This is page 27 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/click/_winconsole.py:
--------------------------------------------------------------------------------
```python
1 | # This module is based on the excellent work by Adam Bartoš who
2 | # provided a lot of what went into the implementation here in
3 | # the discussion to issue1602 in the Python bug tracker.
4 | #
5 | # There are some general differences in regards to how this works
6 | # compared to the original patches as we do not need to patch
7 | # the entire interpreter but just work in our little world of
8 | # echo and prompt.
9 | import io
10 | import sys
11 | import time
12 | import typing as t
13 | from ctypes import byref
14 | from ctypes import c_char
15 | from ctypes import c_char_p
16 | from ctypes import c_int
17 | from ctypes import c_ssize_t
18 | from ctypes import c_ulong
19 | from ctypes import c_void_p
20 | from ctypes import POINTER
21 | from ctypes import py_object
22 | from ctypes import Structure
23 | from ctypes.wintypes import DWORD
24 | from ctypes.wintypes import HANDLE
25 | from ctypes.wintypes import LPCWSTR
26 | from ctypes.wintypes import LPWSTR
27 |
28 | from ._compat import _NonClosingTextIOWrapper
29 |
30 | assert sys.platform == "win32"
31 | import msvcrt # noqa: E402
32 | from ctypes import windll # noqa: E402
33 | from ctypes import WINFUNCTYPE # noqa: E402
34 |
35 | c_ssize_p = POINTER(c_ssize_t)
36 |
37 | kernel32 = windll.kernel32
38 | GetStdHandle = kernel32.GetStdHandle
39 | ReadConsoleW = kernel32.ReadConsoleW
40 | WriteConsoleW = kernel32.WriteConsoleW
41 | GetConsoleMode = kernel32.GetConsoleMode
42 | GetLastError = kernel32.GetLastError
43 | GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32))
44 | CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))(
45 | ("CommandLineToArgvW", windll.shell32)
46 | )
47 | LocalFree = WINFUNCTYPE(c_void_p, c_void_p)(("LocalFree", windll.kernel32))
48 |
49 | STDIN_HANDLE = GetStdHandle(-10)
50 | STDOUT_HANDLE = GetStdHandle(-11)
51 | STDERR_HANDLE = GetStdHandle(-12)
52 |
53 | PyBUF_SIMPLE = 0
54 | PyBUF_WRITABLE = 1
55 |
56 | ERROR_SUCCESS = 0
57 | ERROR_NOT_ENOUGH_MEMORY = 8
58 | ERROR_OPERATION_ABORTED = 995
59 |
60 | STDIN_FILENO = 0
61 | STDOUT_FILENO = 1
62 | STDERR_FILENO = 2
63 |
64 | EOF = b"\x1a"
65 | MAX_BYTES_WRITTEN = 32767
66 |
67 | try:
68 | from ctypes import pythonapi
69 | except ImportError:
70 | # On PyPy we cannot get buffers so our ability to operate here is
71 | # severely limited.
72 | get_buffer = None
73 | else:
74 |
75 | class Py_buffer(Structure):
76 | _fields_ = [
77 | ("buf", c_void_p),
78 | ("obj", py_object),
79 | ("len", c_ssize_t),
80 | ("itemsize", c_ssize_t),
81 | ("readonly", c_int),
82 | ("ndim", c_int),
83 | ("format", c_char_p),
84 | ("shape", c_ssize_p),
85 | ("strides", c_ssize_p),
86 | ("suboffsets", c_ssize_p),
87 | ("internal", c_void_p),
88 | ]
89 |
90 | PyObject_GetBuffer = pythonapi.PyObject_GetBuffer
91 | PyBuffer_Release = pythonapi.PyBuffer_Release
92 |
93 | def get_buffer(obj, writable=False):
94 | buf = Py_buffer()
95 | flags = PyBUF_WRITABLE if writable else PyBUF_SIMPLE
96 | PyObject_GetBuffer(py_object(obj), byref(buf), flags)
97 |
98 | try:
99 | buffer_type = c_char * buf.len
100 | return buffer_type.from_address(buf.buf)
101 | finally:
102 | PyBuffer_Release(byref(buf))
103 |
104 |
105 | class _WindowsConsoleRawIOBase(io.RawIOBase):
106 | def __init__(self, handle):
107 | self.handle = handle
108 |
109 | def isatty(self):
110 | super().isatty()
111 | return True
112 |
113 |
114 | class _WindowsConsoleReader(_WindowsConsoleRawIOBase):
115 | def readable(self):
116 | return True
117 |
118 | def readinto(self, b):
119 | bytes_to_be_read = len(b)
120 | if not bytes_to_be_read:
121 | return 0
122 | elif bytes_to_be_read % 2:
123 | raise ValueError(
124 | "cannot read odd number of bytes from UTF-16-LE encoded console"
125 | )
126 |
127 | buffer = get_buffer(b, writable=True)
128 | code_units_to_be_read = bytes_to_be_read // 2
129 | code_units_read = c_ulong()
130 |
131 | rv = ReadConsoleW(
132 | HANDLE(self.handle),
133 | buffer,
134 | code_units_to_be_read,
135 | byref(code_units_read),
136 | None,
137 | )
138 | if GetLastError() == ERROR_OPERATION_ABORTED:
139 | # wait for KeyboardInterrupt
140 | time.sleep(0.1)
141 | if not rv:
142 | raise OSError(f"Windows error: {GetLastError()}")
143 |
144 | if buffer[0] == EOF:
145 | return 0
146 | return 2 * code_units_read.value
147 |
148 |
149 | class _WindowsConsoleWriter(_WindowsConsoleRawIOBase):
150 | def writable(self):
151 | return True
152 |
153 | @staticmethod
154 | def _get_error_message(errno):
155 | if errno == ERROR_SUCCESS:
156 | return "ERROR_SUCCESS"
157 | elif errno == ERROR_NOT_ENOUGH_MEMORY:
158 | return "ERROR_NOT_ENOUGH_MEMORY"
159 | return f"Windows error {errno}"
160 |
161 | def write(self, b):
162 | bytes_to_be_written = len(b)
163 | buf = get_buffer(b)
164 | code_units_to_be_written = min(bytes_to_be_written, MAX_BYTES_WRITTEN) // 2
165 | code_units_written = c_ulong()
166 |
167 | WriteConsoleW(
168 | HANDLE(self.handle),
169 | buf,
170 | code_units_to_be_written,
171 | byref(code_units_written),
172 | None,
173 | )
174 | bytes_written = 2 * code_units_written.value
175 |
176 | if bytes_written == 0 and bytes_to_be_written > 0:
177 | raise OSError(self._get_error_message(GetLastError()))
178 | return bytes_written
179 |
180 |
181 | class ConsoleStream:
182 | def __init__(self, text_stream: t.TextIO, byte_stream: t.BinaryIO) -> None:
183 | self._text_stream = text_stream
184 | self.buffer = byte_stream
185 |
186 | @property
187 | def name(self) -> str:
188 | return self.buffer.name
189 |
190 | def write(self, x: t.AnyStr) -> int:
191 | if isinstance(x, str):
192 | return self._text_stream.write(x)
193 | try:
194 | self.flush()
195 | except Exception:
196 | pass
197 | return self.buffer.write(x)
198 |
199 | def writelines(self, lines: t.Iterable[t.AnyStr]) -> None:
200 | for line in lines:
201 | self.write(line)
202 |
203 | def __getattr__(self, name: str) -> t.Any:
204 | return getattr(self._text_stream, name)
205 |
206 | def isatty(self) -> bool:
207 | return self.buffer.isatty()
208 |
209 | def __repr__(self):
210 | return f"<ConsoleStream name={self.name!r} encoding={self.encoding!r}>"
211 |
212 |
213 | def _get_text_stdin(buffer_stream: t.BinaryIO) -> t.TextIO:
214 | text_stream = _NonClosingTextIOWrapper(
215 | io.BufferedReader(_WindowsConsoleReader(STDIN_HANDLE)),
216 | "utf-16-le",
217 | "strict",
218 | line_buffering=True,
219 | )
220 | return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream))
221 |
222 |
223 | def _get_text_stdout(buffer_stream: t.BinaryIO) -> t.TextIO:
224 | text_stream = _NonClosingTextIOWrapper(
225 | io.BufferedWriter(_WindowsConsoleWriter(STDOUT_HANDLE)),
226 | "utf-16-le",
227 | "strict",
228 | line_buffering=True,
229 | )
230 | return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream))
231 |
232 |
233 | def _get_text_stderr(buffer_stream: t.BinaryIO) -> t.TextIO:
234 | text_stream = _NonClosingTextIOWrapper(
235 | io.BufferedWriter(_WindowsConsoleWriter(STDERR_HANDLE)),
236 | "utf-16-le",
237 | "strict",
238 | line_buffering=True,
239 | )
240 | return t.cast(t.TextIO, ConsoleStream(text_stream, buffer_stream))
241 |
242 |
243 | _stream_factories: t.Mapping[int, t.Callable[[t.BinaryIO], t.TextIO]] = {
244 | 0: _get_text_stdin,
245 | 1: _get_text_stdout,
246 | 2: _get_text_stderr,
247 | }
248 |
249 |
250 | def _is_console(f: t.TextIO) -> bool:
251 | if not hasattr(f, "fileno"):
252 | return False
253 |
254 | try:
255 | fileno = f.fileno()
256 | except (OSError, io.UnsupportedOperation):
257 | return False
258 |
259 | handle = msvcrt.get_osfhandle(fileno)
260 | return bool(GetConsoleMode(handle, byref(DWORD())))
261 |
262 |
263 | def _get_windows_console_stream(
264 | f: t.TextIO, encoding: t.Optional[str], errors: t.Optional[str]
265 | ) -> t.Optional[t.TextIO]:
266 | if (
267 | get_buffer is not None
268 | and encoding in {"utf-16-le", None}
269 | and errors in {"strict", None}
270 | and _is_console(f)
271 | ):
272 | func = _stream_factories.get(f.fileno())
273 | if func is not None:
274 | b = getattr(f, "buffer", None)
275 |
276 | if b is None:
277 | return None
278 |
279 | return func(b)
280 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py:
--------------------------------------------------------------------------------
```python
1 | import os
2 | import textwrap
3 | from optparse import Values
4 | from typing import Any, List
5 |
6 | from pip._internal.cli.base_command import Command
7 | from pip._internal.cli.status_codes import ERROR, SUCCESS
8 | from pip._internal.exceptions import CommandError, PipError
9 | from pip._internal.utils import filesystem
10 | from pip._internal.utils.logging import getLogger
11 |
12 | logger = getLogger(__name__)
13 |
14 |
15 | class CacheCommand(Command):
16 | """
17 | Inspect and manage pip's wheel cache.
18 |
19 | Subcommands:
20 |
21 | - dir: Show the cache directory.
22 | - info: Show information about the cache.
23 | - list: List filenames of packages stored in the cache.
24 | - remove: Remove one or more package from the cache.
25 | - purge: Remove all items from the cache.
26 |
27 | ``<pattern>`` can be a glob expression or a package name.
28 | """
29 |
30 | ignore_require_venv = True
31 | usage = """
32 | %prog dir
33 | %prog info
34 | %prog list [<pattern>] [--format=[human, abspath]]
35 | %prog remove <pattern>
36 | %prog purge
37 | """
38 |
39 | def add_options(self) -> None:
40 | self.cmd_opts.add_option(
41 | "--format",
42 | action="store",
43 | dest="list_format",
44 | default="human",
45 | choices=("human", "abspath"),
46 | help="Select the output format among: human (default) or abspath",
47 | )
48 |
49 | self.parser.insert_option_group(0, self.cmd_opts)
50 |
51 | def run(self, options: Values, args: List[str]) -> int:
52 | handlers = {
53 | "dir": self.get_cache_dir,
54 | "info": self.get_cache_info,
55 | "list": self.list_cache_items,
56 | "remove": self.remove_cache_items,
57 | "purge": self.purge_cache,
58 | }
59 |
60 | if not options.cache_dir:
61 | logger.error("pip cache commands can not function since cache is disabled.")
62 | return ERROR
63 |
64 | # Determine action
65 | if not args or args[0] not in handlers:
66 | logger.error(
67 | "Need an action (%s) to perform.",
68 | ", ".join(sorted(handlers)),
69 | )
70 | return ERROR
71 |
72 | action = args[0]
73 |
74 | # Error handling happens here, not in the action-handlers.
75 | try:
76 | handlers[action](options, args[1:])
77 | except PipError as e:
78 | logger.error(e.args[0])
79 | return ERROR
80 |
81 | return SUCCESS
82 |
83 | def get_cache_dir(self, options: Values, args: List[Any]) -> None:
84 | if args:
85 | raise CommandError("Too many arguments")
86 |
87 | logger.info(options.cache_dir)
88 |
89 | def get_cache_info(self, options: Values, args: List[Any]) -> None:
90 | if args:
91 | raise CommandError("Too many arguments")
92 |
93 | num_http_files = len(self._find_http_files(options))
94 | num_packages = len(self._find_wheels(options, "*"))
95 |
96 | http_cache_location = self._cache_dir(options, "http-v2")
97 | old_http_cache_location = self._cache_dir(options, "http")
98 | wheels_cache_location = self._cache_dir(options, "wheels")
99 | http_cache_size = filesystem.format_size(
100 | filesystem.directory_size(http_cache_location)
101 | + filesystem.directory_size(old_http_cache_location)
102 | )
103 | wheels_cache_size = filesystem.format_directory_size(wheels_cache_location)
104 |
105 | message = (
106 | textwrap.dedent(
107 | """
108 | Package index page cache location (pip v23.3+): {http_cache_location}
109 | Package index page cache location (older pips): {old_http_cache_location}
110 | Package index page cache size: {http_cache_size}
111 | Number of HTTP files: {num_http_files}
112 | Locally built wheels location: {wheels_cache_location}
113 | Locally built wheels size: {wheels_cache_size}
114 | Number of locally built wheels: {package_count}
115 | """ # noqa: E501
116 | )
117 | .format(
118 | http_cache_location=http_cache_location,
119 | old_http_cache_location=old_http_cache_location,
120 | http_cache_size=http_cache_size,
121 | num_http_files=num_http_files,
122 | wheels_cache_location=wheels_cache_location,
123 | package_count=num_packages,
124 | wheels_cache_size=wheels_cache_size,
125 | )
126 | .strip()
127 | )
128 |
129 | logger.info(message)
130 |
131 | def list_cache_items(self, options: Values, args: List[Any]) -> None:
132 | if len(args) > 1:
133 | raise CommandError("Too many arguments")
134 |
135 | if args:
136 | pattern = args[0]
137 | else:
138 | pattern = "*"
139 |
140 | files = self._find_wheels(options, pattern)
141 | if options.list_format == "human":
142 | self.format_for_human(files)
143 | else:
144 | self.format_for_abspath(files)
145 |
146 | def format_for_human(self, files: List[str]) -> None:
147 | if not files:
148 | logger.info("No locally built wheels cached.")
149 | return
150 |
151 | results = []
152 | for filename in files:
153 | wheel = os.path.basename(filename)
154 | size = filesystem.format_file_size(filename)
155 | results.append(f" - {wheel} ({size})")
156 | logger.info("Cache contents:\n")
157 | logger.info("\n".join(sorted(results)))
158 |
159 | def format_for_abspath(self, files: List[str]) -> None:
160 | if files:
161 | logger.info("\n".join(sorted(files)))
162 |
163 | def remove_cache_items(self, options: Values, args: List[Any]) -> None:
164 | if len(args) > 1:
165 | raise CommandError("Too many arguments")
166 |
167 | if not args:
168 | raise CommandError("Please provide a pattern")
169 |
170 | files = self._find_wheels(options, args[0])
171 |
172 | no_matching_msg = "No matching packages"
173 | if args[0] == "*":
174 | # Only fetch http files if no specific pattern given
175 | files += self._find_http_files(options)
176 | else:
177 | # Add the pattern to the log message
178 | no_matching_msg += f' for pattern "{args[0]}"'
179 |
180 | if not files:
181 | logger.warning(no_matching_msg)
182 |
183 | for filename in files:
184 | os.unlink(filename)
185 | logger.verbose("Removed %s", filename)
186 | logger.info("Files removed: %s", len(files))
187 |
188 | def purge_cache(self, options: Values, args: List[Any]) -> None:
189 | if args:
190 | raise CommandError("Too many arguments")
191 |
192 | return self.remove_cache_items(options, ["*"])
193 |
194 | def _cache_dir(self, options: Values, subdir: str) -> str:
195 | return os.path.join(options.cache_dir, subdir)
196 |
197 | def _find_http_files(self, options: Values) -> List[str]:
198 | old_http_dir = self._cache_dir(options, "http")
199 | new_http_dir = self._cache_dir(options, "http-v2")
200 | return filesystem.find_files(old_http_dir, "*") + filesystem.find_files(
201 | new_http_dir, "*"
202 | )
203 |
204 | def _find_wheels(self, options: Values, pattern: str) -> List[str]:
205 | wheel_dir = self._cache_dir(options, "wheels")
206 |
207 | # The wheel filename format, as specified in PEP 427, is:
208 | # {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl
209 | #
210 | # Additionally, non-alphanumeric values in the distribution are
211 | # normalized to underscores (_), meaning hyphens can never occur
212 | # before `-{version}`.
213 | #
214 | # Given that information:
215 | # - If the pattern we're given contains a hyphen (-), the user is
216 | # providing at least the version. Thus, we can just append `*.whl`
217 | # to match the rest of it.
218 | # - If the pattern we're given doesn't contain a hyphen (-), the
219 | # user is only providing the name. Thus, we append `-*.whl` to
220 | # match the hyphen before the version, followed by anything else.
221 | #
222 | # PEP 427: https://www.python.org/dev/peps/pep-0427/
223 | pattern = pattern + ("*.whl" if "-" in pattern else "-*.whl")
224 |
225 | return filesystem.find_files(wheel_dir, pattern)
226 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | pygments.sphinxext
3 | ~~~~~~~~~~~~~~~~~~
4 |
5 | Sphinx extension to generate automatic documentation of lexers,
6 | formatters and filters.
7 |
8 | :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
9 | :license: BSD, see LICENSE for details.
10 | """
11 |
12 | import sys
13 |
14 | from docutils import nodes
15 | from docutils.statemachine import ViewList
16 | from docutils.parsers.rst import Directive
17 | from sphinx.util.nodes import nested_parse_with_titles
18 |
19 |
20 | MODULEDOC = '''
21 | .. module:: %s
22 |
23 | %s
24 | %s
25 | '''
26 |
27 | LEXERDOC = '''
28 | .. class:: %s
29 |
30 | :Short names: %s
31 | :Filenames: %s
32 | :MIME types: %s
33 |
34 | %s
35 |
36 | %s
37 |
38 | '''
39 |
40 | FMTERDOC = '''
41 | .. class:: %s
42 |
43 | :Short names: %s
44 | :Filenames: %s
45 |
46 | %s
47 |
48 | '''
49 |
50 | FILTERDOC = '''
51 | .. class:: %s
52 |
53 | :Name: %s
54 |
55 | %s
56 |
57 | '''
58 |
59 |
60 | class PygmentsDoc(Directive):
61 | """
62 | A directive to collect all lexers/formatters/filters and generate
63 | autoclass directives for them.
64 | """
65 | has_content = False
66 | required_arguments = 1
67 | optional_arguments = 0
68 | final_argument_whitespace = False
69 | option_spec = {}
70 |
71 | def run(self):
72 | self.filenames = set()
73 | if self.arguments[0] == 'lexers':
74 | out = self.document_lexers()
75 | elif self.arguments[0] == 'formatters':
76 | out = self.document_formatters()
77 | elif self.arguments[0] == 'filters':
78 | out = self.document_filters()
79 | elif self.arguments[0] == 'lexers_overview':
80 | out = self.document_lexers_overview()
81 | else:
82 | raise Exception('invalid argument for "pygmentsdoc" directive')
83 | node = nodes.compound()
84 | vl = ViewList(out.split('\n'), source='')
85 | nested_parse_with_titles(self.state, vl, node)
86 | for fn in self.filenames:
87 | self.state.document.settings.record_dependencies.add(fn)
88 | return node.children
89 |
90 | def document_lexers_overview(self):
91 | """Generate a tabular overview of all lexers.
92 |
93 | The columns are the lexer name, the extensions handled by this lexer
94 | (or "None"), the aliases and a link to the lexer class."""
95 | from pip._vendor.pygments.lexers._mapping import LEXERS
96 | from pip._vendor.pygments.lexers import find_lexer_class
97 | out = []
98 |
99 | table = []
100 |
101 | def format_link(name, url):
102 | if url:
103 | return f'`{name} <{url}>`_'
104 | return name
105 |
106 | for classname, data in sorted(LEXERS.items(), key=lambda x: x[1][1].lower()):
107 | lexer_cls = find_lexer_class(data[1])
108 | extensions = lexer_cls.filenames + lexer_cls.alias_filenames
109 |
110 | table.append({
111 | 'name': format_link(data[1], lexer_cls.url),
112 | 'extensions': ', '.join(extensions).replace('*', '\\*').replace('_', '\\') or 'None',
113 | 'aliases': ', '.join(data[2]),
114 | 'class': f'{data[0]}.{classname}'
115 | })
116 |
117 | column_names = ['name', 'extensions', 'aliases', 'class']
118 | column_lengths = [max([len(row[column]) for row in table if row[column]])
119 | for column in column_names]
120 |
121 | def write_row(*columns):
122 | """Format a table row"""
123 | out = []
124 | for length, col in zip(column_lengths, columns):
125 | if col:
126 | out.append(col.ljust(length))
127 | else:
128 | out.append(' '*length)
129 |
130 | return ' '.join(out)
131 |
132 | def write_seperator():
133 | """Write a table separator row"""
134 | sep = ['='*c for c in column_lengths]
135 | return write_row(*sep)
136 |
137 | out.append(write_seperator())
138 | out.append(write_row('Name', 'Extension(s)', 'Short name(s)', 'Lexer class'))
139 | out.append(write_seperator())
140 | for row in table:
141 | out.append(write_row(
142 | row['name'],
143 | row['extensions'],
144 | row['aliases'],
145 | f':class:`~{row["class"]}`'))
146 | out.append(write_seperator())
147 |
148 | return '\n'.join(out)
149 |
150 | def document_lexers(self):
151 | from pip._vendor.pygments.lexers._mapping import LEXERS
152 | from pip._vendor import pygments
153 | import inspect
154 | import pathlib
155 |
156 | out = []
157 | modules = {}
158 | moduledocstrings = {}
159 | for classname, data in sorted(LEXERS.items(), key=lambda x: x[0]):
160 | module = data[0]
161 | mod = __import__(module, None, None, [classname])
162 | self.filenames.add(mod.__file__)
163 | cls = getattr(mod, classname)
164 | if not cls.__doc__:
165 | print(f"Warning: {classname} does not have a docstring.")
166 | docstring = cls.__doc__
167 | if isinstance(docstring, bytes):
168 | docstring = docstring.decode('utf8')
169 |
170 | example_file = getattr(cls, '_example', None)
171 | if example_file:
172 | p = pathlib.Path(inspect.getabsfile(pygments)).parent.parent /\
173 | 'tests' / 'examplefiles' / example_file
174 | content = p.read_text(encoding='utf-8')
175 | if not content:
176 | raise Exception(
177 | f"Empty example file '{example_file}' for lexer "
178 | f"{classname}")
179 |
180 | if data[2]:
181 | lexer_name = data[2][0]
182 | docstring += '\n\n .. admonition:: Example\n'
183 | docstring += f'\n .. code-block:: {lexer_name}\n\n'
184 | for line in content.splitlines():
185 | docstring += f' {line}\n'
186 |
187 | if cls.version_added:
188 | version_line = f'.. versionadded:: {cls.version_added}'
189 | else:
190 | version_line = ''
191 |
192 | modules.setdefault(module, []).append((
193 | classname,
194 | ', '.join(data[2]) or 'None',
195 | ', '.join(data[3]).replace('*', '\\*').replace('_', '\\') or 'None',
196 | ', '.join(data[4]) or 'None',
197 | docstring,
198 | version_line))
199 | if module not in moduledocstrings:
200 | moddoc = mod.__doc__
201 | if isinstance(moddoc, bytes):
202 | moddoc = moddoc.decode('utf8')
203 | moduledocstrings[module] = moddoc
204 |
205 | for module, lexers in sorted(modules.items(), key=lambda x: x[0]):
206 | if moduledocstrings[module] is None:
207 | raise Exception(f"Missing docstring for {module}")
208 | heading = moduledocstrings[module].splitlines()[4].strip().rstrip('.')
209 | out.append(MODULEDOC % (module, heading, '-'*len(heading)))
210 | for data in lexers:
211 | out.append(LEXERDOC % data)
212 |
213 | return ''.join(out)
214 |
215 | def document_formatters(self):
216 | from pip._vendor.pygments.formatters import FORMATTERS
217 |
218 | out = []
219 | for classname, data in sorted(FORMATTERS.items(), key=lambda x: x[0]):
220 | module = data[0]
221 | mod = __import__(module, None, None, [classname])
222 | self.filenames.add(mod.__file__)
223 | cls = getattr(mod, classname)
224 | docstring = cls.__doc__
225 | if isinstance(docstring, bytes):
226 | docstring = docstring.decode('utf8')
227 | heading = cls.__name__
228 | out.append(FMTERDOC % (heading, ', '.join(data[2]) or 'None',
229 | ', '.join(data[3]).replace('*', '\\*') or 'None',
230 | docstring))
231 | return ''.join(out)
232 |
233 | def document_filters(self):
234 | from pip._vendor.pygments.filters import FILTERS
235 |
236 | out = []
237 | for name, cls in FILTERS.items():
238 | self.filenames.add(sys.modules[cls.__module__].__file__)
239 | docstring = cls.__doc__
240 | if isinstance(docstring, bytes):
241 | docstring = docstring.decode('utf8')
242 | out.append(FILTERDOC % (cls.__name__, name, docstring))
243 | return ''.join(out)
244 |
245 |
246 | def setup(app):
247 | app.add_directive('pygmentsdoc', PygmentsDoc)
248 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py:
--------------------------------------------------------------------------------
```python
1 | import email.message
2 | import importlib.metadata
3 | import pathlib
4 | import zipfile
5 | from typing import (
6 | Collection,
7 | Dict,
8 | Iterable,
9 | Iterator,
10 | Mapping,
11 | Optional,
12 | Sequence,
13 | cast,
14 | )
15 |
16 | from pip._vendor.packaging.requirements import Requirement
17 | from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
18 | from pip._vendor.packaging.version import Version
19 | from pip._vendor.packaging.version import parse as parse_version
20 |
21 | from pip._internal.exceptions import InvalidWheel, UnsupportedWheel
22 | from pip._internal.metadata.base import (
23 | BaseDistribution,
24 | BaseEntryPoint,
25 | InfoPath,
26 | Wheel,
27 | )
28 | from pip._internal.utils.misc import normalize_path
29 | from pip._internal.utils.packaging import get_requirement
30 | from pip._internal.utils.temp_dir import TempDirectory
31 | from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file
32 |
33 | from ._compat import (
34 | BasePath,
35 | get_dist_canonical_name,
36 | parse_name_and_version_from_info_directory,
37 | )
38 |
39 |
40 | class WheelDistribution(importlib.metadata.Distribution):
41 | """An ``importlib.metadata.Distribution`` read from a wheel.
42 |
43 | Although ``importlib.metadata.PathDistribution`` accepts ``zipfile.Path``,
44 | its implementation is too "lazy" for pip's needs (we can't keep the ZipFile
45 | handle open for the entire lifetime of the distribution object).
46 |
47 | This implementation eagerly reads the entire metadata directory into the
48 | memory instead, and operates from that.
49 | """
50 |
51 | def __init__(
52 | self,
53 | files: Mapping[pathlib.PurePosixPath, bytes],
54 | info_location: pathlib.PurePosixPath,
55 | ) -> None:
56 | self._files = files
57 | self.info_location = info_location
58 |
59 | @classmethod
60 | def from_zipfile(
61 | cls,
62 | zf: zipfile.ZipFile,
63 | name: str,
64 | location: str,
65 | ) -> "WheelDistribution":
66 | info_dir, _ = parse_wheel(zf, name)
67 | paths = (
68 | (name, pathlib.PurePosixPath(name.split("/", 1)[-1]))
69 | for name in zf.namelist()
70 | if name.startswith(f"{info_dir}/")
71 | )
72 | files = {
73 | relpath: read_wheel_metadata_file(zf, fullpath)
74 | for fullpath, relpath in paths
75 | }
76 | info_location = pathlib.PurePosixPath(location, info_dir)
77 | return cls(files, info_location)
78 |
79 | def iterdir(self, path: InfoPath) -> Iterator[pathlib.PurePosixPath]:
80 | # Only allow iterating through the metadata directory.
81 | if pathlib.PurePosixPath(str(path)) in self._files:
82 | return iter(self._files)
83 | raise FileNotFoundError(path)
84 |
85 | def read_text(self, filename: str) -> Optional[str]:
86 | try:
87 | data = self._files[pathlib.PurePosixPath(filename)]
88 | except KeyError:
89 | return None
90 | try:
91 | text = data.decode("utf-8")
92 | except UnicodeDecodeError as e:
93 | wheel = self.info_location.parent
94 | error = f"Error decoding metadata for {wheel}: {e} in {filename} file"
95 | raise UnsupportedWheel(error)
96 | return text
97 |
98 |
99 | class Distribution(BaseDistribution):
100 | def __init__(
101 | self,
102 | dist: importlib.metadata.Distribution,
103 | info_location: Optional[BasePath],
104 | installed_location: Optional[BasePath],
105 | ) -> None:
106 | self._dist = dist
107 | self._info_location = info_location
108 | self._installed_location = installed_location
109 |
110 | @classmethod
111 | def from_directory(cls, directory: str) -> BaseDistribution:
112 | info_location = pathlib.Path(directory)
113 | dist = importlib.metadata.Distribution.at(info_location)
114 | return cls(dist, info_location, info_location.parent)
115 |
116 | @classmethod
117 | def from_metadata_file_contents(
118 | cls,
119 | metadata_contents: bytes,
120 | filename: str,
121 | project_name: str,
122 | ) -> BaseDistribution:
123 | # Generate temp dir to contain the metadata file, and write the file contents.
124 | temp_dir = pathlib.Path(
125 | TempDirectory(kind="metadata", globally_managed=True).path
126 | )
127 | metadata_path = temp_dir / "METADATA"
128 | metadata_path.write_bytes(metadata_contents)
129 | # Construct dist pointing to the newly created directory.
130 | dist = importlib.metadata.Distribution.at(metadata_path.parent)
131 | return cls(dist, metadata_path.parent, None)
132 |
133 | @classmethod
134 | def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution:
135 | try:
136 | with wheel.as_zipfile() as zf:
137 | dist = WheelDistribution.from_zipfile(zf, name, wheel.location)
138 | except zipfile.BadZipFile as e:
139 | raise InvalidWheel(wheel.location, name) from e
140 | return cls(dist, dist.info_location, pathlib.PurePosixPath(wheel.location))
141 |
142 | @property
143 | def location(self) -> Optional[str]:
144 | if self._info_location is None:
145 | return None
146 | return str(self._info_location.parent)
147 |
148 | @property
149 | def info_location(self) -> Optional[str]:
150 | if self._info_location is None:
151 | return None
152 | return str(self._info_location)
153 |
154 | @property
155 | def installed_location(self) -> Optional[str]:
156 | if self._installed_location is None:
157 | return None
158 | return normalize_path(str(self._installed_location))
159 |
160 | @property
161 | def canonical_name(self) -> NormalizedName:
162 | return get_dist_canonical_name(self._dist)
163 |
164 | @property
165 | def version(self) -> Version:
166 | if version := parse_name_and_version_from_info_directory(self._dist)[1]:
167 | return parse_version(version)
168 | return parse_version(self._dist.version)
169 |
170 | @property
171 | def raw_version(self) -> str:
172 | return self._dist.version
173 |
174 | def is_file(self, path: InfoPath) -> bool:
175 | return self._dist.read_text(str(path)) is not None
176 |
177 | def iter_distutils_script_names(self) -> Iterator[str]:
178 | # A distutils installation is always "flat" (not in e.g. egg form), so
179 | # if this distribution's info location is NOT a pathlib.Path (but e.g.
180 | # zipfile.Path), it can never contain any distutils scripts.
181 | if not isinstance(self._info_location, pathlib.Path):
182 | return
183 | for child in self._info_location.joinpath("scripts").iterdir():
184 | yield child.name
185 |
186 | def read_text(self, path: InfoPath) -> str:
187 | content = self._dist.read_text(str(path))
188 | if content is None:
189 | raise FileNotFoundError(path)
190 | return content
191 |
192 | def iter_entry_points(self) -> Iterable[BaseEntryPoint]:
193 | # importlib.metadata's EntryPoint structure sasitfies BaseEntryPoint.
194 | return self._dist.entry_points
195 |
196 | def _metadata_impl(self) -> email.message.Message:
197 | # From Python 3.10+, importlib.metadata declares PackageMetadata as the
198 | # return type. This protocol is unfortunately a disaster now and misses
199 | # a ton of fields that we need, including get() and get_payload(). We
200 | # rely on the implementation that the object is actually a Message now,
201 | # until upstream can improve the protocol. (python/cpython#94952)
202 | return cast(email.message.Message, self._dist.metadata)
203 |
204 | def iter_provided_extras(self) -> Iterable[NormalizedName]:
205 | return [
206 | canonicalize_name(extra)
207 | for extra in self.metadata.get_all("Provides-Extra", [])
208 | ]
209 |
210 | def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]:
211 | contexts: Sequence[Dict[str, str]] = [{"extra": e} for e in extras]
212 | for req_string in self.metadata.get_all("Requires-Dist", []):
213 | # strip() because email.message.Message.get_all() may return a leading \n
214 | # in case a long header was wrapped.
215 | req = get_requirement(req_string.strip())
216 | if not req.marker:
217 | yield req
218 | elif not extras and req.marker.evaluate({"extra": ""}):
219 | yield req
220 | elif any(req.marker.evaluate(context) for context in contexts):
221 | yield req
222 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/urllib3/util/request.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import io
4 | import typing
5 | from base64 import b64encode
6 | from enum import Enum
7 |
8 | from ..exceptions import UnrewindableBodyError
9 | from .util import to_bytes
10 |
11 | if typing.TYPE_CHECKING:
12 | from typing import Final
13 |
14 | # Pass as a value within ``headers`` to skip
15 | # emitting some HTTP headers that are added automatically.
16 | # The only headers that are supported are ``Accept-Encoding``,
17 | # ``Host``, and ``User-Agent``.
18 | SKIP_HEADER = "@@@SKIP_HEADER@@@"
19 | SKIPPABLE_HEADERS = frozenset(["accept-encoding", "host", "user-agent"])
20 |
21 | ACCEPT_ENCODING = "gzip,deflate"
22 | try:
23 | try:
24 | import brotlicffi as _unused_module_brotli # type: ignore[import-not-found] # noqa: F401
25 | except ImportError:
26 | import brotli as _unused_module_brotli # type: ignore[import-not-found] # noqa: F401
27 | except ImportError:
28 | pass
29 | else:
30 | ACCEPT_ENCODING += ",br"
31 | try:
32 | import zstandard as _unused_module_zstd # noqa: F401
33 | except ImportError:
34 | pass
35 | else:
36 | ACCEPT_ENCODING += ",zstd"
37 |
38 |
39 | class _TYPE_FAILEDTELL(Enum):
40 | token = 0
41 |
42 |
43 | _FAILEDTELL: Final[_TYPE_FAILEDTELL] = _TYPE_FAILEDTELL.token
44 |
45 | _TYPE_BODY_POSITION = typing.Union[int, _TYPE_FAILEDTELL]
46 |
47 | # When sending a request with these methods we aren't expecting
48 | # a body so don't need to set an explicit 'Content-Length: 0'
49 | # The reason we do this in the negative instead of tracking methods
50 | # which 'should' have a body is because unknown methods should be
51 | # treated as if they were 'POST' which *does* expect a body.
52 | _METHODS_NOT_EXPECTING_BODY = {"GET", "HEAD", "DELETE", "TRACE", "OPTIONS", "CONNECT"}
53 |
54 |
55 | def make_headers(
56 | keep_alive: bool | None = None,
57 | accept_encoding: bool | list[str] | str | None = None,
58 | user_agent: str | None = None,
59 | basic_auth: str | None = None,
60 | proxy_basic_auth: str | None = None,
61 | disable_cache: bool | None = None,
62 | ) -> dict[str, str]:
63 | """
64 | Shortcuts for generating request headers.
65 |
66 | :param keep_alive:
67 | If ``True``, adds 'connection: keep-alive' header.
68 |
69 | :param accept_encoding:
70 | Can be a boolean, list, or string.
71 | ``True`` translates to 'gzip,deflate'. If either the ``brotli`` or
72 | ``brotlicffi`` package is installed 'gzip,deflate,br' is used instead.
73 | List will get joined by comma.
74 | String will be used as provided.
75 |
76 | :param user_agent:
77 | String representing the user-agent you want, such as
78 | "python-urllib3/0.6"
79 |
80 | :param basic_auth:
81 | Colon-separated username:password string for 'authorization: basic ...'
82 | auth header.
83 |
84 | :param proxy_basic_auth:
85 | Colon-separated username:password string for 'proxy-authorization: basic ...'
86 | auth header.
87 |
88 | :param disable_cache:
89 | If ``True``, adds 'cache-control: no-cache' header.
90 |
91 | Example:
92 |
93 | .. code-block:: python
94 |
95 | import urllib3
96 |
97 | print(urllib3.util.make_headers(keep_alive=True, user_agent="Batman/1.0"))
98 | # {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'}
99 | print(urllib3.util.make_headers(accept_encoding=True))
100 | # {'accept-encoding': 'gzip,deflate'}
101 | """
102 | headers: dict[str, str] = {}
103 | if accept_encoding:
104 | if isinstance(accept_encoding, str):
105 | pass
106 | elif isinstance(accept_encoding, list):
107 | accept_encoding = ",".join(accept_encoding)
108 | else:
109 | accept_encoding = ACCEPT_ENCODING
110 | headers["accept-encoding"] = accept_encoding
111 |
112 | if user_agent:
113 | headers["user-agent"] = user_agent
114 |
115 | if keep_alive:
116 | headers["connection"] = "keep-alive"
117 |
118 | if basic_auth:
119 | headers[
120 | "authorization"
121 | ] = f"Basic {b64encode(basic_auth.encode('latin-1')).decode()}"
122 |
123 | if proxy_basic_auth:
124 | headers[
125 | "proxy-authorization"
126 | ] = f"Basic {b64encode(proxy_basic_auth.encode('latin-1')).decode()}"
127 |
128 | if disable_cache:
129 | headers["cache-control"] = "no-cache"
130 |
131 | return headers
132 |
133 |
134 | def set_file_position(
135 | body: typing.Any, pos: _TYPE_BODY_POSITION | None
136 | ) -> _TYPE_BODY_POSITION | None:
137 | """
138 | If a position is provided, move file to that point.
139 | Otherwise, we'll attempt to record a position for future use.
140 | """
141 | if pos is not None:
142 | rewind_body(body, pos)
143 | elif getattr(body, "tell", None) is not None:
144 | try:
145 | pos = body.tell()
146 | except OSError:
147 | # This differentiates from None, allowing us to catch
148 | # a failed `tell()` later when trying to rewind the body.
149 | pos = _FAILEDTELL
150 |
151 | return pos
152 |
153 |
154 | def rewind_body(body: typing.IO[typing.AnyStr], body_pos: _TYPE_BODY_POSITION) -> None:
155 | """
156 | Attempt to rewind body to a certain position.
157 | Primarily used for request redirects and retries.
158 |
159 | :param body:
160 | File-like object that supports seek.
161 |
162 | :param int pos:
163 | Position to seek to in file.
164 | """
165 | body_seek = getattr(body, "seek", None)
166 | if body_seek is not None and isinstance(body_pos, int):
167 | try:
168 | body_seek(body_pos)
169 | except OSError as e:
170 | raise UnrewindableBodyError(
171 | "An error occurred when rewinding request body for redirect/retry."
172 | ) from e
173 | elif body_pos is _FAILEDTELL:
174 | raise UnrewindableBodyError(
175 | "Unable to record file position for rewinding "
176 | "request body during a redirect/retry."
177 | )
178 | else:
179 | raise ValueError(
180 | f"body_pos must be of type integer, instead it was {type(body_pos)}."
181 | )
182 |
183 |
184 | class ChunksAndContentLength(typing.NamedTuple):
185 | chunks: typing.Iterable[bytes] | None
186 | content_length: int | None
187 |
188 |
189 | def body_to_chunks(
190 | body: typing.Any | None, method: str, blocksize: int
191 | ) -> ChunksAndContentLength:
192 | """Takes the HTTP request method, body, and blocksize and
193 | transforms them into an iterable of chunks to pass to
194 | socket.sendall() and an optional 'Content-Length' header.
195 |
196 | A 'Content-Length' of 'None' indicates the length of the body
197 | can't be determined so should use 'Transfer-Encoding: chunked'
198 | for framing instead.
199 | """
200 |
201 | chunks: typing.Iterable[bytes] | None
202 | content_length: int | None
203 |
204 | # No body, we need to make a recommendation on 'Content-Length'
205 | # based on whether that request method is expected to have
206 | # a body or not.
207 | if body is None:
208 | chunks = None
209 | if method.upper() not in _METHODS_NOT_EXPECTING_BODY:
210 | content_length = 0
211 | else:
212 | content_length = None
213 |
214 | # Bytes or strings become bytes
215 | elif isinstance(body, (str, bytes)):
216 | chunks = (to_bytes(body),)
217 | content_length = len(chunks[0])
218 |
219 | # File-like object, TODO: use seek() and tell() for length?
220 | elif hasattr(body, "read"):
221 |
222 | def chunk_readable() -> typing.Iterable[bytes]:
223 | nonlocal body, blocksize
224 | encode = isinstance(body, io.TextIOBase)
225 | while True:
226 | datablock = body.read(blocksize)
227 | if not datablock:
228 | break
229 | if encode:
230 | datablock = datablock.encode("utf-8")
231 | yield datablock
232 |
233 | chunks = chunk_readable()
234 | content_length = None
235 |
236 | # Otherwise we need to start checking via duck-typing.
237 | else:
238 | try:
239 | # Check if the body implements the buffer API.
240 | mv = memoryview(body)
241 | except TypeError:
242 | try:
243 | # Check if the body is an iterable
244 | chunks = iter(body)
245 | content_length = None
246 | except TypeError:
247 | raise TypeError(
248 | f"'body' must be a bytes-like object, file-like "
249 | f"object, or iterable. Instead was {body!r}"
250 | ) from None
251 | else:
252 | # Since it implements the buffer API can be passed directly to socket.sendall()
253 | chunks = (body,)
254 | content_length = mv.nbytes
255 |
256 | return ChunksAndContentLength(chunks=chunks, content_length=content_length)
257 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py:
--------------------------------------------------------------------------------
```python
1 | from typing import Any, Optional
2 |
3 | from pip._vendor.packaging.specifiers import SpecifierSet
4 | from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
5 |
6 | from pip._internal.req.constructors import install_req_drop_extras
7 | from pip._internal.req.req_install import InstallRequirement
8 |
9 | from .base import Candidate, CandidateLookup, Requirement, format_name
10 |
11 |
12 | class ExplicitRequirement(Requirement):
13 | def __init__(self, candidate: Candidate) -> None:
14 | self.candidate = candidate
15 |
16 | def __str__(self) -> str:
17 | return str(self.candidate)
18 |
19 | def __repr__(self) -> str:
20 | return f"{self.__class__.__name__}({self.candidate!r})"
21 |
22 | def __hash__(self) -> int:
23 | return hash(self.candidate)
24 |
25 | def __eq__(self, other: Any) -> bool:
26 | if not isinstance(other, ExplicitRequirement):
27 | return False
28 | return self.candidate == other.candidate
29 |
30 | @property
31 | def project_name(self) -> NormalizedName:
32 | # No need to canonicalize - the candidate did this
33 | return self.candidate.project_name
34 |
35 | @property
36 | def name(self) -> str:
37 | # No need to canonicalize - the candidate did this
38 | return self.candidate.name
39 |
40 | def format_for_error(self) -> str:
41 | return self.candidate.format_for_error()
42 |
43 | def get_candidate_lookup(self) -> CandidateLookup:
44 | return self.candidate, None
45 |
46 | def is_satisfied_by(self, candidate: Candidate) -> bool:
47 | return candidate == self.candidate
48 |
49 |
50 | class SpecifierRequirement(Requirement):
51 | def __init__(self, ireq: InstallRequirement) -> None:
52 | assert ireq.link is None, "This is a link, not a specifier"
53 | self._ireq = ireq
54 | self._equal_cache: Optional[str] = None
55 | self._hash: Optional[int] = None
56 | self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras)
57 |
58 | @property
59 | def _equal(self) -> str:
60 | if self._equal_cache is not None:
61 | return self._equal_cache
62 |
63 | self._equal_cache = str(self._ireq)
64 | return self._equal_cache
65 |
66 | def __str__(self) -> str:
67 | return str(self._ireq.req)
68 |
69 | def __repr__(self) -> str:
70 | return f"{self.__class__.__name__}({str(self._ireq.req)!r})"
71 |
72 | def __eq__(self, other: object) -> bool:
73 | if not isinstance(other, SpecifierRequirement):
74 | return NotImplemented
75 | return self._equal == other._equal
76 |
77 | def __hash__(self) -> int:
78 | if self._hash is not None:
79 | return self._hash
80 |
81 | self._hash = hash(self._equal)
82 | return self._hash
83 |
84 | @property
85 | def project_name(self) -> NormalizedName:
86 | assert self._ireq.req, "Specifier-backed ireq is always PEP 508"
87 | return canonicalize_name(self._ireq.req.name)
88 |
89 | @property
90 | def name(self) -> str:
91 | return format_name(self.project_name, self._extras)
92 |
93 | def format_for_error(self) -> str:
94 | # Convert comma-separated specifiers into "A, B, ..., F and G"
95 | # This makes the specifier a bit more "human readable", without
96 | # risking a change in meaning. (Hopefully! Not all edge cases have
97 | # been checked)
98 | parts = [s.strip() for s in str(self).split(",")]
99 | if len(parts) == 0:
100 | return ""
101 | elif len(parts) == 1:
102 | return parts[0]
103 |
104 | return ", ".join(parts[:-1]) + " and " + parts[-1]
105 |
106 | def get_candidate_lookup(self) -> CandidateLookup:
107 | return None, self._ireq
108 |
109 | def is_satisfied_by(self, candidate: Candidate) -> bool:
110 | assert candidate.name == self.name, (
111 | f"Internal issue: Candidate is not for this requirement "
112 | f"{candidate.name} vs {self.name}"
113 | )
114 | # We can safely always allow prereleases here since PackageFinder
115 | # already implements the prerelease logic, and would have filtered out
116 | # prerelease candidates if the user does not expect them.
117 | assert self._ireq.req, "Specifier-backed ireq is always PEP 508"
118 | spec = self._ireq.req.specifier
119 | return spec.contains(candidate.version, prereleases=True)
120 |
121 |
122 | class SpecifierWithoutExtrasRequirement(SpecifierRequirement):
123 | """
124 | Requirement backed by an install requirement on a base package.
125 | Trims extras from its install requirement if there are any.
126 | """
127 |
128 | def __init__(self, ireq: InstallRequirement) -> None:
129 | assert ireq.link is None, "This is a link, not a specifier"
130 | self._ireq = install_req_drop_extras(ireq)
131 | self._equal_cache: Optional[str] = None
132 | self._hash: Optional[int] = None
133 | self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras)
134 |
135 | @property
136 | def _equal(self) -> str:
137 | if self._equal_cache is not None:
138 | return self._equal_cache
139 |
140 | self._equal_cache = str(self._ireq)
141 | return self._equal_cache
142 |
143 | def __eq__(self, other: object) -> bool:
144 | if not isinstance(other, SpecifierWithoutExtrasRequirement):
145 | return NotImplemented
146 | return self._equal == other._equal
147 |
148 | def __hash__(self) -> int:
149 | if self._hash is not None:
150 | return self._hash
151 |
152 | self._hash = hash(self._equal)
153 | return self._hash
154 |
155 |
156 | class RequiresPythonRequirement(Requirement):
157 | """A requirement representing Requires-Python metadata."""
158 |
159 | def __init__(self, specifier: SpecifierSet, match: Candidate) -> None:
160 | self.specifier = specifier
161 | self._specifier_string = str(specifier) # for faster __eq__
162 | self._hash: Optional[int] = None
163 | self._candidate = match
164 |
165 | def __str__(self) -> str:
166 | return f"Python {self.specifier}"
167 |
168 | def __repr__(self) -> str:
169 | return f"{self.__class__.__name__}({str(self.specifier)!r})"
170 |
171 | def __hash__(self) -> int:
172 | if self._hash is not None:
173 | return self._hash
174 |
175 | self._hash = hash((self._specifier_string, self._candidate))
176 | return self._hash
177 |
178 | def __eq__(self, other: Any) -> bool:
179 | if not isinstance(other, RequiresPythonRequirement):
180 | return False
181 | return (
182 | self._specifier_string == other._specifier_string
183 | and self._candidate == other._candidate
184 | )
185 |
186 | @property
187 | def project_name(self) -> NormalizedName:
188 | return self._candidate.project_name
189 |
190 | @property
191 | def name(self) -> str:
192 | return self._candidate.name
193 |
194 | def format_for_error(self) -> str:
195 | return str(self)
196 |
197 | def get_candidate_lookup(self) -> CandidateLookup:
198 | if self.specifier.contains(self._candidate.version, prereleases=True):
199 | return self._candidate, None
200 | return None, None
201 |
202 | def is_satisfied_by(self, candidate: Candidate) -> bool:
203 | assert candidate.name == self._candidate.name, "Not Python candidate"
204 | # We can safely always allow prereleases here since PackageFinder
205 | # already implements the prerelease logic, and would have filtered out
206 | # prerelease candidates if the user does not expect them.
207 | return self.specifier.contains(candidate.version, prereleases=True)
208 |
209 |
210 | class UnsatisfiableRequirement(Requirement):
211 | """A requirement that cannot be satisfied."""
212 |
213 | def __init__(self, name: NormalizedName) -> None:
214 | self._name = name
215 |
216 | def __str__(self) -> str:
217 | return f"{self._name} (unavailable)"
218 |
219 | def __repr__(self) -> str:
220 | return f"{self.__class__.__name__}({str(self._name)!r})"
221 |
222 | def __eq__(self, other: object) -> bool:
223 | if not isinstance(other, UnsatisfiableRequirement):
224 | return NotImplemented
225 | return self._name == other._name
226 |
227 | def __hash__(self) -> int:
228 | return hash(self._name)
229 |
230 | @property
231 | def project_name(self) -> NormalizedName:
232 | return self._name
233 |
234 | @property
235 | def name(self) -> str:
236 | return self._name
237 |
238 | def format_for_error(self) -> str:
239 | return str(self)
240 |
241 | def get_candidate_lookup(self) -> CandidateLookup:
242 | return None, None
243 |
244 | def is_satisfied_by(self, candidate: Candidate) -> bool:
245 | return False
246 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py:
--------------------------------------------------------------------------------
```python
1 | from typing import Dict
2 |
3 | from .style import Style
4 |
5 | DEFAULT_STYLES: Dict[str, Style] = {
6 | "none": Style.null(),
7 | "reset": Style(
8 | color="default",
9 | bgcolor="default",
10 | dim=False,
11 | bold=False,
12 | italic=False,
13 | underline=False,
14 | blink=False,
15 | blink2=False,
16 | reverse=False,
17 | conceal=False,
18 | strike=False,
19 | ),
20 | "dim": Style(dim=True),
21 | "bright": Style(dim=False),
22 | "bold": Style(bold=True),
23 | "strong": Style(bold=True),
24 | "code": Style(reverse=True, bold=True),
25 | "italic": Style(italic=True),
26 | "emphasize": Style(italic=True),
27 | "underline": Style(underline=True),
28 | "blink": Style(blink=True),
29 | "blink2": Style(blink2=True),
30 | "reverse": Style(reverse=True),
31 | "strike": Style(strike=True),
32 | "black": Style(color="black"),
33 | "red": Style(color="red"),
34 | "green": Style(color="green"),
35 | "yellow": Style(color="yellow"),
36 | "magenta": Style(color="magenta"),
37 | "cyan": Style(color="cyan"),
38 | "white": Style(color="white"),
39 | "inspect.attr": Style(color="yellow", italic=True),
40 | "inspect.attr.dunder": Style(color="yellow", italic=True, dim=True),
41 | "inspect.callable": Style(bold=True, color="red"),
42 | "inspect.async_def": Style(italic=True, color="bright_cyan"),
43 | "inspect.def": Style(italic=True, color="bright_cyan"),
44 | "inspect.class": Style(italic=True, color="bright_cyan"),
45 | "inspect.error": Style(bold=True, color="red"),
46 | "inspect.equals": Style(),
47 | "inspect.help": Style(color="cyan"),
48 | "inspect.doc": Style(dim=True),
49 | "inspect.value.border": Style(color="green"),
50 | "live.ellipsis": Style(bold=True, color="red"),
51 | "layout.tree.row": Style(dim=False, color="red"),
52 | "layout.tree.column": Style(dim=False, color="blue"),
53 | "logging.keyword": Style(bold=True, color="yellow"),
54 | "logging.level.notset": Style(dim=True),
55 | "logging.level.debug": Style(color="green"),
56 | "logging.level.info": Style(color="blue"),
57 | "logging.level.warning": Style(color="red"),
58 | "logging.level.error": Style(color="red", bold=True),
59 | "logging.level.critical": Style(color="red", bold=True, reverse=True),
60 | "log.level": Style.null(),
61 | "log.time": Style(color="cyan", dim=True),
62 | "log.message": Style.null(),
63 | "log.path": Style(dim=True),
64 | "repr.ellipsis": Style(color="yellow"),
65 | "repr.indent": Style(color="green", dim=True),
66 | "repr.error": Style(color="red", bold=True),
67 | "repr.str": Style(color="green", italic=False, bold=False),
68 | "repr.brace": Style(bold=True),
69 | "repr.comma": Style(bold=True),
70 | "repr.ipv4": Style(bold=True, color="bright_green"),
71 | "repr.ipv6": Style(bold=True, color="bright_green"),
72 | "repr.eui48": Style(bold=True, color="bright_green"),
73 | "repr.eui64": Style(bold=True, color="bright_green"),
74 | "repr.tag_start": Style(bold=True),
75 | "repr.tag_name": Style(color="bright_magenta", bold=True),
76 | "repr.tag_contents": Style(color="default"),
77 | "repr.tag_end": Style(bold=True),
78 | "repr.attrib_name": Style(color="yellow", italic=False),
79 | "repr.attrib_equal": Style(bold=True),
80 | "repr.attrib_value": Style(color="magenta", italic=False),
81 | "repr.number": Style(color="cyan", bold=True, italic=False),
82 | "repr.number_complex": Style(color="cyan", bold=True, italic=False), # same
83 | "repr.bool_true": Style(color="bright_green", italic=True),
84 | "repr.bool_false": Style(color="bright_red", italic=True),
85 | "repr.none": Style(color="magenta", italic=True),
86 | "repr.url": Style(underline=True, color="bright_blue", italic=False, bold=False),
87 | "repr.uuid": Style(color="bright_yellow", bold=False),
88 | "repr.call": Style(color="magenta", bold=True),
89 | "repr.path": Style(color="magenta"),
90 | "repr.filename": Style(color="bright_magenta"),
91 | "rule.line": Style(color="bright_green"),
92 | "rule.text": Style.null(),
93 | "json.brace": Style(bold=True),
94 | "json.bool_true": Style(color="bright_green", italic=True),
95 | "json.bool_false": Style(color="bright_red", italic=True),
96 | "json.null": Style(color="magenta", italic=True),
97 | "json.number": Style(color="cyan", bold=True, italic=False),
98 | "json.str": Style(color="green", italic=False, bold=False),
99 | "json.key": Style(color="blue", bold=True),
100 | "prompt": Style.null(),
101 | "prompt.choices": Style(color="magenta", bold=True),
102 | "prompt.default": Style(color="cyan", bold=True),
103 | "prompt.invalid": Style(color="red"),
104 | "prompt.invalid.choice": Style(color="red"),
105 | "pretty": Style.null(),
106 | "scope.border": Style(color="blue"),
107 | "scope.key": Style(color="yellow", italic=True),
108 | "scope.key.special": Style(color="yellow", italic=True, dim=True),
109 | "scope.equals": Style(color="red"),
110 | "table.header": Style(bold=True),
111 | "table.footer": Style(bold=True),
112 | "table.cell": Style.null(),
113 | "table.title": Style(italic=True),
114 | "table.caption": Style(italic=True, dim=True),
115 | "traceback.error": Style(color="red", italic=True),
116 | "traceback.border.syntax_error": Style(color="bright_red"),
117 | "traceback.border": Style(color="red"),
118 | "traceback.text": Style.null(),
119 | "traceback.title": Style(color="red", bold=True),
120 | "traceback.exc_type": Style(color="bright_red", bold=True),
121 | "traceback.exc_value": Style.null(),
122 | "traceback.offset": Style(color="bright_red", bold=True),
123 | "bar.back": Style(color="grey23"),
124 | "bar.complete": Style(color="rgb(249,38,114)"),
125 | "bar.finished": Style(color="rgb(114,156,31)"),
126 | "bar.pulse": Style(color="rgb(249,38,114)"),
127 | "progress.description": Style.null(),
128 | "progress.filesize": Style(color="green"),
129 | "progress.filesize.total": Style(color="green"),
130 | "progress.download": Style(color="green"),
131 | "progress.elapsed": Style(color="yellow"),
132 | "progress.percentage": Style(color="magenta"),
133 | "progress.remaining": Style(color="cyan"),
134 | "progress.data.speed": Style(color="red"),
135 | "progress.spinner": Style(color="green"),
136 | "status.spinner": Style(color="green"),
137 | "tree": Style(),
138 | "tree.line": Style(),
139 | "markdown.paragraph": Style(),
140 | "markdown.text": Style(),
141 | "markdown.em": Style(italic=True),
142 | "markdown.emph": Style(italic=True), # For commonmark backwards compatibility
143 | "markdown.strong": Style(bold=True),
144 | "markdown.code": Style(bold=True, color="cyan", bgcolor="black"),
145 | "markdown.code_block": Style(color="cyan", bgcolor="black"),
146 | "markdown.block_quote": Style(color="magenta"),
147 | "markdown.list": Style(color="cyan"),
148 | "markdown.item": Style(),
149 | "markdown.item.bullet": Style(color="yellow", bold=True),
150 | "markdown.item.number": Style(color="yellow", bold=True),
151 | "markdown.hr": Style(color="yellow"),
152 | "markdown.h1.border": Style(),
153 | "markdown.h1": Style(bold=True),
154 | "markdown.h2": Style(bold=True, underline=True),
155 | "markdown.h3": Style(bold=True),
156 | "markdown.h4": Style(bold=True, dim=True),
157 | "markdown.h5": Style(underline=True),
158 | "markdown.h6": Style(italic=True),
159 | "markdown.h7": Style(italic=True, dim=True),
160 | "markdown.link": Style(color="bright_blue"),
161 | "markdown.link_url": Style(color="blue", underline=True),
162 | "markdown.s": Style(strike=True),
163 | "iso8601.date": Style(color="blue"),
164 | "iso8601.time": Style(color="magenta"),
165 | "iso8601.timezone": Style(color="yellow"),
166 | }
167 |
168 |
169 | if __name__ == "__main__": # pragma: no cover
170 | import argparse
171 | import io
172 |
173 | from pip._vendor.rich.console import Console
174 | from pip._vendor.rich.table import Table
175 | from pip._vendor.rich.text import Text
176 |
177 | parser = argparse.ArgumentParser()
178 | parser.add_argument("--html", action="store_true", help="Export as HTML table")
179 | args = parser.parse_args()
180 | html: bool = args.html
181 | console = Console(record=True, width=70, file=io.StringIO()) if html else Console()
182 |
183 | table = Table("Name", "Styling")
184 |
185 | for style_name, style in DEFAULT_STYLES.items():
186 | table.add_row(Text(style_name, style=style), str(style))
187 |
188 | console.print(table)
189 | if html:
190 | print(console.export_html(inline_styles=True))
191 |
```