This is page 22 of 168. Use http://codebase.md/romanshablio/mcp_server?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .DS_Store
├── .venv
│ ├── __pycache__
│ │ └── hello.cpython-312.pyc
│ ├── bin
│ │ ├── activate
│ │ ├── activate.csh
│ │ ├── activate.fish
│ │ ├── Activate.ps1
│ │ ├── flask
│ │ ├── normalizer
│ │ ├── pip
│ │ ├── pip3
│ │ ├── pip3.12
│ │ ├── python
│ │ ├── python3
│ │ └── python3.12
│ ├── hello.py
│ ├── lib
│ │ └── python3.12
│ │ └── site-packages
│ │ ├── beautifulsoup4-4.12.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ ├── AUTHORS
│ │ │ │ └── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── blinker
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _utilities.cpython-312.pyc
│ │ │ │ └── base.cpython-312.pyc
│ │ │ ├── _utilities.py
│ │ │ ├── base.py
│ │ │ └── py.typed
│ │ ├── blinker-1.8.2.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── bs4
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── css.cpython-312.pyc
│ │ │ │ ├── dammit.cpython-312.pyc
│ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ ├── element.cpython-312.pyc
│ │ │ │ └── formatter.cpython-312.pyc
│ │ │ ├── builder
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _html5lib.cpython-312.pyc
│ │ │ │ │ ├── _htmlparser.cpython-312.pyc
│ │ │ │ │ └── _lxml.cpython-312.pyc
│ │ │ │ ├── _html5lib.py
│ │ │ │ ├── _htmlparser.py
│ │ │ │ └── _lxml.py
│ │ │ ├── css.py
│ │ │ ├── dammit.py
│ │ │ ├── diagnose.py
│ │ │ ├── element.py
│ │ │ ├── formatter.py
│ │ │ └── tests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── test_builder_registry.cpython-312.pyc
│ │ │ │ ├── test_builder.cpython-312.pyc
│ │ │ │ ├── test_css.cpython-312.pyc
│ │ │ │ ├── test_dammit.cpython-312.pyc
│ │ │ │ ├── test_docs.cpython-312.pyc
│ │ │ │ ├── test_element.cpython-312.pyc
│ │ │ │ ├── test_formatter.cpython-312.pyc
│ │ │ │ ├── test_fuzz.cpython-312.pyc
│ │ │ │ ├── test_html5lib.cpython-312.pyc
│ │ │ │ ├── test_htmlparser.cpython-312.pyc
│ │ │ │ ├── test_lxml.cpython-312.pyc
│ │ │ │ ├── test_navigablestring.cpython-312.pyc
│ │ │ │ ├── test_pageelement.cpython-312.pyc
│ │ │ │ ├── test_soup.cpython-312.pyc
│ │ │ │ ├── test_tag.cpython-312.pyc
│ │ │ │ └── test_tree.cpython-312.pyc
│ │ │ ├── fuzz
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase
│ │ │ │ ├── crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase
│ │ │ │ └── crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase
│ │ │ ├── test_builder_registry.py
│ │ │ ├── test_builder.py
│ │ │ ├── test_css.py
│ │ │ ├── test_dammit.py
│ │ │ ├── test_docs.py
│ │ │ ├── test_element.py
│ │ │ ├── test_formatter.py
│ │ │ ├── test_fuzz.py
│ │ │ ├── test_html5lib.py
│ │ │ ├── test_htmlparser.py
│ │ │ ├── test_lxml.py
│ │ │ ├── test_navigablestring.py
│ │ │ ├── test_pageelement.py
│ │ │ ├── test_soup.py
│ │ │ ├── test_tag.py
│ │ │ └── test_tree.py
│ │ ├── certifi
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── core.cpython-312.pyc
│ │ │ ├── cacert.pem
│ │ │ ├── core.py
│ │ │ └── py.typed
│ │ ├── certifi-2024.8.30.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── charset_normalizer
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── cd.cpython-312.pyc
│ │ │ │ ├── constant.cpython-312.pyc
│ │ │ │ ├── legacy.cpython-312.pyc
│ │ │ │ ├── md.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── version.cpython-312.pyc
│ │ │ ├── api.py
│ │ │ ├── cd.py
│ │ │ ├── cli
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __main__.py
│ │ │ │ └── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── __main__.cpython-312.pyc
│ │ │ ├── constant.py
│ │ │ ├── legacy.py
│ │ │ ├── md__mypyc.cpython-312-darwin.so
│ │ │ ├── md.cpython-312-darwin.so
│ │ │ ├── md.py
│ │ │ ├── models.py
│ │ │ ├── py.typed
│ │ │ ├── utils.py
│ │ │ └── version.py
│ │ ├── charset_normalizer-3.4.0.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── click
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ ├── _termui_impl.cpython-312.pyc
│ │ │ │ ├── _textwrap.cpython-312.pyc
│ │ │ │ ├── _winconsole.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── decorators.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formatting.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── shell_completion.cpython-312.pyc
│ │ │ │ ├── termui.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── types.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── _compat.py
│ │ │ ├── _termui_impl.py
│ │ │ ├── _textwrap.py
│ │ │ ├── _winconsole.py
│ │ │ ├── core.py
│ │ │ ├── decorators.py
│ │ │ ├── exceptions.py
│ │ │ ├── formatting.py
│ │ │ ├── globals.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── shell_completion.py
│ │ │ ├── termui.py
│ │ │ ├── testing.py
│ │ │ ├── types.py
│ │ │ └── utils.py
│ │ ├── click-8.1.7.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.rst
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── fake_useragent
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ ├── fake.cpython-312.pyc
│ │ │ │ ├── log.cpython-312.pyc
│ │ │ │ ├── settings.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── data
│ │ │ │ └── browsers.json
│ │ │ ├── errors.py
│ │ │ ├── fake.py
│ │ │ ├── log.py
│ │ │ ├── settings.py
│ │ │ └── utils.py
│ │ ├── fake_useragent-1.5.1.dist-info
│ │ │ ├── AUTHORS
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── flask
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ ├── cli.cpython-312.pyc
│ │ │ │ ├── config.cpython-312.pyc
│ │ │ │ ├── ctx.cpython-312.pyc
│ │ │ │ ├── debughelpers.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── helpers.cpython-312.pyc
│ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── signals.cpython-312.pyc
│ │ │ │ ├── templating.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── typing.cpython-312.pyc
│ │ │ │ ├── views.cpython-312.pyc
│ │ │ │ └── wrappers.cpython-312.pyc
│ │ │ ├── app.py
│ │ │ ├── blueprints.py
│ │ │ ├── cli.py
│ │ │ ├── config.py
│ │ │ ├── ctx.py
│ │ │ ├── debughelpers.py
│ │ │ ├── globals.py
│ │ │ ├── helpers.py
│ │ │ ├── json
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ └── tag.cpython-312.pyc
│ │ │ │ ├── provider.py
│ │ │ │ └── tag.py
│ │ │ ├── logging.py
│ │ │ ├── py.typed
│ │ │ ├── sansio
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ │ └── scaffold.cpython-312.pyc
│ │ │ │ ├── app.py
│ │ │ │ ├── blueprints.py
│ │ │ │ ├── README.md
│ │ │ │ └── scaffold.py
│ │ │ ├── sessions.py
│ │ │ ├── signals.py
│ │ │ ├── templating.py
│ │ │ ├── testing.py
│ │ │ ├── typing.py
│ │ │ ├── views.py
│ │ │ └── wrappers.py
│ │ ├── flask-3.0.3.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── idna
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ ├── codec.py
│ │ │ ├── compat.py
│ │ │ ├── core.py
│ │ │ ├── idnadata.py
│ │ │ ├── intranges.py
│ │ │ ├── package_data.py
│ │ │ ├── py.typed
│ │ │ └── uts46data.py
│ │ ├── idna-3.10.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── itsdangerous
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ ├── exc.cpython-312.pyc
│ │ │ │ ├── serializer.cpython-312.pyc
│ │ │ │ ├── signer.cpython-312.pyc
│ │ │ │ ├── timed.cpython-312.pyc
│ │ │ │ └── url_safe.cpython-312.pyc
│ │ │ ├── _json.py
│ │ │ ├── encoding.py
│ │ │ ├── exc.py
│ │ │ ├── py.typed
│ │ │ ├── serializer.py
│ │ │ ├── signer.py
│ │ │ ├── timed.py
│ │ │ └── url_safe.py
│ │ ├── itsdangerous-2.2.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── jinja2
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _identifier.cpython-312.pyc
│ │ │ │ ├── async_utils.cpython-312.pyc
│ │ │ │ ├── bccache.cpython-312.pyc
│ │ │ │ ├── compiler.cpython-312.pyc
│ │ │ │ ├── constants.cpython-312.pyc
│ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ ├── defaults.cpython-312.pyc
│ │ │ │ ├── environment.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ ├── filters.cpython-312.pyc
│ │ │ │ ├── idtracking.cpython-312.pyc
│ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ ├── loaders.cpython-312.pyc
│ │ │ │ ├── meta.cpython-312.pyc
│ │ │ │ ├── nativetypes.cpython-312.pyc
│ │ │ │ ├── nodes.cpython-312.pyc
│ │ │ │ ├── optimizer.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── runtime.cpython-312.pyc
│ │ │ │ ├── sandbox.cpython-312.pyc
│ │ │ │ ├── tests.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── visitor.cpython-312.pyc
│ │ │ ├── _identifier.py
│ │ │ ├── async_utils.py
│ │ │ ├── bccache.py
│ │ │ ├── compiler.py
│ │ │ ├── constants.py
│ │ │ ├── debug.py
│ │ │ ├── defaults.py
│ │ │ ├── environment.py
│ │ │ ├── exceptions.py
│ │ │ ├── ext.py
│ │ │ ├── filters.py
│ │ │ ├── idtracking.py
│ │ │ ├── lexer.py
│ │ │ ├── loaders.py
│ │ │ ├── meta.py
│ │ │ ├── nativetypes.py
│ │ │ ├── nodes.py
│ │ │ ├── optimizer.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── runtime.py
│ │ │ ├── sandbox.py
│ │ │ ├── tests.py
│ │ │ ├── utils.py
│ │ │ └── visitor.py
│ │ ├── jinja2-3.1.4.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── lxml
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _elementpath.cpython-312.pyc
│ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ ├── cssselect.cpython-312.pyc
│ │ │ │ ├── doctestcompare.cpython-312.pyc
│ │ │ │ ├── ElementInclude.cpython-312.pyc
│ │ │ │ ├── pyclasslookup.cpython-312.pyc
│ │ │ │ ├── sax.cpython-312.pyc
│ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ ├── _elementpath.cpython-312-darwin.so
│ │ │ ├── _elementpath.py
│ │ │ ├── apihelpers.pxi
│ │ │ ├── builder.cpython-312-darwin.so
│ │ │ ├── builder.py
│ │ │ ├── classlookup.pxi
│ │ │ ├── cleanup.pxi
│ │ │ ├── cssselect.py
│ │ │ ├── debug.pxi
│ │ │ ├── docloader.pxi
│ │ │ ├── doctestcompare.py
│ │ │ ├── dtd.pxi
│ │ │ ├── ElementInclude.py
│ │ │ ├── etree_api.h
│ │ │ ├── etree.cpython-312-darwin.so
│ │ │ ├── etree.h
│ │ │ ├── etree.pyx
│ │ │ ├── extensions.pxi
│ │ │ ├── html
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _diffcommand.cpython-312.pyc
│ │ │ │ │ ├── _html5builder.cpython-312.pyc
│ │ │ │ │ ├── _setmixin.cpython-312.pyc
│ │ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ │ ├── clean.cpython-312.pyc
│ │ │ │ │ ├── defs.cpython-312.pyc
│ │ │ │ │ ├── diff.cpython-312.pyc
│ │ │ │ │ ├── ElementSoup.cpython-312.pyc
│ │ │ │ │ ├── formfill.cpython-312.pyc
│ │ │ │ │ ├── html5parser.cpython-312.pyc
│ │ │ │ │ ├── soupparser.cpython-312.pyc
│ │ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ │ ├── _diffcommand.py
│ │ │ │ ├── _html5builder.py
│ │ │ │ ├── _setmixin.py
│ │ │ │ ├── builder.py
│ │ │ │ ├── clean.py
│ │ │ │ ├── defs.py
│ │ │ │ ├── diff.cpython-312-darwin.so
│ │ │ │ ├── diff.py
│ │ │ │ ├── ElementSoup.py
│ │ │ │ ├── formfill.py
│ │ │ │ ├── html5parser.py
│ │ │ │ ├── soupparser.py
│ │ │ │ └── usedoctest.py
│ │ │ ├── includes
│ │ │ │ ├── __init__.pxd
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── c14n.pxd
│ │ │ │ ├── config.pxd
│ │ │ │ ├── dtdvalid.pxd
│ │ │ │ ├── etree_defs.h
│ │ │ │ ├── etreepublic.pxd
│ │ │ │ ├── extlibs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── libcharset.h
│ │ │ │ │ ├── localcharset.h
│ │ │ │ │ ├── zconf.h
│ │ │ │ │ └── zlib.h
│ │ │ │ ├── htmlparser.pxd
│ │ │ │ ├── libexslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── exslt.h
│ │ │ │ │ ├── exsltconfig.h
│ │ │ │ │ └── exsltexports.h
│ │ │ │ ├── libxml
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── c14n.h
│ │ │ │ │ ├── catalog.h
│ │ │ │ │ ├── chvalid.h
│ │ │ │ │ ├── debugXML.h
│ │ │ │ │ ├── dict.h
│ │ │ │ │ ├── encoding.h
│ │ │ │ │ ├── entities.h
│ │ │ │ │ ├── globals.h
│ │ │ │ │ ├── hash.h
│ │ │ │ │ ├── HTMLparser.h
│ │ │ │ │ ├── HTMLtree.h
│ │ │ │ │ ├── list.h
│ │ │ │ │ ├── nanoftp.h
│ │ │ │ │ ├── nanohttp.h
│ │ │ │ │ ├── parser.h
│ │ │ │ │ ├── parserInternals.h
│ │ │ │ │ ├── relaxng.h
│ │ │ │ │ ├── SAX.h
│ │ │ │ │ ├── SAX2.h
│ │ │ │ │ ├── schemasInternals.h
│ │ │ │ │ ├── schematron.h
│ │ │ │ │ ├── threads.h
│ │ │ │ │ ├── tree.h
│ │ │ │ │ ├── uri.h
│ │ │ │ │ ├── valid.h
│ │ │ │ │ ├── xinclude.h
│ │ │ │ │ ├── xlink.h
│ │ │ │ │ ├── xmlautomata.h
│ │ │ │ │ ├── xmlerror.h
│ │ │ │ │ ├── xmlexports.h
│ │ │ │ │ ├── xmlIO.h
│ │ │ │ │ ├── xmlmemory.h
│ │ │ │ │ ├── xmlmodule.h
│ │ │ │ │ ├── xmlreader.h
│ │ │ │ │ ├── xmlregexp.h
│ │ │ │ │ ├── xmlsave.h
│ │ │ │ │ ├── xmlschemas.h
│ │ │ │ │ ├── xmlschemastypes.h
│ │ │ │ │ ├── xmlstring.h
│ │ │ │ │ ├── xmlunicode.h
│ │ │ │ │ ├── xmlversion.h
│ │ │ │ │ ├── xmlwriter.h
│ │ │ │ │ ├── xpath.h
│ │ │ │ │ ├── xpathInternals.h
│ │ │ │ │ └── xpointer.h
│ │ │ │ ├── libxslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── attributes.h
│ │ │ │ │ ├── documents.h
│ │ │ │ │ ├── extensions.h
│ │ │ │ │ ├── extra.h
│ │ │ │ │ ├── functions.h
│ │ │ │ │ ├── imports.h
│ │ │ │ │ ├── keys.h
│ │ │ │ │ ├── namespaces.h
│ │ │ │ │ ├── numbersInternals.h
│ │ │ │ │ ├── pattern.h
│ │ │ │ │ ├── preproc.h
│ │ │ │ │ ├── security.h
│ │ │ │ │ ├── templates.h
│ │ │ │ │ ├── transform.h
│ │ │ │ │ ├── variables.h
│ │ │ │ │ ├── xslt.h
│ │ │ │ │ ├── xsltconfig.h
│ │ │ │ │ ├── xsltexports.h
│ │ │ │ │ ├── xsltInternals.h
│ │ │ │ │ ├── xsltlocale.h
│ │ │ │ │ └── xsltutils.h
│ │ │ │ ├── lxml-version.h
│ │ │ │ ├── relaxng.pxd
│ │ │ │ ├── schematron.pxd
│ │ │ │ ├── tree.pxd
│ │ │ │ ├── uri.pxd
│ │ │ │ ├── xinclude.pxd
│ │ │ │ ├── xmlerror.pxd
│ │ │ │ ├── xmlparser.pxd
│ │ │ │ ├── xmlschema.pxd
│ │ │ │ ├── xpath.pxd
│ │ │ │ └── xslt.pxd
│ │ │ ├── isoschematron
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ └── resources
│ │ │ │ ├── rng
│ │ │ │ │ └── iso-schematron.rng
│ │ │ │ └── xsl
│ │ │ │ ├── iso-schematron-xslt1
│ │ │ │ │ ├── iso_abstract_expand.xsl
│ │ │ │ │ ├── iso_dsdl_include.xsl
│ │ │ │ │ ├── iso_schematron_message.xsl
│ │ │ │ │ ├── iso_schematron_skeleton_for_xslt1.xsl
│ │ │ │ │ ├── iso_svrl_for_xslt1.xsl
│ │ │ │ │ └── readme.txt
│ │ │ │ ├── RNG2Schtrn.xsl
│ │ │ │ └── XSD2Schtrn.xsl
│ │ │ ├── iterparse.pxi
│ │ │ ├── lxml.etree_api.h
│ │ │ ├── lxml.etree.h
│ │ │ ├── nsclasses.pxi
│ │ │ ├── objectify.cpython-312-darwin.so
│ │ │ ├── objectify.pyx
│ │ │ ├── objectpath.pxi
│ │ │ ├── parser.pxi
│ │ │ ├── parsertarget.pxi
│ │ │ ├── proxy.pxi
│ │ │ ├── public-api.pxi
│ │ │ ├── pyclasslookup.py
│ │ │ ├── readonlytree.pxi
│ │ │ ├── relaxng.pxi
│ │ │ ├── sax.cpython-312-darwin.so
│ │ │ ├── sax.py
│ │ │ ├── saxparser.pxi
│ │ │ ├── schematron.pxi
│ │ │ ├── serializer.pxi
│ │ │ ├── usedoctest.py
│ │ │ ├── xinclude.pxi
│ │ │ ├── xmlerror.pxi
│ │ │ ├── xmlid.pxi
│ │ │ ├── xmlschema.pxi
│ │ │ ├── xpath.pxi
│ │ │ ├── xslt.pxi
│ │ │ └── xsltext.pxi
│ │ ├── lxml-5.3.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── LICENSES.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── markupsafe
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── _native.cpython-312.pyc
│ │ │ ├── _native.py
│ │ │ ├── _speedups.c
│ │ │ ├── _speedups.cpython-312-darwin.so
│ │ │ ├── _speedups.pyi
│ │ │ └── py.typed
│ │ ├── MarkupSafe-3.0.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── pip
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pip-runner__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── __pip-runner__.cpython-312.pyc
│ │ │ ├── _internal
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── build_env.cpython-312.pyc
│ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ ├── pyproject.cpython-312.pyc
│ │ │ │ │ ├── self_outdated_check.cpython-312.pyc
│ │ │ │ │ └── wheel_builder.cpython-312.pyc
│ │ │ │ ├── build_env.py
│ │ │ │ ├── cache.py
│ │ │ │ ├── cli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── autocompletion.cpython-312.pyc
│ │ │ │ │ │ ├── base_command.cpython-312.pyc
│ │ │ │ │ │ ├── cmdoptions.cpython-312.pyc
│ │ │ │ │ │ ├── command_context.cpython-312.pyc
│ │ │ │ │ │ ├── index_command.cpython-312.pyc
│ │ │ │ │ │ ├── main_parser.cpython-312.pyc
│ │ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bars.cpython-312.pyc
│ │ │ │ │ │ ├── req_command.cpython-312.pyc
│ │ │ │ │ │ ├── spinners.cpython-312.pyc
│ │ │ │ │ │ └── status_codes.cpython-312.pyc
│ │ │ │ │ ├── autocompletion.py
│ │ │ │ │ ├── base_command.py
│ │ │ │ │ ├── cmdoptions.py
│ │ │ │ │ ├── command_context.py
│ │ │ │ │ ├── index_command.py
│ │ │ │ │ ├── main_parser.py
│ │ │ │ │ ├── main.py
│ │ │ │ │ ├── parser.py
│ │ │ │ │ ├── progress_bars.py
│ │ │ │ │ ├── req_command.py
│ │ │ │ │ ├── spinners.py
│ │ │ │ │ └── status_codes.py
│ │ │ │ ├── commands
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── completion.cpython-312.pyc
│ │ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ ├── hash.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── inspect.cpython-312.pyc
│ │ │ │ │ │ ├── install.cpython-312.pyc
│ │ │ │ │ │ ├── list.cpython-312.pyc
│ │ │ │ │ │ ├── search.cpython-312.pyc
│ │ │ │ │ │ ├── show.cpython-312.pyc
│ │ │ │ │ │ ├── uninstall.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── completion.py
│ │ │ │ │ ├── configuration.py
│ │ │ │ │ ├── debug.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── hash.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── inspect.py
│ │ │ │ │ ├── install.py
│ │ │ │ │ ├── list.py
│ │ │ │ │ ├── search.py
│ │ │ │ │ ├── show.py
│ │ │ │ │ ├── uninstall.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── configuration.py
│ │ │ │ ├── distributions
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── installed.cpython-312.pyc
│ │ │ │ │ │ ├── sdist.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── installed.py
│ │ │ │ │ ├── sdist.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── index
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── collector.cpython-312.pyc
│ │ │ │ │ │ ├── package_finder.cpython-312.pyc
│ │ │ │ │ │ └── sources.cpython-312.pyc
│ │ │ │ │ ├── collector.py
│ │ │ │ │ ├── package_finder.py
│ │ │ │ │ └── sources.py
│ │ │ │ ├── locations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _distutils.cpython-312.pyc
│ │ │ │ │ │ ├── _sysconfig.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── _distutils.py
│ │ │ │ │ ├── _sysconfig.py
│ │ │ │ │ └── base.py
│ │ │ │ ├── main.py
│ │ │ │ ├── metadata
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ └── pkg_resources.cpython-312.pyc
│ │ │ │ │ ├── _json.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── importlib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ │ ├── _dists.cpython-312.pyc
│ │ │ │ │ │ │ └── _envs.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.py
│ │ │ │ │ │ ├── _dists.py
│ │ │ │ │ │ └── _envs.py
│ │ │ │ │ └── pkg_resources.py
│ │ │ │ ├── models
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── candidate.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url.cpython-312.pyc
│ │ │ │ │ │ ├── format_control.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── installation_report.cpython-312.pyc
│ │ │ │ │ │ ├── link.cpython-312.pyc
│ │ │ │ │ │ ├── scheme.cpython-312.pyc
│ │ │ │ │ │ ├── search_scope.cpython-312.pyc
│ │ │ │ │ │ ├── selection_prefs.cpython-312.pyc
│ │ │ │ │ │ ├── target_python.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── candidate.py
│ │ │ │ │ ├── direct_url.py
│ │ │ │ │ ├── format_control.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── installation_report.py
│ │ │ │ │ ├── link.py
│ │ │ │ │ ├── scheme.py
│ │ │ │ │ ├── search_scope.py
│ │ │ │ │ ├── selection_prefs.py
│ │ │ │ │ ├── target_python.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── network
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── lazy_wheel.cpython-312.pyc
│ │ │ │ │ │ ├── session.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── xmlrpc.cpython-312.pyc
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── lazy_wheel.py
│ │ │ │ │ ├── session.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── xmlrpc.py
│ │ │ │ ├── operations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ └── prepare.cpython-312.pyc
│ │ │ │ │ ├── build
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── build_tracker.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_legacy.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── build_tracker.py
│ │ │ │ │ │ ├── metadata_editable.py
│ │ │ │ │ │ ├── metadata_legacy.py
│ │ │ │ │ │ ├── metadata.py
│ │ │ │ │ │ ├── wheel_editable.py
│ │ │ │ │ │ ├── wheel_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── install
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── editable_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── editable_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ └── prepare.py
│ │ │ │ ├── pyproject.py
│ │ │ │ ├── req
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── constructors.cpython-312.pyc
│ │ │ │ │ │ ├── req_file.cpython-312.pyc
│ │ │ │ │ │ ├── req_install.cpython-312.pyc
│ │ │ │ │ │ ├── req_set.cpython-312.pyc
│ │ │ │ │ │ └── req_uninstall.cpython-312.pyc
│ │ │ │ │ ├── constructors.py
│ │ │ │ │ ├── req_file.py
│ │ │ │ │ ├── req_install.py
│ │ │ │ │ ├── req_set.py
│ │ │ │ │ └── req_uninstall.py
│ │ │ │ ├── resolution
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── legacy
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ │ └── resolver.py
│ │ │ │ │ └── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── candidates.cpython-312.pyc
│ │ │ │ │ │ ├── factory.cpython-312.pyc
│ │ │ │ │ │ ├── found_candidates.cpython-312.pyc
│ │ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ │ ├── reporter.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── candidates.py
│ │ │ │ │ ├── factory.py
│ │ │ │ │ ├── found_candidates.py
│ │ │ │ │ ├── provider.py
│ │ │ │ │ ├── reporter.py
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ └── resolver.py
│ │ │ │ ├── self_outdated_check.py
│ │ │ │ ├── utils
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _jaraco_text.cpython-312.pyc
│ │ │ │ │ │ ├── _log.cpython-312.pyc
│ │ │ │ │ │ ├── appdirs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── compatibility_tags.cpython-312.pyc
│ │ │ │ │ │ ├── datetime.cpython-312.pyc
│ │ │ │ │ │ ├── deprecation.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url_helpers.cpython-312.pyc
│ │ │ │ │ │ ├── egg_link.cpython-312.pyc
│ │ │ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ │ │ ├── entrypoints.cpython-312.pyc
│ │ │ │ │ │ ├── filesystem.cpython-312.pyc
│ │ │ │ │ │ ├── filetypes.cpython-312.pyc
│ │ │ │ │ │ ├── glibc.cpython-312.pyc
│ │ │ │ │ │ ├── hashes.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── misc.cpython-312.pyc
│ │ │ │ │ │ ├── packaging.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── setuptools_build.cpython-312.pyc
│ │ │ │ │ │ ├── subprocess.cpython-312.pyc
│ │ │ │ │ │ ├── temp_dir.cpython-312.pyc
│ │ │ │ │ │ ├── unpacking.cpython-312.pyc
│ │ │ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ │ │ ├── virtualenv.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── _jaraco_text.py
│ │ │ │ │ ├── _log.py
│ │ │ │ │ ├── appdirs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── compatibility_tags.py
│ │ │ │ │ ├── datetime.py
│ │ │ │ │ ├── deprecation.py
│ │ │ │ │ ├── direct_url_helpers.py
│ │ │ │ │ ├── egg_link.py
│ │ │ │ │ ├── encoding.py
│ │ │ │ │ ├── entrypoints.py
│ │ │ │ │ ├── filesystem.py
│ │ │ │ │ ├── filetypes.py
│ │ │ │ │ ├── glibc.py
│ │ │ │ │ ├── hashes.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── misc.py
│ │ │ │ │ ├── packaging.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── setuptools_build.py
│ │ │ │ │ ├── subprocess.py
│ │ │ │ │ ├── temp_dir.py
│ │ │ │ │ ├── unpacking.py
│ │ │ │ │ ├── urls.py
│ │ │ │ │ ├── virtualenv.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── vcs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── bazaar.cpython-312.pyc
│ │ │ │ │ │ ├── git.cpython-312.pyc
│ │ │ │ │ │ ├── mercurial.cpython-312.pyc
│ │ │ │ │ │ ├── subversion.cpython-312.pyc
│ │ │ │ │ │ └── versioncontrol.cpython-312.pyc
│ │ │ │ │ ├── bazaar.py
│ │ │ │ │ ├── git.py
│ │ │ │ │ ├── mercurial.py
│ │ │ │ │ ├── subversion.py
│ │ │ │ │ └── versioncontrol.py
│ │ │ │ └── wheel_builder.py
│ │ │ ├── _vendor
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ └── typing_extensions.cpython-312.pyc
│ │ │ │ ├── cachecontrol
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _cmd.cpython-312.pyc
│ │ │ │ │ │ ├── adapter.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── controller.cpython-312.pyc
│ │ │ │ │ │ ├── filewrapper.cpython-312.pyc
│ │ │ │ │ │ ├── heuristics.cpython-312.pyc
│ │ │ │ │ │ ├── serialize.cpython-312.pyc
│ │ │ │ │ │ └── wrapper.cpython-312.pyc
│ │ │ │ │ ├── _cmd.py
│ │ │ │ │ ├── adapter.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── caches
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── file_cache.cpython-312.pyc
│ │ │ │ │ │ │ └── redis_cache.cpython-312.pyc
│ │ │ │ │ │ ├── file_cache.py
│ │ │ │ │ │ └── redis_cache.py
│ │ │ │ │ ├── controller.py
│ │ │ │ │ ├── filewrapper.py
│ │ │ │ │ ├── heuristics.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── serialize.py
│ │ │ │ │ └── wrapper.py
│ │ │ │ ├── certifi
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── core.cpython-312.pyc
│ │ │ │ │ ├── cacert.pem
│ │ │ │ │ ├── core.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── distlib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── database.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── locators.cpython-312.pyc
│ │ │ │ │ │ ├── manifest.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── resources.cpython-312.pyc
│ │ │ │ │ │ ├── scripts.cpython-312.pyc
│ │ │ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── database.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── locators.py
│ │ │ │ │ ├── manifest.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── resources.py
│ │ │ │ │ ├── scripts.py
│ │ │ │ │ ├── t32.exe
│ │ │ │ │ ├── t64-arm.exe
│ │ │ │ │ ├── t64.exe
│ │ │ │ │ ├── util.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ ├── w32.exe
│ │ │ │ │ ├── w64-arm.exe
│ │ │ │ │ ├── w64.exe
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── distro
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── distro.cpython-312.pyc
│ │ │ │ │ ├── distro.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── idna
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ │ │ ├── codec.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── core.py
│ │ │ │ │ ├── idnadata.py
│ │ │ │ │ ├── intranges.py
│ │ │ │ │ ├── package_data.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ └── uts46data.py
│ │ │ │ ├── msgpack
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ │ │ └── fallback.cpython-312.pyc
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── ext.py
│ │ │ │ │ └── fallback.py
│ │ │ │ ├── packaging
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _elffile.cpython-312.pyc
│ │ │ │ │ │ ├── _manylinux.cpython-312.pyc
│ │ │ │ │ │ ├── _musllinux.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _structures.cpython-312.pyc
│ │ │ │ │ │ ├── _tokenizer.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ ├── specifiers.cpython-312.pyc
│ │ │ │ │ │ ├── tags.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── version.cpython-312.pyc
│ │ │ │ │ ├── _elffile.py
│ │ │ │ │ ├── _manylinux.py
│ │ │ │ │ ├── _musllinux.py
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _structures.py
│ │ │ │ │ ├── _tokenizer.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ ├── specifiers.py
│ │ │ │ │ ├── tags.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── version.py
│ │ │ │ ├── pkg_resources
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── platformdirs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── android.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── macos.cpython-312.pyc
│ │ │ │ │ │ ├── unix.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── windows.cpython-312.pyc
│ │ │ │ │ ├── android.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── macos.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── unix.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ └── windows.py
│ │ │ │ ├── pygments
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── cmdline.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── filter.cpython-312.pyc
│ │ │ │ │ │ ├── formatter.cpython-312.pyc
│ │ │ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ │ │ ├── modeline.cpython-312.pyc
│ │ │ │ │ │ ├── plugin.cpython-312.pyc
│ │ │ │ │ │ ├── regexopt.cpython-312.pyc
│ │ │ │ │ │ ├── scanner.cpython-312.pyc
│ │ │ │ │ │ ├── sphinxext.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── token.cpython-312.pyc
│ │ │ │ │ │ ├── unistring.cpython-312.pyc
│ │ │ │ │ │ └── util.cpython-312.pyc
│ │ │ │ │ ├── cmdline.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── filter.py
│ │ │ │ │ ├── filters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── formatter.py
│ │ │ │ │ ├── formatters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ ├── bbcode.cpython-312.pyc
│ │ │ │ │ │ │ ├── groff.cpython-312.pyc
│ │ │ │ │ │ │ ├── html.cpython-312.pyc
│ │ │ │ │ │ │ ├── img.cpython-312.pyc
│ │ │ │ │ │ │ ├── irc.cpython-312.pyc
│ │ │ │ │ │ │ ├── latex.cpython-312.pyc
│ │ │ │ │ │ │ ├── other.cpython-312.pyc
│ │ │ │ │ │ │ ├── pangomarkup.cpython-312.pyc
│ │ │ │ │ │ │ ├── rtf.cpython-312.pyc
│ │ │ │ │ │ │ ├── svg.cpython-312.pyc
│ │ │ │ │ │ │ ├── terminal.cpython-312.pyc
│ │ │ │ │ │ │ └── terminal256.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ ├── bbcode.py
│ │ │ │ │ │ ├── groff.py
│ │ │ │ │ │ ├── html.py
│ │ │ │ │ │ ├── img.py
│ │ │ │ │ │ ├── irc.py
│ │ │ │ │ │ ├── latex.py
│ │ │ │ │ │ ├── other.py
│ │ │ │ │ │ ├── pangomarkup.py
│ │ │ │ │ │ ├── rtf.py
│ │ │ │ │ │ ├── svg.py
│ │ │ │ │ │ ├── terminal.py
│ │ │ │ │ │ └── terminal256.py
│ │ │ │ │ ├── lexer.py
│ │ │ │ │ ├── lexers
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ └── python.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ └── python.py
│ │ │ │ │ ├── modeline.py
│ │ │ │ │ ├── plugin.py
│ │ │ │ │ ├── regexopt.py
│ │ │ │ │ ├── scanner.py
│ │ │ │ │ ├── sphinxext.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styles
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── _mapping.cpython-312.pyc
│ │ │ │ │ │ └── _mapping.py
│ │ │ │ │ ├── token.py
│ │ │ │ │ ├── unistring.py
│ │ │ │ │ └── util.py
│ │ │ │ ├── pyproject_hooks
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ └── _impl.cpython-312.pyc
│ │ │ │ │ ├── _compat.py
│ │ │ │ │ ├── _impl.py
│ │ │ │ │ └── _in_process
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── _in_process.cpython-312.pyc
│ │ │ │ │ └── _in_process.py
│ │ │ │ ├── requests
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ │ ├── __version__.py
│ │ │ │ │ ├── _internal_utils.py
│ │ │ │ │ ├── adapters.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── certs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── cookies.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── hooks.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ ├── packages.py
│ │ │ │ │ ├── sessions.py
│ │ │ │ │ ├── status_codes.py
│ │ │ │ │ ├── structures.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── providers.cpython-312.pyc
│ │ │ │ │ │ ├── reporters.cpython-312.pyc
│ │ │ │ │ │ ├── resolvers.cpython-312.pyc
│ │ │ │ │ │ └── structs.cpython-312.pyc
│ │ │ │ │ ├── compat
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── collections_abc.cpython-312.pyc
│ │ │ │ │ │ └── collections_abc.py
│ │ │ │ │ ├── providers.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── reporters.py
│ │ │ │ │ ├── resolvers.py
│ │ │ │ │ └── structs.py
│ │ │ │ ├── rich
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── _cell_widths.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_codes.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_replace.cpython-312.pyc
│ │ │ │ │ │ ├── _export_format.cpython-312.pyc
│ │ │ │ │ │ ├── _extension.cpython-312.pyc
│ │ │ │ │ │ ├── _fileno.cpython-312.pyc
│ │ │ │ │ │ ├── _inspect.cpython-312.pyc
│ │ │ │ │ │ ├── _log_render.cpython-312.pyc
│ │ │ │ │ │ ├── _loop.cpython-312.pyc
│ │ │ │ │ │ ├── _null_file.cpython-312.pyc
│ │ │ │ │ │ ├── _palettes.cpython-312.pyc
│ │ │ │ │ │ ├── _pick.cpython-312.pyc
│ │ │ │ │ │ ├── _ratio.cpython-312.pyc
│ │ │ │ │ │ ├── _spinners.cpython-312.pyc
│ │ │ │ │ │ ├── _stack.cpython-312.pyc
│ │ │ │ │ │ ├── _timer.cpython-312.pyc
│ │ │ │ │ │ ├── _win32_console.cpython-312.pyc
│ │ │ │ │ │ ├── _windows_renderer.cpython-312.pyc
│ │ │ │ │ │ ├── _windows.cpython-312.pyc
│ │ │ │ │ │ ├── _wrap.cpython-312.pyc
│ │ │ │ │ │ ├── abc.cpython-312.pyc
│ │ │ │ │ │ ├── align.cpython-312.pyc
│ │ │ │ │ │ ├── ansi.cpython-312.pyc
│ │ │ │ │ │ ├── bar.cpython-312.pyc
│ │ │ │ │ │ ├── box.cpython-312.pyc
│ │ │ │ │ │ ├── cells.cpython-312.pyc
│ │ │ │ │ │ ├── color_triplet.cpython-312.pyc
│ │ │ │ │ │ ├── color.cpython-312.pyc
│ │ │ │ │ │ ├── columns.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── constrain.cpython-312.pyc
│ │ │ │ │ │ ├── containers.cpython-312.pyc
│ │ │ │ │ │ ├── control.cpython-312.pyc
│ │ │ │ │ │ ├── default_styles.cpython-312.pyc
│ │ │ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ │ │ ├── emoji.cpython-312.pyc
│ │ │ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ │ │ ├── file_proxy.cpython-312.pyc
│ │ │ │ │ │ ├── filesize.cpython-312.pyc
│ │ │ │ │ │ ├── highlighter.cpython-312.pyc
│ │ │ │ │ │ ├── json.cpython-312.pyc
│ │ │ │ │ │ ├── jupyter.cpython-312.pyc
│ │ │ │ │ │ ├── layout.cpython-312.pyc
│ │ │ │ │ │ ├── live_render.cpython-312.pyc
│ │ │ │ │ │ ├── live.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── markup.cpython-312.pyc
│ │ │ │ │ │ ├── measure.cpython-312.pyc
│ │ │ │ │ │ ├── padding.cpython-312.pyc
│ │ │ │ │ │ ├── pager.cpython-312.pyc
│ │ │ │ │ │ ├── palette.cpython-312.pyc
│ │ │ │ │ │ ├── panel.cpython-312.pyc
│ │ │ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bar.cpython-312.pyc
│ │ │ │ │ │ ├── progress.cpython-312.pyc
│ │ │ │ │ │ ├── prompt.cpython-312.pyc
│ │ │ │ │ │ ├── protocol.cpython-312.pyc
│ │ │ │ │ │ ├── region.cpython-312.pyc
│ │ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ │ ├── rule.cpython-312.pyc
│ │ │ │ │ │ ├── scope.cpython-312.pyc
│ │ │ │ │ │ ├── screen.cpython-312.pyc
│ │ │ │ │ │ ├── segment.cpython-312.pyc
│ │ │ │ │ │ ├── spinner.cpython-312.pyc
│ │ │ │ │ │ ├── status.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── styled.cpython-312.pyc
│ │ │ │ │ │ ├── syntax.cpython-312.pyc
│ │ │ │ │ │ ├── table.cpython-312.pyc
│ │ │ │ │ │ ├── terminal_theme.cpython-312.pyc
│ │ │ │ │ │ ├── text.cpython-312.pyc
│ │ │ │ │ │ ├── theme.cpython-312.pyc
│ │ │ │ │ │ ├── themes.cpython-312.pyc
│ │ │ │ │ │ ├── traceback.cpython-312.pyc
│ │ │ │ │ │ └── tree.cpython-312.pyc
│ │ │ │ │ ├── _cell_widths.py
│ │ │ │ │ ├── _emoji_codes.py
│ │ │ │ │ ├── _emoji_replace.py
│ │ │ │ │ ├── _export_format.py
│ │ │ │ │ ├── _extension.py
│ │ │ │ │ ├── _fileno.py
│ │ │ │ │ ├── _inspect.py
│ │ │ │ │ ├── _log_render.py
│ │ │ │ │ ├── _loop.py
│ │ │ │ │ ├── _null_file.py
│ │ │ │ │ ├── _palettes.py
│ │ │ │ │ ├── _pick.py
│ │ │ │ │ ├── _ratio.py
│ │ │ │ │ ├── _spinners.py
│ │ │ │ │ ├── _stack.py
│ │ │ │ │ ├── _timer.py
│ │ │ │ │ ├── _win32_console.py
│ │ │ │ │ ├── _windows_renderer.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ ├── _wrap.py
│ │ │ │ │ ├── abc.py
│ │ │ │ │ ├── align.py
│ │ │ │ │ ├── ansi.py
│ │ │ │ │ ├── bar.py
│ │ │ │ │ ├── box.py
│ │ │ │ │ ├── cells.py
│ │ │ │ │ ├── color_triplet.py
│ │ │ │ │ ├── color.py
│ │ │ │ │ ├── columns.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── constrain.py
│ │ │ │ │ ├── containers.py
│ │ │ │ │ ├── control.py
│ │ │ │ │ ├── default_styles.py
│ │ │ │ │ ├── diagnose.py
│ │ │ │ │ ├── emoji.py
│ │ │ │ │ ├── errors.py
│ │ │ │ │ ├── file_proxy.py
│ │ │ │ │ ├── filesize.py
│ │ │ │ │ ├── highlighter.py
│ │ │ │ │ ├── json.py
│ │ │ │ │ ├── jupyter.py
│ │ │ │ │ ├── layout.py
│ │ │ │ │ ├── live_render.py
│ │ │ │ │ ├── live.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── markup.py
│ │ │ │ │ ├── measure.py
│ │ │ │ │ ├── padding.py
│ │ │ │ │ ├── pager.py
│ │ │ │ │ ├── palette.py
│ │ │ │ │ ├── panel.py
│ │ │ │ │ ├── pretty.py
│ │ │ │ │ ├── progress_bar.py
│ │ │ │ │ ├── progress.py
│ │ │ │ │ ├── prompt.py
│ │ │ │ │ ├── protocol.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── region.py
│ │ │ │ │ ├── repr.py
│ │ │ │ │ ├── rule.py
│ │ │ │ │ ├── scope.py
│ │ │ │ │ ├── screen.py
│ │ │ │ │ ├── segment.py
│ │ │ │ │ ├── spinner.py
│ │ │ │ │ ├── status.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styled.py
│ │ │ │ │ ├── syntax.py
│ │ │ │ │ ├── table.py
│ │ │ │ │ ├── terminal_theme.py
│ │ │ │ │ ├── text.py
│ │ │ │ │ ├── theme.py
│ │ │ │ │ ├── themes.py
│ │ │ │ │ ├── traceback.py
│ │ │ │ │ └── tree.py
│ │ │ │ ├── tomli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _re.cpython-312.pyc
│ │ │ │ │ │ └── _types.cpython-312.pyc
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _re.py
│ │ │ │ │ ├── _types.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── truststore
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _api.cpython-312.pyc
│ │ │ │ │ │ ├── _macos.cpython-312.pyc
│ │ │ │ │ │ ├── _openssl.cpython-312.pyc
│ │ │ │ │ │ ├── _ssl_constants.cpython-312.pyc
│ │ │ │ │ │ └── _windows.cpython-312.pyc
│ │ │ │ │ ├── _api.py
│ │ │ │ │ ├── _macos.py
│ │ │ │ │ ├── _openssl.py
│ │ │ │ │ ├── _ssl_constants.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── typing_extensions.py
│ │ │ │ ├── urllib3
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── _collections.py
│ │ │ │ │ ├── _version.py
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── connectionpool.py
│ │ │ │ │ ├── contrib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _appengine_environ.cpython-312.pyc
│ │ │ │ │ │ │ ├── appengine.cpython-312.pyc
│ │ │ │ │ │ │ ├── ntlmpool.cpython-312.pyc
│ │ │ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ │ │ ├── securetransport.cpython-312.pyc
│ │ │ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ │ │ ├── _appengine_environ.py
│ │ │ │ │ │ ├── _securetransport
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── bindings.cpython-312.pyc
│ │ │ │ │ │ │ │ └── low_level.cpython-312.pyc
│ │ │ │ │ │ │ ├── bindings.py
│ │ │ │ │ │ │ └── low_level.py
│ │ │ │ │ │ ├── appengine.py
│ │ │ │ │ │ ├── ntlmpool.py
│ │ │ │ │ │ ├── pyopenssl.py
│ │ │ │ │ │ ├── securetransport.py
│ │ │ │ │ │ └── socks.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── fields.py
│ │ │ │ │ ├── filepost.py
│ │ │ │ │ ├── packages
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── six.cpython-312.pyc
│ │ │ │ │ │ ├── backports
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── makefile.cpython-312.pyc
│ │ │ │ │ │ │ │ └── weakref_finalize.cpython-312.pyc
│ │ │ │ │ │ │ ├── makefile.py
│ │ │ │ │ │ │ └── weakref_finalize.py
│ │ │ │ │ │ └── six.py
│ │ │ │ │ ├── poolmanager.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ └── util
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ │ │ ├── queue.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ │ │ └── wait.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── proxy.py
│ │ │ │ │ ├── queue.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── ssl_.py
│ │ │ │ │ ├── ssl_match_hostname.py
│ │ │ │ │ ├── ssltransport.py
│ │ │ │ │ ├── timeout.py
│ │ │ │ │ ├── url.py
│ │ │ │ │ └── wait.py
│ │ │ │ └── vendor.txt
│ │ │ └── py.typed
│ │ ├── pip-24.2.dist-info
│ │ │ ├── AUTHORS.txt
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── requests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── __version__.py
│ │ │ ├── _internal_utils.py
│ │ │ ├── adapters.py
│ │ │ ├── api.py
│ │ │ ├── auth.py
│ │ │ ├── certs.py
│ │ │ ├── compat.py
│ │ │ ├── cookies.py
│ │ │ ├── exceptions.py
│ │ │ ├── help.py
│ │ │ ├── hooks.py
│ │ │ ├── models.py
│ │ │ ├── packages.py
│ │ │ ├── sessions.py
│ │ │ ├── status_codes.py
│ │ │ ├── structures.py
│ │ │ └── utils.py
│ │ ├── requests-2.32.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── soupsieve
│ │ │ ├── __init__.py
│ │ │ ├── __meta__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __meta__.cpython-312.pyc
│ │ │ │ ├── css_match.cpython-312.pyc
│ │ │ │ ├── css_parser.cpython-312.pyc
│ │ │ │ ├── css_types.cpython-312.pyc
│ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ └── util.cpython-312.pyc
│ │ │ ├── css_match.py
│ │ │ ├── css_parser.py
│ │ │ ├── css_types.py
│ │ │ ├── pretty.py
│ │ │ ├── py.typed
│ │ │ └── util.py
│ │ ├── soupsieve-2.6.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── urllib3
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _base_connection.cpython-312.pyc
│ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ ├── _request_methods.cpython-312.pyc
│ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ └── response.cpython-312.pyc
│ │ │ ├── _base_connection.py
│ │ │ ├── _collections.py
│ │ │ ├── _request_methods.py
│ │ │ ├── _version.py
│ │ │ ├── connection.py
│ │ │ ├── connectionpool.py
│ │ │ ├── contrib
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ ├── emscripten
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── fetch.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── emscripten_fetch_worker.js
│ │ │ │ │ ├── fetch.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ └── response.py
│ │ │ │ ├── pyopenssl.py
│ │ │ │ └── socks.py
│ │ │ ├── exceptions.py
│ │ │ ├── fields.py
│ │ │ ├── filepost.py
│ │ │ ├── http2
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ └── probe.cpython-312.pyc
│ │ │ │ ├── connection.py
│ │ │ │ └── probe.py
│ │ │ ├── poolmanager.py
│ │ │ ├── py.typed
│ │ │ ├── response.py
│ │ │ └── util
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ └── wait.cpython-312.pyc
│ │ │ ├── connection.py
│ │ │ ├── proxy.py
│ │ │ ├── request.py
│ │ │ ├── response.py
│ │ │ ├── retry.py
│ │ │ ├── ssl_.py
│ │ │ ├── ssl_match_hostname.py
│ │ │ ├── ssltransport.py
│ │ │ ├── timeout.py
│ │ │ ├── url.py
│ │ │ ├── util.py
│ │ │ └── wait.py
│ │ ├── urllib3-2.2.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── useragent
│ │ │ ├── __init__.py
│ │ │ ├── __init__.pyc
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── resources
│ │ │ │ └── user_agent_data.json
│ │ │ └── test
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── test_additional_os.json
│ │ │ ├── test_browser.json
│ │ │ ├── test_device.json
│ │ │ ├── test_firefox.json
│ │ │ ├── test_os.json
│ │ │ └── test_pgts_browser.json
│ │ ├── useragent-0.1.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── werkzeug
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _internal.cpython-312.pyc
│ │ │ │ ├── _reloader.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formparser.cpython-312.pyc
│ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ ├── local.cpython-312.pyc
│ │ │ │ ├── security.cpython-312.pyc
│ │ │ │ ├── serving.cpython-312.pyc
│ │ │ │ ├── test.cpython-312.pyc
│ │ │ │ ├── testapp.cpython-312.pyc
│ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ ├── user_agent.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── wsgi.cpython-312.pyc
│ │ │ ├── _internal.py
│ │ │ ├── _reloader.py
│ │ │ ├── datastructures
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── accept.cpython-312.pyc
│ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ ├── cache_control.cpython-312.pyc
│ │ │ │ │ ├── csp.cpython-312.pyc
│ │ │ │ │ ├── etag.cpython-312.pyc
│ │ │ │ │ ├── file_storage.cpython-312.pyc
│ │ │ │ │ ├── headers.cpython-312.pyc
│ │ │ │ │ ├── mixins.cpython-312.pyc
│ │ │ │ │ ├── range.cpython-312.pyc
│ │ │ │ │ └── structures.cpython-312.pyc
│ │ │ │ ├── accept.py
│ │ │ │ ├── accept.pyi
│ │ │ │ ├── auth.py
│ │ │ │ ├── cache_control.py
│ │ │ │ ├── cache_control.pyi
│ │ │ │ ├── csp.py
│ │ │ │ ├── csp.pyi
│ │ │ │ ├── etag.py
│ │ │ │ ├── etag.pyi
│ │ │ │ ├── file_storage.py
│ │ │ │ ├── file_storage.pyi
│ │ │ │ ├── headers.py
│ │ │ │ ├── headers.pyi
│ │ │ │ ├── mixins.py
│ │ │ │ ├── mixins.pyi
│ │ │ │ ├── range.py
│ │ │ │ ├── range.pyi
│ │ │ │ ├── structures.py
│ │ │ │ └── structures.pyi
│ │ │ ├── debug
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ └── tbtools.cpython-312.pyc
│ │ │ │ ├── console.py
│ │ │ │ ├── repr.py
│ │ │ │ ├── shared
│ │ │ │ │ ├── console.png
│ │ │ │ │ ├── debugger.js
│ │ │ │ │ ├── ICON_LICENSE.md
│ │ │ │ │ ├── less.png
│ │ │ │ │ ├── more.png
│ │ │ │ │ └── style.css
│ │ │ │ └── tbtools.py
│ │ │ ├── exceptions.py
│ │ │ ├── formparser.py
│ │ │ ├── http.py
│ │ │ ├── local.py
│ │ │ ├── middleware
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── dispatcher.cpython-312.pyc
│ │ │ │ │ ├── http_proxy.cpython-312.pyc
│ │ │ │ │ ├── lint.cpython-312.pyc
│ │ │ │ │ ├── profiler.cpython-312.pyc
│ │ │ │ │ ├── proxy_fix.cpython-312.pyc
│ │ │ │ │ └── shared_data.cpython-312.pyc
│ │ │ │ ├── dispatcher.py
│ │ │ │ ├── http_proxy.py
│ │ │ │ ├── lint.py
│ │ │ │ ├── profiler.py
│ │ │ │ ├── proxy_fix.py
│ │ │ │ └── shared_data.py
│ │ │ ├── py.typed
│ │ │ ├── routing
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── converters.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── map.cpython-312.pyc
│ │ │ │ │ ├── matcher.cpython-312.pyc
│ │ │ │ │ └── rules.cpython-312.pyc
│ │ │ │ ├── converters.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── map.py
│ │ │ │ ├── matcher.py
│ │ │ │ └── rules.py
│ │ │ ├── sansio
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ │ ├── multipart.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ ├── http.py
│ │ │ │ ├── multipart.py
│ │ │ │ ├── request.py
│ │ │ │ ├── response.py
│ │ │ │ └── utils.py
│ │ │ ├── security.py
│ │ │ ├── serving.py
│ │ │ ├── test.py
│ │ │ ├── testapp.py
│ │ │ ├── urls.py
│ │ │ ├── user_agent.py
│ │ │ ├── utils.py
│ │ │ ├── wrappers
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ ├── request.py
│ │ │ │ └── response.py
│ │ │ └── wsgi.py
│ │ └── werkzeug-3.0.4.dist-info
│ │ ├── INSTALLER
│ │ ├── LICENSE.txt
│ │ ├── METADATA
│ │ ├── RECORD
│ │ └── WHEEL
│ ├── pyvenv.cfg
│ ├── static
│ │ └── styles.css
│ ├── templates
│ │ └── index.html
│ └── test.py
├── cline_config.json
├── mcp_server.py
├── README.md
├── search_results.json
├── settings.json
└── test_files
├── text1.txt
└── text2.txt
```
# Files
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py:
--------------------------------------------------------------------------------
```python
1 | """Utilities to lazily create and visit candidates found.
2 |
3 | Creating and visiting a candidate is a *very* costly operation. It involves
4 | fetching, extracting, potentially building modules from source, and verifying
5 | distribution metadata. It is therefore crucial for performance to keep
6 | everything here lazy all the way down, so we only touch candidates that we
7 | absolutely need, and not "download the world" when we only need one version of
8 | something.
9 | """
10 |
11 | import functools
12 | import logging
13 | from collections.abc import Sequence
14 | from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional, Set, Tuple
15 |
16 | from pip._vendor.packaging.version import _BaseVersion
17 |
18 | from pip._internal.exceptions import MetadataInvalid
19 |
20 | from .base import Candidate
21 |
22 | logger = logging.getLogger(__name__)
23 |
24 | IndexCandidateInfo = Tuple[_BaseVersion, Callable[[], Optional[Candidate]]]
25 |
26 | if TYPE_CHECKING:
27 | SequenceCandidate = Sequence[Candidate]
28 | else:
29 | # For compatibility: Python before 3.9 does not support using [] on the
30 | # Sequence class.
31 | #
32 | # >>> from collections.abc import Sequence
33 | # >>> Sequence[str]
34 | # Traceback (most recent call last):
35 | # File "<stdin>", line 1, in <module>
36 | # TypeError: 'ABCMeta' object is not subscriptable
37 | #
38 | # TODO: Remove this block after dropping Python 3.8 support.
39 | SequenceCandidate = Sequence
40 |
41 |
42 | def _iter_built(infos: Iterator[IndexCandidateInfo]) -> Iterator[Candidate]:
43 | """Iterator for ``FoundCandidates``.
44 |
45 | This iterator is used when the package is not already installed. Candidates
46 | from index come later in their normal ordering.
47 | """
48 | versions_found: Set[_BaseVersion] = set()
49 | for version, func in infos:
50 | if version in versions_found:
51 | continue
52 | try:
53 | candidate = func()
54 | except MetadataInvalid as e:
55 | logger.warning(
56 | "Ignoring version %s of %s since it has invalid metadata:\n"
57 | "%s\n"
58 | "Please use pip<24.1 if you need to use this version.",
59 | version,
60 | e.ireq.name,
61 | e,
62 | )
63 | # Mark version as found to avoid trying other candidates with the same
64 | # version, since they most likely have invalid metadata as well.
65 | versions_found.add(version)
66 | else:
67 | if candidate is None:
68 | continue
69 | yield candidate
70 | versions_found.add(version)
71 |
72 |
73 | def _iter_built_with_prepended(
74 | installed: Candidate, infos: Iterator[IndexCandidateInfo]
75 | ) -> Iterator[Candidate]:
76 | """Iterator for ``FoundCandidates``.
77 |
78 | This iterator is used when the resolver prefers the already-installed
79 | candidate and NOT to upgrade. The installed candidate is therefore
80 | always yielded first, and candidates from index come later in their
81 | normal ordering, except skipped when the version is already installed.
82 | """
83 | yield installed
84 | versions_found: Set[_BaseVersion] = {installed.version}
85 | for version, func in infos:
86 | if version in versions_found:
87 | continue
88 | candidate = func()
89 | if candidate is None:
90 | continue
91 | yield candidate
92 | versions_found.add(version)
93 |
94 |
95 | def _iter_built_with_inserted(
96 | installed: Candidate, infos: Iterator[IndexCandidateInfo]
97 | ) -> Iterator[Candidate]:
98 | """Iterator for ``FoundCandidates``.
99 |
100 | This iterator is used when the resolver prefers to upgrade an
101 | already-installed package. Candidates from index are returned in their
102 | normal ordering, except replaced when the version is already installed.
103 |
104 | The implementation iterates through and yields other candidates, inserting
105 | the installed candidate exactly once before we start yielding older or
106 | equivalent candidates, or after all other candidates if they are all newer.
107 | """
108 | versions_found: Set[_BaseVersion] = set()
109 | for version, func in infos:
110 | if version in versions_found:
111 | continue
112 | # If the installed candidate is better, yield it first.
113 | if installed.version >= version:
114 | yield installed
115 | versions_found.add(installed.version)
116 | candidate = func()
117 | if candidate is None:
118 | continue
119 | yield candidate
120 | versions_found.add(version)
121 |
122 | # If the installed candidate is older than all other candidates.
123 | if installed.version not in versions_found:
124 | yield installed
125 |
126 |
127 | class FoundCandidates(SequenceCandidate):
128 | """A lazy sequence to provide candidates to the resolver.
129 |
130 | The intended usage is to return this from `find_matches()` so the resolver
131 | can iterate through the sequence multiple times, but only access the index
132 | page when remote packages are actually needed. This improve performances
133 | when suitable candidates are already installed on disk.
134 | """
135 |
136 | def __init__(
137 | self,
138 | get_infos: Callable[[], Iterator[IndexCandidateInfo]],
139 | installed: Optional[Candidate],
140 | prefers_installed: bool,
141 | incompatible_ids: Set[int],
142 | ):
143 | self._get_infos = get_infos
144 | self._installed = installed
145 | self._prefers_installed = prefers_installed
146 | self._incompatible_ids = incompatible_ids
147 |
148 | def __getitem__(self, index: Any) -> Any:
149 | # Implemented to satisfy the ABC check. This is not needed by the
150 | # resolver, and should not be used by the provider either (for
151 | # performance reasons).
152 | raise NotImplementedError("don't do this")
153 |
154 | def __iter__(self) -> Iterator[Candidate]:
155 | infos = self._get_infos()
156 | if not self._installed:
157 | iterator = _iter_built(infos)
158 | elif self._prefers_installed:
159 | iterator = _iter_built_with_prepended(self._installed, infos)
160 | else:
161 | iterator = _iter_built_with_inserted(self._installed, infos)
162 | return (c for c in iterator if id(c) not in self._incompatible_ids)
163 |
164 | def __len__(self) -> int:
165 | # Implemented to satisfy the ABC check. This is not needed by the
166 | # resolver, and should not be used by the provider either (for
167 | # performance reasons).
168 | raise NotImplementedError("don't do this")
169 |
170 | @functools.lru_cache(maxsize=1)
171 | def __bool__(self) -> bool:
172 | if self._prefers_installed and self._installed:
173 | return True
174 | return any(self)
175 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py:
--------------------------------------------------------------------------------
```python
1 | import logging
2 | import os
3 | import shutil
4 | from optparse import Values
5 | from typing import List
6 |
7 | from pip._internal.cache import WheelCache
8 | from pip._internal.cli import cmdoptions
9 | from pip._internal.cli.req_command import RequirementCommand, with_cleanup
10 | from pip._internal.cli.status_codes import SUCCESS
11 | from pip._internal.exceptions import CommandError
12 | from pip._internal.operations.build.build_tracker import get_build_tracker
13 | from pip._internal.req.req_install import (
14 | InstallRequirement,
15 | check_legacy_setup_py_options,
16 | )
17 | from pip._internal.utils.misc import ensure_dir, normalize_path
18 | from pip._internal.utils.temp_dir import TempDirectory
19 | from pip._internal.wheel_builder import build, should_build_for_wheel_command
20 |
21 | logger = logging.getLogger(__name__)
22 |
23 |
24 | class WheelCommand(RequirementCommand):
25 | """
26 | Build Wheel archives for your requirements and dependencies.
27 |
28 | Wheel is a built-package format, and offers the advantage of not
29 | recompiling your software during every install. For more details, see the
30 | wheel docs: https://wheel.readthedocs.io/en/latest/
31 |
32 | 'pip wheel' uses the build system interface as described here:
33 | https://pip.pypa.io/en/stable/reference/build-system/
34 |
35 | """
36 |
37 | usage = """
38 | %prog [options] <requirement specifier> ...
39 | %prog [options] -r <requirements file> ...
40 | %prog [options] [-e] <vcs project url> ...
41 | %prog [options] [-e] <local project path> ...
42 | %prog [options] <archive url/path> ..."""
43 |
44 | def add_options(self) -> None:
45 | self.cmd_opts.add_option(
46 | "-w",
47 | "--wheel-dir",
48 | dest="wheel_dir",
49 | metavar="dir",
50 | default=os.curdir,
51 | help=(
52 | "Build wheels into <dir>, where the default is the "
53 | "current working directory."
54 | ),
55 | )
56 | self.cmd_opts.add_option(cmdoptions.no_binary())
57 | self.cmd_opts.add_option(cmdoptions.only_binary())
58 | self.cmd_opts.add_option(cmdoptions.prefer_binary())
59 | self.cmd_opts.add_option(cmdoptions.no_build_isolation())
60 | self.cmd_opts.add_option(cmdoptions.use_pep517())
61 | self.cmd_opts.add_option(cmdoptions.no_use_pep517())
62 | self.cmd_opts.add_option(cmdoptions.check_build_deps())
63 | self.cmd_opts.add_option(cmdoptions.constraints())
64 | self.cmd_opts.add_option(cmdoptions.editable())
65 | self.cmd_opts.add_option(cmdoptions.requirements())
66 | self.cmd_opts.add_option(cmdoptions.src())
67 | self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
68 | self.cmd_opts.add_option(cmdoptions.no_deps())
69 | self.cmd_opts.add_option(cmdoptions.progress_bar())
70 |
71 | self.cmd_opts.add_option(
72 | "--no-verify",
73 | dest="no_verify",
74 | action="store_true",
75 | default=False,
76 | help="Don't verify if built wheel is valid.",
77 | )
78 |
79 | self.cmd_opts.add_option(cmdoptions.config_settings())
80 | self.cmd_opts.add_option(cmdoptions.build_options())
81 | self.cmd_opts.add_option(cmdoptions.global_options())
82 |
83 | self.cmd_opts.add_option(
84 | "--pre",
85 | action="store_true",
86 | default=False,
87 | help=(
88 | "Include pre-release and development versions. By default, "
89 | "pip only finds stable versions."
90 | ),
91 | )
92 |
93 | self.cmd_opts.add_option(cmdoptions.require_hashes())
94 |
95 | index_opts = cmdoptions.make_option_group(
96 | cmdoptions.index_group,
97 | self.parser,
98 | )
99 |
100 | self.parser.insert_option_group(0, index_opts)
101 | self.parser.insert_option_group(0, self.cmd_opts)
102 |
103 | @with_cleanup
104 | def run(self, options: Values, args: List[str]) -> int:
105 | session = self.get_default_session(options)
106 |
107 | finder = self._build_package_finder(options, session)
108 |
109 | options.wheel_dir = normalize_path(options.wheel_dir)
110 | ensure_dir(options.wheel_dir)
111 |
112 | build_tracker = self.enter_context(get_build_tracker())
113 |
114 | directory = TempDirectory(
115 | delete=not options.no_clean,
116 | kind="wheel",
117 | globally_managed=True,
118 | )
119 |
120 | reqs = self.get_requirements(args, options, finder, session)
121 | check_legacy_setup_py_options(options, reqs)
122 |
123 | wheel_cache = WheelCache(options.cache_dir)
124 |
125 | preparer = self.make_requirement_preparer(
126 | temp_build_dir=directory,
127 | options=options,
128 | build_tracker=build_tracker,
129 | session=session,
130 | finder=finder,
131 | download_dir=options.wheel_dir,
132 | use_user_site=False,
133 | verbosity=self.verbosity,
134 | )
135 |
136 | resolver = self.make_resolver(
137 | preparer=preparer,
138 | finder=finder,
139 | options=options,
140 | wheel_cache=wheel_cache,
141 | ignore_requires_python=options.ignore_requires_python,
142 | use_pep517=options.use_pep517,
143 | )
144 |
145 | self.trace_basic_info(finder)
146 |
147 | requirement_set = resolver.resolve(reqs, check_supported_wheels=True)
148 |
149 | reqs_to_build: List[InstallRequirement] = []
150 | for req in requirement_set.requirements.values():
151 | if req.is_wheel:
152 | preparer.save_linked_requirement(req)
153 | elif should_build_for_wheel_command(req):
154 | reqs_to_build.append(req)
155 |
156 | preparer.prepare_linked_requirements_more(requirement_set.requirements.values())
157 |
158 | # build wheels
159 | build_successes, build_failures = build(
160 | reqs_to_build,
161 | wheel_cache=wheel_cache,
162 | verify=(not options.no_verify),
163 | build_options=options.build_options or [],
164 | global_options=options.global_options or [],
165 | )
166 | for req in build_successes:
167 | assert req.link and req.link.is_wheel
168 | assert req.local_file_path
169 | # copy from cache to target directory
170 | try:
171 | shutil.copy(req.local_file_path, options.wheel_dir)
172 | except OSError as e:
173 | logger.warning(
174 | "Building wheel for %s failed: %s",
175 | req.name,
176 | e,
177 | )
178 | build_failures.append(req)
179 | if len(build_failures) != 0:
180 | raise CommandError("Failed to build one or more wheels")
181 |
182 | return SUCCESS
183 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | pygments.style
3 | ~~~~~~~~~~~~~~
4 |
5 | Basic style object.
6 |
7 | :copyright: Copyright 2006-2024 by the Pygments team, see AUTHORS.
8 | :license: BSD, see LICENSE for details.
9 | """
10 |
11 | from pip._vendor.pygments.token import Token, STANDARD_TYPES
12 |
13 | # Default mapping of ansixxx to RGB colors.
14 | _ansimap = {
15 | # dark
16 | 'ansiblack': '000000',
17 | 'ansired': '7f0000',
18 | 'ansigreen': '007f00',
19 | 'ansiyellow': '7f7fe0',
20 | 'ansiblue': '00007f',
21 | 'ansimagenta': '7f007f',
22 | 'ansicyan': '007f7f',
23 | 'ansigray': 'e5e5e5',
24 | # normal
25 | 'ansibrightblack': '555555',
26 | 'ansibrightred': 'ff0000',
27 | 'ansibrightgreen': '00ff00',
28 | 'ansibrightyellow': 'ffff00',
29 | 'ansibrightblue': '0000ff',
30 | 'ansibrightmagenta': 'ff00ff',
31 | 'ansibrightcyan': '00ffff',
32 | 'ansiwhite': 'ffffff',
33 | }
34 | # mapping of deprecated #ansixxx colors to new color names
35 | _deprecated_ansicolors = {
36 | # dark
37 | '#ansiblack': 'ansiblack',
38 | '#ansidarkred': 'ansired',
39 | '#ansidarkgreen': 'ansigreen',
40 | '#ansibrown': 'ansiyellow',
41 | '#ansidarkblue': 'ansiblue',
42 | '#ansipurple': 'ansimagenta',
43 | '#ansiteal': 'ansicyan',
44 | '#ansilightgray': 'ansigray',
45 | # normal
46 | '#ansidarkgray': 'ansibrightblack',
47 | '#ansired': 'ansibrightred',
48 | '#ansigreen': 'ansibrightgreen',
49 | '#ansiyellow': 'ansibrightyellow',
50 | '#ansiblue': 'ansibrightblue',
51 | '#ansifuchsia': 'ansibrightmagenta',
52 | '#ansiturquoise': 'ansibrightcyan',
53 | '#ansiwhite': 'ansiwhite',
54 | }
55 | ansicolors = set(_ansimap)
56 |
57 |
58 | class StyleMeta(type):
59 |
60 | def __new__(mcs, name, bases, dct):
61 | obj = type.__new__(mcs, name, bases, dct)
62 | for token in STANDARD_TYPES:
63 | if token not in obj.styles:
64 | obj.styles[token] = ''
65 |
66 | def colorformat(text):
67 | if text in ansicolors:
68 | return text
69 | if text[0:1] == '#':
70 | col = text[1:]
71 | if len(col) == 6:
72 | return col
73 | elif len(col) == 3:
74 | return col[0] * 2 + col[1] * 2 + col[2] * 2
75 | elif text == '':
76 | return ''
77 | elif text.startswith('var') or text.startswith('calc'):
78 | return text
79 | assert False, f"wrong color format {text!r}"
80 |
81 | _styles = obj._styles = {}
82 |
83 | for ttype in obj.styles:
84 | for token in ttype.split():
85 | if token in _styles:
86 | continue
87 | ndef = _styles.get(token.parent, None)
88 | styledefs = obj.styles.get(token, '').split()
89 | if not ndef or token is None:
90 | ndef = ['', 0, 0, 0, '', '', 0, 0, 0]
91 | elif 'noinherit' in styledefs and token is not Token:
92 | ndef = _styles[Token][:]
93 | else:
94 | ndef = ndef[:]
95 | _styles[token] = ndef
96 | for styledef in obj.styles.get(token, '').split():
97 | if styledef == 'noinherit':
98 | pass
99 | elif styledef == 'bold':
100 | ndef[1] = 1
101 | elif styledef == 'nobold':
102 | ndef[1] = 0
103 | elif styledef == 'italic':
104 | ndef[2] = 1
105 | elif styledef == 'noitalic':
106 | ndef[2] = 0
107 | elif styledef == 'underline':
108 | ndef[3] = 1
109 | elif styledef == 'nounderline':
110 | ndef[3] = 0
111 | elif styledef[:3] == 'bg:':
112 | ndef[4] = colorformat(styledef[3:])
113 | elif styledef[:7] == 'border:':
114 | ndef[5] = colorformat(styledef[7:])
115 | elif styledef == 'roman':
116 | ndef[6] = 1
117 | elif styledef == 'sans':
118 | ndef[7] = 1
119 | elif styledef == 'mono':
120 | ndef[8] = 1
121 | else:
122 | ndef[0] = colorformat(styledef)
123 |
124 | return obj
125 |
126 | def style_for_token(cls, token):
127 | t = cls._styles[token]
128 | ansicolor = bgansicolor = None
129 | color = t[0]
130 | if color in _deprecated_ansicolors:
131 | color = _deprecated_ansicolors[color]
132 | if color in ansicolors:
133 | ansicolor = color
134 | color = _ansimap[color]
135 | bgcolor = t[4]
136 | if bgcolor in _deprecated_ansicolors:
137 | bgcolor = _deprecated_ansicolors[bgcolor]
138 | if bgcolor in ansicolors:
139 | bgansicolor = bgcolor
140 | bgcolor = _ansimap[bgcolor]
141 |
142 | return {
143 | 'color': color or None,
144 | 'bold': bool(t[1]),
145 | 'italic': bool(t[2]),
146 | 'underline': bool(t[3]),
147 | 'bgcolor': bgcolor or None,
148 | 'border': t[5] or None,
149 | 'roman': bool(t[6]) or None,
150 | 'sans': bool(t[7]) or None,
151 | 'mono': bool(t[8]) or None,
152 | 'ansicolor': ansicolor,
153 | 'bgansicolor': bgansicolor,
154 | }
155 |
156 | def list_styles(cls):
157 | return list(cls)
158 |
159 | def styles_token(cls, ttype):
160 | return ttype in cls._styles
161 |
162 | def __iter__(cls):
163 | for token in cls._styles:
164 | yield token, cls.style_for_token(token)
165 |
166 | def __len__(cls):
167 | return len(cls._styles)
168 |
169 |
170 | class Style(metaclass=StyleMeta):
171 |
172 | #: overall background color (``None`` means transparent)
173 | background_color = '#ffffff'
174 |
175 | #: highlight background color
176 | highlight_color = '#ffffcc'
177 |
178 | #: line number font color
179 | line_number_color = 'inherit'
180 |
181 | #: line number background color
182 | line_number_background_color = 'transparent'
183 |
184 | #: special line number font color
185 | line_number_special_color = '#000000'
186 |
187 | #: special line number background color
188 | line_number_special_background_color = '#ffffc0'
189 |
190 | #: Style definitions for individual token types.
191 | styles = {}
192 |
193 | #: user-friendly style name (used when selecting the style, so this
194 | # should be all-lowercase, no spaces, hyphens)
195 | name = 'unnamed'
196 |
197 | aliases = []
198 |
199 | # Attribute for lexers defined within Pygments. If set
200 | # to True, the style is not shown in the style gallery
201 | # on the website. This is intended for language-specific
202 | # styles.
203 | web_style_gallery_exclude = False
204 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/werkzeug/urls.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import codecs
4 | import re
5 | import typing as t
6 | import urllib.parse
7 | from urllib.parse import quote
8 | from urllib.parse import unquote
9 | from urllib.parse import urlencode
10 | from urllib.parse import urlsplit
11 | from urllib.parse import urlunsplit
12 |
13 | from .datastructures import iter_multi_items
14 |
15 |
16 | def _codec_error_url_quote(e: UnicodeError) -> tuple[str, int]:
17 | """Used in :func:`uri_to_iri` after unquoting to re-quote any
18 | invalid bytes.
19 | """
20 | # the docs state that UnicodeError does have these attributes,
21 | # but mypy isn't picking them up
22 | out = quote(e.object[e.start : e.end], safe="") # type: ignore
23 | return out, e.end # type: ignore
24 |
25 |
26 | codecs.register_error("werkzeug.url_quote", _codec_error_url_quote)
27 |
28 |
29 | def _make_unquote_part(name: str, chars: str) -> t.Callable[[str], str]:
30 | """Create a function that unquotes all percent encoded characters except those
31 | given. This allows working with unquoted characters if possible while not changing
32 | the meaning of a given part of a URL.
33 | """
34 | choices = "|".join(f"{ord(c):02X}" for c in sorted(chars))
35 | pattern = re.compile(f"((?:%(?:{choices}))+)", re.I)
36 |
37 | def _unquote_partial(value: str) -> str:
38 | parts = iter(pattern.split(value))
39 | out = []
40 |
41 | for part in parts:
42 | out.append(unquote(part, "utf-8", "werkzeug.url_quote"))
43 | out.append(next(parts, ""))
44 |
45 | return "".join(out)
46 |
47 | _unquote_partial.__name__ = f"_unquote_{name}"
48 | return _unquote_partial
49 |
50 |
51 | # characters that should remain quoted in URL parts
52 | # based on https://url.spec.whatwg.org/#percent-encoded-bytes
53 | # always keep all controls, space, and % quoted
54 | _always_unsafe = bytes((*range(0x21), 0x25, 0x7F)).decode()
55 | _unquote_fragment = _make_unquote_part("fragment", _always_unsafe)
56 | _unquote_query = _make_unquote_part("query", _always_unsafe + "&=+#")
57 | _unquote_path = _make_unquote_part("path", _always_unsafe + "/?#")
58 | _unquote_user = _make_unquote_part("user", _always_unsafe + ":@/?#")
59 |
60 |
61 | def uri_to_iri(uri: str) -> str:
62 | """Convert a URI to an IRI. All valid UTF-8 characters are unquoted,
63 | leaving all reserved and invalid characters quoted. If the URL has
64 | a domain, it is decoded from Punycode.
65 |
66 | >>> uri_to_iri("http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF")
67 | 'http://\\u2603.net/p\\xe5th?q=\\xe8ry%DF'
68 |
69 | :param uri: The URI to convert.
70 |
71 | .. versionchanged:: 3.0
72 | Passing a tuple or bytes, and the ``charset`` and ``errors`` parameters,
73 | are removed.
74 |
75 | .. versionchanged:: 2.3
76 | Which characters remain quoted is specific to each part of the URL.
77 |
78 | .. versionchanged:: 0.15
79 | All reserved and invalid characters remain quoted. Previously,
80 | only some reserved characters were preserved, and invalid bytes
81 | were replaced instead of left quoted.
82 |
83 | .. versionadded:: 0.6
84 | """
85 | parts = urlsplit(uri)
86 | path = _unquote_path(parts.path)
87 | query = _unquote_query(parts.query)
88 | fragment = _unquote_fragment(parts.fragment)
89 |
90 | if parts.hostname:
91 | netloc = _decode_idna(parts.hostname)
92 | else:
93 | netloc = ""
94 |
95 | if ":" in netloc:
96 | netloc = f"[{netloc}]"
97 |
98 | if parts.port:
99 | netloc = f"{netloc}:{parts.port}"
100 |
101 | if parts.username:
102 | auth = _unquote_user(parts.username)
103 |
104 | if parts.password:
105 | password = _unquote_user(parts.password)
106 | auth = f"{auth}:{password}"
107 |
108 | netloc = f"{auth}@{netloc}"
109 |
110 | return urlunsplit((parts.scheme, netloc, path, query, fragment))
111 |
112 |
113 | def iri_to_uri(iri: str) -> str:
114 | """Convert an IRI to a URI. All non-ASCII and unsafe characters are
115 | quoted. If the URL has a domain, it is encoded to Punycode.
116 |
117 | >>> iri_to_uri('http://\\u2603.net/p\\xe5th?q=\\xe8ry%DF')
118 | 'http://xn--n3h.net/p%C3%A5th?q=%C3%A8ry%DF'
119 |
120 | :param iri: The IRI to convert.
121 |
122 | .. versionchanged:: 3.0
123 | Passing a tuple or bytes, the ``charset`` and ``errors`` parameters,
124 | and the ``safe_conversion`` parameter, are removed.
125 |
126 | .. versionchanged:: 2.3
127 | Which characters remain unquoted is specific to each part of the URL.
128 |
129 | .. versionchanged:: 0.15
130 | All reserved characters remain unquoted. Previously, only some reserved
131 | characters were left unquoted.
132 |
133 | .. versionchanged:: 0.9.6
134 | The ``safe_conversion`` parameter was added.
135 |
136 | .. versionadded:: 0.6
137 | """
138 | parts = urlsplit(iri)
139 | # safe = https://url.spec.whatwg.org/#url-path-segment-string
140 | # as well as percent for things that are already quoted
141 | path = quote(parts.path, safe="%!$&'()*+,/:;=@")
142 | query = quote(parts.query, safe="%!$&'()*+,/:;=?@")
143 | fragment = quote(parts.fragment, safe="%!#$&'()*+,/:;=?@")
144 |
145 | if parts.hostname:
146 | netloc = parts.hostname.encode("idna").decode("ascii")
147 | else:
148 | netloc = ""
149 |
150 | if ":" in netloc:
151 | netloc = f"[{netloc}]"
152 |
153 | if parts.port:
154 | netloc = f"{netloc}:{parts.port}"
155 |
156 | if parts.username:
157 | auth = quote(parts.username, safe="%!$&'()*+,;=")
158 |
159 | if parts.password:
160 | password = quote(parts.password, safe="%!$&'()*+,;=")
161 | auth = f"{auth}:{password}"
162 |
163 | netloc = f"{auth}@{netloc}"
164 |
165 | return urlunsplit((parts.scheme, netloc, path, query, fragment))
166 |
167 |
168 | # Python < 3.12
169 | # itms-services was worked around in previous iri_to_uri implementations, but
170 | # we can tell Python directly that it needs to preserve the //.
171 | if "itms-services" not in urllib.parse.uses_netloc:
172 | urllib.parse.uses_netloc.append("itms-services")
173 |
174 |
175 | def _decode_idna(domain: str) -> str:
176 | try:
177 | data = domain.encode("ascii")
178 | except UnicodeEncodeError:
179 | # If the domain is not ASCII, it's decoded already.
180 | return domain
181 |
182 | try:
183 | # Try decoding in one shot.
184 | return data.decode("idna")
185 | except UnicodeDecodeError:
186 | pass
187 |
188 | # Decode each part separately, leaving invalid parts as punycode.
189 | parts = []
190 |
191 | for part in data.split(b"."):
192 | try:
193 | parts.append(part.decode("idna"))
194 | except UnicodeDecodeError:
195 | parts.append(part.decode("ascii"))
196 |
197 | return ".".join(parts)
198 |
199 |
200 | def _urlencode(query: t.Mapping[str, str] | t.Iterable[tuple[str, str]]) -> str:
201 | items = [x for x in iter_multi_items(query) if x[1] is not None]
202 | # safe = https://url.spec.whatwg.org/#percent-encoded-bytes
203 | return urlencode(items, safe="!$'()*,/:;?@")
204 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | requests.api
3 | ~~~~~~~~~~~~
4 |
5 | This module implements the Requests API.
6 |
7 | :copyright: (c) 2012 by Kenneth Reitz.
8 | :license: Apache2, see LICENSE for more details.
9 | """
10 |
11 | from . import sessions
12 |
13 |
14 | def request(method, url, **kwargs):
15 | """Constructs and sends a :class:`Request <Request>`.
16 |
17 | :param method: method for the new :class:`Request` object: ``GET``, ``OPTIONS``, ``HEAD``, ``POST``, ``PUT``, ``PATCH``, or ``DELETE``.
18 | :param url: URL for the new :class:`Request` object.
19 | :param params: (optional) Dictionary, list of tuples or bytes to send
20 | in the query string for the :class:`Request`.
21 | :param data: (optional) Dictionary, list of tuples, bytes, or file-like
22 | object to send in the body of the :class:`Request`.
23 | :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`.
24 | :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
25 | :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
26 | :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload.
27 | ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')``
28 | or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content_type'`` is a string
29 | defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers
30 | to add for the file.
31 | :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
32 | :param timeout: (optional) How many seconds to wait for the server to send data
33 | before giving up, as a float, or a :ref:`(connect timeout, read
34 | timeout) <timeouts>` tuple.
35 | :type timeout: float or tuple
36 | :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``.
37 | :type allow_redirects: bool
38 | :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
39 | :param verify: (optional) Either a boolean, in which case it controls whether we verify
40 | the server's TLS certificate, or a string, in which case it must be a path
41 | to a CA bundle to use. Defaults to ``True``.
42 | :param stream: (optional) if ``False``, the response content will be immediately downloaded.
43 | :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
44 | :return: :class:`Response <Response>` object
45 | :rtype: requests.Response
46 |
47 | Usage::
48 |
49 | >>> import requests
50 | >>> req = requests.request('GET', 'https://httpbin.org/get')
51 | >>> req
52 | <Response [200]>
53 | """
54 |
55 | # By using the 'with' statement we are sure the session is closed, thus we
56 | # avoid leaving sockets open which can trigger a ResourceWarning in some
57 | # cases, and look like a memory leak in others.
58 | with sessions.Session() as session:
59 | return session.request(method=method, url=url, **kwargs)
60 |
61 |
62 | def get(url, params=None, **kwargs):
63 | r"""Sends a GET request.
64 |
65 | :param url: URL for the new :class:`Request` object.
66 | :param params: (optional) Dictionary, list of tuples or bytes to send
67 | in the query string for the :class:`Request`.
68 | :param \*\*kwargs: Optional arguments that ``request`` takes.
69 | :return: :class:`Response <Response>` object
70 | :rtype: requests.Response
71 | """
72 |
73 | return request("get", url, params=params, **kwargs)
74 |
75 |
76 | def options(url, **kwargs):
77 | r"""Sends an OPTIONS request.
78 |
79 | :param url: URL for the new :class:`Request` object.
80 | :param \*\*kwargs: Optional arguments that ``request`` takes.
81 | :return: :class:`Response <Response>` object
82 | :rtype: requests.Response
83 | """
84 |
85 | return request("options", url, **kwargs)
86 |
87 |
88 | def head(url, **kwargs):
89 | r"""Sends a HEAD request.
90 |
91 | :param url: URL for the new :class:`Request` object.
92 | :param \*\*kwargs: Optional arguments that ``request`` takes. If
93 | `allow_redirects` is not provided, it will be set to `False` (as
94 | opposed to the default :meth:`request` behavior).
95 | :return: :class:`Response <Response>` object
96 | :rtype: requests.Response
97 | """
98 |
99 | kwargs.setdefault("allow_redirects", False)
100 | return request("head", url, **kwargs)
101 |
102 |
103 | def post(url, data=None, json=None, **kwargs):
104 | r"""Sends a POST request.
105 |
106 | :param url: URL for the new :class:`Request` object.
107 | :param data: (optional) Dictionary, list of tuples, bytes, or file-like
108 | object to send in the body of the :class:`Request`.
109 | :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`.
110 | :param \*\*kwargs: Optional arguments that ``request`` takes.
111 | :return: :class:`Response <Response>` object
112 | :rtype: requests.Response
113 | """
114 |
115 | return request("post", url, data=data, json=json, **kwargs)
116 |
117 |
118 | def put(url, data=None, **kwargs):
119 | r"""Sends a PUT request.
120 |
121 | :param url: URL for the new :class:`Request` object.
122 | :param data: (optional) Dictionary, list of tuples, bytes, or file-like
123 | object to send in the body of the :class:`Request`.
124 | :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`.
125 | :param \*\*kwargs: Optional arguments that ``request`` takes.
126 | :return: :class:`Response <Response>` object
127 | :rtype: requests.Response
128 | """
129 |
130 | return request("put", url, data=data, **kwargs)
131 |
132 |
133 | def patch(url, data=None, **kwargs):
134 | r"""Sends a PATCH request.
135 |
136 | :param url: URL for the new :class:`Request` object.
137 | :param data: (optional) Dictionary, list of tuples, bytes, or file-like
138 | object to send in the body of the :class:`Request`.
139 | :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`.
140 | :param \*\*kwargs: Optional arguments that ``request`` takes.
141 | :return: :class:`Response <Response>` object
142 | :rtype: requests.Response
143 | """
144 |
145 | return request("patch", url, data=data, **kwargs)
146 |
147 |
148 | def delete(url, **kwargs):
149 | r"""Sends a DELETE request.
150 |
151 | :param url: URL for the new :class:`Request` object.
152 | :param \*\*kwargs: Optional arguments that ``request`` takes.
153 | :return: :class:`Response <Response>` object
154 | :rtype: requests.Response
155 | """
156 |
157 | return request("delete", url, **kwargs)
158 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/requests/api.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | requests.api
3 | ~~~~~~~~~~~~
4 |
5 | This module implements the Requests API.
6 |
7 | :copyright: (c) 2012 by Kenneth Reitz.
8 | :license: Apache2, see LICENSE for more details.
9 | """
10 |
11 | from . import sessions
12 |
13 |
14 | def request(method, url, **kwargs):
15 | """Constructs and sends a :class:`Request <Request>`.
16 |
17 | :param method: method for the new :class:`Request` object: ``GET``, ``OPTIONS``, ``HEAD``, ``POST``, ``PUT``, ``PATCH``, or ``DELETE``.
18 | :param url: URL for the new :class:`Request` object.
19 | :param params: (optional) Dictionary, list of tuples or bytes to send
20 | in the query string for the :class:`Request`.
21 | :param data: (optional) Dictionary, list of tuples, bytes, or file-like
22 | object to send in the body of the :class:`Request`.
23 | :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`.
24 | :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
25 | :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
26 | :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload.
27 | ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')``
28 | or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content_type'`` is a string
29 | defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers
30 | to add for the file.
31 | :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth.
32 | :param timeout: (optional) How many seconds to wait for the server to send data
33 | before giving up, as a float, or a :ref:`(connect timeout, read
34 | timeout) <timeouts>` tuple.
35 | :type timeout: float or tuple
36 | :param allow_redirects: (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``.
37 | :type allow_redirects: bool
38 | :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy.
39 | :param verify: (optional) Either a boolean, in which case it controls whether we verify
40 | the server's TLS certificate, or a string, in which case it must be a path
41 | to a CA bundle to use. Defaults to ``True``.
42 | :param stream: (optional) if ``False``, the response content will be immediately downloaded.
43 | :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair.
44 | :return: :class:`Response <Response>` object
45 | :rtype: requests.Response
46 |
47 | Usage::
48 |
49 | >>> import requests
50 | >>> req = requests.request('GET', 'https://httpbin.org/get')
51 | >>> req
52 | <Response [200]>
53 | """
54 |
55 | # By using the 'with' statement we are sure the session is closed, thus we
56 | # avoid leaving sockets open which can trigger a ResourceWarning in some
57 | # cases, and look like a memory leak in others.
58 | with sessions.Session() as session:
59 | return session.request(method=method, url=url, **kwargs)
60 |
61 |
62 | def get(url, params=None, **kwargs):
63 | r"""Sends a GET request.
64 |
65 | :param url: URL for the new :class:`Request` object.
66 | :param params: (optional) Dictionary, list of tuples or bytes to send
67 | in the query string for the :class:`Request`.
68 | :param \*\*kwargs: Optional arguments that ``request`` takes.
69 | :return: :class:`Response <Response>` object
70 | :rtype: requests.Response
71 | """
72 |
73 | return request("get", url, params=params, **kwargs)
74 |
75 |
76 | def options(url, **kwargs):
77 | r"""Sends an OPTIONS request.
78 |
79 | :param url: URL for the new :class:`Request` object.
80 | :param \*\*kwargs: Optional arguments that ``request`` takes.
81 | :return: :class:`Response <Response>` object
82 | :rtype: requests.Response
83 | """
84 |
85 | return request("options", url, **kwargs)
86 |
87 |
88 | def head(url, **kwargs):
89 | r"""Sends a HEAD request.
90 |
91 | :param url: URL for the new :class:`Request` object.
92 | :param \*\*kwargs: Optional arguments that ``request`` takes. If
93 | `allow_redirects` is not provided, it will be set to `False` (as
94 | opposed to the default :meth:`request` behavior).
95 | :return: :class:`Response <Response>` object
96 | :rtype: requests.Response
97 | """
98 |
99 | kwargs.setdefault("allow_redirects", False)
100 | return request("head", url, **kwargs)
101 |
102 |
103 | def post(url, data=None, json=None, **kwargs):
104 | r"""Sends a POST request.
105 |
106 | :param url: URL for the new :class:`Request` object.
107 | :param data: (optional) Dictionary, list of tuples, bytes, or file-like
108 | object to send in the body of the :class:`Request`.
109 | :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`.
110 | :param \*\*kwargs: Optional arguments that ``request`` takes.
111 | :return: :class:`Response <Response>` object
112 | :rtype: requests.Response
113 | """
114 |
115 | return request("post", url, data=data, json=json, **kwargs)
116 |
117 |
118 | def put(url, data=None, **kwargs):
119 | r"""Sends a PUT request.
120 |
121 | :param url: URL for the new :class:`Request` object.
122 | :param data: (optional) Dictionary, list of tuples, bytes, or file-like
123 | object to send in the body of the :class:`Request`.
124 | :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`.
125 | :param \*\*kwargs: Optional arguments that ``request`` takes.
126 | :return: :class:`Response <Response>` object
127 | :rtype: requests.Response
128 | """
129 |
130 | return request("put", url, data=data, **kwargs)
131 |
132 |
133 | def patch(url, data=None, **kwargs):
134 | r"""Sends a PATCH request.
135 |
136 | :param url: URL for the new :class:`Request` object.
137 | :param data: (optional) Dictionary, list of tuples, bytes, or file-like
138 | object to send in the body of the :class:`Request`.
139 | :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`.
140 | :param \*\*kwargs: Optional arguments that ``request`` takes.
141 | :return: :class:`Response <Response>` object
142 | :rtype: requests.Response
143 | """
144 |
145 | return request("patch", url, data=data, **kwargs)
146 |
147 |
148 | def delete(url, **kwargs):
149 | r"""Sends a DELETE request.
150 |
151 | :param url: URL for the new :class:`Request` object.
152 | :param \*\*kwargs: Optional arguments that ``request`` takes.
153 | :return: :class:`Response <Response>` object
154 | :rtype: requests.Response
155 | """
156 |
157 | return request("delete", url, **kwargs)
158 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py:
--------------------------------------------------------------------------------
```python
1 | """ PEP 610 """
2 |
3 | import json
4 | import re
5 | import urllib.parse
6 | from dataclasses import dataclass
7 | from typing import Any, ClassVar, Dict, Iterable, Optional, Type, TypeVar, Union
8 |
9 | __all__ = [
10 | "DirectUrl",
11 | "DirectUrlValidationError",
12 | "DirInfo",
13 | "ArchiveInfo",
14 | "VcsInfo",
15 | ]
16 |
17 | T = TypeVar("T")
18 |
19 | DIRECT_URL_METADATA_NAME = "direct_url.json"
20 | ENV_VAR_RE = re.compile(r"^\$\{[A-Za-z0-9-_]+\}(:\$\{[A-Za-z0-9-_]+\})?$")
21 |
22 |
23 | class DirectUrlValidationError(Exception):
24 | pass
25 |
26 |
27 | def _get(
28 | d: Dict[str, Any], expected_type: Type[T], key: str, default: Optional[T] = None
29 | ) -> Optional[T]:
30 | """Get value from dictionary and verify expected type."""
31 | if key not in d:
32 | return default
33 | value = d[key]
34 | if not isinstance(value, expected_type):
35 | raise DirectUrlValidationError(
36 | f"{value!r} has unexpected type for {key} (expected {expected_type})"
37 | )
38 | return value
39 |
40 |
41 | def _get_required(
42 | d: Dict[str, Any], expected_type: Type[T], key: str, default: Optional[T] = None
43 | ) -> T:
44 | value = _get(d, expected_type, key, default)
45 | if value is None:
46 | raise DirectUrlValidationError(f"{key} must have a value")
47 | return value
48 |
49 |
50 | def _exactly_one_of(infos: Iterable[Optional["InfoType"]]) -> "InfoType":
51 | infos = [info for info in infos if info is not None]
52 | if not infos:
53 | raise DirectUrlValidationError(
54 | "missing one of archive_info, dir_info, vcs_info"
55 | )
56 | if len(infos) > 1:
57 | raise DirectUrlValidationError(
58 | "more than one of archive_info, dir_info, vcs_info"
59 | )
60 | assert infos[0] is not None
61 | return infos[0]
62 |
63 |
64 | def _filter_none(**kwargs: Any) -> Dict[str, Any]:
65 | """Make dict excluding None values."""
66 | return {k: v for k, v in kwargs.items() if v is not None}
67 |
68 |
69 | @dataclass
70 | class VcsInfo:
71 | name: ClassVar = "vcs_info"
72 |
73 | vcs: str
74 | commit_id: str
75 | requested_revision: Optional[str] = None
76 |
77 | @classmethod
78 | def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["VcsInfo"]:
79 | if d is None:
80 | return None
81 | return cls(
82 | vcs=_get_required(d, str, "vcs"),
83 | commit_id=_get_required(d, str, "commit_id"),
84 | requested_revision=_get(d, str, "requested_revision"),
85 | )
86 |
87 | def _to_dict(self) -> Dict[str, Any]:
88 | return _filter_none(
89 | vcs=self.vcs,
90 | requested_revision=self.requested_revision,
91 | commit_id=self.commit_id,
92 | )
93 |
94 |
95 | class ArchiveInfo:
96 | name = "archive_info"
97 |
98 | def __init__(
99 | self,
100 | hash: Optional[str] = None,
101 | hashes: Optional[Dict[str, str]] = None,
102 | ) -> None:
103 | # set hashes before hash, since the hash setter will further populate hashes
104 | self.hashes = hashes
105 | self.hash = hash
106 |
107 | @property
108 | def hash(self) -> Optional[str]:
109 | return self._hash
110 |
111 | @hash.setter
112 | def hash(self, value: Optional[str]) -> None:
113 | if value is not None:
114 | # Auto-populate the hashes key to upgrade to the new format automatically.
115 | # We don't back-populate the legacy hash key from hashes.
116 | try:
117 | hash_name, hash_value = value.split("=", 1)
118 | except ValueError:
119 | raise DirectUrlValidationError(
120 | f"invalid archive_info.hash format: {value!r}"
121 | )
122 | if self.hashes is None:
123 | self.hashes = {hash_name: hash_value}
124 | elif hash_name not in self.hashes:
125 | self.hashes = self.hashes.copy()
126 | self.hashes[hash_name] = hash_value
127 | self._hash = value
128 |
129 | @classmethod
130 | def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["ArchiveInfo"]:
131 | if d is None:
132 | return None
133 | return cls(hash=_get(d, str, "hash"), hashes=_get(d, dict, "hashes"))
134 |
135 | def _to_dict(self) -> Dict[str, Any]:
136 | return _filter_none(hash=self.hash, hashes=self.hashes)
137 |
138 |
139 | @dataclass
140 | class DirInfo:
141 | name: ClassVar = "dir_info"
142 |
143 | editable: bool = False
144 |
145 | @classmethod
146 | def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["DirInfo"]:
147 | if d is None:
148 | return None
149 | return cls(editable=_get_required(d, bool, "editable", default=False))
150 |
151 | def _to_dict(self) -> Dict[str, Any]:
152 | return _filter_none(editable=self.editable or None)
153 |
154 |
155 | InfoType = Union[ArchiveInfo, DirInfo, VcsInfo]
156 |
157 |
158 | @dataclass
159 | class DirectUrl:
160 | url: str
161 | info: InfoType
162 | subdirectory: Optional[str] = None
163 |
164 | def _remove_auth_from_netloc(self, netloc: str) -> str:
165 | if "@" not in netloc:
166 | return netloc
167 | user_pass, netloc_no_user_pass = netloc.split("@", 1)
168 | if (
169 | isinstance(self.info, VcsInfo)
170 | and self.info.vcs == "git"
171 | and user_pass == "git"
172 | ):
173 | return netloc
174 | if ENV_VAR_RE.match(user_pass):
175 | return netloc
176 | return netloc_no_user_pass
177 |
178 | @property
179 | def redacted_url(self) -> str:
180 | """url with user:password part removed unless it is formed with
181 | environment variables as specified in PEP 610, or it is ``git``
182 | in the case of a git URL.
183 | """
184 | purl = urllib.parse.urlsplit(self.url)
185 | netloc = self._remove_auth_from_netloc(purl.netloc)
186 | surl = urllib.parse.urlunsplit(
187 | (purl.scheme, netloc, purl.path, purl.query, purl.fragment)
188 | )
189 | return surl
190 |
191 | def validate(self) -> None:
192 | self.from_dict(self.to_dict())
193 |
194 | @classmethod
195 | def from_dict(cls, d: Dict[str, Any]) -> "DirectUrl":
196 | return DirectUrl(
197 | url=_get_required(d, str, "url"),
198 | subdirectory=_get(d, str, "subdirectory"),
199 | info=_exactly_one_of(
200 | [
201 | ArchiveInfo._from_dict(_get(d, dict, "archive_info")),
202 | DirInfo._from_dict(_get(d, dict, "dir_info")),
203 | VcsInfo._from_dict(_get(d, dict, "vcs_info")),
204 | ]
205 | ),
206 | )
207 |
208 | def to_dict(self) -> Dict[str, Any]:
209 | res = _filter_none(
210 | url=self.redacted_url,
211 | subdirectory=self.subdirectory,
212 | )
213 | res[self.info.name] = self.info._to_dict()
214 | return res
215 |
216 | @classmethod
217 | def from_json(cls, s: str) -> "DirectUrl":
218 | return cls.from_dict(json.loads(s))
219 |
220 | def to_json(self) -> str:
221 | return json.dumps(self.to_dict(), sort_keys=True)
222 |
223 | def is_local_editable(self) -> bool:
224 | return isinstance(self.info, DirInfo) and self.info.editable
225 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py:
--------------------------------------------------------------------------------
```python
1 | import sys
2 | import time
3 | from typing import TYPE_CHECKING, Callable, Dict, Iterable, List, Union
4 |
5 | if sys.version_info >= (3, 8):
6 | from typing import Final
7 | else:
8 | from pip._vendor.typing_extensions import Final # pragma: no cover
9 |
10 | from .segment import ControlCode, ControlType, Segment
11 |
12 | if TYPE_CHECKING:
13 | from .console import Console, ConsoleOptions, RenderResult
14 |
15 | STRIP_CONTROL_CODES: Final = [
16 | 7, # Bell
17 | 8, # Backspace
18 | 11, # Vertical tab
19 | 12, # Form feed
20 | 13, # Carriage return
21 | ]
22 | _CONTROL_STRIP_TRANSLATE: Final = {
23 | _codepoint: None for _codepoint in STRIP_CONTROL_CODES
24 | }
25 |
26 | CONTROL_ESCAPE: Final = {
27 | 7: "\\a",
28 | 8: "\\b",
29 | 11: "\\v",
30 | 12: "\\f",
31 | 13: "\\r",
32 | }
33 |
34 | CONTROL_CODES_FORMAT: Dict[int, Callable[..., str]] = {
35 | ControlType.BELL: lambda: "\x07",
36 | ControlType.CARRIAGE_RETURN: lambda: "\r",
37 | ControlType.HOME: lambda: "\x1b[H",
38 | ControlType.CLEAR: lambda: "\x1b[2J",
39 | ControlType.ENABLE_ALT_SCREEN: lambda: "\x1b[?1049h",
40 | ControlType.DISABLE_ALT_SCREEN: lambda: "\x1b[?1049l",
41 | ControlType.SHOW_CURSOR: lambda: "\x1b[?25h",
42 | ControlType.HIDE_CURSOR: lambda: "\x1b[?25l",
43 | ControlType.CURSOR_UP: lambda param: f"\x1b[{param}A",
44 | ControlType.CURSOR_DOWN: lambda param: f"\x1b[{param}B",
45 | ControlType.CURSOR_FORWARD: lambda param: f"\x1b[{param}C",
46 | ControlType.CURSOR_BACKWARD: lambda param: f"\x1b[{param}D",
47 | ControlType.CURSOR_MOVE_TO_COLUMN: lambda param: f"\x1b[{param+1}G",
48 | ControlType.ERASE_IN_LINE: lambda param: f"\x1b[{param}K",
49 | ControlType.CURSOR_MOVE_TO: lambda x, y: f"\x1b[{y+1};{x+1}H",
50 | ControlType.SET_WINDOW_TITLE: lambda title: f"\x1b]0;{title}\x07",
51 | }
52 |
53 |
54 | class Control:
55 | """A renderable that inserts a control code (non printable but may move cursor).
56 |
57 | Args:
58 | *codes (str): Positional arguments are either a :class:`~rich.segment.ControlType` enum or a
59 | tuple of ControlType and an integer parameter
60 | """
61 |
62 | __slots__ = ["segment"]
63 |
64 | def __init__(self, *codes: Union[ControlType, ControlCode]) -> None:
65 | control_codes: List[ControlCode] = [
66 | (code,) if isinstance(code, ControlType) else code for code in codes
67 | ]
68 | _format_map = CONTROL_CODES_FORMAT
69 | rendered_codes = "".join(
70 | _format_map[code](*parameters) for code, *parameters in control_codes
71 | )
72 | self.segment = Segment(rendered_codes, None, control_codes)
73 |
74 | @classmethod
75 | def bell(cls) -> "Control":
76 | """Ring the 'bell'."""
77 | return cls(ControlType.BELL)
78 |
79 | @classmethod
80 | def home(cls) -> "Control":
81 | """Move cursor to 'home' position."""
82 | return cls(ControlType.HOME)
83 |
84 | @classmethod
85 | def move(cls, x: int = 0, y: int = 0) -> "Control":
86 | """Move cursor relative to current position.
87 |
88 | Args:
89 | x (int): X offset.
90 | y (int): Y offset.
91 |
92 | Returns:
93 | ~Control: Control object.
94 |
95 | """
96 |
97 | def get_codes() -> Iterable[ControlCode]:
98 | control = ControlType
99 | if x:
100 | yield (
101 | control.CURSOR_FORWARD if x > 0 else control.CURSOR_BACKWARD,
102 | abs(x),
103 | )
104 | if y:
105 | yield (
106 | control.CURSOR_DOWN if y > 0 else control.CURSOR_UP,
107 | abs(y),
108 | )
109 |
110 | control = cls(*get_codes())
111 | return control
112 |
113 | @classmethod
114 | def move_to_column(cls, x: int, y: int = 0) -> "Control":
115 | """Move to the given column, optionally add offset to row.
116 |
117 | Returns:
118 | x (int): absolute x (column)
119 | y (int): optional y offset (row)
120 |
121 | Returns:
122 | ~Control: Control object.
123 | """
124 |
125 | return (
126 | cls(
127 | (ControlType.CURSOR_MOVE_TO_COLUMN, x),
128 | (
129 | ControlType.CURSOR_DOWN if y > 0 else ControlType.CURSOR_UP,
130 | abs(y),
131 | ),
132 | )
133 | if y
134 | else cls((ControlType.CURSOR_MOVE_TO_COLUMN, x))
135 | )
136 |
137 | @classmethod
138 | def move_to(cls, x: int, y: int) -> "Control":
139 | """Move cursor to absolute position.
140 |
141 | Args:
142 | x (int): x offset (column)
143 | y (int): y offset (row)
144 |
145 | Returns:
146 | ~Control: Control object.
147 | """
148 | return cls((ControlType.CURSOR_MOVE_TO, x, y))
149 |
150 | @classmethod
151 | def clear(cls) -> "Control":
152 | """Clear the screen."""
153 | return cls(ControlType.CLEAR)
154 |
155 | @classmethod
156 | def show_cursor(cls, show: bool) -> "Control":
157 | """Show or hide the cursor."""
158 | return cls(ControlType.SHOW_CURSOR if show else ControlType.HIDE_CURSOR)
159 |
160 | @classmethod
161 | def alt_screen(cls, enable: bool) -> "Control":
162 | """Enable or disable alt screen."""
163 | if enable:
164 | return cls(ControlType.ENABLE_ALT_SCREEN, ControlType.HOME)
165 | else:
166 | return cls(ControlType.DISABLE_ALT_SCREEN)
167 |
168 | @classmethod
169 | def title(cls, title: str) -> "Control":
170 | """Set the terminal window title
171 |
172 | Args:
173 | title (str): The new terminal window title
174 | """
175 | return cls((ControlType.SET_WINDOW_TITLE, title))
176 |
177 | def __str__(self) -> str:
178 | return self.segment.text
179 |
180 | def __rich_console__(
181 | self, console: "Console", options: "ConsoleOptions"
182 | ) -> "RenderResult":
183 | if self.segment.text:
184 | yield self.segment
185 |
186 |
187 | def strip_control_codes(
188 | text: str, _translate_table: Dict[int, None] = _CONTROL_STRIP_TRANSLATE
189 | ) -> str:
190 | """Remove control codes from text.
191 |
192 | Args:
193 | text (str): A string possibly contain control codes.
194 |
195 | Returns:
196 | str: String with control codes removed.
197 | """
198 | return text.translate(_translate_table)
199 |
200 |
201 | def escape_control_codes(
202 | text: str,
203 | _translate_table: Dict[int, str] = CONTROL_ESCAPE,
204 | ) -> str:
205 | """Replace control codes with their "escaped" equivalent in the given text.
206 | (e.g. "\b" becomes "\\b")
207 |
208 | Args:
209 | text (str): A string possibly containing control codes.
210 |
211 | Returns:
212 | str: String with control codes replaced with their escaped version.
213 | """
214 | return text.translate(_translate_table)
215 |
216 |
217 | if __name__ == "__main__": # pragma: no cover
218 | from pip._vendor.rich.console import Console
219 |
220 | console = Console()
221 | console.print("Look at the title of your terminal window ^")
222 | # console.print(Control((ControlType.SET_WINDOW_TITLE, "Hello, world!")))
223 | for i in range(10):
224 | console.set_window_title("🚀 Loading" + "." * i)
225 | time.sleep(0.5)
226 |
```