This is page 41 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-24.2.dist-info/AUTHORS.txt:
--------------------------------------------------------------------------------
```
1 | @Switch01
2 | A_Rog
3 | Aakanksha Agrawal
4 | Abhinav Sagar
5 | ABHYUDAY PRATAP SINGH
6 | abs51295
7 | AceGentile
8 | Adam Chainz
9 | Adam Tse
10 | Adam Wentz
11 | admin
12 | Adolfo Ochagavía
13 | Adrien Morison
14 | Agus
15 | ahayrapetyan
16 | Ahilya
17 | AinsworthK
18 | Akash Srivastava
19 | Alan Yee
20 | Albert Tugushev
21 | Albert-Guan
22 | albertg
23 | Alberto Sottile
24 | Aleks Bunin
25 | Ales Erjavec
26 | Alethea Flowers
27 | Alex Gaynor
28 | Alex Grönholm
29 | Alex Hedges
30 | Alex Loosley
31 | Alex Morega
32 | Alex Stachowiak
33 | Alexander Shtyrov
34 | Alexandre Conrad
35 | Alexey Popravka
36 | Aleš Erjavec
37 | Alli
38 | Ami Fischman
39 | Ananya Maiti
40 | Anatoly Techtonik
41 | Anders Kaseorg
42 | Andre Aguiar
43 | Andreas Lutro
44 | Andrei Geacar
45 | Andrew Gaul
46 | Andrew Shymanel
47 | Andrey Bienkowski
48 | Andrey Bulgakov
49 | Andrés Delfino
50 | Andy Freeland
51 | Andy Kluger
52 | Ani Hayrapetyan
53 | Aniruddha Basak
54 | Anish Tambe
55 | Anrs Hu
56 | Anthony Sottile
57 | Antoine Musso
58 | Anton Ovchinnikov
59 | Anton Patrushev
60 | Antonio Alvarado Hernandez
61 | Antony Lee
62 | Antti Kaihola
63 | Anubhav Patel
64 | Anudit Nagar
65 | Anuj Godase
66 | AQNOUCH Mohammed
67 | AraHaan
68 | arena
69 | arenasys
70 | Arindam Choudhury
71 | Armin Ronacher
72 | Arnon Yaari
73 | Artem
74 | Arun Babu Neelicattu
75 | Ashley Manton
76 | Ashwin Ramaswami
77 | atse
78 | Atsushi Odagiri
79 | Avinash Karhana
80 | Avner Cohen
81 | Awit (Ah-Wit) Ghirmai
82 | Baptiste Mispelon
83 | Barney Gale
84 | barneygale
85 | Bartek Ogryczak
86 | Bastian Venthur
87 | Ben Bodenmiller
88 | Ben Darnell
89 | Ben Hoyt
90 | Ben Mares
91 | Ben Rosser
92 | Bence Nagy
93 | Benjamin Peterson
94 | Benjamin VanEvery
95 | Benoit Pierre
96 | Berker Peksag
97 | Bernard
98 | Bernard Tyers
99 | Bernardo B. Marques
100 | Bernhard M. Wiedemann
101 | Bertil Hatt
102 | Bhavam Vidyarthi
103 | Blazej Michalik
104 | Bogdan Opanchuk
105 | BorisZZZ
106 | Brad Erickson
107 | Bradley Ayers
108 | Branch Vincent
109 | Brandon L. Reiss
110 | Brandt Bucher
111 | Brannon Dorsey
112 | Brett Randall
113 | Brett Rosen
114 | Brian Cristante
115 | Brian Rosner
116 | briantracy
117 | BrownTruck
118 | Bruno Oliveira
119 | Bruno Renié
120 | Bruno S
121 | Bstrdsmkr
122 | Buck Golemon
123 | burrows
124 | Bussonnier Matthias
125 | bwoodsend
126 | c22
127 | Caleb Martinez
128 | Calvin Smith
129 | Carl Meyer
130 | Carlos Liam
131 | Carol Willing
132 | Carter Thayer
133 | Cass
134 | Chandrasekhar Atina
135 | Charlie Marsh
136 | Chih-Hsuan Yen
137 | Chris Brinker
138 | Chris Hunt
139 | Chris Jerdonek
140 | Chris Kuehl
141 | Chris Markiewicz
142 | Chris McDonough
143 | Chris Pawley
144 | Chris Pryer
145 | Chris Wolfe
146 | Christian Clauss
147 | Christian Heimes
148 | Christian Oudard
149 | Christoph Reiter
150 | Christopher Hunt
151 | Christopher Snyder
152 | chrysle
153 | cjc7373
154 | Clark Boylan
155 | Claudio Jolowicz
156 | Clay McClure
157 | Cody
158 | Cody Soyland
159 | Colin Watson
160 | Collin Anderson
161 | Connor Osborn
162 | Cooper Lees
163 | Cooper Ry Lees
164 | Cory Benfield
165 | Cory Wright
166 | Craig Kerstiens
167 | Cristian Sorinel
168 | Cristina
169 | Cristina Muñoz
170 | ctg123
171 | Curtis Doty
172 | cytolentino
173 | Daan De Meyer
174 | Dale
175 | Damian
176 | Damian Quiroga
177 | Damian Shaw
178 | Dan Black
179 | Dan Savilonis
180 | Dan Sully
181 | Dane Hillard
182 | daniel
183 | Daniel Collins
184 | Daniel Hahler
185 | Daniel Holth
186 | Daniel Jost
187 | Daniel Katz
188 | Daniel Shaulov
189 | Daniele Esposti
190 | Daniele Nicolodi
191 | Daniele Procida
192 | Daniil Konovalenko
193 | Danny Hermes
194 | Danny McClanahan
195 | Darren Kavanagh
196 | Dav Clark
197 | Dave Abrahams
198 | Dave Jones
199 | David Aguilar
200 | David Black
201 | David Bordeynik
202 | David Caro
203 | David D Lowe
204 | David Evans
205 | David Hewitt
206 | David Linke
207 | David Poggi
208 | David Poznik
209 | David Pursehouse
210 | David Runge
211 | David Tucker
212 | David Wales
213 | Davidovich
214 | ddelange
215 | Deepak Sharma
216 | Deepyaman Datta
217 | Denise Yu
218 | dependabot[bot]
219 | derwolfe
220 | Desetude
221 | Devesh Kumar Singh
222 | devsagul
223 | Diego Caraballo
224 | Diego Ramirez
225 | DiegoCaraballo
226 | Dimitri Merejkowsky
227 | Dimitri Papadopoulos
228 | Dirk Stolle
229 | Dmitry Gladkov
230 | Dmitry Volodin
231 | Domen Kožar
232 | Dominic Davis-Foster
233 | Donald Stufft
234 | Dongweiming
235 | doron zarhi
236 | Dos Moonen
237 | Douglas Thor
238 | DrFeathers
239 | Dustin Ingram
240 | Dustin Rodrigues
241 | Dwayne Bailey
242 | Ed Morley
243 | Edgar Ramírez
244 | Edgar Ramírez Mondragón
245 | Ee Durbin
246 | Efflam Lemaillet
247 | efflamlemaillet
248 | Eitan Adler
249 | ekristina
250 | elainechan
251 | Eli Schwartz
252 | Elisha Hollander
253 | Ellen Marie Dash
254 | Emil Burzo
255 | Emil Styrke
256 | Emmanuel Arias
257 | Endoh Takanao
258 | enoch
259 | Erdinc Mutlu
260 | Eric Cousineau
261 | Eric Gillingham
262 | Eric Hanchrow
263 | Eric Hopper
264 | Erik M. Bray
265 | Erik Rose
266 | Erwin Janssen
267 | Eugene Vereshchagin
268 | everdimension
269 | Federico
270 | Felipe Peter
271 | Felix Yan
272 | fiber-space
273 | Filip Kokosiński
274 | Filipe Laíns
275 | Finn Womack
276 | finnagin
277 | Flavio Amurrio
278 | Florian Briand
279 | Florian Rathgeber
280 | Francesco
281 | Francesco Montesano
282 | Fredrik Orderud
283 | Frost Ming
284 | Gabriel Curio
285 | Gabriel de Perthuis
286 | Garry Polley
287 | gavin
288 | gdanielson
289 | Geoffrey Sneddon
290 | George Song
291 | Georgi Valkov
292 | Georgy Pchelkin
293 | ghost
294 | Giftlin Rajaiah
295 | gizmoguy1
296 | gkdoc
297 | Godefroid Chapelle
298 | Gopinath M
299 | GOTO Hayato
300 | gousaiyang
301 | gpiks
302 | Greg Roodt
303 | Greg Ward
304 | Guilherme Espada
305 | Guillaume Seguin
306 | gutsytechster
307 | Guy Rozendorn
308 | Guy Tuval
309 | gzpan123
310 | Hanjun Kim
311 | Hari Charan
312 | Harsh Vardhan
313 | harupy
314 | Harutaka Kawamura
315 | hauntsaninja
316 | Henrich Hartzer
317 | Henry Schreiner
318 | Herbert Pfennig
319 | Holly Stotelmyer
320 | Honnix
321 | Hsiaoming Yang
322 | Hugo Lopes Tavares
323 | Hugo van Kemenade
324 | Hugues Bruant
325 | Hynek Schlawack
326 | Ian Bicking
327 | Ian Cordasco
328 | Ian Lee
329 | Ian Stapleton Cordasco
330 | Ian Wienand
331 | Igor Kuzmitshov
332 | Igor Sobreira
333 | Ikko Ashimine
334 | Ilan Schnell
335 | Illia Volochii
336 | Ilya Baryshev
337 | Inada Naoki
338 | Ionel Cristian Mărieș
339 | Ionel Maries Cristian
340 | Itamar Turner-Trauring
341 | Ivan Pozdeev
342 | J. Nick Koston
343 | Jacob Kim
344 | Jacob Walls
345 | Jaime Sanz
346 | jakirkham
347 | Jakub Kuczys
348 | Jakub Stasiak
349 | Jakub Vysoky
350 | Jakub Wilk
351 | James Cleveland
352 | James Curtin
353 | James Firth
354 | James Gerity
355 | James Polley
356 | Jan Pokorný
357 | Jannis Leidel
358 | Jarek Potiuk
359 | jarondl
360 | Jason Curtis
361 | Jason R. Coombs
362 | JasonMo
363 | JasonMo1
364 | Jay Graves
365 | Jean Abou Samra
366 | Jean-Christophe Fillion-Robin
367 | Jeff Barber
368 | Jeff Dairiki
369 | Jeff Widman
370 | Jelmer Vernooij
371 | jenix21
372 | Jeremy Fleischman
373 | Jeremy Stanley
374 | Jeremy Zafran
375 | Jesse Rittner
376 | Jiashuo Li
377 | Jim Fisher
378 | Jim Garrison
379 | Jinzhe Zeng
380 | Jiun Bae
381 | Jivan Amara
382 | Joe Bylund
383 | Joe Michelini
384 | John Paton
385 | John Sirois
386 | John T. Wodder II
387 | John-Scott Atlakson
388 | johnthagen
389 | Jon Banafato
390 | Jon Dufresne
391 | Jon Parise
392 | Jonas Nockert
393 | Jonathan Herbert
394 | Joonatan Partanen
395 | Joost Molenaar
396 | Jorge Niedbalski
397 | Joseph Bylund
398 | Joseph Long
399 | Josh Bronson
400 | Josh Cannon
401 | Josh Hansen
402 | Josh Schneier
403 | Joshua
404 | Juan Luis Cano Rodríguez
405 | Juanjo Bazán
406 | Judah Rand
407 | Julian Berman
408 | Julian Gethmann
409 | Julien Demoor
410 | Jussi Kukkonen
411 | jwg4
412 | Jyrki Pulliainen
413 | Kai Chen
414 | Kai Mueller
415 | Kamal Bin Mustafa
416 | kasium
417 | kaustav haldar
418 | keanemind
419 | Keith Maxwell
420 | Kelsey Hightower
421 | Kenneth Belitzky
422 | Kenneth Reitz
423 | Kevin Burke
424 | Kevin Carter
425 | Kevin Frommelt
426 | Kevin R Patterson
427 | Kexuan Sun
428 | Kit Randel
429 | Klaas van Schelven
430 | KOLANICH
431 | konstin
432 | kpinc
433 | Krishna Oza
434 | Kumar McMillan
435 | Kuntal Majumder
436 | Kurt McKee
437 | Kyle Persohn
438 | lakshmanaram
439 | Laszlo Kiss-Kollar
440 | Laurent Bristiel
441 | Laurent LAPORTE
442 | Laurie O
443 | Laurie Opperman
444 | layday
445 | Leon Sasson
446 | Lev Givon
447 | Lincoln de Sousa
448 | Lipis
449 | lorddavidiii
450 | Loren Carvalho
451 | Lucas Cimon
452 | Ludovic Gasc
453 | Luis Medel
454 | Lukas Geiger
455 | Lukas Juhrich
456 | Luke Macken
457 | Luo Jiebin
458 | luojiebin
459 | luz.paz
460 | László Kiss Kollár
461 | M00nL1ght
462 | Marc Abramowitz
463 | Marc Tamlyn
464 | Marcus Smith
465 | Mariatta
466 | Mark Kohler
467 | Mark McLoughlin
468 | Mark Williams
469 | Markus Hametner
470 | Martey Dodoo
471 | Martin Fischer
472 | Martin Häcker
473 | Martin Pavlasek
474 | Masaki
475 | Masklinn
476 | Matej Stuchlik
477 | Mathew Jennings
478 | Mathieu Bridon
479 | Mathieu Kniewallner
480 | Matt Bacchi
481 | Matt Good
482 | Matt Maker
483 | Matt Robenolt
484 | Matt Wozniski
485 | matthew
486 | Matthew Einhorn
487 | Matthew Feickert
488 | Matthew Gilliard
489 | Matthew Hughes
490 | Matthew Iversen
491 | Matthew Treinish
492 | Matthew Trumbell
493 | Matthew Willson
494 | Matthias Bussonnier
495 | mattip
496 | Maurits van Rees
497 | Max W Chase
498 | Maxim Kurnikov
499 | Maxime Rouyrre
500 | mayeut
501 | mbaluna
502 | mdebi
503 | memoselyk
504 | meowmeowcat
505 | Michael
506 | Michael Aquilina
507 | Michael E. Karpeles
508 | Michael Klich
509 | Michael Mintz
510 | Michael Williamson
511 | michaelpacer
512 | Michał Górny
513 | Mickaël Schoentgen
514 | Miguel Araujo Perez
515 | Mihir Singh
516 | Mike
517 | Mike Hendricks
518 | Min RK
519 | MinRK
520 | Miro Hrončok
521 | Monica Baluna
522 | montefra
523 | Monty Taylor
524 | morotti
525 | mrKazzila
526 | Muha Ajjan
527 | Nadav Wexler
528 | Nahuel Ambrosini
529 | Nate Coraor
530 | Nate Prewitt
531 | Nathan Houghton
532 | Nathaniel J. Smith
533 | Nehal J Wani
534 | Neil Botelho
535 | Nguyễn Gia Phong
536 | Nicholas Serra
537 | Nick Coghlan
538 | Nick Stenning
539 | Nick Timkovich
540 | Nicolas Bock
541 | Nicole Harris
542 | Nikhil Benesch
543 | Nikhil Ladha
544 | Nikita Chepanov
545 | Nikolay Korolev
546 | Nipunn Koorapati
547 | Nitesh Sharma
548 | Niyas Sait
549 | Noah
550 | Noah Gorny
551 | Nowell Strite
552 | NtaleGrey
553 | nvdv
554 | OBITORASU
555 | Ofek Lev
556 | ofrinevo
557 | Oliver Freund
558 | Oliver Jeeves
559 | Oliver Mannion
560 | Oliver Tonnhofer
561 | Olivier Girardot
562 | Olivier Grisel
563 | Ollie Rutherfurd
564 | OMOTO Kenji
565 | Omry Yadan
566 | onlinejudge95
567 | Oren Held
568 | Oscar Benjamin
569 | Oz N Tiram
570 | Pachwenko
571 | Patrick Dubroy
572 | Patrick Jenkins
573 | Patrick Lawson
574 | patricktokeeffe
575 | Patrik Kopkan
576 | Paul Ganssle
577 | Paul Kehrer
578 | Paul Moore
579 | Paul Nasrat
580 | Paul Oswald
581 | Paul van der Linden
582 | Paulus Schoutsen
583 | Pavel Safronov
584 | Pavithra Eswaramoorthy
585 | Pawel Jasinski
586 | Paweł Szramowski
587 | Pekka Klärck
588 | Peter Gessler
589 | Peter Lisák
590 | Peter Shen
591 | Peter Waller
592 | Petr Viktorin
593 | petr-tik
594 | Phaneendra Chiruvella
595 | Phil Elson
596 | Phil Freo
597 | Phil Pennock
598 | Phil Whelan
599 | Philip Jägenstedt
600 | Philip Molloy
601 | Philippe Ombredanne
602 | Pi Delport
603 | Pierre-Yves Rofes
604 | Pieter Degroote
605 | pip
606 | Prabakaran Kumaresshan
607 | Prabhjyotsing Surjit Singh Sodhi
608 | Prabhu Marappan
609 | Pradyun Gedam
610 | Prashant Sharma
611 | Pratik Mallya
612 | pre-commit-ci[bot]
613 | Preet Thakkar
614 | Preston Holmes
615 | Przemek Wrzos
616 | Pulkit Goyal
617 | q0w
618 | Qiangning Hong
619 | Qiming Xu
620 | Quentin Lee
621 | Quentin Pradet
622 | R. David Murray
623 | Rafael Caricio
624 | Ralf Schmitt
625 | Ran Benita
626 | Razzi Abuissa
627 | rdb
628 | Reece Dunham
629 | Remi Rampin
630 | Rene Dudfield
631 | Riccardo Magliocchetti
632 | Riccardo Schirone
633 | Richard Jones
634 | Richard Si
635 | Ricky Ng-Adam
636 | Rishi
637 | rmorotti
638 | RobberPhex
639 | Robert Collins
640 | Robert McGibbon
641 | Robert Pollak
642 | Robert T. McGibbon
643 | robin elisha robinson
644 | Roey Berman
645 | Rohan Jain
646 | Roman Bogorodskiy
647 | Roman Donchenko
648 | Romuald Brunet
649 | ronaudinho
650 | Ronny Pfannschmidt
651 | Rory McCann
652 | Ross Brattain
653 | Roy Wellington Ⅳ
654 | Ruairidh MacLeod
655 | Russell Keith-Magee
656 | Ryan Shepherd
657 | Ryan Wooden
658 | ryneeverett
659 | S. Guliaev
660 | Sachi King
661 | Salvatore Rinchiera
662 | sandeepkiran-js
663 | Sander Van Balen
664 | Savio Jomton
665 | schlamar
666 | Scott Kitterman
667 | Sean
668 | seanj
669 | Sebastian Jordan
670 | Sebastian Schaetz
671 | Segev Finer
672 | SeongSoo Cho
673 | Sergey Vasilyev
674 | Seth Michael Larson
675 | Seth Woodworth
676 | Shahar Epstein
677 | Shantanu
678 | shenxianpeng
679 | shireenrao
680 | Shivansh-007
681 | Shixian Sheng
682 | Shlomi Fish
683 | Shovan Maity
684 | Simeon Visser
685 | Simon Cross
686 | Simon Pichugin
687 | sinoroc
688 | sinscary
689 | snook92
690 | socketubs
691 | Sorin Sbarnea
692 | Srinivas Nyayapati
693 | Stavros Korokithakis
694 | Stefan Scherfke
695 | Stefano Rivera
696 | Stephan Erb
697 | Stephen Rosen
698 | stepshal
699 | Steve (Gadget) Barnes
700 | Steve Barnes
701 | Steve Dower
702 | Steve Kowalik
703 | Steven Myint
704 | Steven Silvester
705 | stonebig
706 | studioj
707 | Stéphane Bidoul
708 | Stéphane Bidoul (ACSONE)
709 | Stéphane Klein
710 | Sumana Harihareswara
711 | Surbhi Sharma
712 | Sviatoslav Sydorenko
713 | Sviatoslav Sydorenko (Святослав Сидоренко)
714 | Swat009
715 | Sylvain
716 | Takayuki SHIMIZUKAWA
717 | Taneli Hukkinen
718 | tbeswick
719 | Thiago
720 | Thijs Triemstra
721 | Thomas Fenzl
722 | Thomas Grainger
723 | Thomas Guettler
724 | Thomas Johansson
725 | Thomas Kluyver
726 | Thomas Smith
727 | Thomas VINCENT
728 | Tim D. Smith
729 | Tim Gates
730 | Tim Harder
731 | Tim Heap
732 | tim smith
733 | tinruufu
734 | Tobias Hermann
735 | Tom Forbes
736 | Tom Freudenheim
737 | Tom V
738 | Tomas Hrnciar
739 | Tomas Orsava
740 | Tomer Chachamu
741 | Tommi Enenkel | AnB
742 | Tomáš Hrnčiar
743 | Tony Beswick
744 | Tony Narlock
745 | Tony Zhaocheng Tan
746 | TonyBeswick
747 | toonarmycaptain
748 | Toshio Kuratomi
749 | toxinu
750 | Travis Swicegood
751 | Tushar Sadhwani
752 | Tzu-ping Chung
753 | Valentin Haenel
754 | Victor Stinner
755 | victorvpaulo
756 | Vikram - Google
757 | Viktor Szépe
758 | Ville Skyttä
759 | Vinay Sajip
760 | Vincent Philippon
761 | Vinicyus Macedo
762 | Vipul Kumar
763 | Vitaly Babiy
764 | Vladimir Fokow
765 | Vladimir Rutsky
766 | W. Trevor King
767 | Wil Tan
768 | Wilfred Hughes
769 | William Edwards
770 | William ML Leslie
771 | William T Olson
772 | William Woodruff
773 | Wilson Mo
774 | wim glenn
775 | Winson Luk
776 | Wolfgang Maier
777 | Wu Zhenyu
778 | XAMES3
779 | Xavier Fernandez
780 | Xianpeng Shen
781 | xoviat
782 | xtreak
783 | YAMAMOTO Takashi
784 | Yen Chi Hsuan
785 | Yeray Diaz Diaz
786 | Yoval P
787 | Yu Jian
788 | Yuan Jing Vincent Yan
789 | Yusuke Hayashi
790 | Zearin
791 | Zhiping Deng
792 | ziebam
793 | Zvezdan Petkovic
794 | Łukasz Langa
795 | Роман Донченко
796 | Семён Марьясин
797 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py:
--------------------------------------------------------------------------------
```python
1 | """Base option parser setup"""
2 |
3 | import logging
4 | import optparse
5 | import shutil
6 | import sys
7 | import textwrap
8 | from contextlib import suppress
9 | from typing import Any, Dict, Generator, List, Optional, Tuple
10 |
11 | from pip._internal.cli.status_codes import UNKNOWN_ERROR
12 | from pip._internal.configuration import Configuration, ConfigurationError
13 | from pip._internal.utils.misc import redact_auth_from_url, strtobool
14 |
15 | logger = logging.getLogger(__name__)
16 |
17 |
18 | class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
19 | """A prettier/less verbose help formatter for optparse."""
20 |
21 | def __init__(self, *args: Any, **kwargs: Any) -> None:
22 | # help position must be aligned with __init__.parseopts.description
23 | kwargs["max_help_position"] = 30
24 | kwargs["indent_increment"] = 1
25 | kwargs["width"] = shutil.get_terminal_size()[0] - 2
26 | super().__init__(*args, **kwargs)
27 |
28 | def format_option_strings(self, option: optparse.Option) -> str:
29 | return self._format_option_strings(option)
30 |
31 | def _format_option_strings(
32 | self, option: optparse.Option, mvarfmt: str = " <{}>", optsep: str = ", "
33 | ) -> str:
34 | """
35 | Return a comma-separated list of option strings and metavars.
36 |
37 | :param option: tuple of (short opt, long opt), e.g: ('-f', '--format')
38 | :param mvarfmt: metavar format string
39 | :param optsep: separator
40 | """
41 | opts = []
42 |
43 | if option._short_opts:
44 | opts.append(option._short_opts[0])
45 | if option._long_opts:
46 | opts.append(option._long_opts[0])
47 | if len(opts) > 1:
48 | opts.insert(1, optsep)
49 |
50 | if option.takes_value():
51 | assert option.dest is not None
52 | metavar = option.metavar or option.dest.lower()
53 | opts.append(mvarfmt.format(metavar.lower()))
54 |
55 | return "".join(opts)
56 |
57 | def format_heading(self, heading: str) -> str:
58 | if heading == "Options":
59 | return ""
60 | return heading + ":\n"
61 |
62 | def format_usage(self, usage: str) -> str:
63 | """
64 | Ensure there is only one newline between usage and the first heading
65 | if there is no description.
66 | """
67 | msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), " "))
68 | return msg
69 |
70 | def format_description(self, description: Optional[str]) -> str:
71 | # leave full control over description to us
72 | if description:
73 | if hasattr(self.parser, "main"):
74 | label = "Commands"
75 | else:
76 | label = "Description"
77 | # some doc strings have initial newlines, some don't
78 | description = description.lstrip("\n")
79 | # some doc strings have final newlines and spaces, some don't
80 | description = description.rstrip()
81 | # dedent, then reindent
82 | description = self.indent_lines(textwrap.dedent(description), " ")
83 | description = f"{label}:\n{description}\n"
84 | return description
85 | else:
86 | return ""
87 |
88 | def format_epilog(self, epilog: Optional[str]) -> str:
89 | # leave full control over epilog to us
90 | if epilog:
91 | return epilog
92 | else:
93 | return ""
94 |
95 | def indent_lines(self, text: str, indent: str) -> str:
96 | new_lines = [indent + line for line in text.split("\n")]
97 | return "\n".join(new_lines)
98 |
99 |
100 | class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter):
101 | """Custom help formatter for use in ConfigOptionParser.
102 |
103 | This is updates the defaults before expanding them, allowing
104 | them to show up correctly in the help listing.
105 |
106 | Also redact auth from url type options
107 | """
108 |
109 | def expand_default(self, option: optparse.Option) -> str:
110 | default_values = None
111 | if self.parser is not None:
112 | assert isinstance(self.parser, ConfigOptionParser)
113 | self.parser._update_defaults(self.parser.defaults)
114 | assert option.dest is not None
115 | default_values = self.parser.defaults.get(option.dest)
116 | help_text = super().expand_default(option)
117 |
118 | if default_values and option.metavar == "URL":
119 | if isinstance(default_values, str):
120 | default_values = [default_values]
121 |
122 | # If its not a list, we should abort and just return the help text
123 | if not isinstance(default_values, list):
124 | default_values = []
125 |
126 | for val in default_values:
127 | help_text = help_text.replace(val, redact_auth_from_url(val))
128 |
129 | return help_text
130 |
131 |
132 | class CustomOptionParser(optparse.OptionParser):
133 | def insert_option_group(
134 | self, idx: int, *args: Any, **kwargs: Any
135 | ) -> optparse.OptionGroup:
136 | """Insert an OptionGroup at a given position."""
137 | group = self.add_option_group(*args, **kwargs)
138 |
139 | self.option_groups.pop()
140 | self.option_groups.insert(idx, group)
141 |
142 | return group
143 |
144 | @property
145 | def option_list_all(self) -> List[optparse.Option]:
146 | """Get a list of all options, including those in option groups."""
147 | res = self.option_list[:]
148 | for i in self.option_groups:
149 | res.extend(i.option_list)
150 |
151 | return res
152 |
153 |
154 | class ConfigOptionParser(CustomOptionParser):
155 | """Custom option parser which updates its defaults by checking the
156 | configuration files and environmental variables"""
157 |
158 | def __init__(
159 | self,
160 | *args: Any,
161 | name: str,
162 | isolated: bool = False,
163 | **kwargs: Any,
164 | ) -> None:
165 | self.name = name
166 | self.config = Configuration(isolated)
167 |
168 | assert self.name
169 | super().__init__(*args, **kwargs)
170 |
171 | def check_default(self, option: optparse.Option, key: str, val: Any) -> Any:
172 | try:
173 | return option.check_value(key, val)
174 | except optparse.OptionValueError as exc:
175 | print(f"An error occurred during configuration: {exc}")
176 | sys.exit(3)
177 |
178 | def _get_ordered_configuration_items(
179 | self,
180 | ) -> Generator[Tuple[str, Any], None, None]:
181 | # Configuration gives keys in an unordered manner. Order them.
182 | override_order = ["global", self.name, ":env:"]
183 |
184 | # Pool the options into different groups
185 | section_items: Dict[str, List[Tuple[str, Any]]] = {
186 | name: [] for name in override_order
187 | }
188 | for section_key, val in self.config.items():
189 | # ignore empty values
190 | if not val:
191 | logger.debug(
192 | "Ignoring configuration key '%s' as it's value is empty.",
193 | section_key,
194 | )
195 | continue
196 |
197 | section, key = section_key.split(".", 1)
198 | if section in override_order:
199 | section_items[section].append((key, val))
200 |
201 | # Yield each group in their override order
202 | for section in override_order:
203 | for key, val in section_items[section]:
204 | yield key, val
205 |
206 | def _update_defaults(self, defaults: Dict[str, Any]) -> Dict[str, Any]:
207 | """Updates the given defaults with values from the config files and
208 | the environ. Does a little special handling for certain types of
209 | options (lists)."""
210 |
211 | # Accumulate complex default state.
212 | self.values = optparse.Values(self.defaults)
213 | late_eval = set()
214 | # Then set the options with those values
215 | for key, val in self._get_ordered_configuration_items():
216 | # '--' because configuration supports only long names
217 | option = self.get_option("--" + key)
218 |
219 | # Ignore options not present in this parser. E.g. non-globals put
220 | # in [global] by users that want them to apply to all applicable
221 | # commands.
222 | if option is None:
223 | continue
224 |
225 | assert option.dest is not None
226 |
227 | if option.action in ("store_true", "store_false"):
228 | try:
229 | val = strtobool(val)
230 | except ValueError:
231 | self.error(
232 | f"{val} is not a valid value for {key} option, "
233 | "please specify a boolean value like yes/no, "
234 | "true/false or 1/0 instead."
235 | )
236 | elif option.action == "count":
237 | with suppress(ValueError):
238 | val = strtobool(val)
239 | with suppress(ValueError):
240 | val = int(val)
241 | if not isinstance(val, int) or val < 0:
242 | self.error(
243 | f"{val} is not a valid value for {key} option, "
244 | "please instead specify either a non-negative integer "
245 | "or a boolean value like yes/no or false/true "
246 | "which is equivalent to 1/0."
247 | )
248 | elif option.action == "append":
249 | val = val.split()
250 | val = [self.check_default(option, key, v) for v in val]
251 | elif option.action == "callback":
252 | assert option.callback is not None
253 | late_eval.add(option.dest)
254 | opt_str = option.get_opt_string()
255 | val = option.convert_value(opt_str, val)
256 | # From take_action
257 | args = option.callback_args or ()
258 | kwargs = option.callback_kwargs or {}
259 | option.callback(option, opt_str, val, self, *args, **kwargs)
260 | else:
261 | val = self.check_default(option, key, val)
262 |
263 | defaults[option.dest] = val
264 |
265 | for key in late_eval:
266 | defaults[key] = getattr(self.values, key)
267 | self.values = None
268 | return defaults
269 |
270 | def get_default_values(self) -> optparse.Values:
271 | """Overriding to make updating the defaults after instantiation of
272 | the option parser possible, _update_defaults() does the dirty work."""
273 | if not self.process_default_values:
274 | # Old, pre-Optik 1.5 behaviour.
275 | return optparse.Values(self.defaults)
276 |
277 | # Load the configuration, or error out in case of an error
278 | try:
279 | self.config.load()
280 | except ConfigurationError as err:
281 | self.exit(UNKNOWN_ERROR, str(err))
282 |
283 | defaults = self._update_defaults(self.defaults.copy()) # ours
284 | for option in self._get_all_options():
285 | assert option.dest is not None
286 | default = defaults.get(option.dest)
287 | if isinstance(default, str):
288 | opt_str = option.get_opt_string()
289 | defaults[option.dest] = option.check_value(opt_str, default)
290 | return optparse.Values(defaults)
291 |
292 | def error(self, msg: str) -> None:
293 | self.print_usage(sys.stderr)
294 | self.exit(UNKNOWN_ERROR, f"{msg}\n")
295 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py:
--------------------------------------------------------------------------------
```python
1 | # -*- coding: utf-8 -*-
2 | #
3 | # Copyright (C) 2013-2017 Vinay Sajip.
4 | # Licensed to the Python Software Foundation under a contributor agreement.
5 | # See LICENSE.txt and CONTRIBUTORS.txt.
6 | #
7 | from __future__ import unicode_literals
8 |
9 | import bisect
10 | import io
11 | import logging
12 | import os
13 | import pkgutil
14 | import sys
15 | import types
16 | import zipimport
17 |
18 | from . import DistlibException
19 | from .util import cached_property, get_cache_base, Cache
20 |
21 | logger = logging.getLogger(__name__)
22 |
23 |
24 | cache = None # created when needed
25 |
26 |
27 | class ResourceCache(Cache):
28 | def __init__(self, base=None):
29 | if base is None:
30 | # Use native string to avoid issues on 2.x: see Python #20140.
31 | base = os.path.join(get_cache_base(), str('resource-cache'))
32 | super(ResourceCache, self).__init__(base)
33 |
34 | def is_stale(self, resource, path):
35 | """
36 | Is the cache stale for the given resource?
37 |
38 | :param resource: The :class:`Resource` being cached.
39 | :param path: The path of the resource in the cache.
40 | :return: True if the cache is stale.
41 | """
42 | # Cache invalidation is a hard problem :-)
43 | return True
44 |
45 | def get(self, resource):
46 | """
47 | Get a resource into the cache,
48 |
49 | :param resource: A :class:`Resource` instance.
50 | :return: The pathname of the resource in the cache.
51 | """
52 | prefix, path = resource.finder.get_cache_info(resource)
53 | if prefix is None:
54 | result = path
55 | else:
56 | result = os.path.join(self.base, self.prefix_to_dir(prefix), path)
57 | dirname = os.path.dirname(result)
58 | if not os.path.isdir(dirname):
59 | os.makedirs(dirname)
60 | if not os.path.exists(result):
61 | stale = True
62 | else:
63 | stale = self.is_stale(resource, path)
64 | if stale:
65 | # write the bytes of the resource to the cache location
66 | with open(result, 'wb') as f:
67 | f.write(resource.bytes)
68 | return result
69 |
70 |
71 | class ResourceBase(object):
72 | def __init__(self, finder, name):
73 | self.finder = finder
74 | self.name = name
75 |
76 |
77 | class Resource(ResourceBase):
78 | """
79 | A class representing an in-package resource, such as a data file. This is
80 | not normally instantiated by user code, but rather by a
81 | :class:`ResourceFinder` which manages the resource.
82 | """
83 | is_container = False # Backwards compatibility
84 |
85 | def as_stream(self):
86 | """
87 | Get the resource as a stream.
88 |
89 | This is not a property to make it obvious that it returns a new stream
90 | each time.
91 | """
92 | return self.finder.get_stream(self)
93 |
94 | @cached_property
95 | def file_path(self):
96 | global cache
97 | if cache is None:
98 | cache = ResourceCache()
99 | return cache.get(self)
100 |
101 | @cached_property
102 | def bytes(self):
103 | return self.finder.get_bytes(self)
104 |
105 | @cached_property
106 | def size(self):
107 | return self.finder.get_size(self)
108 |
109 |
110 | class ResourceContainer(ResourceBase):
111 | is_container = True # Backwards compatibility
112 |
113 | @cached_property
114 | def resources(self):
115 | return self.finder.get_resources(self)
116 |
117 |
118 | class ResourceFinder(object):
119 | """
120 | Resource finder for file system resources.
121 | """
122 |
123 | if sys.platform.startswith('java'):
124 | skipped_extensions = ('.pyc', '.pyo', '.class')
125 | else:
126 | skipped_extensions = ('.pyc', '.pyo')
127 |
128 | def __init__(self, module):
129 | self.module = module
130 | self.loader = getattr(module, '__loader__', None)
131 | self.base = os.path.dirname(getattr(module, '__file__', ''))
132 |
133 | def _adjust_path(self, path):
134 | return os.path.realpath(path)
135 |
136 | def _make_path(self, resource_name):
137 | # Issue #50: need to preserve type of path on Python 2.x
138 | # like os.path._get_sep
139 | if isinstance(resource_name, bytes): # should only happen on 2.x
140 | sep = b'/'
141 | else:
142 | sep = '/'
143 | parts = resource_name.split(sep)
144 | parts.insert(0, self.base)
145 | result = os.path.join(*parts)
146 | return self._adjust_path(result)
147 |
148 | def _find(self, path):
149 | return os.path.exists(path)
150 |
151 | def get_cache_info(self, resource):
152 | return None, resource.path
153 |
154 | def find(self, resource_name):
155 | path = self._make_path(resource_name)
156 | if not self._find(path):
157 | result = None
158 | else:
159 | if self._is_directory(path):
160 | result = ResourceContainer(self, resource_name)
161 | else:
162 | result = Resource(self, resource_name)
163 | result.path = path
164 | return result
165 |
166 | def get_stream(self, resource):
167 | return open(resource.path, 'rb')
168 |
169 | def get_bytes(self, resource):
170 | with open(resource.path, 'rb') as f:
171 | return f.read()
172 |
173 | def get_size(self, resource):
174 | return os.path.getsize(resource.path)
175 |
176 | def get_resources(self, resource):
177 | def allowed(f):
178 | return (f != '__pycache__' and not
179 | f.endswith(self.skipped_extensions))
180 | return set([f for f in os.listdir(resource.path) if allowed(f)])
181 |
182 | def is_container(self, resource):
183 | return self._is_directory(resource.path)
184 |
185 | _is_directory = staticmethod(os.path.isdir)
186 |
187 | def iterator(self, resource_name):
188 | resource = self.find(resource_name)
189 | if resource is not None:
190 | todo = [resource]
191 | while todo:
192 | resource = todo.pop(0)
193 | yield resource
194 | if resource.is_container:
195 | rname = resource.name
196 | for name in resource.resources:
197 | if not rname:
198 | new_name = name
199 | else:
200 | new_name = '/'.join([rname, name])
201 | child = self.find(new_name)
202 | if child.is_container:
203 | todo.append(child)
204 | else:
205 | yield child
206 |
207 |
208 | class ZipResourceFinder(ResourceFinder):
209 | """
210 | Resource finder for resources in .zip files.
211 | """
212 | def __init__(self, module):
213 | super(ZipResourceFinder, self).__init__(module)
214 | archive = self.loader.archive
215 | self.prefix_len = 1 + len(archive)
216 | # PyPy doesn't have a _files attr on zipimporter, and you can't set one
217 | if hasattr(self.loader, '_files'):
218 | self._files = self.loader._files
219 | else:
220 | self._files = zipimport._zip_directory_cache[archive]
221 | self.index = sorted(self._files)
222 |
223 | def _adjust_path(self, path):
224 | return path
225 |
226 | def _find(self, path):
227 | path = path[self.prefix_len:]
228 | if path in self._files:
229 | result = True
230 | else:
231 | if path and path[-1] != os.sep:
232 | path = path + os.sep
233 | i = bisect.bisect(self.index, path)
234 | try:
235 | result = self.index[i].startswith(path)
236 | except IndexError:
237 | result = False
238 | if not result:
239 | logger.debug('_find failed: %r %r', path, self.loader.prefix)
240 | else:
241 | logger.debug('_find worked: %r %r', path, self.loader.prefix)
242 | return result
243 |
244 | def get_cache_info(self, resource):
245 | prefix = self.loader.archive
246 | path = resource.path[1 + len(prefix):]
247 | return prefix, path
248 |
249 | def get_bytes(self, resource):
250 | return self.loader.get_data(resource.path)
251 |
252 | def get_stream(self, resource):
253 | return io.BytesIO(self.get_bytes(resource))
254 |
255 | def get_size(self, resource):
256 | path = resource.path[self.prefix_len:]
257 | return self._files[path][3]
258 |
259 | def get_resources(self, resource):
260 | path = resource.path[self.prefix_len:]
261 | if path and path[-1] != os.sep:
262 | path += os.sep
263 | plen = len(path)
264 | result = set()
265 | i = bisect.bisect(self.index, path)
266 | while i < len(self.index):
267 | if not self.index[i].startswith(path):
268 | break
269 | s = self.index[i][plen:]
270 | result.add(s.split(os.sep, 1)[0]) # only immediate children
271 | i += 1
272 | return result
273 |
274 | def _is_directory(self, path):
275 | path = path[self.prefix_len:]
276 | if path and path[-1] != os.sep:
277 | path += os.sep
278 | i = bisect.bisect(self.index, path)
279 | try:
280 | result = self.index[i].startswith(path)
281 | except IndexError:
282 | result = False
283 | return result
284 |
285 |
286 | _finder_registry = {
287 | type(None): ResourceFinder,
288 | zipimport.zipimporter: ZipResourceFinder
289 | }
290 |
291 | try:
292 | # In Python 3.6, _frozen_importlib -> _frozen_importlib_external
293 | try:
294 | import _frozen_importlib_external as _fi
295 | except ImportError:
296 | import _frozen_importlib as _fi
297 | _finder_registry[_fi.SourceFileLoader] = ResourceFinder
298 | _finder_registry[_fi.FileFinder] = ResourceFinder
299 | # See issue #146
300 | _finder_registry[_fi.SourcelessFileLoader] = ResourceFinder
301 | del _fi
302 | except (ImportError, AttributeError):
303 | pass
304 |
305 |
306 | def register_finder(loader, finder_maker):
307 | _finder_registry[type(loader)] = finder_maker
308 |
309 |
310 | _finder_cache = {}
311 |
312 |
313 | def finder(package):
314 | """
315 | Return a resource finder for a package.
316 | :param package: The name of the package.
317 | :return: A :class:`ResourceFinder` instance for the package.
318 | """
319 | if package in _finder_cache:
320 | result = _finder_cache[package]
321 | else:
322 | if package not in sys.modules:
323 | __import__(package)
324 | module = sys.modules[package]
325 | path = getattr(module, '__path__', None)
326 | if path is None:
327 | raise DistlibException('You cannot get a finder for a module, '
328 | 'only for a package')
329 | loader = getattr(module, '__loader__', None)
330 | finder_maker = _finder_registry.get(type(loader))
331 | if finder_maker is None:
332 | raise DistlibException('Unable to locate finder for %r' % package)
333 | result = finder_maker(module)
334 | _finder_cache[package] = result
335 | return result
336 |
337 |
338 | _dummy_module = types.ModuleType(str('__dummy__'))
339 |
340 |
341 | def finder_for_path(path):
342 | """
343 | Return a resource finder for a path, which should represent a container.
344 |
345 | :param path: The path.
346 | :return: A :class:`ResourceFinder` instance for the path.
347 | """
348 | result = None
349 | # calls any path hooks, gets importer into cache
350 | pkgutil.get_importer(path)
351 | loader = sys.path_importer_cache.get(path)
352 | finder = _finder_registry.get(type(loader))
353 | if finder:
354 | module = _dummy_module
355 | module.__file__ = os.path.join(path, '')
356 | module.__loader__ = loader
357 | result = finder(module)
358 | return result
359 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/urllib3/fields.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import email.utils
4 | import mimetypes
5 | import typing
6 |
7 | _TYPE_FIELD_VALUE = typing.Union[str, bytes]
8 | _TYPE_FIELD_VALUE_TUPLE = typing.Union[
9 | _TYPE_FIELD_VALUE,
10 | typing.Tuple[str, _TYPE_FIELD_VALUE],
11 | typing.Tuple[str, _TYPE_FIELD_VALUE, str],
12 | ]
13 |
14 |
15 | def guess_content_type(
16 | filename: str | None, default: str = "application/octet-stream"
17 | ) -> str:
18 | """
19 | Guess the "Content-Type" of a file.
20 |
21 | :param filename:
22 | The filename to guess the "Content-Type" of using :mod:`mimetypes`.
23 | :param default:
24 | If no "Content-Type" can be guessed, default to `default`.
25 | """
26 | if filename:
27 | return mimetypes.guess_type(filename)[0] or default
28 | return default
29 |
30 |
31 | def format_header_param_rfc2231(name: str, value: _TYPE_FIELD_VALUE) -> str:
32 | """
33 | Helper function to format and quote a single header parameter using the
34 | strategy defined in RFC 2231.
35 |
36 | Particularly useful for header parameters which might contain
37 | non-ASCII values, like file names. This follows
38 | `RFC 2388 Section 4.4 <https://tools.ietf.org/html/rfc2388#section-4.4>`_.
39 |
40 | :param name:
41 | The name of the parameter, a string expected to be ASCII only.
42 | :param value:
43 | The value of the parameter, provided as ``bytes`` or `str``.
44 | :returns:
45 | An RFC-2231-formatted unicode string.
46 |
47 | .. deprecated:: 2.0.0
48 | Will be removed in urllib3 v2.1.0. This is not valid for
49 | ``multipart/form-data`` header parameters.
50 | """
51 | import warnings
52 |
53 | warnings.warn(
54 | "'format_header_param_rfc2231' is deprecated and will be "
55 | "removed in urllib3 v2.1.0. This is not valid for "
56 | "multipart/form-data header parameters.",
57 | DeprecationWarning,
58 | stacklevel=2,
59 | )
60 |
61 | if isinstance(value, bytes):
62 | value = value.decode("utf-8")
63 |
64 | if not any(ch in value for ch in '"\\\r\n'):
65 | result = f'{name}="{value}"'
66 | try:
67 | result.encode("ascii")
68 | except (UnicodeEncodeError, UnicodeDecodeError):
69 | pass
70 | else:
71 | return result
72 |
73 | value = email.utils.encode_rfc2231(value, "utf-8")
74 | value = f"{name}*={value}"
75 |
76 | return value
77 |
78 |
79 | def format_multipart_header_param(name: str, value: _TYPE_FIELD_VALUE) -> str:
80 | """
81 | Format and quote a single multipart header parameter.
82 |
83 | This follows the `WHATWG HTML Standard`_ as of 2021/06/10, matching
84 | the behavior of current browser and curl versions. Values are
85 | assumed to be UTF-8. The ``\\n``, ``\\r``, and ``"`` characters are
86 | percent encoded.
87 |
88 | .. _WHATWG HTML Standard:
89 | https://html.spec.whatwg.org/multipage/
90 | form-control-infrastructure.html#multipart-form-data
91 |
92 | :param name:
93 | The name of the parameter, an ASCII-only ``str``.
94 | :param value:
95 | The value of the parameter, a ``str`` or UTF-8 encoded
96 | ``bytes``.
97 | :returns:
98 | A string ``name="value"`` with the escaped value.
99 |
100 | .. versionchanged:: 2.0.0
101 | Matches the WHATWG HTML Standard as of 2021/06/10. Control
102 | characters are no longer percent encoded.
103 |
104 | .. versionchanged:: 2.0.0
105 | Renamed from ``format_header_param_html5`` and
106 | ``format_header_param``. The old names will be removed in
107 | urllib3 v2.1.0.
108 | """
109 | if isinstance(value, bytes):
110 | value = value.decode("utf-8")
111 |
112 | # percent encode \n \r "
113 | value = value.translate({10: "%0A", 13: "%0D", 34: "%22"})
114 | return f'{name}="{value}"'
115 |
116 |
117 | def format_header_param_html5(name: str, value: _TYPE_FIELD_VALUE) -> str:
118 | """
119 | .. deprecated:: 2.0.0
120 | Renamed to :func:`format_multipart_header_param`. Will be
121 | removed in urllib3 v2.1.0.
122 | """
123 | import warnings
124 |
125 | warnings.warn(
126 | "'format_header_param_html5' has been renamed to "
127 | "'format_multipart_header_param'. The old name will be "
128 | "removed in urllib3 v2.1.0.",
129 | DeprecationWarning,
130 | stacklevel=2,
131 | )
132 | return format_multipart_header_param(name, value)
133 |
134 |
135 | def format_header_param(name: str, value: _TYPE_FIELD_VALUE) -> str:
136 | """
137 | .. deprecated:: 2.0.0
138 | Renamed to :func:`format_multipart_header_param`. Will be
139 | removed in urllib3 v2.1.0.
140 | """
141 | import warnings
142 |
143 | warnings.warn(
144 | "'format_header_param' has been renamed to "
145 | "'format_multipart_header_param'. The old name will be "
146 | "removed in urllib3 v2.1.0.",
147 | DeprecationWarning,
148 | stacklevel=2,
149 | )
150 | return format_multipart_header_param(name, value)
151 |
152 |
153 | class RequestField:
154 | """
155 | A data container for request body parameters.
156 |
157 | :param name:
158 | The name of this request field. Must be unicode.
159 | :param data:
160 | The data/value body.
161 | :param filename:
162 | An optional filename of the request field. Must be unicode.
163 | :param headers:
164 | An optional dict-like object of headers to initially use for the field.
165 |
166 | .. versionchanged:: 2.0.0
167 | The ``header_formatter`` parameter is deprecated and will
168 | be removed in urllib3 v2.1.0.
169 | """
170 |
171 | def __init__(
172 | self,
173 | name: str,
174 | data: _TYPE_FIELD_VALUE,
175 | filename: str | None = None,
176 | headers: typing.Mapping[str, str] | None = None,
177 | header_formatter: typing.Callable[[str, _TYPE_FIELD_VALUE], str] | None = None,
178 | ):
179 | self._name = name
180 | self._filename = filename
181 | self.data = data
182 | self.headers: dict[str, str | None] = {}
183 | if headers:
184 | self.headers = dict(headers)
185 |
186 | if header_formatter is not None:
187 | import warnings
188 |
189 | warnings.warn(
190 | "The 'header_formatter' parameter is deprecated and "
191 | "will be removed in urllib3 v2.1.0.",
192 | DeprecationWarning,
193 | stacklevel=2,
194 | )
195 | self.header_formatter = header_formatter
196 | else:
197 | self.header_formatter = format_multipart_header_param
198 |
199 | @classmethod
200 | def from_tuples(
201 | cls,
202 | fieldname: str,
203 | value: _TYPE_FIELD_VALUE_TUPLE,
204 | header_formatter: typing.Callable[[str, _TYPE_FIELD_VALUE], str] | None = None,
205 | ) -> RequestField:
206 | """
207 | A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters.
208 |
209 | Supports constructing :class:`~urllib3.fields.RequestField` from
210 | parameter of key/value strings AND key/filetuple. A filetuple is a
211 | (filename, data, MIME type) tuple where the MIME type is optional.
212 | For example::
213 |
214 | 'foo': 'bar',
215 | 'fakefile': ('foofile.txt', 'contents of foofile'),
216 | 'realfile': ('barfile.txt', open('realfile').read()),
217 | 'typedfile': ('bazfile.bin', open('bazfile').read(), 'image/jpeg'),
218 | 'nonamefile': 'contents of nonamefile field',
219 |
220 | Field names and filenames must be unicode.
221 | """
222 | filename: str | None
223 | content_type: str | None
224 | data: _TYPE_FIELD_VALUE
225 |
226 | if isinstance(value, tuple):
227 | if len(value) == 3:
228 | filename, data, content_type = value
229 | else:
230 | filename, data = value
231 | content_type = guess_content_type(filename)
232 | else:
233 | filename = None
234 | content_type = None
235 | data = value
236 |
237 | request_param = cls(
238 | fieldname, data, filename=filename, header_formatter=header_formatter
239 | )
240 | request_param.make_multipart(content_type=content_type)
241 |
242 | return request_param
243 |
244 | def _render_part(self, name: str, value: _TYPE_FIELD_VALUE) -> str:
245 | """
246 | Override this method to change how each multipart header
247 | parameter is formatted. By default, this calls
248 | :func:`format_multipart_header_param`.
249 |
250 | :param name:
251 | The name of the parameter, an ASCII-only ``str``.
252 | :param value:
253 | The value of the parameter, a ``str`` or UTF-8 encoded
254 | ``bytes``.
255 |
256 | :meta public:
257 | """
258 | return self.header_formatter(name, value)
259 |
260 | def _render_parts(
261 | self,
262 | header_parts: (
263 | dict[str, _TYPE_FIELD_VALUE | None]
264 | | typing.Sequence[tuple[str, _TYPE_FIELD_VALUE | None]]
265 | ),
266 | ) -> str:
267 | """
268 | Helper function to format and quote a single header.
269 |
270 | Useful for single headers that are composed of multiple items. E.g.,
271 | 'Content-Disposition' fields.
272 |
273 | :param header_parts:
274 | A sequence of (k, v) tuples or a :class:`dict` of (k, v) to format
275 | as `k1="v1"; k2="v2"; ...`.
276 | """
277 | iterable: typing.Iterable[tuple[str, _TYPE_FIELD_VALUE | None]]
278 |
279 | parts = []
280 | if isinstance(header_parts, dict):
281 | iterable = header_parts.items()
282 | else:
283 | iterable = header_parts
284 |
285 | for name, value in iterable:
286 | if value is not None:
287 | parts.append(self._render_part(name, value))
288 |
289 | return "; ".join(parts)
290 |
291 | def render_headers(self) -> str:
292 | """
293 | Renders the headers for this request field.
294 | """
295 | lines = []
296 |
297 | sort_keys = ["Content-Disposition", "Content-Type", "Content-Location"]
298 | for sort_key in sort_keys:
299 | if self.headers.get(sort_key, False):
300 | lines.append(f"{sort_key}: {self.headers[sort_key]}")
301 |
302 | for header_name, header_value in self.headers.items():
303 | if header_name not in sort_keys:
304 | if header_value:
305 | lines.append(f"{header_name}: {header_value}")
306 |
307 | lines.append("\r\n")
308 | return "\r\n".join(lines)
309 |
310 | def make_multipart(
311 | self,
312 | content_disposition: str | None = None,
313 | content_type: str | None = None,
314 | content_location: str | None = None,
315 | ) -> None:
316 | """
317 | Makes this request field into a multipart request field.
318 |
319 | This method overrides "Content-Disposition", "Content-Type" and
320 | "Content-Location" headers to the request parameter.
321 |
322 | :param content_disposition:
323 | The 'Content-Disposition' of the request body. Defaults to 'form-data'
324 | :param content_type:
325 | The 'Content-Type' of the request body.
326 | :param content_location:
327 | The 'Content-Location' of the request body.
328 |
329 | """
330 | content_disposition = (content_disposition or "form-data") + "; ".join(
331 | [
332 | "",
333 | self._render_parts(
334 | (("name", self._name), ("filename", self._filename))
335 | ),
336 | ]
337 | )
338 |
339 | self.headers["Content-Disposition"] = content_disposition
340 | self.headers["Content-Type"] = content_type
341 | self.headers["Content-Location"] = content_location
342 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/_elementpath.py:
--------------------------------------------------------------------------------
```python
1 | # cython: language_level=2
2 |
3 | #
4 | # ElementTree
5 | # $Id: ElementPath.py 3375 2008-02-13 08:05:08Z fredrik $
6 | #
7 | # limited xpath support for element trees
8 | #
9 | # history:
10 | # 2003-05-23 fl created
11 | # 2003-05-28 fl added support for // etc
12 | # 2003-08-27 fl fixed parsing of periods in element names
13 | # 2007-09-10 fl new selection engine
14 | # 2007-09-12 fl fixed parent selector
15 | # 2007-09-13 fl added iterfind; changed findall to return a list
16 | # 2007-11-30 fl added namespaces support
17 | # 2009-10-30 fl added child element value filter
18 | #
19 | # Copyright (c) 2003-2009 by Fredrik Lundh. All rights reserved.
20 | #
21 | # [email protected]
22 | # http://www.pythonware.com
23 | #
24 | # --------------------------------------------------------------------
25 | # The ElementTree toolkit is
26 | #
27 | # Copyright (c) 1999-2009 by Fredrik Lundh
28 | #
29 | # By obtaining, using, and/or copying this software and/or its
30 | # associated documentation, you agree that you have read, understood,
31 | # and will comply with the following terms and conditions:
32 | #
33 | # Permission to use, copy, modify, and distribute this software and
34 | # its associated documentation for any purpose and without fee is
35 | # hereby granted, provided that the above copyright notice appears in
36 | # all copies, and that both that copyright notice and this permission
37 | # notice appear in supporting documentation, and that the name of
38 | # Secret Labs AB or the author not be used in advertising or publicity
39 | # pertaining to distribution of the software without specific, written
40 | # prior permission.
41 | #
42 | # SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
43 | # TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT-
44 | # ABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR
45 | # BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
46 | # DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
47 | # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
48 | # ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
49 | # OF THIS SOFTWARE.
50 | # --------------------------------------------------------------------
51 |
52 | ##
53 | # Implementation module for XPath support. There's usually no reason
54 | # to import this module directly; the <b>ElementTree</b> does this for
55 | # you, if needed.
56 | ##
57 |
58 |
59 | import re
60 |
61 | xpath_tokenizer_re = re.compile(
62 | "("
63 | "'[^']*'|\"[^\"]*\"|"
64 | "::|"
65 | "//?|"
66 | r"\.\.|"
67 | r"\(\)|"
68 | r"[/.*:\[\]\(\)@=])|"
69 | r"((?:\{[^}]+\})?[^/\[\]\(\)@=\s]+)|"
70 | r"\s+"
71 | )
72 |
73 | def xpath_tokenizer(pattern, namespaces=None, with_prefixes=True):
74 | # ElementTree uses '', lxml used None originally.
75 | default_namespace = (namespaces.get(None) or namespaces.get('')) if namespaces else None
76 | parsing_attribute = False
77 | for token in xpath_tokenizer_re.findall(pattern):
78 | ttype, tag = token
79 | if tag and tag[0] != "{":
80 | if ":" in tag and with_prefixes:
81 | prefix, uri = tag.split(":", 1)
82 | try:
83 | if not namespaces:
84 | raise KeyError
85 | yield ttype, "{%s}%s" % (namespaces[prefix], uri)
86 | except KeyError:
87 | raise SyntaxError("prefix %r not found in prefix map" % prefix)
88 | elif default_namespace and not parsing_attribute:
89 | yield ttype, "{%s}%s" % (default_namespace, tag)
90 | else:
91 | yield token
92 | parsing_attribute = False
93 | else:
94 | yield token
95 | parsing_attribute = ttype == '@'
96 |
97 |
98 | def prepare_child(next, token):
99 | tag = token[1]
100 | def select(result):
101 | for elem in result:
102 | yield from elem.iterchildren(tag)
103 | return select
104 |
105 | def prepare_star(next, token):
106 | def select(result):
107 | for elem in result:
108 | yield from elem.iterchildren('*')
109 | return select
110 |
111 | def prepare_self(next, token):
112 | def select(result):
113 | return result
114 | return select
115 |
116 | def prepare_descendant(next, token):
117 | token = next()
118 | if token[0] == "*":
119 | tag = "*"
120 | elif not token[0]:
121 | tag = token[1]
122 | else:
123 | raise SyntaxError("invalid descendant")
124 | def select(result):
125 | for elem in result:
126 | yield from elem.iterdescendants(tag)
127 | return select
128 |
129 | def prepare_parent(next, token):
130 | def select(result):
131 | for elem in result:
132 | parent = elem.getparent()
133 | if parent is not None:
134 | yield parent
135 | return select
136 |
137 | def prepare_predicate(next, token):
138 | # FIXME: replace with real parser!!! refs:
139 | # http://effbot.org/zone/simple-iterator-parser.htm
140 | # http://javascript.crockford.com/tdop/tdop.html
141 | signature = ''
142 | predicate = []
143 | while 1:
144 | token = next()
145 | if token[0] == "]":
146 | break
147 | if token == ('', ''):
148 | # ignore whitespace
149 | continue
150 | if token[0] and token[0][:1] in "'\"":
151 | token = "'", token[0][1:-1]
152 | signature += token[0] or "-"
153 | predicate.append(token[1])
154 |
155 | # use signature to determine predicate type
156 | if signature == "@-":
157 | # [@attribute] predicate
158 | key = predicate[1]
159 | def select(result):
160 | for elem in result:
161 | if elem.get(key) is not None:
162 | yield elem
163 | return select
164 | if signature == "@-='":
165 | # [@attribute='value']
166 | key = predicate[1]
167 | value = predicate[-1]
168 | def select(result):
169 | for elem in result:
170 | if elem.get(key) == value:
171 | yield elem
172 | return select
173 | if signature == "-" and not re.match(r"-?\d+$", predicate[0]):
174 | # [tag]
175 | tag = predicate[0]
176 | def select(result):
177 | for elem in result:
178 | for _ in elem.iterchildren(tag):
179 | yield elem
180 | break
181 | return select
182 | if signature == ".='" or (signature == "-='" and not re.match(r"-?\d+$", predicate[0])):
183 | # [.='value'] or [tag='value']
184 | tag = predicate[0]
185 | value = predicate[-1]
186 | if tag:
187 | def select(result):
188 | for elem in result:
189 | for e in elem.iterchildren(tag):
190 | if "".join(e.itertext()) == value:
191 | yield elem
192 | break
193 | else:
194 | def select(result):
195 | for elem in result:
196 | if "".join(elem.itertext()) == value:
197 | yield elem
198 | return select
199 | if signature == "-" or signature == "-()" or signature == "-()-":
200 | # [index] or [last()] or [last()-index]
201 | if signature == "-":
202 | # [index]
203 | index = int(predicate[0]) - 1
204 | if index < 0:
205 | if index == -1:
206 | raise SyntaxError(
207 | "indices in path predicates are 1-based, not 0-based")
208 | else:
209 | raise SyntaxError("path index >= 1 expected")
210 | else:
211 | if predicate[0] != "last":
212 | raise SyntaxError("unsupported function")
213 | if signature == "-()-":
214 | try:
215 | index = int(predicate[2]) - 1
216 | except ValueError:
217 | raise SyntaxError("unsupported expression")
218 | else:
219 | index = -1
220 | def select(result):
221 | for elem in result:
222 | parent = elem.getparent()
223 | if parent is None:
224 | continue
225 | try:
226 | # FIXME: what if the selector is "*" ?
227 | elems = list(parent.iterchildren(elem.tag))
228 | if elems[index] is elem:
229 | yield elem
230 | except IndexError:
231 | pass
232 | return select
233 | raise SyntaxError("invalid predicate")
234 |
235 | ops = {
236 | "": prepare_child,
237 | "*": prepare_star,
238 | ".": prepare_self,
239 | "..": prepare_parent,
240 | "//": prepare_descendant,
241 | "[": prepare_predicate,
242 | }
243 |
244 |
245 | # --------------------------------------------------------------------
246 |
247 | _cache = {}
248 |
249 |
250 | def _build_path_iterator(path, namespaces, with_prefixes=True):
251 | """compile selector pattern"""
252 | if path[-1:] == "/":
253 | path += "*" # implicit all (FIXME: keep this?)
254 |
255 | cache_key = (path,)
256 | if namespaces:
257 | # lxml originally used None for the default namespace but ElementTree uses the
258 | # more convenient (all-strings-dict) empty string, so we support both here,
259 | # preferring the more convenient '', as long as they aren't ambiguous.
260 | if None in namespaces:
261 | if '' in namespaces and namespaces[None] != namespaces['']:
262 | raise ValueError("Ambiguous default namespace provided: %r versus %r" % (
263 | namespaces[None], namespaces['']))
264 | cache_key += (namespaces[None],) + tuple(sorted(
265 | item for item in namespaces.items() if item[0] is not None))
266 | else:
267 | cache_key += tuple(sorted(namespaces.items()))
268 |
269 | try:
270 | return _cache[cache_key]
271 | except KeyError:
272 | pass
273 | if len(_cache) > 100:
274 | _cache.clear()
275 |
276 | if path[:1] == "/":
277 | raise SyntaxError("cannot use absolute path on element")
278 | stream = iter(xpath_tokenizer(path, namespaces, with_prefixes=with_prefixes))
279 | try:
280 | _next = stream.next
281 | except AttributeError:
282 | # Python 3
283 | _next = stream.__next__
284 | try:
285 | token = _next()
286 | except StopIteration:
287 | raise SyntaxError("empty path expression")
288 | selector = []
289 | while 1:
290 | try:
291 | selector.append(ops[token[0]](_next, token))
292 | except StopIteration:
293 | raise SyntaxError("invalid path")
294 | try:
295 | token = _next()
296 | if token[0] == "/":
297 | token = _next()
298 | except StopIteration:
299 | break
300 | _cache[cache_key] = selector
301 | return selector
302 |
303 |
304 | ##
305 | # Iterate over the matching nodes
306 |
307 | def iterfind(elem, path, namespaces=None, with_prefixes=True):
308 | selector = _build_path_iterator(path, namespaces, with_prefixes=with_prefixes)
309 | result = iter((elem,))
310 | for select in selector:
311 | result = select(result)
312 | return result
313 |
314 |
315 | ##
316 | # Find first matching object.
317 |
318 | def find(elem, path, namespaces=None, with_prefixes=True):
319 | it = iterfind(elem, path, namespaces, with_prefixes=with_prefixes)
320 | try:
321 | return next(it)
322 | except StopIteration:
323 | return None
324 |
325 |
326 | ##
327 | # Find all matching objects.
328 |
329 | def findall(elem, path, namespaces=None, with_prefixes=True):
330 | return list(iterfind(elem, path, namespaces))
331 |
332 |
333 | ##
334 | # Find text for first matching object.
335 |
336 | def findtext(elem, path, default=None, namespaces=None, with_prefixes=True):
337 | el = find(elem, path, namespaces, with_prefixes=with_prefixes)
338 | if el is None:
339 | return default
340 | else:
341 | return el.text or ''
342 |
```