This is page 40 of 168. Use http://codebase.md/romanshablio/mcp_server?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .DS_Store
├── .venv
│ ├── __pycache__
│ │ └── hello.cpython-312.pyc
│ ├── bin
│ │ ├── activate
│ │ ├── activate.csh
│ │ ├── activate.fish
│ │ ├── Activate.ps1
│ │ ├── flask
│ │ ├── normalizer
│ │ ├── pip
│ │ ├── pip3
│ │ ├── pip3.12
│ │ ├── python
│ │ ├── python3
│ │ └── python3.12
│ ├── hello.py
│ ├── lib
│ │ └── python3.12
│ │ └── site-packages
│ │ ├── beautifulsoup4-4.12.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ ├── AUTHORS
│ │ │ │ └── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── blinker
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _utilities.cpython-312.pyc
│ │ │ │ └── base.cpython-312.pyc
│ │ │ ├── _utilities.py
│ │ │ ├── base.py
│ │ │ └── py.typed
│ │ ├── blinker-1.8.2.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── bs4
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── css.cpython-312.pyc
│ │ │ │ ├── dammit.cpython-312.pyc
│ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ ├── element.cpython-312.pyc
│ │ │ │ └── formatter.cpython-312.pyc
│ │ │ ├── builder
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _html5lib.cpython-312.pyc
│ │ │ │ │ ├── _htmlparser.cpython-312.pyc
│ │ │ │ │ └── _lxml.cpython-312.pyc
│ │ │ │ ├── _html5lib.py
│ │ │ │ ├── _htmlparser.py
│ │ │ │ └── _lxml.py
│ │ │ ├── css.py
│ │ │ ├── dammit.py
│ │ │ ├── diagnose.py
│ │ │ ├── element.py
│ │ │ ├── formatter.py
│ │ │ └── tests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── test_builder_registry.cpython-312.pyc
│ │ │ │ ├── test_builder.cpython-312.pyc
│ │ │ │ ├── test_css.cpython-312.pyc
│ │ │ │ ├── test_dammit.cpython-312.pyc
│ │ │ │ ├── test_docs.cpython-312.pyc
│ │ │ │ ├── test_element.cpython-312.pyc
│ │ │ │ ├── test_formatter.cpython-312.pyc
│ │ │ │ ├── test_fuzz.cpython-312.pyc
│ │ │ │ ├── test_html5lib.cpython-312.pyc
│ │ │ │ ├── test_htmlparser.cpython-312.pyc
│ │ │ │ ├── test_lxml.cpython-312.pyc
│ │ │ │ ├── test_navigablestring.cpython-312.pyc
│ │ │ │ ├── test_pageelement.cpython-312.pyc
│ │ │ │ ├── test_soup.cpython-312.pyc
│ │ │ │ ├── test_tag.cpython-312.pyc
│ │ │ │ └── test_tree.cpython-312.pyc
│ │ │ ├── fuzz
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase
│ │ │ │ ├── crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase
│ │ │ │ └── crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase
│ │ │ ├── test_builder_registry.py
│ │ │ ├── test_builder.py
│ │ │ ├── test_css.py
│ │ │ ├── test_dammit.py
│ │ │ ├── test_docs.py
│ │ │ ├── test_element.py
│ │ │ ├── test_formatter.py
│ │ │ ├── test_fuzz.py
│ │ │ ├── test_html5lib.py
│ │ │ ├── test_htmlparser.py
│ │ │ ├── test_lxml.py
│ │ │ ├── test_navigablestring.py
│ │ │ ├── test_pageelement.py
│ │ │ ├── test_soup.py
│ │ │ ├── test_tag.py
│ │ │ └── test_tree.py
│ │ ├── certifi
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── core.cpython-312.pyc
│ │ │ ├── cacert.pem
│ │ │ ├── core.py
│ │ │ └── py.typed
│ │ ├── certifi-2024.8.30.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── charset_normalizer
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── cd.cpython-312.pyc
│ │ │ │ ├── constant.cpython-312.pyc
│ │ │ │ ├── legacy.cpython-312.pyc
│ │ │ │ ├── md.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── version.cpython-312.pyc
│ │ │ ├── api.py
│ │ │ ├── cd.py
│ │ │ ├── cli
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __main__.py
│ │ │ │ └── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── __main__.cpython-312.pyc
│ │ │ ├── constant.py
│ │ │ ├── legacy.py
│ │ │ ├── md__mypyc.cpython-312-darwin.so
│ │ │ ├── md.cpython-312-darwin.so
│ │ │ ├── md.py
│ │ │ ├── models.py
│ │ │ ├── py.typed
│ │ │ ├── utils.py
│ │ │ └── version.py
│ │ ├── charset_normalizer-3.4.0.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── click
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ ├── _termui_impl.cpython-312.pyc
│ │ │ │ ├── _textwrap.cpython-312.pyc
│ │ │ │ ├── _winconsole.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── decorators.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formatting.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── shell_completion.cpython-312.pyc
│ │ │ │ ├── termui.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── types.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── _compat.py
│ │ │ ├── _termui_impl.py
│ │ │ ├── _textwrap.py
│ │ │ ├── _winconsole.py
│ │ │ ├── core.py
│ │ │ ├── decorators.py
│ │ │ ├── exceptions.py
│ │ │ ├── formatting.py
│ │ │ ├── globals.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── shell_completion.py
│ │ │ ├── termui.py
│ │ │ ├── testing.py
│ │ │ ├── types.py
│ │ │ └── utils.py
│ │ ├── click-8.1.7.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.rst
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── fake_useragent
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ ├── fake.cpython-312.pyc
│ │ │ │ ├── log.cpython-312.pyc
│ │ │ │ ├── settings.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── data
│ │ │ │ └── browsers.json
│ │ │ ├── errors.py
│ │ │ ├── fake.py
│ │ │ ├── log.py
│ │ │ ├── settings.py
│ │ │ └── utils.py
│ │ ├── fake_useragent-1.5.1.dist-info
│ │ │ ├── AUTHORS
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── flask
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ ├── cli.cpython-312.pyc
│ │ │ │ ├── config.cpython-312.pyc
│ │ │ │ ├── ctx.cpython-312.pyc
│ │ │ │ ├── debughelpers.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── helpers.cpython-312.pyc
│ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── signals.cpython-312.pyc
│ │ │ │ ├── templating.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── typing.cpython-312.pyc
│ │ │ │ ├── views.cpython-312.pyc
│ │ │ │ └── wrappers.cpython-312.pyc
│ │ │ ├── app.py
│ │ │ ├── blueprints.py
│ │ │ ├── cli.py
│ │ │ ├── config.py
│ │ │ ├── ctx.py
│ │ │ ├── debughelpers.py
│ │ │ ├── globals.py
│ │ │ ├── helpers.py
│ │ │ ├── json
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ └── tag.cpython-312.pyc
│ │ │ │ ├── provider.py
│ │ │ │ └── tag.py
│ │ │ ├── logging.py
│ │ │ ├── py.typed
│ │ │ ├── sansio
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ │ └── scaffold.cpython-312.pyc
│ │ │ │ ├── app.py
│ │ │ │ ├── blueprints.py
│ │ │ │ ├── README.md
│ │ │ │ └── scaffold.py
│ │ │ ├── sessions.py
│ │ │ ├── signals.py
│ │ │ ├── templating.py
│ │ │ ├── testing.py
│ │ │ ├── typing.py
│ │ │ ├── views.py
│ │ │ └── wrappers.py
│ │ ├── flask-3.0.3.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── idna
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ ├── codec.py
│ │ │ ├── compat.py
│ │ │ ├── core.py
│ │ │ ├── idnadata.py
│ │ │ ├── intranges.py
│ │ │ ├── package_data.py
│ │ │ ├── py.typed
│ │ │ └── uts46data.py
│ │ ├── idna-3.10.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── itsdangerous
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ ├── exc.cpython-312.pyc
│ │ │ │ ├── serializer.cpython-312.pyc
│ │ │ │ ├── signer.cpython-312.pyc
│ │ │ │ ├── timed.cpython-312.pyc
│ │ │ │ └── url_safe.cpython-312.pyc
│ │ │ ├── _json.py
│ │ │ ├── encoding.py
│ │ │ ├── exc.py
│ │ │ ├── py.typed
│ │ │ ├── serializer.py
│ │ │ ├── signer.py
│ │ │ ├── timed.py
│ │ │ └── url_safe.py
│ │ ├── itsdangerous-2.2.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── jinja2
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _identifier.cpython-312.pyc
│ │ │ │ ├── async_utils.cpython-312.pyc
│ │ │ │ ├── bccache.cpython-312.pyc
│ │ │ │ ├── compiler.cpython-312.pyc
│ │ │ │ ├── constants.cpython-312.pyc
│ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ ├── defaults.cpython-312.pyc
│ │ │ │ ├── environment.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ ├── filters.cpython-312.pyc
│ │ │ │ ├── idtracking.cpython-312.pyc
│ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ ├── loaders.cpython-312.pyc
│ │ │ │ ├── meta.cpython-312.pyc
│ │ │ │ ├── nativetypes.cpython-312.pyc
│ │ │ │ ├── nodes.cpython-312.pyc
│ │ │ │ ├── optimizer.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── runtime.cpython-312.pyc
│ │ │ │ ├── sandbox.cpython-312.pyc
│ │ │ │ ├── tests.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── visitor.cpython-312.pyc
│ │ │ ├── _identifier.py
│ │ │ ├── async_utils.py
│ │ │ ├── bccache.py
│ │ │ ├── compiler.py
│ │ │ ├── constants.py
│ │ │ ├── debug.py
│ │ │ ├── defaults.py
│ │ │ ├── environment.py
│ │ │ ├── exceptions.py
│ │ │ ├── ext.py
│ │ │ ├── filters.py
│ │ │ ├── idtracking.py
│ │ │ ├── lexer.py
│ │ │ ├── loaders.py
│ │ │ ├── meta.py
│ │ │ ├── nativetypes.py
│ │ │ ├── nodes.py
│ │ │ ├── optimizer.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── runtime.py
│ │ │ ├── sandbox.py
│ │ │ ├── tests.py
│ │ │ ├── utils.py
│ │ │ └── visitor.py
│ │ ├── jinja2-3.1.4.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── lxml
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _elementpath.cpython-312.pyc
│ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ ├── cssselect.cpython-312.pyc
│ │ │ │ ├── doctestcompare.cpython-312.pyc
│ │ │ │ ├── ElementInclude.cpython-312.pyc
│ │ │ │ ├── pyclasslookup.cpython-312.pyc
│ │ │ │ ├── sax.cpython-312.pyc
│ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ ├── _elementpath.cpython-312-darwin.so
│ │ │ ├── _elementpath.py
│ │ │ ├── apihelpers.pxi
│ │ │ ├── builder.cpython-312-darwin.so
│ │ │ ├── builder.py
│ │ │ ├── classlookup.pxi
│ │ │ ├── cleanup.pxi
│ │ │ ├── cssselect.py
│ │ │ ├── debug.pxi
│ │ │ ├── docloader.pxi
│ │ │ ├── doctestcompare.py
│ │ │ ├── dtd.pxi
│ │ │ ├── ElementInclude.py
│ │ │ ├── etree_api.h
│ │ │ ├── etree.cpython-312-darwin.so
│ │ │ ├── etree.h
│ │ │ ├── etree.pyx
│ │ │ ├── extensions.pxi
│ │ │ ├── html
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _diffcommand.cpython-312.pyc
│ │ │ │ │ ├── _html5builder.cpython-312.pyc
│ │ │ │ │ ├── _setmixin.cpython-312.pyc
│ │ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ │ ├── clean.cpython-312.pyc
│ │ │ │ │ ├── defs.cpython-312.pyc
│ │ │ │ │ ├── diff.cpython-312.pyc
│ │ │ │ │ ├── ElementSoup.cpython-312.pyc
│ │ │ │ │ ├── formfill.cpython-312.pyc
│ │ │ │ │ ├── html5parser.cpython-312.pyc
│ │ │ │ │ ├── soupparser.cpython-312.pyc
│ │ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ │ ├── _diffcommand.py
│ │ │ │ ├── _html5builder.py
│ │ │ │ ├── _setmixin.py
│ │ │ │ ├── builder.py
│ │ │ │ ├── clean.py
│ │ │ │ ├── defs.py
│ │ │ │ ├── diff.cpython-312-darwin.so
│ │ │ │ ├── diff.py
│ │ │ │ ├── ElementSoup.py
│ │ │ │ ├── formfill.py
│ │ │ │ ├── html5parser.py
│ │ │ │ ├── soupparser.py
│ │ │ │ └── usedoctest.py
│ │ │ ├── includes
│ │ │ │ ├── __init__.pxd
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── c14n.pxd
│ │ │ │ ├── config.pxd
│ │ │ │ ├── dtdvalid.pxd
│ │ │ │ ├── etree_defs.h
│ │ │ │ ├── etreepublic.pxd
│ │ │ │ ├── extlibs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── libcharset.h
│ │ │ │ │ ├── localcharset.h
│ │ │ │ │ ├── zconf.h
│ │ │ │ │ └── zlib.h
│ │ │ │ ├── htmlparser.pxd
│ │ │ │ ├── libexslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── exslt.h
│ │ │ │ │ ├── exsltconfig.h
│ │ │ │ │ └── exsltexports.h
│ │ │ │ ├── libxml
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── c14n.h
│ │ │ │ │ ├── catalog.h
│ │ │ │ │ ├── chvalid.h
│ │ │ │ │ ├── debugXML.h
│ │ │ │ │ ├── dict.h
│ │ │ │ │ ├── encoding.h
│ │ │ │ │ ├── entities.h
│ │ │ │ │ ├── globals.h
│ │ │ │ │ ├── hash.h
│ │ │ │ │ ├── HTMLparser.h
│ │ │ │ │ ├── HTMLtree.h
│ │ │ │ │ ├── list.h
│ │ │ │ │ ├── nanoftp.h
│ │ │ │ │ ├── nanohttp.h
│ │ │ │ │ ├── parser.h
│ │ │ │ │ ├── parserInternals.h
│ │ │ │ │ ├── relaxng.h
│ │ │ │ │ ├── SAX.h
│ │ │ │ │ ├── SAX2.h
│ │ │ │ │ ├── schemasInternals.h
│ │ │ │ │ ├── schematron.h
│ │ │ │ │ ├── threads.h
│ │ │ │ │ ├── tree.h
│ │ │ │ │ ├── uri.h
│ │ │ │ │ ├── valid.h
│ │ │ │ │ ├── xinclude.h
│ │ │ │ │ ├── xlink.h
│ │ │ │ │ ├── xmlautomata.h
│ │ │ │ │ ├── xmlerror.h
│ │ │ │ │ ├── xmlexports.h
│ │ │ │ │ ├── xmlIO.h
│ │ │ │ │ ├── xmlmemory.h
│ │ │ │ │ ├── xmlmodule.h
│ │ │ │ │ ├── xmlreader.h
│ │ │ │ │ ├── xmlregexp.h
│ │ │ │ │ ├── xmlsave.h
│ │ │ │ │ ├── xmlschemas.h
│ │ │ │ │ ├── xmlschemastypes.h
│ │ │ │ │ ├── xmlstring.h
│ │ │ │ │ ├── xmlunicode.h
│ │ │ │ │ ├── xmlversion.h
│ │ │ │ │ ├── xmlwriter.h
│ │ │ │ │ ├── xpath.h
│ │ │ │ │ ├── xpathInternals.h
│ │ │ │ │ └── xpointer.h
│ │ │ │ ├── libxslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── attributes.h
│ │ │ │ │ ├── documents.h
│ │ │ │ │ ├── extensions.h
│ │ │ │ │ ├── extra.h
│ │ │ │ │ ├── functions.h
│ │ │ │ │ ├── imports.h
│ │ │ │ │ ├── keys.h
│ │ │ │ │ ├── namespaces.h
│ │ │ │ │ ├── numbersInternals.h
│ │ │ │ │ ├── pattern.h
│ │ │ │ │ ├── preproc.h
│ │ │ │ │ ├── security.h
│ │ │ │ │ ├── templates.h
│ │ │ │ │ ├── transform.h
│ │ │ │ │ ├── variables.h
│ │ │ │ │ ├── xslt.h
│ │ │ │ │ ├── xsltconfig.h
│ │ │ │ │ ├── xsltexports.h
│ │ │ │ │ ├── xsltInternals.h
│ │ │ │ │ ├── xsltlocale.h
│ │ │ │ │ └── xsltutils.h
│ │ │ │ ├── lxml-version.h
│ │ │ │ ├── relaxng.pxd
│ │ │ │ ├── schematron.pxd
│ │ │ │ ├── tree.pxd
│ │ │ │ ├── uri.pxd
│ │ │ │ ├── xinclude.pxd
│ │ │ │ ├── xmlerror.pxd
│ │ │ │ ├── xmlparser.pxd
│ │ │ │ ├── xmlschema.pxd
│ │ │ │ ├── xpath.pxd
│ │ │ │ └── xslt.pxd
│ │ │ ├── isoschematron
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ └── resources
│ │ │ │ ├── rng
│ │ │ │ │ └── iso-schematron.rng
│ │ │ │ └── xsl
│ │ │ │ ├── iso-schematron-xslt1
│ │ │ │ │ ├── iso_abstract_expand.xsl
│ │ │ │ │ ├── iso_dsdl_include.xsl
│ │ │ │ │ ├── iso_schematron_message.xsl
│ │ │ │ │ ├── iso_schematron_skeleton_for_xslt1.xsl
│ │ │ │ │ ├── iso_svrl_for_xslt1.xsl
│ │ │ │ │ └── readme.txt
│ │ │ │ ├── RNG2Schtrn.xsl
│ │ │ │ └── XSD2Schtrn.xsl
│ │ │ ├── iterparse.pxi
│ │ │ ├── lxml.etree_api.h
│ │ │ ├── lxml.etree.h
│ │ │ ├── nsclasses.pxi
│ │ │ ├── objectify.cpython-312-darwin.so
│ │ │ ├── objectify.pyx
│ │ │ ├── objectpath.pxi
│ │ │ ├── parser.pxi
│ │ │ ├── parsertarget.pxi
│ │ │ ├── proxy.pxi
│ │ │ ├── public-api.pxi
│ │ │ ├── pyclasslookup.py
│ │ │ ├── readonlytree.pxi
│ │ │ ├── relaxng.pxi
│ │ │ ├── sax.cpython-312-darwin.so
│ │ │ ├── sax.py
│ │ │ ├── saxparser.pxi
│ │ │ ├── schematron.pxi
│ │ │ ├── serializer.pxi
│ │ │ ├── usedoctest.py
│ │ │ ├── xinclude.pxi
│ │ │ ├── xmlerror.pxi
│ │ │ ├── xmlid.pxi
│ │ │ ├── xmlschema.pxi
│ │ │ ├── xpath.pxi
│ │ │ ├── xslt.pxi
│ │ │ └── xsltext.pxi
│ │ ├── lxml-5.3.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── LICENSES.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── markupsafe
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── _native.cpython-312.pyc
│ │ │ ├── _native.py
│ │ │ ├── _speedups.c
│ │ │ ├── _speedups.cpython-312-darwin.so
│ │ │ ├── _speedups.pyi
│ │ │ └── py.typed
│ │ ├── MarkupSafe-3.0.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── pip
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pip-runner__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── __pip-runner__.cpython-312.pyc
│ │ │ ├── _internal
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── build_env.cpython-312.pyc
│ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ ├── pyproject.cpython-312.pyc
│ │ │ │ │ ├── self_outdated_check.cpython-312.pyc
│ │ │ │ │ └── wheel_builder.cpython-312.pyc
│ │ │ │ ├── build_env.py
│ │ │ │ ├── cache.py
│ │ │ │ ├── cli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── autocompletion.cpython-312.pyc
│ │ │ │ │ │ ├── base_command.cpython-312.pyc
│ │ │ │ │ │ ├── cmdoptions.cpython-312.pyc
│ │ │ │ │ │ ├── command_context.cpython-312.pyc
│ │ │ │ │ │ ├── index_command.cpython-312.pyc
│ │ │ │ │ │ ├── main_parser.cpython-312.pyc
│ │ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bars.cpython-312.pyc
│ │ │ │ │ │ ├── req_command.cpython-312.pyc
│ │ │ │ │ │ ├── spinners.cpython-312.pyc
│ │ │ │ │ │ └── status_codes.cpython-312.pyc
│ │ │ │ │ ├── autocompletion.py
│ │ │ │ │ ├── base_command.py
│ │ │ │ │ ├── cmdoptions.py
│ │ │ │ │ ├── command_context.py
│ │ │ │ │ ├── index_command.py
│ │ │ │ │ ├── main_parser.py
│ │ │ │ │ ├── main.py
│ │ │ │ │ ├── parser.py
│ │ │ │ │ ├── progress_bars.py
│ │ │ │ │ ├── req_command.py
│ │ │ │ │ ├── spinners.py
│ │ │ │ │ └── status_codes.py
│ │ │ │ ├── commands
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── completion.cpython-312.pyc
│ │ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ ├── hash.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── inspect.cpython-312.pyc
│ │ │ │ │ │ ├── install.cpython-312.pyc
│ │ │ │ │ │ ├── list.cpython-312.pyc
│ │ │ │ │ │ ├── search.cpython-312.pyc
│ │ │ │ │ │ ├── show.cpython-312.pyc
│ │ │ │ │ │ ├── uninstall.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── completion.py
│ │ │ │ │ ├── configuration.py
│ │ │ │ │ ├── debug.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── hash.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── inspect.py
│ │ │ │ │ ├── install.py
│ │ │ │ │ ├── list.py
│ │ │ │ │ ├── search.py
│ │ │ │ │ ├── show.py
│ │ │ │ │ ├── uninstall.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── configuration.py
│ │ │ │ ├── distributions
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── installed.cpython-312.pyc
│ │ │ │ │ │ ├── sdist.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── installed.py
│ │ │ │ │ ├── sdist.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── index
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── collector.cpython-312.pyc
│ │ │ │ │ │ ├── package_finder.cpython-312.pyc
│ │ │ │ │ │ └── sources.cpython-312.pyc
│ │ │ │ │ ├── collector.py
│ │ │ │ │ ├── package_finder.py
│ │ │ │ │ └── sources.py
│ │ │ │ ├── locations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _distutils.cpython-312.pyc
│ │ │ │ │ │ ├── _sysconfig.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── _distutils.py
│ │ │ │ │ ├── _sysconfig.py
│ │ │ │ │ └── base.py
│ │ │ │ ├── main.py
│ │ │ │ ├── metadata
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ └── pkg_resources.cpython-312.pyc
│ │ │ │ │ ├── _json.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── importlib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ │ ├── _dists.cpython-312.pyc
│ │ │ │ │ │ │ └── _envs.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.py
│ │ │ │ │ │ ├── _dists.py
│ │ │ │ │ │ └── _envs.py
│ │ │ │ │ └── pkg_resources.py
│ │ │ │ ├── models
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── candidate.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url.cpython-312.pyc
│ │ │ │ │ │ ├── format_control.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── installation_report.cpython-312.pyc
│ │ │ │ │ │ ├── link.cpython-312.pyc
│ │ │ │ │ │ ├── scheme.cpython-312.pyc
│ │ │ │ │ │ ├── search_scope.cpython-312.pyc
│ │ │ │ │ │ ├── selection_prefs.cpython-312.pyc
│ │ │ │ │ │ ├── target_python.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── candidate.py
│ │ │ │ │ ├── direct_url.py
│ │ │ │ │ ├── format_control.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── installation_report.py
│ │ │ │ │ ├── link.py
│ │ │ │ │ ├── scheme.py
│ │ │ │ │ ├── search_scope.py
│ │ │ │ │ ├── selection_prefs.py
│ │ │ │ │ ├── target_python.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── network
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── lazy_wheel.cpython-312.pyc
│ │ │ │ │ │ ├── session.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── xmlrpc.cpython-312.pyc
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── lazy_wheel.py
│ │ │ │ │ ├── session.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── xmlrpc.py
│ │ │ │ ├── operations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ └── prepare.cpython-312.pyc
│ │ │ │ │ ├── build
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── build_tracker.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_legacy.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── build_tracker.py
│ │ │ │ │ │ ├── metadata_editable.py
│ │ │ │ │ │ ├── metadata_legacy.py
│ │ │ │ │ │ ├── metadata.py
│ │ │ │ │ │ ├── wheel_editable.py
│ │ │ │ │ │ ├── wheel_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── install
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── editable_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── editable_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ └── prepare.py
│ │ │ │ ├── pyproject.py
│ │ │ │ ├── req
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── constructors.cpython-312.pyc
│ │ │ │ │ │ ├── req_file.cpython-312.pyc
│ │ │ │ │ │ ├── req_install.cpython-312.pyc
│ │ │ │ │ │ ├── req_set.cpython-312.pyc
│ │ │ │ │ │ └── req_uninstall.cpython-312.pyc
│ │ │ │ │ ├── constructors.py
│ │ │ │ │ ├── req_file.py
│ │ │ │ │ ├── req_install.py
│ │ │ │ │ ├── req_set.py
│ │ │ │ │ └── req_uninstall.py
│ │ │ │ ├── resolution
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── legacy
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ │ └── resolver.py
│ │ │ │ │ └── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── candidates.cpython-312.pyc
│ │ │ │ │ │ ├── factory.cpython-312.pyc
│ │ │ │ │ │ ├── found_candidates.cpython-312.pyc
│ │ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ │ ├── reporter.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── candidates.py
│ │ │ │ │ ├── factory.py
│ │ │ │ │ ├── found_candidates.py
│ │ │ │ │ ├── provider.py
│ │ │ │ │ ├── reporter.py
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ └── resolver.py
│ │ │ │ ├── self_outdated_check.py
│ │ │ │ ├── utils
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _jaraco_text.cpython-312.pyc
│ │ │ │ │ │ ├── _log.cpython-312.pyc
│ │ │ │ │ │ ├── appdirs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── compatibility_tags.cpython-312.pyc
│ │ │ │ │ │ ├── datetime.cpython-312.pyc
│ │ │ │ │ │ ├── deprecation.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url_helpers.cpython-312.pyc
│ │ │ │ │ │ ├── egg_link.cpython-312.pyc
│ │ │ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ │ │ ├── entrypoints.cpython-312.pyc
│ │ │ │ │ │ ├── filesystem.cpython-312.pyc
│ │ │ │ │ │ ├── filetypes.cpython-312.pyc
│ │ │ │ │ │ ├── glibc.cpython-312.pyc
│ │ │ │ │ │ ├── hashes.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── misc.cpython-312.pyc
│ │ │ │ │ │ ├── packaging.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── setuptools_build.cpython-312.pyc
│ │ │ │ │ │ ├── subprocess.cpython-312.pyc
│ │ │ │ │ │ ├── temp_dir.cpython-312.pyc
│ │ │ │ │ │ ├── unpacking.cpython-312.pyc
│ │ │ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ │ │ ├── virtualenv.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── _jaraco_text.py
│ │ │ │ │ ├── _log.py
│ │ │ │ │ ├── appdirs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── compatibility_tags.py
│ │ │ │ │ ├── datetime.py
│ │ │ │ │ ├── deprecation.py
│ │ │ │ │ ├── direct_url_helpers.py
│ │ │ │ │ ├── egg_link.py
│ │ │ │ │ ├── encoding.py
│ │ │ │ │ ├── entrypoints.py
│ │ │ │ │ ├── filesystem.py
│ │ │ │ │ ├── filetypes.py
│ │ │ │ │ ├── glibc.py
│ │ │ │ │ ├── hashes.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── misc.py
│ │ │ │ │ ├── packaging.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── setuptools_build.py
│ │ │ │ │ ├── subprocess.py
│ │ │ │ │ ├── temp_dir.py
│ │ │ │ │ ├── unpacking.py
│ │ │ │ │ ├── urls.py
│ │ │ │ │ ├── virtualenv.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── vcs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── bazaar.cpython-312.pyc
│ │ │ │ │ │ ├── git.cpython-312.pyc
│ │ │ │ │ │ ├── mercurial.cpython-312.pyc
│ │ │ │ │ │ ├── subversion.cpython-312.pyc
│ │ │ │ │ │ └── versioncontrol.cpython-312.pyc
│ │ │ │ │ ├── bazaar.py
│ │ │ │ │ ├── git.py
│ │ │ │ │ ├── mercurial.py
│ │ │ │ │ ├── subversion.py
│ │ │ │ │ └── versioncontrol.py
│ │ │ │ └── wheel_builder.py
│ │ │ ├── _vendor
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ └── typing_extensions.cpython-312.pyc
│ │ │ │ ├── cachecontrol
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _cmd.cpython-312.pyc
│ │ │ │ │ │ ├── adapter.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── controller.cpython-312.pyc
│ │ │ │ │ │ ├── filewrapper.cpython-312.pyc
│ │ │ │ │ │ ├── heuristics.cpython-312.pyc
│ │ │ │ │ │ ├── serialize.cpython-312.pyc
│ │ │ │ │ │ └── wrapper.cpython-312.pyc
│ │ │ │ │ ├── _cmd.py
│ │ │ │ │ ├── adapter.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── caches
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── file_cache.cpython-312.pyc
│ │ │ │ │ │ │ └── redis_cache.cpython-312.pyc
│ │ │ │ │ │ ├── file_cache.py
│ │ │ │ │ │ └── redis_cache.py
│ │ │ │ │ ├── controller.py
│ │ │ │ │ ├── filewrapper.py
│ │ │ │ │ ├── heuristics.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── serialize.py
│ │ │ │ │ └── wrapper.py
│ │ │ │ ├── certifi
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── core.cpython-312.pyc
│ │ │ │ │ ├── cacert.pem
│ │ │ │ │ ├── core.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── distlib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── database.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── locators.cpython-312.pyc
│ │ │ │ │ │ ├── manifest.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── resources.cpython-312.pyc
│ │ │ │ │ │ ├── scripts.cpython-312.pyc
│ │ │ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── database.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── locators.py
│ │ │ │ │ ├── manifest.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── resources.py
│ │ │ │ │ ├── scripts.py
│ │ │ │ │ ├── t32.exe
│ │ │ │ │ ├── t64-arm.exe
│ │ │ │ │ ├── t64.exe
│ │ │ │ │ ├── util.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ ├── w32.exe
│ │ │ │ │ ├── w64-arm.exe
│ │ │ │ │ ├── w64.exe
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── distro
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── distro.cpython-312.pyc
│ │ │ │ │ ├── distro.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── idna
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ │ │ ├── codec.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── core.py
│ │ │ │ │ ├── idnadata.py
│ │ │ │ │ ├── intranges.py
│ │ │ │ │ ├── package_data.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ └── uts46data.py
│ │ │ │ ├── msgpack
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ │ │ └── fallback.cpython-312.pyc
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── ext.py
│ │ │ │ │ └── fallback.py
│ │ │ │ ├── packaging
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _elffile.cpython-312.pyc
│ │ │ │ │ │ ├── _manylinux.cpython-312.pyc
│ │ │ │ │ │ ├── _musllinux.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _structures.cpython-312.pyc
│ │ │ │ │ │ ├── _tokenizer.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ ├── specifiers.cpython-312.pyc
│ │ │ │ │ │ ├── tags.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── version.cpython-312.pyc
│ │ │ │ │ ├── _elffile.py
│ │ │ │ │ ├── _manylinux.py
│ │ │ │ │ ├── _musllinux.py
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _structures.py
│ │ │ │ │ ├── _tokenizer.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ ├── specifiers.py
│ │ │ │ │ ├── tags.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── version.py
│ │ │ │ ├── pkg_resources
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── platformdirs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── android.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── macos.cpython-312.pyc
│ │ │ │ │ │ ├── unix.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── windows.cpython-312.pyc
│ │ │ │ │ ├── android.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── macos.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── unix.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ └── windows.py
│ │ │ │ ├── pygments
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── cmdline.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── filter.cpython-312.pyc
│ │ │ │ │ │ ├── formatter.cpython-312.pyc
│ │ │ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ │ │ ├── modeline.cpython-312.pyc
│ │ │ │ │ │ ├── plugin.cpython-312.pyc
│ │ │ │ │ │ ├── regexopt.cpython-312.pyc
│ │ │ │ │ │ ├── scanner.cpython-312.pyc
│ │ │ │ │ │ ├── sphinxext.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── token.cpython-312.pyc
│ │ │ │ │ │ ├── unistring.cpython-312.pyc
│ │ │ │ │ │ └── util.cpython-312.pyc
│ │ │ │ │ ├── cmdline.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── filter.py
│ │ │ │ │ ├── filters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── formatter.py
│ │ │ │ │ ├── formatters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ ├── bbcode.cpython-312.pyc
│ │ │ │ │ │ │ ├── groff.cpython-312.pyc
│ │ │ │ │ │ │ ├── html.cpython-312.pyc
│ │ │ │ │ │ │ ├── img.cpython-312.pyc
│ │ │ │ │ │ │ ├── irc.cpython-312.pyc
│ │ │ │ │ │ │ ├── latex.cpython-312.pyc
│ │ │ │ │ │ │ ├── other.cpython-312.pyc
│ │ │ │ │ │ │ ├── pangomarkup.cpython-312.pyc
│ │ │ │ │ │ │ ├── rtf.cpython-312.pyc
│ │ │ │ │ │ │ ├── svg.cpython-312.pyc
│ │ │ │ │ │ │ ├── terminal.cpython-312.pyc
│ │ │ │ │ │ │ └── terminal256.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ ├── bbcode.py
│ │ │ │ │ │ ├── groff.py
│ │ │ │ │ │ ├── html.py
│ │ │ │ │ │ ├── img.py
│ │ │ │ │ │ ├── irc.py
│ │ │ │ │ │ ├── latex.py
│ │ │ │ │ │ ├── other.py
│ │ │ │ │ │ ├── pangomarkup.py
│ │ │ │ │ │ ├── rtf.py
│ │ │ │ │ │ ├── svg.py
│ │ │ │ │ │ ├── terminal.py
│ │ │ │ │ │ └── terminal256.py
│ │ │ │ │ ├── lexer.py
│ │ │ │ │ ├── lexers
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ └── python.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ └── python.py
│ │ │ │ │ ├── modeline.py
│ │ │ │ │ ├── plugin.py
│ │ │ │ │ ├── regexopt.py
│ │ │ │ │ ├── scanner.py
│ │ │ │ │ ├── sphinxext.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styles
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── _mapping.cpython-312.pyc
│ │ │ │ │ │ └── _mapping.py
│ │ │ │ │ ├── token.py
│ │ │ │ │ ├── unistring.py
│ │ │ │ │ └── util.py
│ │ │ │ ├── pyproject_hooks
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ └── _impl.cpython-312.pyc
│ │ │ │ │ ├── _compat.py
│ │ │ │ │ ├── _impl.py
│ │ │ │ │ └── _in_process
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── _in_process.cpython-312.pyc
│ │ │ │ │ └── _in_process.py
│ │ │ │ ├── requests
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ │ ├── __version__.py
│ │ │ │ │ ├── _internal_utils.py
│ │ │ │ │ ├── adapters.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── certs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── cookies.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── hooks.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ ├── packages.py
│ │ │ │ │ ├── sessions.py
│ │ │ │ │ ├── status_codes.py
│ │ │ │ │ ├── structures.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── providers.cpython-312.pyc
│ │ │ │ │ │ ├── reporters.cpython-312.pyc
│ │ │ │ │ │ ├── resolvers.cpython-312.pyc
│ │ │ │ │ │ └── structs.cpython-312.pyc
│ │ │ │ │ ├── compat
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── collections_abc.cpython-312.pyc
│ │ │ │ │ │ └── collections_abc.py
│ │ │ │ │ ├── providers.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── reporters.py
│ │ │ │ │ ├── resolvers.py
│ │ │ │ │ └── structs.py
│ │ │ │ ├── rich
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── _cell_widths.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_codes.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_replace.cpython-312.pyc
│ │ │ │ │ │ ├── _export_format.cpython-312.pyc
│ │ │ │ │ │ ├── _extension.cpython-312.pyc
│ │ │ │ │ │ ├── _fileno.cpython-312.pyc
│ │ │ │ │ │ ├── _inspect.cpython-312.pyc
│ │ │ │ │ │ ├── _log_render.cpython-312.pyc
│ │ │ │ │ │ ├── _loop.cpython-312.pyc
│ │ │ │ │ │ ├── _null_file.cpython-312.pyc
│ │ │ │ │ │ ├── _palettes.cpython-312.pyc
│ │ │ │ │ │ ├── _pick.cpython-312.pyc
│ │ │ │ │ │ ├── _ratio.cpython-312.pyc
│ │ │ │ │ │ ├── _spinners.cpython-312.pyc
│ │ │ │ │ │ ├── _stack.cpython-312.pyc
│ │ │ │ │ │ ├── _timer.cpython-312.pyc
│ │ │ │ │ │ ├── _win32_console.cpython-312.pyc
│ │ │ │ │ │ ├── _windows_renderer.cpython-312.pyc
│ │ │ │ │ │ ├── _windows.cpython-312.pyc
│ │ │ │ │ │ ├── _wrap.cpython-312.pyc
│ │ │ │ │ │ ├── abc.cpython-312.pyc
│ │ │ │ │ │ ├── align.cpython-312.pyc
│ │ │ │ │ │ ├── ansi.cpython-312.pyc
│ │ │ │ │ │ ├── bar.cpython-312.pyc
│ │ │ │ │ │ ├── box.cpython-312.pyc
│ │ │ │ │ │ ├── cells.cpython-312.pyc
│ │ │ │ │ │ ├── color_triplet.cpython-312.pyc
│ │ │ │ │ │ ├── color.cpython-312.pyc
│ │ │ │ │ │ ├── columns.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── constrain.cpython-312.pyc
│ │ │ │ │ │ ├── containers.cpython-312.pyc
│ │ │ │ │ │ ├── control.cpython-312.pyc
│ │ │ │ │ │ ├── default_styles.cpython-312.pyc
│ │ │ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ │ │ ├── emoji.cpython-312.pyc
│ │ │ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ │ │ ├── file_proxy.cpython-312.pyc
│ │ │ │ │ │ ├── filesize.cpython-312.pyc
│ │ │ │ │ │ ├── highlighter.cpython-312.pyc
│ │ │ │ │ │ ├── json.cpython-312.pyc
│ │ │ │ │ │ ├── jupyter.cpython-312.pyc
│ │ │ │ │ │ ├── layout.cpython-312.pyc
│ │ │ │ │ │ ├── live_render.cpython-312.pyc
│ │ │ │ │ │ ├── live.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── markup.cpython-312.pyc
│ │ │ │ │ │ ├── measure.cpython-312.pyc
│ │ │ │ │ │ ├── padding.cpython-312.pyc
│ │ │ │ │ │ ├── pager.cpython-312.pyc
│ │ │ │ │ │ ├── palette.cpython-312.pyc
│ │ │ │ │ │ ├── panel.cpython-312.pyc
│ │ │ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bar.cpython-312.pyc
│ │ │ │ │ │ ├── progress.cpython-312.pyc
│ │ │ │ │ │ ├── prompt.cpython-312.pyc
│ │ │ │ │ │ ├── protocol.cpython-312.pyc
│ │ │ │ │ │ ├── region.cpython-312.pyc
│ │ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ │ ├── rule.cpython-312.pyc
│ │ │ │ │ │ ├── scope.cpython-312.pyc
│ │ │ │ │ │ ├── screen.cpython-312.pyc
│ │ │ │ │ │ ├── segment.cpython-312.pyc
│ │ │ │ │ │ ├── spinner.cpython-312.pyc
│ │ │ │ │ │ ├── status.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── styled.cpython-312.pyc
│ │ │ │ │ │ ├── syntax.cpython-312.pyc
│ │ │ │ │ │ ├── table.cpython-312.pyc
│ │ │ │ │ │ ├── terminal_theme.cpython-312.pyc
│ │ │ │ │ │ ├── text.cpython-312.pyc
│ │ │ │ │ │ ├── theme.cpython-312.pyc
│ │ │ │ │ │ ├── themes.cpython-312.pyc
│ │ │ │ │ │ ├── traceback.cpython-312.pyc
│ │ │ │ │ │ └── tree.cpython-312.pyc
│ │ │ │ │ ├── _cell_widths.py
│ │ │ │ │ ├── _emoji_codes.py
│ │ │ │ │ ├── _emoji_replace.py
│ │ │ │ │ ├── _export_format.py
│ │ │ │ │ ├── _extension.py
│ │ │ │ │ ├── _fileno.py
│ │ │ │ │ ├── _inspect.py
│ │ │ │ │ ├── _log_render.py
│ │ │ │ │ ├── _loop.py
│ │ │ │ │ ├── _null_file.py
│ │ │ │ │ ├── _palettes.py
│ │ │ │ │ ├── _pick.py
│ │ │ │ │ ├── _ratio.py
│ │ │ │ │ ├── _spinners.py
│ │ │ │ │ ├── _stack.py
│ │ │ │ │ ├── _timer.py
│ │ │ │ │ ├── _win32_console.py
│ │ │ │ │ ├── _windows_renderer.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ ├── _wrap.py
│ │ │ │ │ ├── abc.py
│ │ │ │ │ ├── align.py
│ │ │ │ │ ├── ansi.py
│ │ │ │ │ ├── bar.py
│ │ │ │ │ ├── box.py
│ │ │ │ │ ├── cells.py
│ │ │ │ │ ├── color_triplet.py
│ │ │ │ │ ├── color.py
│ │ │ │ │ ├── columns.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── constrain.py
│ │ │ │ │ ├── containers.py
│ │ │ │ │ ├── control.py
│ │ │ │ │ ├── default_styles.py
│ │ │ │ │ ├── diagnose.py
│ │ │ │ │ ├── emoji.py
│ │ │ │ │ ├── errors.py
│ │ │ │ │ ├── file_proxy.py
│ │ │ │ │ ├── filesize.py
│ │ │ │ │ ├── highlighter.py
│ │ │ │ │ ├── json.py
│ │ │ │ │ ├── jupyter.py
│ │ │ │ │ ├── layout.py
│ │ │ │ │ ├── live_render.py
│ │ │ │ │ ├── live.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── markup.py
│ │ │ │ │ ├── measure.py
│ │ │ │ │ ├── padding.py
│ │ │ │ │ ├── pager.py
│ │ │ │ │ ├── palette.py
│ │ │ │ │ ├── panel.py
│ │ │ │ │ ├── pretty.py
│ │ │ │ │ ├── progress_bar.py
│ │ │ │ │ ├── progress.py
│ │ │ │ │ ├── prompt.py
│ │ │ │ │ ├── protocol.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── region.py
│ │ │ │ │ ├── repr.py
│ │ │ │ │ ├── rule.py
│ │ │ │ │ ├── scope.py
│ │ │ │ │ ├── screen.py
│ │ │ │ │ ├── segment.py
│ │ │ │ │ ├── spinner.py
│ │ │ │ │ ├── status.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styled.py
│ │ │ │ │ ├── syntax.py
│ │ │ │ │ ├── table.py
│ │ │ │ │ ├── terminal_theme.py
│ │ │ │ │ ├── text.py
│ │ │ │ │ ├── theme.py
│ │ │ │ │ ├── themes.py
│ │ │ │ │ ├── traceback.py
│ │ │ │ │ └── tree.py
│ │ │ │ ├── tomli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _re.cpython-312.pyc
│ │ │ │ │ │ └── _types.cpython-312.pyc
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _re.py
│ │ │ │ │ ├── _types.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── truststore
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _api.cpython-312.pyc
│ │ │ │ │ │ ├── _macos.cpython-312.pyc
│ │ │ │ │ │ ├── _openssl.cpython-312.pyc
│ │ │ │ │ │ ├── _ssl_constants.cpython-312.pyc
│ │ │ │ │ │ └── _windows.cpython-312.pyc
│ │ │ │ │ ├── _api.py
│ │ │ │ │ ├── _macos.py
│ │ │ │ │ ├── _openssl.py
│ │ │ │ │ ├── _ssl_constants.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── typing_extensions.py
│ │ │ │ ├── urllib3
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── _collections.py
│ │ │ │ │ ├── _version.py
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── connectionpool.py
│ │ │ │ │ ├── contrib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _appengine_environ.cpython-312.pyc
│ │ │ │ │ │ │ ├── appengine.cpython-312.pyc
│ │ │ │ │ │ │ ├── ntlmpool.cpython-312.pyc
│ │ │ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ │ │ ├── securetransport.cpython-312.pyc
│ │ │ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ │ │ ├── _appengine_environ.py
│ │ │ │ │ │ ├── _securetransport
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── bindings.cpython-312.pyc
│ │ │ │ │ │ │ │ └── low_level.cpython-312.pyc
│ │ │ │ │ │ │ ├── bindings.py
│ │ │ │ │ │ │ └── low_level.py
│ │ │ │ │ │ ├── appengine.py
│ │ │ │ │ │ ├── ntlmpool.py
│ │ │ │ │ │ ├── pyopenssl.py
│ │ │ │ │ │ ├── securetransport.py
│ │ │ │ │ │ └── socks.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── fields.py
│ │ │ │ │ ├── filepost.py
│ │ │ │ │ ├── packages
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── six.cpython-312.pyc
│ │ │ │ │ │ ├── backports
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── makefile.cpython-312.pyc
│ │ │ │ │ │ │ │ └── weakref_finalize.cpython-312.pyc
│ │ │ │ │ │ │ ├── makefile.py
│ │ │ │ │ │ │ └── weakref_finalize.py
│ │ │ │ │ │ └── six.py
│ │ │ │ │ ├── poolmanager.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ └── util
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ │ │ ├── queue.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ │ │ └── wait.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── proxy.py
│ │ │ │ │ ├── queue.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── ssl_.py
│ │ │ │ │ ├── ssl_match_hostname.py
│ │ │ │ │ ├── ssltransport.py
│ │ │ │ │ ├── timeout.py
│ │ │ │ │ ├── url.py
│ │ │ │ │ └── wait.py
│ │ │ │ └── vendor.txt
│ │ │ └── py.typed
│ │ ├── pip-24.2.dist-info
│ │ │ ├── AUTHORS.txt
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── requests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── __version__.py
│ │ │ ├── _internal_utils.py
│ │ │ ├── adapters.py
│ │ │ ├── api.py
│ │ │ ├── auth.py
│ │ │ ├── certs.py
│ │ │ ├── compat.py
│ │ │ ├── cookies.py
│ │ │ ├── exceptions.py
│ │ │ ├── help.py
│ │ │ ├── hooks.py
│ │ │ ├── models.py
│ │ │ ├── packages.py
│ │ │ ├── sessions.py
│ │ │ ├── status_codes.py
│ │ │ ├── structures.py
│ │ │ └── utils.py
│ │ ├── requests-2.32.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── soupsieve
│ │ │ ├── __init__.py
│ │ │ ├── __meta__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __meta__.cpython-312.pyc
│ │ │ │ ├── css_match.cpython-312.pyc
│ │ │ │ ├── css_parser.cpython-312.pyc
│ │ │ │ ├── css_types.cpython-312.pyc
│ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ └── util.cpython-312.pyc
│ │ │ ├── css_match.py
│ │ │ ├── css_parser.py
│ │ │ ├── css_types.py
│ │ │ ├── pretty.py
│ │ │ ├── py.typed
│ │ │ └── util.py
│ │ ├── soupsieve-2.6.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── urllib3
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _base_connection.cpython-312.pyc
│ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ ├── _request_methods.cpython-312.pyc
│ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ └── response.cpython-312.pyc
│ │ │ ├── _base_connection.py
│ │ │ ├── _collections.py
│ │ │ ├── _request_methods.py
│ │ │ ├── _version.py
│ │ │ ├── connection.py
│ │ │ ├── connectionpool.py
│ │ │ ├── contrib
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ ├── emscripten
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── fetch.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── emscripten_fetch_worker.js
│ │ │ │ │ ├── fetch.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ └── response.py
│ │ │ │ ├── pyopenssl.py
│ │ │ │ └── socks.py
│ │ │ ├── exceptions.py
│ │ │ ├── fields.py
│ │ │ ├── filepost.py
│ │ │ ├── http2
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ └── probe.cpython-312.pyc
│ │ │ │ ├── connection.py
│ │ │ │ └── probe.py
│ │ │ ├── poolmanager.py
│ │ │ ├── py.typed
│ │ │ ├── response.py
│ │ │ └── util
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ └── wait.cpython-312.pyc
│ │ │ ├── connection.py
│ │ │ ├── proxy.py
│ │ │ ├── request.py
│ │ │ ├── response.py
│ │ │ ├── retry.py
│ │ │ ├── ssl_.py
│ │ │ ├── ssl_match_hostname.py
│ │ │ ├── ssltransport.py
│ │ │ ├── timeout.py
│ │ │ ├── url.py
│ │ │ ├── util.py
│ │ │ └── wait.py
│ │ ├── urllib3-2.2.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── useragent
│ │ │ ├── __init__.py
│ │ │ ├── __init__.pyc
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── resources
│ │ │ │ └── user_agent_data.json
│ │ │ └── test
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── test_additional_os.json
│ │ │ ├── test_browser.json
│ │ │ ├── test_device.json
│ │ │ ├── test_firefox.json
│ │ │ ├── test_os.json
│ │ │ └── test_pgts_browser.json
│ │ ├── useragent-0.1.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── werkzeug
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _internal.cpython-312.pyc
│ │ │ │ ├── _reloader.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formparser.cpython-312.pyc
│ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ ├── local.cpython-312.pyc
│ │ │ │ ├── security.cpython-312.pyc
│ │ │ │ ├── serving.cpython-312.pyc
│ │ │ │ ├── test.cpython-312.pyc
│ │ │ │ ├── testapp.cpython-312.pyc
│ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ ├── user_agent.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── wsgi.cpython-312.pyc
│ │ │ ├── _internal.py
│ │ │ ├── _reloader.py
│ │ │ ├── datastructures
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── accept.cpython-312.pyc
│ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ ├── cache_control.cpython-312.pyc
│ │ │ │ │ ├── csp.cpython-312.pyc
│ │ │ │ │ ├── etag.cpython-312.pyc
│ │ │ │ │ ├── file_storage.cpython-312.pyc
│ │ │ │ │ ├── headers.cpython-312.pyc
│ │ │ │ │ ├── mixins.cpython-312.pyc
│ │ │ │ │ ├── range.cpython-312.pyc
│ │ │ │ │ └── structures.cpython-312.pyc
│ │ │ │ ├── accept.py
│ │ │ │ ├── accept.pyi
│ │ │ │ ├── auth.py
│ │ │ │ ├── cache_control.py
│ │ │ │ ├── cache_control.pyi
│ │ │ │ ├── csp.py
│ │ │ │ ├── csp.pyi
│ │ │ │ ├── etag.py
│ │ │ │ ├── etag.pyi
│ │ │ │ ├── file_storage.py
│ │ │ │ ├── file_storage.pyi
│ │ │ │ ├── headers.py
│ │ │ │ ├── headers.pyi
│ │ │ │ ├── mixins.py
│ │ │ │ ├── mixins.pyi
│ │ │ │ ├── range.py
│ │ │ │ ├── range.pyi
│ │ │ │ ├── structures.py
│ │ │ │ └── structures.pyi
│ │ │ ├── debug
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ └── tbtools.cpython-312.pyc
│ │ │ │ ├── console.py
│ │ │ │ ├── repr.py
│ │ │ │ ├── shared
│ │ │ │ │ ├── console.png
│ │ │ │ │ ├── debugger.js
│ │ │ │ │ ├── ICON_LICENSE.md
│ │ │ │ │ ├── less.png
│ │ │ │ │ ├── more.png
│ │ │ │ │ └── style.css
│ │ │ │ └── tbtools.py
│ │ │ ├── exceptions.py
│ │ │ ├── formparser.py
│ │ │ ├── http.py
│ │ │ ├── local.py
│ │ │ ├── middleware
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── dispatcher.cpython-312.pyc
│ │ │ │ │ ├── http_proxy.cpython-312.pyc
│ │ │ │ │ ├── lint.cpython-312.pyc
│ │ │ │ │ ├── profiler.cpython-312.pyc
│ │ │ │ │ ├── proxy_fix.cpython-312.pyc
│ │ │ │ │ └── shared_data.cpython-312.pyc
│ │ │ │ ├── dispatcher.py
│ │ │ │ ├── http_proxy.py
│ │ │ │ ├── lint.py
│ │ │ │ ├── profiler.py
│ │ │ │ ├── proxy_fix.py
│ │ │ │ └── shared_data.py
│ │ │ ├── py.typed
│ │ │ ├── routing
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── converters.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── map.cpython-312.pyc
│ │ │ │ │ ├── matcher.cpython-312.pyc
│ │ │ │ │ └── rules.cpython-312.pyc
│ │ │ │ ├── converters.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── map.py
│ │ │ │ ├── matcher.py
│ │ │ │ └── rules.py
│ │ │ ├── sansio
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ │ ├── multipart.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ ├── http.py
│ │ │ │ ├── multipart.py
│ │ │ │ ├── request.py
│ │ │ │ ├── response.py
│ │ │ │ └── utils.py
│ │ │ ├── security.py
│ │ │ ├── serving.py
│ │ │ ├── test.py
│ │ │ ├── testapp.py
│ │ │ ├── urls.py
│ │ │ ├── user_agent.py
│ │ │ ├── utils.py
│ │ │ ├── wrappers
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ ├── request.py
│ │ │ │ └── response.py
│ │ │ └── wsgi.py
│ │ └── werkzeug-3.0.4.dist-info
│ │ ├── INSTALLER
│ │ ├── LICENSE.txt
│ │ ├── METADATA
│ │ ├── RECORD
│ │ └── WHEEL
│ ├── pyvenv.cfg
│ ├── static
│ │ └── styles.css
│ ├── templates
│ │ └── index.html
│ └── test.py
├── cline_config.json
├── mcp_server.py
├── README.md
├── search_results.json
├── settings.json
└── test_files
├── text1.txt
└── text2.txt
```
# Files
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py:
--------------------------------------------------------------------------------
```python
1 | """Unix."""
2 |
3 | from __future__ import annotations
4 |
5 | import os
6 | import sys
7 | from configparser import ConfigParser
8 | from pathlib import Path
9 | from typing import Iterator, NoReturn
10 |
11 | from .api import PlatformDirsABC
12 |
13 | if sys.platform == "win32":
14 |
15 | def getuid() -> NoReturn:
16 | msg = "should only be used on Unix"
17 | raise RuntimeError(msg)
18 |
19 | else:
20 | from os import getuid
21 |
22 |
23 | class Unix(PlatformDirsABC): # noqa: PLR0904
24 | """
25 | On Unix/Linux, we follow the `XDG Basedir Spec <https://specifications.freedesktop.org/basedir-spec/basedir-spec-
26 | latest.html>`_.
27 |
28 | The spec allows overriding directories with environment variables. The examples shown are the default values,
29 | alongside the name of the environment variable that overrides them. Makes use of the `appname
30 | <platformdirs.api.PlatformDirsABC.appname>`, `version <platformdirs.api.PlatformDirsABC.version>`, `multipath
31 | <platformdirs.api.PlatformDirsABC.multipath>`, `opinion <platformdirs.api.PlatformDirsABC.opinion>`, `ensure_exists
32 | <platformdirs.api.PlatformDirsABC.ensure_exists>`.
33 |
34 | """
35 |
36 | @property
37 | def user_data_dir(self) -> str:
38 | """
39 | :return: data directory tied to the user, e.g. ``~/.local/share/$appname/$version`` or
40 | ``$XDG_DATA_HOME/$appname/$version``
41 | """
42 | path = os.environ.get("XDG_DATA_HOME", "")
43 | if not path.strip():
44 | path = os.path.expanduser("~/.local/share") # noqa: PTH111
45 | return self._append_app_name_and_version(path)
46 |
47 | @property
48 | def _site_data_dirs(self) -> list[str]:
49 | path = os.environ.get("XDG_DATA_DIRS", "")
50 | if not path.strip():
51 | path = f"/usr/local/share{os.pathsep}/usr/share"
52 | return [self._append_app_name_and_version(p) for p in path.split(os.pathsep)]
53 |
54 | @property
55 | def site_data_dir(self) -> str:
56 | """
57 | :return: data directories shared by users (if `multipath <platformdirs.api.PlatformDirsABC.multipath>` is
58 | enabled and ``XDG_DATA_DIRS`` is set and a multi path the response is also a multi path separated by the
59 | OS path separator), e.g. ``/usr/local/share/$appname/$version`` or ``/usr/share/$appname/$version``
60 | """
61 | # XDG default for $XDG_DATA_DIRS; only first, if multipath is False
62 | dirs = self._site_data_dirs
63 | if not self.multipath:
64 | return dirs[0]
65 | return os.pathsep.join(dirs)
66 |
67 | @property
68 | def user_config_dir(self) -> str:
69 | """
70 | :return: config directory tied to the user, e.g. ``~/.config/$appname/$version`` or
71 | ``$XDG_CONFIG_HOME/$appname/$version``
72 | """
73 | path = os.environ.get("XDG_CONFIG_HOME", "")
74 | if not path.strip():
75 | path = os.path.expanduser("~/.config") # noqa: PTH111
76 | return self._append_app_name_and_version(path)
77 |
78 | @property
79 | def _site_config_dirs(self) -> list[str]:
80 | path = os.environ.get("XDG_CONFIG_DIRS", "")
81 | if not path.strip():
82 | path = "/etc/xdg"
83 | return [self._append_app_name_and_version(p) for p in path.split(os.pathsep)]
84 |
85 | @property
86 | def site_config_dir(self) -> str:
87 | """
88 | :return: config directories shared by users (if `multipath <platformdirs.api.PlatformDirsABC.multipath>`
89 | is enabled and ``XDG_CONFIG_DIRS`` is set and a multi path the response is also a multi path separated by
90 | the OS path separator), e.g. ``/etc/xdg/$appname/$version``
91 | """
92 | # XDG default for $XDG_CONFIG_DIRS only first, if multipath is False
93 | dirs = self._site_config_dirs
94 | if not self.multipath:
95 | return dirs[0]
96 | return os.pathsep.join(dirs)
97 |
98 | @property
99 | def user_cache_dir(self) -> str:
100 | """
101 | :return: cache directory tied to the user, e.g. ``~/.cache/$appname/$version`` or
102 | ``~/$XDG_CACHE_HOME/$appname/$version``
103 | """
104 | path = os.environ.get("XDG_CACHE_HOME", "")
105 | if not path.strip():
106 | path = os.path.expanduser("~/.cache") # noqa: PTH111
107 | return self._append_app_name_and_version(path)
108 |
109 | @property
110 | def site_cache_dir(self) -> str:
111 | """:return: cache directory shared by users, e.g. ``/var/cache/$appname/$version``"""
112 | return self._append_app_name_and_version("/var/cache")
113 |
114 | @property
115 | def user_state_dir(self) -> str:
116 | """
117 | :return: state directory tied to the user, e.g. ``~/.local/state/$appname/$version`` or
118 | ``$XDG_STATE_HOME/$appname/$version``
119 | """
120 | path = os.environ.get("XDG_STATE_HOME", "")
121 | if not path.strip():
122 | path = os.path.expanduser("~/.local/state") # noqa: PTH111
123 | return self._append_app_name_and_version(path)
124 |
125 | @property
126 | def user_log_dir(self) -> str:
127 | """:return: log directory tied to the user, same as `user_state_dir` if not opinionated else ``log`` in it"""
128 | path = self.user_state_dir
129 | if self.opinion:
130 | path = os.path.join(path, "log") # noqa: PTH118
131 | self._optionally_create_directory(path)
132 | return path
133 |
134 | @property
135 | def user_documents_dir(self) -> str:
136 | """:return: documents directory tied to the user, e.g. ``~/Documents``"""
137 | return _get_user_media_dir("XDG_DOCUMENTS_DIR", "~/Documents")
138 |
139 | @property
140 | def user_downloads_dir(self) -> str:
141 | """:return: downloads directory tied to the user, e.g. ``~/Downloads``"""
142 | return _get_user_media_dir("XDG_DOWNLOAD_DIR", "~/Downloads")
143 |
144 | @property
145 | def user_pictures_dir(self) -> str:
146 | """:return: pictures directory tied to the user, e.g. ``~/Pictures``"""
147 | return _get_user_media_dir("XDG_PICTURES_DIR", "~/Pictures")
148 |
149 | @property
150 | def user_videos_dir(self) -> str:
151 | """:return: videos directory tied to the user, e.g. ``~/Videos``"""
152 | return _get_user_media_dir("XDG_VIDEOS_DIR", "~/Videos")
153 |
154 | @property
155 | def user_music_dir(self) -> str:
156 | """:return: music directory tied to the user, e.g. ``~/Music``"""
157 | return _get_user_media_dir("XDG_MUSIC_DIR", "~/Music")
158 |
159 | @property
160 | def user_desktop_dir(self) -> str:
161 | """:return: desktop directory tied to the user, e.g. ``~/Desktop``"""
162 | return _get_user_media_dir("XDG_DESKTOP_DIR", "~/Desktop")
163 |
164 | @property
165 | def user_runtime_dir(self) -> str:
166 | """
167 | :return: runtime directory tied to the user, e.g. ``/run/user/$(id -u)/$appname/$version`` or
168 | ``$XDG_RUNTIME_DIR/$appname/$version``.
169 |
170 | For FreeBSD/OpenBSD/NetBSD, it would return ``/var/run/user/$(id -u)/$appname/$version`` if
171 | exists, otherwise ``/tmp/runtime-$(id -u)/$appname/$version``, if``$XDG_RUNTIME_DIR``
172 | is not set.
173 | """
174 | path = os.environ.get("XDG_RUNTIME_DIR", "")
175 | if not path.strip():
176 | if sys.platform.startswith(("freebsd", "openbsd", "netbsd")):
177 | path = f"/var/run/user/{getuid()}"
178 | if not Path(path).exists():
179 | path = f"/tmp/runtime-{getuid()}" # noqa: S108
180 | else:
181 | path = f"/run/user/{getuid()}"
182 | return self._append_app_name_and_version(path)
183 |
184 | @property
185 | def site_runtime_dir(self) -> str:
186 | """
187 | :return: runtime directory shared by users, e.g. ``/run/$appname/$version`` or \
188 | ``$XDG_RUNTIME_DIR/$appname/$version``.
189 |
190 | Note that this behaves almost exactly like `user_runtime_dir` if ``$XDG_RUNTIME_DIR`` is set, but will
191 | fall back to paths associated to the root user instead of a regular logged-in user if it's not set.
192 |
193 | If you wish to ensure that a logged-in root user path is returned e.g. ``/run/user/0``, use `user_runtime_dir`
194 | instead.
195 |
196 | For FreeBSD/OpenBSD/NetBSD, it would return ``/var/run/$appname/$version`` if ``$XDG_RUNTIME_DIR`` is not set.
197 | """
198 | path = os.environ.get("XDG_RUNTIME_DIR", "")
199 | if not path.strip():
200 | if sys.platform.startswith(("freebsd", "openbsd", "netbsd")):
201 | path = "/var/run"
202 | else:
203 | path = "/run"
204 | return self._append_app_name_and_version(path)
205 |
206 | @property
207 | def site_data_path(self) -> Path:
208 | """:return: data path shared by users. Only return the first item, even if ``multipath`` is set to ``True``"""
209 | return self._first_item_as_path_if_multipath(self.site_data_dir)
210 |
211 | @property
212 | def site_config_path(self) -> Path:
213 | """:return: config path shared by the users, returns the first item, even if ``multipath`` is set to ``True``"""
214 | return self._first_item_as_path_if_multipath(self.site_config_dir)
215 |
216 | @property
217 | def site_cache_path(self) -> Path:
218 | """:return: cache path shared by users. Only return the first item, even if ``multipath`` is set to ``True``"""
219 | return self._first_item_as_path_if_multipath(self.site_cache_dir)
220 |
221 | def _first_item_as_path_if_multipath(self, directory: str) -> Path:
222 | if self.multipath:
223 | # If multipath is True, the first path is returned.
224 | directory = directory.split(os.pathsep)[0]
225 | return Path(directory)
226 |
227 | def iter_config_dirs(self) -> Iterator[str]:
228 | """:yield: all user and site configuration directories."""
229 | yield self.user_config_dir
230 | yield from self._site_config_dirs
231 |
232 | def iter_data_dirs(self) -> Iterator[str]:
233 | """:yield: all user and site data directories."""
234 | yield self.user_data_dir
235 | yield from self._site_data_dirs
236 |
237 |
238 | def _get_user_media_dir(env_var: str, fallback_tilde_path: str) -> str:
239 | media_dir = _get_user_dirs_folder(env_var)
240 | if media_dir is None:
241 | media_dir = os.environ.get(env_var, "").strip()
242 | if not media_dir:
243 | media_dir = os.path.expanduser(fallback_tilde_path) # noqa: PTH111
244 |
245 | return media_dir
246 |
247 |
248 | def _get_user_dirs_folder(key: str) -> str | None:
249 | """
250 | Return directory from user-dirs.dirs config file.
251 |
252 | See https://freedesktop.org/wiki/Software/xdg-user-dirs/.
253 |
254 | """
255 | user_dirs_config_path = Path(Unix().user_config_dir) / "user-dirs.dirs"
256 | if user_dirs_config_path.exists():
257 | parser = ConfigParser()
258 |
259 | with user_dirs_config_path.open() as stream:
260 | # Add fake section header, so ConfigParser doesn't complain
261 | parser.read_string(f"[top]\n{stream.read()}")
262 |
263 | if key not in parser["top"]:
264 | return None
265 |
266 | path = parser["top"][key].strip('"')
267 | # Handle relative home paths
268 | return path.replace("$HOME", os.path.expanduser("~")) # noqa: PTH111
269 |
270 | return None
271 |
272 |
273 | __all__ = [
274 | "Unix",
275 | ]
276 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py:
--------------------------------------------------------------------------------
```python
1 | # This file is dual licensed under the terms of the Apache License, Version
2 | # 2.0, and the BSD License. See the LICENSE file in the root of this repository
3 | # for complete details.
4 |
5 | from __future__ import annotations
6 |
7 | import operator
8 | import os
9 | import platform
10 | import sys
11 | from typing import Any, Callable, TypedDict, cast
12 |
13 | from ._parser import MarkerAtom, MarkerList, Op, Value, Variable
14 | from ._parser import parse_marker as _parse_marker
15 | from ._tokenizer import ParserSyntaxError
16 | from .specifiers import InvalidSpecifier, Specifier
17 | from .utils import canonicalize_name
18 |
19 | __all__ = [
20 | "InvalidMarker",
21 | "UndefinedComparison",
22 | "UndefinedEnvironmentName",
23 | "Marker",
24 | "default_environment",
25 | ]
26 |
27 | Operator = Callable[[str, str], bool]
28 |
29 |
30 | class InvalidMarker(ValueError):
31 | """
32 | An invalid marker was found, users should refer to PEP 508.
33 | """
34 |
35 |
36 | class UndefinedComparison(ValueError):
37 | """
38 | An invalid operation was attempted on a value that doesn't support it.
39 | """
40 |
41 |
42 | class UndefinedEnvironmentName(ValueError):
43 | """
44 | A name was attempted to be used that does not exist inside of the
45 | environment.
46 | """
47 |
48 |
49 | class Environment(TypedDict):
50 | implementation_name: str
51 | """The implementation's identifier, e.g. ``'cpython'``."""
52 |
53 | implementation_version: str
54 | """
55 | The implementation's version, e.g. ``'3.13.0a2'`` for CPython 3.13.0a2, or
56 | ``'7.3.13'`` for PyPy3.10 v7.3.13.
57 | """
58 |
59 | os_name: str
60 | """
61 | The value of :py:data:`os.name`. The name of the operating system dependent module
62 | imported, e.g. ``'posix'``.
63 | """
64 |
65 | platform_machine: str
66 | """
67 | Returns the machine type, e.g. ``'i386'``.
68 |
69 | An empty string if the value cannot be determined.
70 | """
71 |
72 | platform_release: str
73 | """
74 | The system's release, e.g. ``'2.2.0'`` or ``'NT'``.
75 |
76 | An empty string if the value cannot be determined.
77 | """
78 |
79 | platform_system: str
80 | """
81 | The system/OS name, e.g. ``'Linux'``, ``'Windows'`` or ``'Java'``.
82 |
83 | An empty string if the value cannot be determined.
84 | """
85 |
86 | platform_version: str
87 | """
88 | The system's release version, e.g. ``'#3 on degas'``.
89 |
90 | An empty string if the value cannot be determined.
91 | """
92 |
93 | python_full_version: str
94 | """
95 | The Python version as string ``'major.minor.patchlevel'``.
96 |
97 | Note that unlike the Python :py:data:`sys.version`, this value will always include
98 | the patchlevel (it defaults to 0).
99 | """
100 |
101 | platform_python_implementation: str
102 | """
103 | A string identifying the Python implementation, e.g. ``'CPython'``.
104 | """
105 |
106 | python_version: str
107 | """The Python version as string ``'major.minor'``."""
108 |
109 | sys_platform: str
110 | """
111 | This string contains a platform identifier that can be used to append
112 | platform-specific components to :py:data:`sys.path`, for instance.
113 |
114 | For Unix systems, except on Linux and AIX, this is the lowercased OS name as
115 | returned by ``uname -s`` with the first part of the version as returned by
116 | ``uname -r`` appended, e.g. ``'sunos5'`` or ``'freebsd8'``, at the time when Python
117 | was built.
118 | """
119 |
120 |
121 | def _normalize_extra_values(results: Any) -> Any:
122 | """
123 | Normalize extra values.
124 | """
125 | if isinstance(results[0], tuple):
126 | lhs, op, rhs = results[0]
127 | if isinstance(lhs, Variable) and lhs.value == "extra":
128 | normalized_extra = canonicalize_name(rhs.value)
129 | rhs = Value(normalized_extra)
130 | elif isinstance(rhs, Variable) and rhs.value == "extra":
131 | normalized_extra = canonicalize_name(lhs.value)
132 | lhs = Value(normalized_extra)
133 | results[0] = lhs, op, rhs
134 | return results
135 |
136 |
137 | def _format_marker(
138 | marker: list[str] | MarkerAtom | str, first: bool | None = True
139 | ) -> str:
140 | assert isinstance(marker, (list, tuple, str))
141 |
142 | # Sometimes we have a structure like [[...]] which is a single item list
143 | # where the single item is itself it's own list. In that case we want skip
144 | # the rest of this function so that we don't get extraneous () on the
145 | # outside.
146 | if (
147 | isinstance(marker, list)
148 | and len(marker) == 1
149 | and isinstance(marker[0], (list, tuple))
150 | ):
151 | return _format_marker(marker[0])
152 |
153 | if isinstance(marker, list):
154 | inner = (_format_marker(m, first=False) for m in marker)
155 | if first:
156 | return " ".join(inner)
157 | else:
158 | return "(" + " ".join(inner) + ")"
159 | elif isinstance(marker, tuple):
160 | return " ".join([m.serialize() for m in marker])
161 | else:
162 | return marker
163 |
164 |
165 | _operators: dict[str, Operator] = {
166 | "in": lambda lhs, rhs: lhs in rhs,
167 | "not in": lambda lhs, rhs: lhs not in rhs,
168 | "<": operator.lt,
169 | "<=": operator.le,
170 | "==": operator.eq,
171 | "!=": operator.ne,
172 | ">=": operator.ge,
173 | ">": operator.gt,
174 | }
175 |
176 |
177 | def _eval_op(lhs: str, op: Op, rhs: str) -> bool:
178 | try:
179 | spec = Specifier("".join([op.serialize(), rhs]))
180 | except InvalidSpecifier:
181 | pass
182 | else:
183 | return spec.contains(lhs, prereleases=True)
184 |
185 | oper: Operator | None = _operators.get(op.serialize())
186 | if oper is None:
187 | raise UndefinedComparison(f"Undefined {op!r} on {lhs!r} and {rhs!r}.")
188 |
189 | return oper(lhs, rhs)
190 |
191 |
192 | def _normalize(*values: str, key: str) -> tuple[str, ...]:
193 | # PEP 685 – Comparison of extra names for optional distribution dependencies
194 | # https://peps.python.org/pep-0685/
195 | # > When comparing extra names, tools MUST normalize the names being
196 | # > compared using the semantics outlined in PEP 503 for names
197 | if key == "extra":
198 | return tuple(canonicalize_name(v) for v in values)
199 |
200 | # other environment markers don't have such standards
201 | return values
202 |
203 |
204 | def _evaluate_markers(markers: MarkerList, environment: dict[str, str]) -> bool:
205 | groups: list[list[bool]] = [[]]
206 |
207 | for marker in markers:
208 | assert isinstance(marker, (list, tuple, str))
209 |
210 | if isinstance(marker, list):
211 | groups[-1].append(_evaluate_markers(marker, environment))
212 | elif isinstance(marker, tuple):
213 | lhs, op, rhs = marker
214 |
215 | if isinstance(lhs, Variable):
216 | environment_key = lhs.value
217 | lhs_value = environment[environment_key]
218 | rhs_value = rhs.value
219 | else:
220 | lhs_value = lhs.value
221 | environment_key = rhs.value
222 | rhs_value = environment[environment_key]
223 |
224 | lhs_value, rhs_value = _normalize(lhs_value, rhs_value, key=environment_key)
225 | groups[-1].append(_eval_op(lhs_value, op, rhs_value))
226 | else:
227 | assert marker in ["and", "or"]
228 | if marker == "or":
229 | groups.append([])
230 |
231 | return any(all(item) for item in groups)
232 |
233 |
234 | def format_full_version(info: sys._version_info) -> str:
235 | version = "{0.major}.{0.minor}.{0.micro}".format(info)
236 | kind = info.releaselevel
237 | if kind != "final":
238 | version += kind[0] + str(info.serial)
239 | return version
240 |
241 |
242 | def default_environment() -> Environment:
243 | iver = format_full_version(sys.implementation.version)
244 | implementation_name = sys.implementation.name
245 | return {
246 | "implementation_name": implementation_name,
247 | "implementation_version": iver,
248 | "os_name": os.name,
249 | "platform_machine": platform.machine(),
250 | "platform_release": platform.release(),
251 | "platform_system": platform.system(),
252 | "platform_version": platform.version(),
253 | "python_full_version": platform.python_version(),
254 | "platform_python_implementation": platform.python_implementation(),
255 | "python_version": ".".join(platform.python_version_tuple()[:2]),
256 | "sys_platform": sys.platform,
257 | }
258 |
259 |
260 | class Marker:
261 | def __init__(self, marker: str) -> None:
262 | # Note: We create a Marker object without calling this constructor in
263 | # packaging.requirements.Requirement. If any additional logic is
264 | # added here, make sure to mirror/adapt Requirement.
265 | try:
266 | self._markers = _normalize_extra_values(_parse_marker(marker))
267 | # The attribute `_markers` can be described in terms of a recursive type:
268 | # MarkerList = List[Union[Tuple[Node, ...], str, MarkerList]]
269 | #
270 | # For example, the following expression:
271 | # python_version > "3.6" or (python_version == "3.6" and os_name == "unix")
272 | #
273 | # is parsed into:
274 | # [
275 | # (<Variable('python_version')>, <Op('>')>, <Value('3.6')>),
276 | # 'and',
277 | # [
278 | # (<Variable('python_version')>, <Op('==')>, <Value('3.6')>),
279 | # 'or',
280 | # (<Variable('os_name')>, <Op('==')>, <Value('unix')>)
281 | # ]
282 | # ]
283 | except ParserSyntaxError as e:
284 | raise InvalidMarker(str(e)) from e
285 |
286 | def __str__(self) -> str:
287 | return _format_marker(self._markers)
288 |
289 | def __repr__(self) -> str:
290 | return f"<Marker('{self}')>"
291 |
292 | def __hash__(self) -> int:
293 | return hash((self.__class__.__name__, str(self)))
294 |
295 | def __eq__(self, other: Any) -> bool:
296 | if not isinstance(other, Marker):
297 | return NotImplemented
298 |
299 | return str(self) == str(other)
300 |
301 | def evaluate(self, environment: dict[str, str] | None = None) -> bool:
302 | """Evaluate a marker.
303 |
304 | Return the boolean from evaluating the given marker against the
305 | environment. environment is an optional argument to override all or
306 | part of the determined environment.
307 |
308 | The environment is determined from the current Python process.
309 | """
310 | current_environment = cast("dict[str, str]", default_environment())
311 | current_environment["extra"] = ""
312 | # Work around platform.python_version() returning something that is not PEP 440
313 | # compliant for non-tagged Python builds. We preserve default_environment()'s
314 | # behavior of returning platform.python_version() verbatim, and leave it to the
315 | # caller to provide a syntactically valid version if they want to override it.
316 | if current_environment["python_full_version"].endswith("+"):
317 | current_environment["python_full_version"] += "local"
318 | if environment is not None:
319 | current_environment.update(environment)
320 | # The API used to allow setting extra to None. We need to handle this
321 | # case for backwards compatibility.
322 | if current_environment["extra"] is None:
323 | current_environment["extra"] = ""
324 |
325 | return _evaluate_markers(self._markers, current_environment)
326 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/werkzeug/datastructures/accept.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import codecs
4 | import re
5 |
6 | from .structures import ImmutableList
7 |
8 |
9 | class Accept(ImmutableList):
10 | """An :class:`Accept` object is just a list subclass for lists of
11 | ``(value, quality)`` tuples. It is automatically sorted by specificity
12 | and quality.
13 |
14 | All :class:`Accept` objects work similar to a list but provide extra
15 | functionality for working with the data. Containment checks are
16 | normalized to the rules of that header:
17 |
18 | >>> a = CharsetAccept([('ISO-8859-1', 1), ('utf-8', 0.7)])
19 | >>> a.best
20 | 'ISO-8859-1'
21 | >>> 'iso-8859-1' in a
22 | True
23 | >>> 'UTF8' in a
24 | True
25 | >>> 'utf7' in a
26 | False
27 |
28 | To get the quality for an item you can use normal item lookup:
29 |
30 | >>> print a['utf-8']
31 | 0.7
32 | >>> a['utf7']
33 | 0
34 |
35 | .. versionchanged:: 0.5
36 | :class:`Accept` objects are forced immutable now.
37 |
38 | .. versionchanged:: 1.0.0
39 | :class:`Accept` internal values are no longer ordered
40 | alphabetically for equal quality tags. Instead the initial
41 | order is preserved.
42 |
43 | """
44 |
45 | def __init__(self, values=()):
46 | if values is None:
47 | list.__init__(self)
48 | self.provided = False
49 | elif isinstance(values, Accept):
50 | self.provided = values.provided
51 | list.__init__(self, values)
52 | else:
53 | self.provided = True
54 | values = sorted(
55 | values, key=lambda x: (self._specificity(x[0]), x[1]), reverse=True
56 | )
57 | list.__init__(self, values)
58 |
59 | def _specificity(self, value):
60 | """Returns a tuple describing the value's specificity."""
61 | return (value != "*",)
62 |
63 | def _value_matches(self, value, item):
64 | """Check if a value matches a given accept item."""
65 | return item == "*" or item.lower() == value.lower()
66 |
67 | def __getitem__(self, key):
68 | """Besides index lookup (getting item n) you can also pass it a string
69 | to get the quality for the item. If the item is not in the list, the
70 | returned quality is ``0``.
71 | """
72 | if isinstance(key, str):
73 | return self.quality(key)
74 | return list.__getitem__(self, key)
75 |
76 | def quality(self, key):
77 | """Returns the quality of the key.
78 |
79 | .. versionadded:: 0.6
80 | In previous versions you had to use the item-lookup syntax
81 | (eg: ``obj[key]`` instead of ``obj.quality(key)``)
82 | """
83 | for item, quality in self:
84 | if self._value_matches(key, item):
85 | return quality
86 | return 0
87 |
88 | def __contains__(self, value):
89 | for item, _quality in self:
90 | if self._value_matches(value, item):
91 | return True
92 | return False
93 |
94 | def __repr__(self):
95 | pairs_str = ", ".join(f"({x!r}, {y})" for x, y in self)
96 | return f"{type(self).__name__}([{pairs_str}])"
97 |
98 | def index(self, key):
99 | """Get the position of an entry or raise :exc:`ValueError`.
100 |
101 | :param key: The key to be looked up.
102 |
103 | .. versionchanged:: 0.5
104 | This used to raise :exc:`IndexError`, which was inconsistent
105 | with the list API.
106 | """
107 | if isinstance(key, str):
108 | for idx, (item, _quality) in enumerate(self):
109 | if self._value_matches(key, item):
110 | return idx
111 | raise ValueError(key)
112 | return list.index(self, key)
113 |
114 | def find(self, key):
115 | """Get the position of an entry or return -1.
116 |
117 | :param key: The key to be looked up.
118 | """
119 | try:
120 | return self.index(key)
121 | except ValueError:
122 | return -1
123 |
124 | def values(self):
125 | """Iterate over all values."""
126 | for item in self:
127 | yield item[0]
128 |
129 | def to_header(self):
130 | """Convert the header set into an HTTP header string."""
131 | result = []
132 | for value, quality in self:
133 | if quality != 1:
134 | value = f"{value};q={quality}"
135 | result.append(value)
136 | return ",".join(result)
137 |
138 | def __str__(self):
139 | return self.to_header()
140 |
141 | def _best_single_match(self, match):
142 | for client_item, quality in self:
143 | if self._value_matches(match, client_item):
144 | # self is sorted by specificity descending, we can exit
145 | return client_item, quality
146 | return None
147 |
148 | def best_match(self, matches, default=None):
149 | """Returns the best match from a list of possible matches based
150 | on the specificity and quality of the client. If two items have the
151 | same quality and specificity, the one is returned that comes first.
152 |
153 | :param matches: a list of matches to check for
154 | :param default: the value that is returned if none match
155 | """
156 | result = default
157 | best_quality = -1
158 | best_specificity = (-1,)
159 | for server_item in matches:
160 | match = self._best_single_match(server_item)
161 | if not match:
162 | continue
163 | client_item, quality = match
164 | specificity = self._specificity(client_item)
165 | if quality <= 0 or quality < best_quality:
166 | continue
167 | # better quality or same quality but more specific => better match
168 | if quality > best_quality or specificity > best_specificity:
169 | result = server_item
170 | best_quality = quality
171 | best_specificity = specificity
172 | return result
173 |
174 | @property
175 | def best(self):
176 | """The best match as value."""
177 | if self:
178 | return self[0][0]
179 |
180 |
181 | _mime_split_re = re.compile(r"/|(?:\s*;\s*)")
182 |
183 |
184 | def _normalize_mime(value):
185 | return _mime_split_re.split(value.lower())
186 |
187 |
188 | class MIMEAccept(Accept):
189 | """Like :class:`Accept` but with special methods and behavior for
190 | mimetypes.
191 | """
192 |
193 | def _specificity(self, value):
194 | return tuple(x != "*" for x in _mime_split_re.split(value))
195 |
196 | def _value_matches(self, value, item):
197 | # item comes from the client, can't match if it's invalid.
198 | if "/" not in item:
199 | return False
200 |
201 | # value comes from the application, tell the developer when it
202 | # doesn't look valid.
203 | if "/" not in value:
204 | raise ValueError(f"invalid mimetype {value!r}")
205 |
206 | # Split the match value into type, subtype, and a sorted list of parameters.
207 | normalized_value = _normalize_mime(value)
208 | value_type, value_subtype = normalized_value[:2]
209 | value_params = sorted(normalized_value[2:])
210 |
211 | # "*/*" is the only valid value that can start with "*".
212 | if value_type == "*" and value_subtype != "*":
213 | raise ValueError(f"invalid mimetype {value!r}")
214 |
215 | # Split the accept item into type, subtype, and parameters.
216 | normalized_item = _normalize_mime(item)
217 | item_type, item_subtype = normalized_item[:2]
218 | item_params = sorted(normalized_item[2:])
219 |
220 | # "*/not-*" from the client is invalid, can't match.
221 | if item_type == "*" and item_subtype != "*":
222 | return False
223 |
224 | return (
225 | (item_type == "*" and item_subtype == "*")
226 | or (value_type == "*" and value_subtype == "*")
227 | ) or (
228 | item_type == value_type
229 | and (
230 | item_subtype == "*"
231 | or value_subtype == "*"
232 | or (item_subtype == value_subtype and item_params == value_params)
233 | )
234 | )
235 |
236 | @property
237 | def accept_html(self):
238 | """True if this object accepts HTML."""
239 | return (
240 | "text/html" in self or "application/xhtml+xml" in self or self.accept_xhtml
241 | )
242 |
243 | @property
244 | def accept_xhtml(self):
245 | """True if this object accepts XHTML."""
246 | return "application/xhtml+xml" in self or "application/xml" in self
247 |
248 | @property
249 | def accept_json(self):
250 | """True if this object accepts JSON."""
251 | return "application/json" in self
252 |
253 |
254 | _locale_delim_re = re.compile(r"[_-]")
255 |
256 |
257 | def _normalize_lang(value):
258 | """Process a language tag for matching."""
259 | return _locale_delim_re.split(value.lower())
260 |
261 |
262 | class LanguageAccept(Accept):
263 | """Like :class:`Accept` but with normalization for language tags."""
264 |
265 | def _value_matches(self, value, item):
266 | return item == "*" or _normalize_lang(value) == _normalize_lang(item)
267 |
268 | def best_match(self, matches, default=None):
269 | """Given a list of supported values, finds the best match from
270 | the list of accepted values.
271 |
272 | Language tags are normalized for the purpose of matching, but
273 | are returned unchanged.
274 |
275 | If no exact match is found, this will fall back to matching
276 | the first subtag (primary language only), first with the
277 | accepted values then with the match values. This partial is not
278 | applied to any other language subtags.
279 |
280 | The default is returned if no exact or fallback match is found.
281 |
282 | :param matches: A list of supported languages to find a match.
283 | :param default: The value that is returned if none match.
284 | """
285 | # Look for an exact match first. If a client accepts "en-US",
286 | # "en-US" is a valid match at this point.
287 | result = super().best_match(matches)
288 |
289 | if result is not None:
290 | return result
291 |
292 | # Fall back to accepting primary tags. If a client accepts
293 | # "en-US", "en" is a valid match at this point. Need to use
294 | # re.split to account for 2 or 3 letter codes.
295 | fallback = Accept(
296 | [(_locale_delim_re.split(item[0], 1)[0], item[1]) for item in self]
297 | )
298 | result = fallback.best_match(matches)
299 |
300 | if result is not None:
301 | return result
302 |
303 | # Fall back to matching primary tags. If the client accepts
304 | # "en", "en-US" is a valid match at this point.
305 | fallback_matches = [_locale_delim_re.split(item, 1)[0] for item in matches]
306 | result = super().best_match(fallback_matches)
307 |
308 | # Return a value from the original match list. Find the first
309 | # original value that starts with the matched primary tag.
310 | if result is not None:
311 | return next(item for item in matches if item.startswith(result))
312 |
313 | return default
314 |
315 |
316 | class CharsetAccept(Accept):
317 | """Like :class:`Accept` but with normalization for charsets."""
318 |
319 | def _value_matches(self, value, item):
320 | def _normalize(name):
321 | try:
322 | return codecs.lookup(name).name
323 | except LookupError:
324 | return name.lower()
325 |
326 | return item == "*" or _normalize(value) == _normalize(item)
327 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/jinja2/idtracking.py:
--------------------------------------------------------------------------------
```python
1 | import typing as t
2 |
3 | from . import nodes
4 | from .visitor import NodeVisitor
5 |
6 | VAR_LOAD_PARAMETER = "param"
7 | VAR_LOAD_RESOLVE = "resolve"
8 | VAR_LOAD_ALIAS = "alias"
9 | VAR_LOAD_UNDEFINED = "undefined"
10 |
11 |
12 | def find_symbols(
13 | nodes: t.Iterable[nodes.Node], parent_symbols: t.Optional["Symbols"] = None
14 | ) -> "Symbols":
15 | sym = Symbols(parent=parent_symbols)
16 | visitor = FrameSymbolVisitor(sym)
17 | for node in nodes:
18 | visitor.visit(node)
19 | return sym
20 |
21 |
22 | def symbols_for_node(
23 | node: nodes.Node, parent_symbols: t.Optional["Symbols"] = None
24 | ) -> "Symbols":
25 | sym = Symbols(parent=parent_symbols)
26 | sym.analyze_node(node)
27 | return sym
28 |
29 |
30 | class Symbols:
31 | def __init__(
32 | self, parent: t.Optional["Symbols"] = None, level: t.Optional[int] = None
33 | ) -> None:
34 | if level is None:
35 | if parent is None:
36 | level = 0
37 | else:
38 | level = parent.level + 1
39 |
40 | self.level: int = level
41 | self.parent = parent
42 | self.refs: t.Dict[str, str] = {}
43 | self.loads: t.Dict[str, t.Any] = {}
44 | self.stores: t.Set[str] = set()
45 |
46 | def analyze_node(self, node: nodes.Node, **kwargs: t.Any) -> None:
47 | visitor = RootVisitor(self)
48 | visitor.visit(node, **kwargs)
49 |
50 | def _define_ref(
51 | self, name: str, load: t.Optional[t.Tuple[str, t.Optional[str]]] = None
52 | ) -> str:
53 | ident = f"l_{self.level}_{name}"
54 | self.refs[name] = ident
55 | if load is not None:
56 | self.loads[ident] = load
57 | return ident
58 |
59 | def find_load(self, target: str) -> t.Optional[t.Any]:
60 | if target in self.loads:
61 | return self.loads[target]
62 |
63 | if self.parent is not None:
64 | return self.parent.find_load(target)
65 |
66 | return None
67 |
68 | def find_ref(self, name: str) -> t.Optional[str]:
69 | if name in self.refs:
70 | return self.refs[name]
71 |
72 | if self.parent is not None:
73 | return self.parent.find_ref(name)
74 |
75 | return None
76 |
77 | def ref(self, name: str) -> str:
78 | rv = self.find_ref(name)
79 | if rv is None:
80 | raise AssertionError(
81 | "Tried to resolve a name to a reference that was"
82 | f" unknown to the frame ({name!r})"
83 | )
84 | return rv
85 |
86 | def copy(self) -> "Symbols":
87 | rv = object.__new__(self.__class__)
88 | rv.__dict__.update(self.__dict__)
89 | rv.refs = self.refs.copy()
90 | rv.loads = self.loads.copy()
91 | rv.stores = self.stores.copy()
92 | return rv
93 |
94 | def store(self, name: str) -> None:
95 | self.stores.add(name)
96 |
97 | # If we have not see the name referenced yet, we need to figure
98 | # out what to set it to.
99 | if name not in self.refs:
100 | # If there is a parent scope we check if the name has a
101 | # reference there. If it does it means we might have to alias
102 | # to a variable there.
103 | if self.parent is not None:
104 | outer_ref = self.parent.find_ref(name)
105 | if outer_ref is not None:
106 | self._define_ref(name, load=(VAR_LOAD_ALIAS, outer_ref))
107 | return
108 |
109 | # Otherwise we can just set it to undefined.
110 | self._define_ref(name, load=(VAR_LOAD_UNDEFINED, None))
111 |
112 | def declare_parameter(self, name: str) -> str:
113 | self.stores.add(name)
114 | return self._define_ref(name, load=(VAR_LOAD_PARAMETER, None))
115 |
116 | def load(self, name: str) -> None:
117 | if self.find_ref(name) is None:
118 | self._define_ref(name, load=(VAR_LOAD_RESOLVE, name))
119 |
120 | def branch_update(self, branch_symbols: t.Sequence["Symbols"]) -> None:
121 | stores: t.Dict[str, int] = {}
122 | for branch in branch_symbols:
123 | for target in branch.stores:
124 | if target in self.stores:
125 | continue
126 | stores[target] = stores.get(target, 0) + 1
127 |
128 | for sym in branch_symbols:
129 | self.refs.update(sym.refs)
130 | self.loads.update(sym.loads)
131 | self.stores.update(sym.stores)
132 |
133 | for name, branch_count in stores.items():
134 | if branch_count == len(branch_symbols):
135 | continue
136 |
137 | target = self.find_ref(name) # type: ignore
138 | assert target is not None, "should not happen"
139 |
140 | if self.parent is not None:
141 | outer_target = self.parent.find_ref(name)
142 | if outer_target is not None:
143 | self.loads[target] = (VAR_LOAD_ALIAS, outer_target)
144 | continue
145 | self.loads[target] = (VAR_LOAD_RESOLVE, name)
146 |
147 | def dump_stores(self) -> t.Dict[str, str]:
148 | rv: t.Dict[str, str] = {}
149 | node: t.Optional["Symbols"] = self
150 |
151 | while node is not None:
152 | for name in sorted(node.stores):
153 | if name not in rv:
154 | rv[name] = self.find_ref(name) # type: ignore
155 |
156 | node = node.parent
157 |
158 | return rv
159 |
160 | def dump_param_targets(self) -> t.Set[str]:
161 | rv = set()
162 | node: t.Optional["Symbols"] = self
163 |
164 | while node is not None:
165 | for target, (instr, _) in self.loads.items():
166 | if instr == VAR_LOAD_PARAMETER:
167 | rv.add(target)
168 |
169 | node = node.parent
170 |
171 | return rv
172 |
173 |
174 | class RootVisitor(NodeVisitor):
175 | def __init__(self, symbols: "Symbols") -> None:
176 | self.sym_visitor = FrameSymbolVisitor(symbols)
177 |
178 | def _simple_visit(self, node: nodes.Node, **kwargs: t.Any) -> None:
179 | for child in node.iter_child_nodes():
180 | self.sym_visitor.visit(child)
181 |
182 | visit_Template = _simple_visit
183 | visit_Block = _simple_visit
184 | visit_Macro = _simple_visit
185 | visit_FilterBlock = _simple_visit
186 | visit_Scope = _simple_visit
187 | visit_If = _simple_visit
188 | visit_ScopedEvalContextModifier = _simple_visit
189 |
190 | def visit_AssignBlock(self, node: nodes.AssignBlock, **kwargs: t.Any) -> None:
191 | for child in node.body:
192 | self.sym_visitor.visit(child)
193 |
194 | def visit_CallBlock(self, node: nodes.CallBlock, **kwargs: t.Any) -> None:
195 | for child in node.iter_child_nodes(exclude=("call",)):
196 | self.sym_visitor.visit(child)
197 |
198 | def visit_OverlayScope(self, node: nodes.OverlayScope, **kwargs: t.Any) -> None:
199 | for child in node.body:
200 | self.sym_visitor.visit(child)
201 |
202 | def visit_For(
203 | self, node: nodes.For, for_branch: str = "body", **kwargs: t.Any
204 | ) -> None:
205 | if for_branch == "body":
206 | self.sym_visitor.visit(node.target, store_as_param=True)
207 | branch = node.body
208 | elif for_branch == "else":
209 | branch = node.else_
210 | elif for_branch == "test":
211 | self.sym_visitor.visit(node.target, store_as_param=True)
212 | if node.test is not None:
213 | self.sym_visitor.visit(node.test)
214 | return
215 | else:
216 | raise RuntimeError("Unknown for branch")
217 |
218 | if branch:
219 | for item in branch:
220 | self.sym_visitor.visit(item)
221 |
222 | def visit_With(self, node: nodes.With, **kwargs: t.Any) -> None:
223 | for target in node.targets:
224 | self.sym_visitor.visit(target)
225 | for child in node.body:
226 | self.sym_visitor.visit(child)
227 |
228 | def generic_visit(self, node: nodes.Node, *args: t.Any, **kwargs: t.Any) -> None:
229 | raise NotImplementedError(f"Cannot find symbols for {type(node).__name__!r}")
230 |
231 |
232 | class FrameSymbolVisitor(NodeVisitor):
233 | """A visitor for `Frame.inspect`."""
234 |
235 | def __init__(self, symbols: "Symbols") -> None:
236 | self.symbols = symbols
237 |
238 | def visit_Name(
239 | self, node: nodes.Name, store_as_param: bool = False, **kwargs: t.Any
240 | ) -> None:
241 | """All assignments to names go through this function."""
242 | if store_as_param or node.ctx == "param":
243 | self.symbols.declare_parameter(node.name)
244 | elif node.ctx == "store":
245 | self.symbols.store(node.name)
246 | elif node.ctx == "load":
247 | self.symbols.load(node.name)
248 |
249 | def visit_NSRef(self, node: nodes.NSRef, **kwargs: t.Any) -> None:
250 | self.symbols.load(node.name)
251 |
252 | def visit_If(self, node: nodes.If, **kwargs: t.Any) -> None:
253 | self.visit(node.test, **kwargs)
254 | original_symbols = self.symbols
255 |
256 | def inner_visit(nodes: t.Iterable[nodes.Node]) -> "Symbols":
257 | self.symbols = rv = original_symbols.copy()
258 |
259 | for subnode in nodes:
260 | self.visit(subnode, **kwargs)
261 |
262 | self.symbols = original_symbols
263 | return rv
264 |
265 | body_symbols = inner_visit(node.body)
266 | elif_symbols = inner_visit(node.elif_)
267 | else_symbols = inner_visit(node.else_ or ())
268 | self.symbols.branch_update([body_symbols, elif_symbols, else_symbols])
269 |
270 | def visit_Macro(self, node: nodes.Macro, **kwargs: t.Any) -> None:
271 | self.symbols.store(node.name)
272 |
273 | def visit_Import(self, node: nodes.Import, **kwargs: t.Any) -> None:
274 | self.generic_visit(node, **kwargs)
275 | self.symbols.store(node.target)
276 |
277 | def visit_FromImport(self, node: nodes.FromImport, **kwargs: t.Any) -> None:
278 | self.generic_visit(node, **kwargs)
279 |
280 | for name in node.names:
281 | if isinstance(name, tuple):
282 | self.symbols.store(name[1])
283 | else:
284 | self.symbols.store(name)
285 |
286 | def visit_Assign(self, node: nodes.Assign, **kwargs: t.Any) -> None:
287 | """Visit assignments in the correct order."""
288 | self.visit(node.node, **kwargs)
289 | self.visit(node.target, **kwargs)
290 |
291 | def visit_For(self, node: nodes.For, **kwargs: t.Any) -> None:
292 | """Visiting stops at for blocks. However the block sequence
293 | is visited as part of the outer scope.
294 | """
295 | self.visit(node.iter, **kwargs)
296 |
297 | def visit_CallBlock(self, node: nodes.CallBlock, **kwargs: t.Any) -> None:
298 | self.visit(node.call, **kwargs)
299 |
300 | def visit_FilterBlock(self, node: nodes.FilterBlock, **kwargs: t.Any) -> None:
301 | self.visit(node.filter, **kwargs)
302 |
303 | def visit_With(self, node: nodes.With, **kwargs: t.Any) -> None:
304 | for target in node.values:
305 | self.visit(target)
306 |
307 | def visit_AssignBlock(self, node: nodes.AssignBlock, **kwargs: t.Any) -> None:
308 | """Stop visiting at block assigns."""
309 | self.visit(node.target, **kwargs)
310 |
311 | def visit_Scope(self, node: nodes.Scope, **kwargs: t.Any) -> None:
312 | """Stop visiting at scopes."""
313 |
314 | def visit_Block(self, node: nodes.Block, **kwargs: t.Any) -> None:
315 | """Stop visiting at blocks."""
316 |
317 | def visit_OverlayScope(self, node: nodes.OverlayScope, **kwargs: t.Any) -> None:
318 | """Do not visit into overlay scopes."""
319 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py:
--------------------------------------------------------------------------------
```python
1 | from typing import TYPE_CHECKING, Optional
2 |
3 | from .align import AlignMethod
4 | from .box import ROUNDED, Box
5 | from .cells import cell_len
6 | from .jupyter import JupyterMixin
7 | from .measure import Measurement, measure_renderables
8 | from .padding import Padding, PaddingDimensions
9 | from .segment import Segment
10 | from .style import Style, StyleType
11 | from .text import Text, TextType
12 |
13 | if TYPE_CHECKING:
14 | from .console import Console, ConsoleOptions, RenderableType, RenderResult
15 |
16 |
17 | class Panel(JupyterMixin):
18 | """A console renderable that draws a border around its contents.
19 |
20 | Example:
21 | >>> console.print(Panel("Hello, World!"))
22 |
23 | Args:
24 | renderable (RenderableType): A console renderable object.
25 | box (Box, optional): A Box instance that defines the look of the border (see :ref:`appendix_box`.
26 | Defaults to box.ROUNDED.
27 | safe_box (bool, optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True.
28 | expand (bool, optional): If True the panel will stretch to fill the console
29 | width, otherwise it will be sized to fit the contents. Defaults to True.
30 | style (str, optional): The style of the panel (border and contents). Defaults to "none".
31 | border_style (str, optional): The style of the border. Defaults to "none".
32 | width (Optional[int], optional): Optional width of panel. Defaults to None to auto-detect.
33 | height (Optional[int], optional): Optional height of panel. Defaults to None to auto-detect.
34 | padding (Optional[PaddingDimensions]): Optional padding around renderable. Defaults to 0.
35 | highlight (bool, optional): Enable automatic highlighting of panel title (if str). Defaults to False.
36 | """
37 |
38 | def __init__(
39 | self,
40 | renderable: "RenderableType",
41 | box: Box = ROUNDED,
42 | *,
43 | title: Optional[TextType] = None,
44 | title_align: AlignMethod = "center",
45 | subtitle: Optional[TextType] = None,
46 | subtitle_align: AlignMethod = "center",
47 | safe_box: Optional[bool] = None,
48 | expand: bool = True,
49 | style: StyleType = "none",
50 | border_style: StyleType = "none",
51 | width: Optional[int] = None,
52 | height: Optional[int] = None,
53 | padding: PaddingDimensions = (0, 1),
54 | highlight: bool = False,
55 | ) -> None:
56 | self.renderable = renderable
57 | self.box = box
58 | self.title = title
59 | self.title_align: AlignMethod = title_align
60 | self.subtitle = subtitle
61 | self.subtitle_align = subtitle_align
62 | self.safe_box = safe_box
63 | self.expand = expand
64 | self.style = style
65 | self.border_style = border_style
66 | self.width = width
67 | self.height = height
68 | self.padding = padding
69 | self.highlight = highlight
70 |
71 | @classmethod
72 | def fit(
73 | cls,
74 | renderable: "RenderableType",
75 | box: Box = ROUNDED,
76 | *,
77 | title: Optional[TextType] = None,
78 | title_align: AlignMethod = "center",
79 | subtitle: Optional[TextType] = None,
80 | subtitle_align: AlignMethod = "center",
81 | safe_box: Optional[bool] = None,
82 | style: StyleType = "none",
83 | border_style: StyleType = "none",
84 | width: Optional[int] = None,
85 | height: Optional[int] = None,
86 | padding: PaddingDimensions = (0, 1),
87 | highlight: bool = False,
88 | ) -> "Panel":
89 | """An alternative constructor that sets expand=False."""
90 | return cls(
91 | renderable,
92 | box,
93 | title=title,
94 | title_align=title_align,
95 | subtitle=subtitle,
96 | subtitle_align=subtitle_align,
97 | safe_box=safe_box,
98 | style=style,
99 | border_style=border_style,
100 | width=width,
101 | height=height,
102 | padding=padding,
103 | highlight=highlight,
104 | expand=False,
105 | )
106 |
107 | @property
108 | def _title(self) -> Optional[Text]:
109 | if self.title:
110 | title_text = (
111 | Text.from_markup(self.title)
112 | if isinstance(self.title, str)
113 | else self.title.copy()
114 | )
115 | title_text.end = ""
116 | title_text.plain = title_text.plain.replace("\n", " ")
117 | title_text.no_wrap = True
118 | title_text.expand_tabs()
119 | title_text.pad(1)
120 | return title_text
121 | return None
122 |
123 | @property
124 | def _subtitle(self) -> Optional[Text]:
125 | if self.subtitle:
126 | subtitle_text = (
127 | Text.from_markup(self.subtitle)
128 | if isinstance(self.subtitle, str)
129 | else self.subtitle.copy()
130 | )
131 | subtitle_text.end = ""
132 | subtitle_text.plain = subtitle_text.plain.replace("\n", " ")
133 | subtitle_text.no_wrap = True
134 | subtitle_text.expand_tabs()
135 | subtitle_text.pad(1)
136 | return subtitle_text
137 | return None
138 |
139 | def __rich_console__(
140 | self, console: "Console", options: "ConsoleOptions"
141 | ) -> "RenderResult":
142 | _padding = Padding.unpack(self.padding)
143 | renderable = (
144 | Padding(self.renderable, _padding) if any(_padding) else self.renderable
145 | )
146 | style = console.get_style(self.style)
147 | border_style = style + console.get_style(self.border_style)
148 | width = (
149 | options.max_width
150 | if self.width is None
151 | else min(options.max_width, self.width)
152 | )
153 |
154 | safe_box: bool = console.safe_box if self.safe_box is None else self.safe_box
155 | box = self.box.substitute(options, safe=safe_box)
156 |
157 | def align_text(
158 | text: Text, width: int, align: str, character: str, style: Style
159 | ) -> Text:
160 | """Gets new aligned text.
161 |
162 | Args:
163 | text (Text): Title or subtitle text.
164 | width (int): Desired width.
165 | align (str): Alignment.
166 | character (str): Character for alignment.
167 | style (Style): Border style
168 |
169 | Returns:
170 | Text: New text instance
171 | """
172 | text = text.copy()
173 | text.truncate(width)
174 | excess_space = width - cell_len(text.plain)
175 | if excess_space:
176 | if align == "left":
177 | return Text.assemble(
178 | text,
179 | (character * excess_space, style),
180 | no_wrap=True,
181 | end="",
182 | )
183 | elif align == "center":
184 | left = excess_space // 2
185 | return Text.assemble(
186 | (character * left, style),
187 | text,
188 | (character * (excess_space - left), style),
189 | no_wrap=True,
190 | end="",
191 | )
192 | else:
193 | return Text.assemble(
194 | (character * excess_space, style),
195 | text,
196 | no_wrap=True,
197 | end="",
198 | )
199 | return text
200 |
201 | title_text = self._title
202 | if title_text is not None:
203 | title_text.stylize_before(border_style)
204 |
205 | child_width = (
206 | width - 2
207 | if self.expand
208 | else console.measure(
209 | renderable, options=options.update_width(width - 2)
210 | ).maximum
211 | )
212 | child_height = self.height or options.height or None
213 | if child_height:
214 | child_height -= 2
215 | if title_text is not None:
216 | child_width = min(
217 | options.max_width - 2, max(child_width, title_text.cell_len + 2)
218 | )
219 |
220 | width = child_width + 2
221 | child_options = options.update(
222 | width=child_width, height=child_height, highlight=self.highlight
223 | )
224 | lines = console.render_lines(renderable, child_options, style=style)
225 |
226 | line_start = Segment(box.mid_left, border_style)
227 | line_end = Segment(f"{box.mid_right}", border_style)
228 | new_line = Segment.line()
229 | if title_text is None or width <= 4:
230 | yield Segment(box.get_top([width - 2]), border_style)
231 | else:
232 | title_text = align_text(
233 | title_text,
234 | width - 4,
235 | self.title_align,
236 | box.top,
237 | border_style,
238 | )
239 | yield Segment(box.top_left + box.top, border_style)
240 | yield from console.render(title_text, child_options.update_width(width - 4))
241 | yield Segment(box.top + box.top_right, border_style)
242 |
243 | yield new_line
244 | for line in lines:
245 | yield line_start
246 | yield from line
247 | yield line_end
248 | yield new_line
249 |
250 | subtitle_text = self._subtitle
251 | if subtitle_text is not None:
252 | subtitle_text.stylize_before(border_style)
253 |
254 | if subtitle_text is None or width <= 4:
255 | yield Segment(box.get_bottom([width - 2]), border_style)
256 | else:
257 | subtitle_text = align_text(
258 | subtitle_text,
259 | width - 4,
260 | self.subtitle_align,
261 | box.bottom,
262 | border_style,
263 | )
264 | yield Segment(box.bottom_left + box.bottom, border_style)
265 | yield from console.render(
266 | subtitle_text, child_options.update_width(width - 4)
267 | )
268 | yield Segment(box.bottom + box.bottom_right, border_style)
269 |
270 | yield new_line
271 |
272 | def __rich_measure__(
273 | self, console: "Console", options: "ConsoleOptions"
274 | ) -> "Measurement":
275 | _title = self._title
276 | _, right, _, left = Padding.unpack(self.padding)
277 | padding = left + right
278 | renderables = [self.renderable, _title] if _title else [self.renderable]
279 |
280 | if self.width is None:
281 | width = (
282 | measure_renderables(
283 | console,
284 | options.update_width(options.max_width - padding - 2),
285 | renderables,
286 | ).maximum
287 | + padding
288 | + 2
289 | )
290 | else:
291 | width = self.width
292 | return Measurement(width, width)
293 |
294 |
295 | if __name__ == "__main__": # pragma: no cover
296 | from .console import Console
297 |
298 | c = Console()
299 |
300 | from .box import DOUBLE, ROUNDED
301 | from .padding import Padding
302 |
303 | p = Panel(
304 | "Hello, World!",
305 | title="rich.Panel",
306 | style="white on blue",
307 | box=DOUBLE,
308 | padding=1,
309 | )
310 |
311 | c.print()
312 | c.print(p)
313 |
```