This is page 24 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/lxml/includes/libxml/xmlschemas.h:
--------------------------------------------------------------------------------
```
1 | /*
2 | * Summary: incomplete XML Schemas structure implementation
3 | * Description: interface to the XML Schemas handling and schema validity
4 | * checking, it is incomplete right now.
5 | *
6 | * Copy: See Copyright for the status of this software.
7 | *
8 | * Author: Daniel Veillard
9 | */
10 |
11 |
12 | #ifndef __XML_SCHEMA_H__
13 | #define __XML_SCHEMA_H__
14 |
15 | #include <libxml/xmlversion.h>
16 |
17 | #ifdef LIBXML_SCHEMAS_ENABLED
18 |
19 | #include <stdio.h>
20 | #include <libxml/encoding.h>
21 | #include <libxml/tree.h>
22 | #include <libxml/xmlerror.h>
23 |
24 | #ifdef __cplusplus
25 | extern "C" {
26 | #endif
27 |
28 | /**
29 | * This error codes are obsolete; not used any more.
30 | */
31 | typedef enum {
32 | XML_SCHEMAS_ERR_OK = 0,
33 | XML_SCHEMAS_ERR_NOROOT = 1,
34 | XML_SCHEMAS_ERR_UNDECLAREDELEM,
35 | XML_SCHEMAS_ERR_NOTTOPLEVEL,
36 | XML_SCHEMAS_ERR_MISSING,
37 | XML_SCHEMAS_ERR_WRONGELEM,
38 | XML_SCHEMAS_ERR_NOTYPE,
39 | XML_SCHEMAS_ERR_NOROLLBACK,
40 | XML_SCHEMAS_ERR_ISABSTRACT,
41 | XML_SCHEMAS_ERR_NOTEMPTY,
42 | XML_SCHEMAS_ERR_ELEMCONT,
43 | XML_SCHEMAS_ERR_HAVEDEFAULT,
44 | XML_SCHEMAS_ERR_NOTNILLABLE,
45 | XML_SCHEMAS_ERR_EXTRACONTENT,
46 | XML_SCHEMAS_ERR_INVALIDATTR,
47 | XML_SCHEMAS_ERR_INVALIDELEM,
48 | XML_SCHEMAS_ERR_NOTDETERMINIST,
49 | XML_SCHEMAS_ERR_CONSTRUCT,
50 | XML_SCHEMAS_ERR_INTERNAL,
51 | XML_SCHEMAS_ERR_NOTSIMPLE,
52 | XML_SCHEMAS_ERR_ATTRUNKNOWN,
53 | XML_SCHEMAS_ERR_ATTRINVALID,
54 | XML_SCHEMAS_ERR_VALUE,
55 | XML_SCHEMAS_ERR_FACET,
56 | XML_SCHEMAS_ERR_,
57 | XML_SCHEMAS_ERR_XXX
58 | } xmlSchemaValidError;
59 |
60 | /*
61 | * ATTENTION: Change xmlSchemaSetValidOptions's check
62 | * for invalid values, if adding to the validation
63 | * options below.
64 | */
65 | /**
66 | * xmlSchemaValidOption:
67 | *
68 | * This is the set of XML Schema validation options.
69 | */
70 | typedef enum {
71 | XML_SCHEMA_VAL_VC_I_CREATE = 1<<0
72 | /* Default/fixed: create an attribute node
73 | * or an element's text node on the instance.
74 | */
75 | } xmlSchemaValidOption;
76 |
77 | /*
78 | XML_SCHEMA_VAL_XSI_ASSEMBLE = 1<<1,
79 | * assemble schemata using
80 | * xsi:schemaLocation and
81 | * xsi:noNamespaceSchemaLocation
82 | */
83 |
84 | /**
85 | * The schemas related types are kept internal
86 | */
87 | typedef struct _xmlSchema xmlSchema;
88 | typedef xmlSchema *xmlSchemaPtr;
89 |
90 | /**
91 | * xmlSchemaValidityErrorFunc:
92 | * @ctx: the validation context
93 | * @msg: the message
94 | * @...: extra arguments
95 | *
96 | * Signature of an error callback from an XSD validation
97 | */
98 | typedef void (*xmlSchemaValidityErrorFunc)
99 | (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3);
100 |
101 | /**
102 | * xmlSchemaValidityWarningFunc:
103 | * @ctx: the validation context
104 | * @msg: the message
105 | * @...: extra arguments
106 | *
107 | * Signature of a warning callback from an XSD validation
108 | */
109 | typedef void (*xmlSchemaValidityWarningFunc)
110 | (void *ctx, const char *msg, ...) LIBXML_ATTR_FORMAT(2,3);
111 |
112 | /**
113 | * A schemas validation context
114 | */
115 | typedef struct _xmlSchemaParserCtxt xmlSchemaParserCtxt;
116 | typedef xmlSchemaParserCtxt *xmlSchemaParserCtxtPtr;
117 |
118 | typedef struct _xmlSchemaValidCtxt xmlSchemaValidCtxt;
119 | typedef xmlSchemaValidCtxt *xmlSchemaValidCtxtPtr;
120 |
121 | /**
122 | * xmlSchemaValidityLocatorFunc:
123 | * @ctx: user provided context
124 | * @file: returned file information
125 | * @line: returned line information
126 | *
127 | * A schemas validation locator, a callback called by the validator.
128 | * This is used when file or node information are not available
129 | * to find out what file and line number are affected
130 | *
131 | * Returns: 0 in case of success and -1 in case of error
132 | */
133 |
134 | typedef int (*xmlSchemaValidityLocatorFunc) (void *ctx,
135 | const char **file, unsigned long *line);
136 |
137 | /*
138 | * Interfaces for parsing.
139 | */
140 | XMLPUBFUN xmlSchemaParserCtxtPtr
141 | xmlSchemaNewParserCtxt (const char *URL);
142 | XMLPUBFUN xmlSchemaParserCtxtPtr
143 | xmlSchemaNewMemParserCtxt (const char *buffer,
144 | int size);
145 | XMLPUBFUN xmlSchemaParserCtxtPtr
146 | xmlSchemaNewDocParserCtxt (xmlDocPtr doc);
147 | XMLPUBFUN void
148 | xmlSchemaFreeParserCtxt (xmlSchemaParserCtxtPtr ctxt);
149 | XMLPUBFUN void
150 | xmlSchemaSetParserErrors (xmlSchemaParserCtxtPtr ctxt,
151 | xmlSchemaValidityErrorFunc err,
152 | xmlSchemaValidityWarningFunc warn,
153 | void *ctx);
154 | XMLPUBFUN void
155 | xmlSchemaSetParserStructuredErrors(xmlSchemaParserCtxtPtr ctxt,
156 | xmlStructuredErrorFunc serror,
157 | void *ctx);
158 | XMLPUBFUN int
159 | xmlSchemaGetParserErrors(xmlSchemaParserCtxtPtr ctxt,
160 | xmlSchemaValidityErrorFunc * err,
161 | xmlSchemaValidityWarningFunc * warn,
162 | void **ctx);
163 | XMLPUBFUN int
164 | xmlSchemaIsValid (xmlSchemaValidCtxtPtr ctxt);
165 |
166 | XMLPUBFUN xmlSchemaPtr
167 | xmlSchemaParse (xmlSchemaParserCtxtPtr ctxt);
168 | XMLPUBFUN void
169 | xmlSchemaFree (xmlSchemaPtr schema);
170 | #ifdef LIBXML_OUTPUT_ENABLED
171 | XMLPUBFUN void
172 | xmlSchemaDump (FILE *output,
173 | xmlSchemaPtr schema);
174 | #endif /* LIBXML_OUTPUT_ENABLED */
175 | /*
176 | * Interfaces for validating
177 | */
178 | XMLPUBFUN void
179 | xmlSchemaSetValidErrors (xmlSchemaValidCtxtPtr ctxt,
180 | xmlSchemaValidityErrorFunc err,
181 | xmlSchemaValidityWarningFunc warn,
182 | void *ctx);
183 | XMLPUBFUN void
184 | xmlSchemaSetValidStructuredErrors(xmlSchemaValidCtxtPtr ctxt,
185 | xmlStructuredErrorFunc serror,
186 | void *ctx);
187 | XMLPUBFUN int
188 | xmlSchemaGetValidErrors (xmlSchemaValidCtxtPtr ctxt,
189 | xmlSchemaValidityErrorFunc *err,
190 | xmlSchemaValidityWarningFunc *warn,
191 | void **ctx);
192 | XMLPUBFUN int
193 | xmlSchemaSetValidOptions (xmlSchemaValidCtxtPtr ctxt,
194 | int options);
195 | XMLPUBFUN void
196 | xmlSchemaValidateSetFilename(xmlSchemaValidCtxtPtr vctxt,
197 | const char *filename);
198 | XMLPUBFUN int
199 | xmlSchemaValidCtxtGetOptions(xmlSchemaValidCtxtPtr ctxt);
200 |
201 | XMLPUBFUN xmlSchemaValidCtxtPtr
202 | xmlSchemaNewValidCtxt (xmlSchemaPtr schema);
203 | XMLPUBFUN void
204 | xmlSchemaFreeValidCtxt (xmlSchemaValidCtxtPtr ctxt);
205 | XMLPUBFUN int
206 | xmlSchemaValidateDoc (xmlSchemaValidCtxtPtr ctxt,
207 | xmlDocPtr instance);
208 | XMLPUBFUN int
209 | xmlSchemaValidateOneElement (xmlSchemaValidCtxtPtr ctxt,
210 | xmlNodePtr elem);
211 | XMLPUBFUN int
212 | xmlSchemaValidateStream (xmlSchemaValidCtxtPtr ctxt,
213 | xmlParserInputBufferPtr input,
214 | xmlCharEncoding enc,
215 | xmlSAXHandlerPtr sax,
216 | void *user_data);
217 | XMLPUBFUN int
218 | xmlSchemaValidateFile (xmlSchemaValidCtxtPtr ctxt,
219 | const char * filename,
220 | int options);
221 |
222 | XMLPUBFUN xmlParserCtxtPtr
223 | xmlSchemaValidCtxtGetParserCtxt(xmlSchemaValidCtxtPtr ctxt);
224 |
225 | /*
226 | * Interface to insert Schemas SAX validation in a SAX stream
227 | */
228 | typedef struct _xmlSchemaSAXPlug xmlSchemaSAXPlugStruct;
229 | typedef xmlSchemaSAXPlugStruct *xmlSchemaSAXPlugPtr;
230 |
231 | XMLPUBFUN xmlSchemaSAXPlugPtr
232 | xmlSchemaSAXPlug (xmlSchemaValidCtxtPtr ctxt,
233 | xmlSAXHandlerPtr *sax,
234 | void **user_data);
235 | XMLPUBFUN int
236 | xmlSchemaSAXUnplug (xmlSchemaSAXPlugPtr plug);
237 |
238 |
239 | XMLPUBFUN void
240 | xmlSchemaValidateSetLocator (xmlSchemaValidCtxtPtr vctxt,
241 | xmlSchemaValidityLocatorFunc f,
242 | void *ctxt);
243 |
244 | #ifdef __cplusplus
245 | }
246 | #endif
247 |
248 | #endif /* LIBXML_SCHEMAS_ENABLED */
249 | #endif /* __XML_SCHEMA_H__ */
250 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py:
--------------------------------------------------------------------------------
```python
1 | import re
2 | import sys
3 | from contextlib import suppress
4 | from typing import Iterable, NamedTuple, Optional
5 |
6 | from .color import Color
7 | from .style import Style
8 | from .text import Text
9 |
10 | re_ansi = re.compile(
11 | r"""
12 | (?:\x1b\](.*?)\x1b\\)|
13 | (?:\x1b([(@-Z\\-_]|\[[0-?]*[ -/]*[@-~]))
14 | """,
15 | re.VERBOSE,
16 | )
17 |
18 |
19 | class _AnsiToken(NamedTuple):
20 | """Result of ansi tokenized string."""
21 |
22 | plain: str = ""
23 | sgr: Optional[str] = ""
24 | osc: Optional[str] = ""
25 |
26 |
27 | def _ansi_tokenize(ansi_text: str) -> Iterable[_AnsiToken]:
28 | """Tokenize a string in to plain text and ANSI codes.
29 |
30 | Args:
31 | ansi_text (str): A String containing ANSI codes.
32 |
33 | Yields:
34 | AnsiToken: A named tuple of (plain, sgr, osc)
35 | """
36 |
37 | position = 0
38 | sgr: Optional[str]
39 | osc: Optional[str]
40 | for match in re_ansi.finditer(ansi_text):
41 | start, end = match.span(0)
42 | osc, sgr = match.groups()
43 | if start > position:
44 | yield _AnsiToken(ansi_text[position:start])
45 | if sgr:
46 | if sgr == "(":
47 | position = end + 1
48 | continue
49 | if sgr.endswith("m"):
50 | yield _AnsiToken("", sgr[1:-1], osc)
51 | else:
52 | yield _AnsiToken("", sgr, osc)
53 | position = end
54 | if position < len(ansi_text):
55 | yield _AnsiToken(ansi_text[position:])
56 |
57 |
58 | SGR_STYLE_MAP = {
59 | 1: "bold",
60 | 2: "dim",
61 | 3: "italic",
62 | 4: "underline",
63 | 5: "blink",
64 | 6: "blink2",
65 | 7: "reverse",
66 | 8: "conceal",
67 | 9: "strike",
68 | 21: "underline2",
69 | 22: "not dim not bold",
70 | 23: "not italic",
71 | 24: "not underline",
72 | 25: "not blink",
73 | 26: "not blink2",
74 | 27: "not reverse",
75 | 28: "not conceal",
76 | 29: "not strike",
77 | 30: "color(0)",
78 | 31: "color(1)",
79 | 32: "color(2)",
80 | 33: "color(3)",
81 | 34: "color(4)",
82 | 35: "color(5)",
83 | 36: "color(6)",
84 | 37: "color(7)",
85 | 39: "default",
86 | 40: "on color(0)",
87 | 41: "on color(1)",
88 | 42: "on color(2)",
89 | 43: "on color(3)",
90 | 44: "on color(4)",
91 | 45: "on color(5)",
92 | 46: "on color(6)",
93 | 47: "on color(7)",
94 | 49: "on default",
95 | 51: "frame",
96 | 52: "encircle",
97 | 53: "overline",
98 | 54: "not frame not encircle",
99 | 55: "not overline",
100 | 90: "color(8)",
101 | 91: "color(9)",
102 | 92: "color(10)",
103 | 93: "color(11)",
104 | 94: "color(12)",
105 | 95: "color(13)",
106 | 96: "color(14)",
107 | 97: "color(15)",
108 | 100: "on color(8)",
109 | 101: "on color(9)",
110 | 102: "on color(10)",
111 | 103: "on color(11)",
112 | 104: "on color(12)",
113 | 105: "on color(13)",
114 | 106: "on color(14)",
115 | 107: "on color(15)",
116 | }
117 |
118 |
119 | class AnsiDecoder:
120 | """Translate ANSI code in to styled Text."""
121 |
122 | def __init__(self) -> None:
123 | self.style = Style.null()
124 |
125 | def decode(self, terminal_text: str) -> Iterable[Text]:
126 | """Decode ANSI codes in an iterable of lines.
127 |
128 | Args:
129 | lines (Iterable[str]): An iterable of lines of terminal output.
130 |
131 | Yields:
132 | Text: Marked up Text.
133 | """
134 | for line in terminal_text.splitlines():
135 | yield self.decode_line(line)
136 |
137 | def decode_line(self, line: str) -> Text:
138 | """Decode a line containing ansi codes.
139 |
140 | Args:
141 | line (str): A line of terminal output.
142 |
143 | Returns:
144 | Text: A Text instance marked up according to ansi codes.
145 | """
146 | from_ansi = Color.from_ansi
147 | from_rgb = Color.from_rgb
148 | _Style = Style
149 | text = Text()
150 | append = text.append
151 | line = line.rsplit("\r", 1)[-1]
152 | for plain_text, sgr, osc in _ansi_tokenize(line):
153 | if plain_text:
154 | append(plain_text, self.style or None)
155 | elif osc is not None:
156 | if osc.startswith("8;"):
157 | _params, semicolon, link = osc[2:].partition(";")
158 | if semicolon:
159 | self.style = self.style.update_link(link or None)
160 | elif sgr is not None:
161 | # Translate in to semi-colon separated codes
162 | # Ignore invalid codes, because we want to be lenient
163 | codes = [
164 | min(255, int(_code) if _code else 0)
165 | for _code in sgr.split(";")
166 | if _code.isdigit() or _code == ""
167 | ]
168 | iter_codes = iter(codes)
169 | for code in iter_codes:
170 | if code == 0:
171 | # reset
172 | self.style = _Style.null()
173 | elif code in SGR_STYLE_MAP:
174 | # styles
175 | self.style += _Style.parse(SGR_STYLE_MAP[code])
176 | elif code == 38:
177 | # Foreground
178 | with suppress(StopIteration):
179 | color_type = next(iter_codes)
180 | if color_type == 5:
181 | self.style += _Style.from_color(
182 | from_ansi(next(iter_codes))
183 | )
184 | elif color_type == 2:
185 | self.style += _Style.from_color(
186 | from_rgb(
187 | next(iter_codes),
188 | next(iter_codes),
189 | next(iter_codes),
190 | )
191 | )
192 | elif code == 48:
193 | # Background
194 | with suppress(StopIteration):
195 | color_type = next(iter_codes)
196 | if color_type == 5:
197 | self.style += _Style.from_color(
198 | None, from_ansi(next(iter_codes))
199 | )
200 | elif color_type == 2:
201 | self.style += _Style.from_color(
202 | None,
203 | from_rgb(
204 | next(iter_codes),
205 | next(iter_codes),
206 | next(iter_codes),
207 | ),
208 | )
209 |
210 | return text
211 |
212 |
213 | if sys.platform != "win32" and __name__ == "__main__": # pragma: no cover
214 | import io
215 | import os
216 | import pty
217 | import sys
218 |
219 | decoder = AnsiDecoder()
220 |
221 | stdout = io.BytesIO()
222 |
223 | def read(fd: int) -> bytes:
224 | data = os.read(fd, 1024)
225 | stdout.write(data)
226 | return data
227 |
228 | pty.spawn(sys.argv[1:], read)
229 |
230 | from .console import Console
231 |
232 | console = Console(record=True)
233 |
234 | stdout_result = stdout.getvalue().decode("utf-8")
235 | print(stdout_result)
236 |
237 | for line in decoder.decode(stdout_result):
238 | console.print(line)
239 |
240 | console.save_html("stdout.html")
241 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/flask/views.py:
--------------------------------------------------------------------------------
```python
1 | from __future__ import annotations
2 |
3 | import typing as t
4 |
5 | from . import typing as ft
6 | from .globals import current_app
7 | from .globals import request
8 |
9 | F = t.TypeVar("F", bound=t.Callable[..., t.Any])
10 |
11 | http_method_funcs = frozenset(
12 | ["get", "post", "head", "options", "delete", "put", "trace", "patch"]
13 | )
14 |
15 |
16 | class View:
17 | """Subclass this class and override :meth:`dispatch_request` to
18 | create a generic class-based view. Call :meth:`as_view` to create a
19 | view function that creates an instance of the class with the given
20 | arguments and calls its ``dispatch_request`` method with any URL
21 | variables.
22 |
23 | See :doc:`views` for a detailed guide.
24 |
25 | .. code-block:: python
26 |
27 | class Hello(View):
28 | init_every_request = False
29 |
30 | def dispatch_request(self, name):
31 | return f"Hello, {name}!"
32 |
33 | app.add_url_rule(
34 | "/hello/<name>", view_func=Hello.as_view("hello")
35 | )
36 |
37 | Set :attr:`methods` on the class to change what methods the view
38 | accepts.
39 |
40 | Set :attr:`decorators` on the class to apply a list of decorators to
41 | the generated view function. Decorators applied to the class itself
42 | will not be applied to the generated view function!
43 |
44 | Set :attr:`init_every_request` to ``False`` for efficiency, unless
45 | you need to store request-global data on ``self``.
46 | """
47 |
48 | #: The methods this view is registered for. Uses the same default
49 | #: (``["GET", "HEAD", "OPTIONS"]``) as ``route`` and
50 | #: ``add_url_rule`` by default.
51 | methods: t.ClassVar[t.Collection[str] | None] = None
52 |
53 | #: Control whether the ``OPTIONS`` method is handled automatically.
54 | #: Uses the same default (``True``) as ``route`` and
55 | #: ``add_url_rule`` by default.
56 | provide_automatic_options: t.ClassVar[bool | None] = None
57 |
58 | #: A list of decorators to apply, in order, to the generated view
59 | #: function. Remember that ``@decorator`` syntax is applied bottom
60 | #: to top, so the first decorator in the list would be the bottom
61 | #: decorator.
62 | #:
63 | #: .. versionadded:: 0.8
64 | decorators: t.ClassVar[list[t.Callable[[F], F]]] = []
65 |
66 | #: Create a new instance of this view class for every request by
67 | #: default. If a view subclass sets this to ``False``, the same
68 | #: instance is used for every request.
69 | #:
70 | #: A single instance is more efficient, especially if complex setup
71 | #: is done during init. However, storing data on ``self`` is no
72 | #: longer safe across requests, and :data:`~flask.g` should be used
73 | #: instead.
74 | #:
75 | #: .. versionadded:: 2.2
76 | init_every_request: t.ClassVar[bool] = True
77 |
78 | def dispatch_request(self) -> ft.ResponseReturnValue:
79 | """The actual view function behavior. Subclasses must override
80 | this and return a valid response. Any variables from the URL
81 | rule are passed as keyword arguments.
82 | """
83 | raise NotImplementedError()
84 |
85 | @classmethod
86 | def as_view(
87 | cls, name: str, *class_args: t.Any, **class_kwargs: t.Any
88 | ) -> ft.RouteCallable:
89 | """Convert the class into a view function that can be registered
90 | for a route.
91 |
92 | By default, the generated view will create a new instance of the
93 | view class for every request and call its
94 | :meth:`dispatch_request` method. If the view class sets
95 | :attr:`init_every_request` to ``False``, the same instance will
96 | be used for every request.
97 |
98 | Except for ``name``, all other arguments passed to this method
99 | are forwarded to the view class ``__init__`` method.
100 |
101 | .. versionchanged:: 2.2
102 | Added the ``init_every_request`` class attribute.
103 | """
104 | if cls.init_every_request:
105 |
106 | def view(**kwargs: t.Any) -> ft.ResponseReturnValue:
107 | self = view.view_class( # type: ignore[attr-defined]
108 | *class_args, **class_kwargs
109 | )
110 | return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return]
111 |
112 | else:
113 | self = cls(*class_args, **class_kwargs)
114 |
115 | def view(**kwargs: t.Any) -> ft.ResponseReturnValue:
116 | return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return]
117 |
118 | if cls.decorators:
119 | view.__name__ = name
120 | view.__module__ = cls.__module__
121 | for decorator in cls.decorators:
122 | view = decorator(view)
123 |
124 | # We attach the view class to the view function for two reasons:
125 | # first of all it allows us to easily figure out what class-based
126 | # view this thing came from, secondly it's also used for instantiating
127 | # the view class so you can actually replace it with something else
128 | # for testing purposes and debugging.
129 | view.view_class = cls # type: ignore
130 | view.__name__ = name
131 | view.__doc__ = cls.__doc__
132 | view.__module__ = cls.__module__
133 | view.methods = cls.methods # type: ignore
134 | view.provide_automatic_options = cls.provide_automatic_options # type: ignore
135 | return view
136 |
137 |
138 | class MethodView(View):
139 | """Dispatches request methods to the corresponding instance methods.
140 | For example, if you implement a ``get`` method, it will be used to
141 | handle ``GET`` requests.
142 |
143 | This can be useful for defining a REST API.
144 |
145 | :attr:`methods` is automatically set based on the methods defined on
146 | the class.
147 |
148 | See :doc:`views` for a detailed guide.
149 |
150 | .. code-block:: python
151 |
152 | class CounterAPI(MethodView):
153 | def get(self):
154 | return str(session.get("counter", 0))
155 |
156 | def post(self):
157 | session["counter"] = session.get("counter", 0) + 1
158 | return redirect(url_for("counter"))
159 |
160 | app.add_url_rule(
161 | "/counter", view_func=CounterAPI.as_view("counter")
162 | )
163 | """
164 |
165 | def __init_subclass__(cls, **kwargs: t.Any) -> None:
166 | super().__init_subclass__(**kwargs)
167 |
168 | if "methods" not in cls.__dict__:
169 | methods = set()
170 |
171 | for base in cls.__bases__:
172 | if getattr(base, "methods", None):
173 | methods.update(base.methods) # type: ignore[attr-defined]
174 |
175 | for key in http_method_funcs:
176 | if hasattr(cls, key):
177 | methods.add(key.upper())
178 |
179 | if methods:
180 | cls.methods = methods
181 |
182 | def dispatch_request(self, **kwargs: t.Any) -> ft.ResponseReturnValue:
183 | meth = getattr(self, request.method.lower(), None)
184 |
185 | # If the request method is HEAD and we don't have a handler for it
186 | # retry with GET.
187 | if meth is None and request.method == "HEAD":
188 | meth = getattr(self, "get", None)
189 |
190 | assert meth is not None, f"Unimplemented method {request.method!r}"
191 | return current_app.ensure_sync(meth)(**kwargs) # type: ignore[no-any-return]
192 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/bs4/tests/test_fuzz.py:
--------------------------------------------------------------------------------
```python
1 | """This file contains test cases reported by third parties using
2 | fuzzing tools, primarily from Google's oss-fuzz project. Some of these
3 | represent real problems with Beautiful Soup, but many are problems in
4 | libraries that Beautiful Soup depends on, and many of the test cases
5 | represent different ways of triggering the same problem.
6 |
7 | Grouping these test cases together makes it easy to see which test
8 | cases represent the same problem, and puts the test cases in close
9 | proximity to code that can trigger the problems.
10 | """
11 | import os
12 | import pytest
13 | from bs4 import (
14 | BeautifulSoup,
15 | ParserRejectedMarkup,
16 | )
17 | try:
18 | from soupsieve.util import SelectorSyntaxError
19 | import lxml
20 | import html5lib
21 | fully_fuzzable = True
22 | except ImportError:
23 | fully_fuzzable = False
24 |
25 |
26 | @pytest.mark.skipif(not fully_fuzzable, reason="Prerequisites for fuzz tests are not installed.")
27 | class TestFuzz(object):
28 |
29 | # Test case markup files from fuzzers are given this extension so
30 | # they can be included in builds.
31 | TESTCASE_SUFFIX = ".testcase"
32 |
33 | # Copied 20230512 from
34 | # https://github.com/google/oss-fuzz/blob/4ac6a645a197a695fe76532251feb5067076b3f3/projects/bs4/bs4_fuzzer.py
35 | #
36 | # Copying the code lets us precisely duplicate the behavior of
37 | # oss-fuzz. The downside is that this code changes over time, so
38 | # multiple copies of the code must be kept around to run against
39 | # older tests. I'm not sure what to do about this, but I may
40 | # retire old tests after a time.
41 | def fuzz_test_with_css(self, filename):
42 | data = self.__markup(filename)
43 | parsers = ['lxml-xml', 'html5lib', 'html.parser', 'lxml']
44 | try:
45 | idx = int(data[0]) % len(parsers)
46 | except ValueError:
47 | return
48 |
49 | css_selector, data = data[1:10], data[10:]
50 |
51 | try:
52 | soup = BeautifulSoup(data[1:], features=parsers[idx])
53 | except ParserRejectedMarkup:
54 | return
55 | except ValueError:
56 | return
57 |
58 | list(soup.find_all(True))
59 | try:
60 | soup.css.select(css_selector.decode('utf-8', 'replace'))
61 | except SelectorSyntaxError:
62 | return
63 | soup.prettify()
64 |
65 | # This class of error has been fixed by catching a less helpful
66 | # exception from html.parser and raising ParserRejectedMarkup
67 | # instead.
68 | @pytest.mark.parametrize(
69 | "filename", [
70 | "clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912",
71 | "crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a",
72 | ]
73 | )
74 | def test_rejected_markup(self, filename):
75 | markup = self.__markup(filename)
76 | with pytest.raises(ParserRejectedMarkup):
77 | BeautifulSoup(markup, 'html.parser')
78 |
79 | # This class of error has to do with very deeply nested documents
80 | # which overflow the Python call stack when the tree is converted
81 | # to a string. This is an issue with Beautiful Soup which was fixed
82 | # as part of [bug=1471755].
83 | #
84 | # These test cases are in the older format that doesn't specify
85 | # which parser to use or give a CSS selector.
86 | @pytest.mark.parametrize(
87 | "filename", [
88 | "clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440",
89 | "clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632",
90 | "clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464",
91 | "clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400",
92 | ]
93 | )
94 | def test_deeply_nested_document_without_css(self, filename):
95 | # Parsing the document and encoding it back to a string is
96 | # sufficient to demonstrate that the overflow problem has
97 | # been fixed.
98 | markup = self.__markup(filename)
99 | BeautifulSoup(markup, 'html.parser').encode()
100 |
101 | # This class of error has to do with very deeply nested documents
102 | # which overflow the Python call stack when the tree is converted
103 | # to a string. This is an issue with Beautiful Soup which was fixed
104 | # as part of [bug=1471755].
105 | @pytest.mark.parametrize(
106 | "filename", [
107 | "clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016",
108 | "clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000",
109 | "clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624",
110 | ]
111 | )
112 | def test_deeply_nested_document(self, filename):
113 | self.fuzz_test_with_css(filename)
114 |
115 | @pytest.mark.parametrize(
116 | "filename", [
117 | "clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256",
118 | "clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824",
119 | ]
120 | )
121 | def test_soupsieve_errors(self, filename):
122 | self.fuzz_test_with_css(filename)
123 |
124 | # This class of error represents problems with html5lib's parser,
125 | # not Beautiful Soup. I use
126 | # https://github.com/html5lib/html5lib-python/issues/568 to notify
127 | # the html5lib developers of these issues.
128 | #
129 | # These test cases are in the older format that doesn't specify
130 | # which parser to use or give a CSS selector.
131 | @pytest.mark.skip(reason="html5lib-specific problems")
132 | @pytest.mark.parametrize(
133 | "filename", [
134 | # b"""ÿ<!DOCTyPEV PUBLIC'''Ð'"""
135 | "clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320",
136 |
137 | # b')<a><math><TR><a><mI><a><p><a>'
138 | "clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456",
139 |
140 | # b'-<math><sElect><mi><sElect><sElect>'
141 | "clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896",
142 |
143 | # b'ñ<table><svg><html>'
144 | "clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224",
145 |
146 | # <TABLE>, some ^@ characters, some <math> tags.
147 | "clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744",
148 |
149 | # Nested table
150 | "crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08"
151 | ]
152 | )
153 | def test_html5lib_parse_errors_without_css(self, filename):
154 | markup = self.__markup(filename)
155 | print(BeautifulSoup(markup, 'html5lib').encode())
156 |
157 | # This class of error represents problems with html5lib's parser,
158 | # not Beautiful Soup. I use
159 | # https://github.com/html5lib/html5lib-python/issues/568 to notify
160 | # the html5lib developers of these issues.
161 | @pytest.mark.skip(reason="html5lib-specific problems")
162 | @pytest.mark.parametrize(
163 | "filename", [
164 | # b'- \xff\xff <math>\x10<select><mi><select><select>t'
165 | "clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640",
166 | ]
167 | )
168 | def test_html5lib_parse_errors(self, filename):
169 | self.fuzz_test_with_css(filename)
170 |
171 | def __markup(self, filename):
172 | if not filename.endswith(self.TESTCASE_SUFFIX):
173 | filename += self.TESTCASE_SUFFIX
174 | this_dir = os.path.split(__file__)[0]
175 | path = os.path.join(this_dir, 'fuzz', filename)
176 | return open(path, 'rb').read()
177 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/urllib3/__init__.py:
--------------------------------------------------------------------------------
```python
1 | """
2 | Python HTTP library with thread-safe connection pooling, file post support, user friendly, and more
3 | """
4 |
5 | from __future__ import annotations
6 |
7 | # Set default logging handler to avoid "No handler found" warnings.
8 | import logging
9 | import sys
10 | import typing
11 | import warnings
12 | from logging import NullHandler
13 |
14 | from . import exceptions
15 | from ._base_connection import _TYPE_BODY
16 | from ._collections import HTTPHeaderDict
17 | from ._version import __version__
18 | from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool, connection_from_url
19 | from .filepost import _TYPE_FIELDS, encode_multipart_formdata
20 | from .poolmanager import PoolManager, ProxyManager, proxy_from_url
21 | from .response import BaseHTTPResponse, HTTPResponse
22 | from .util.request import make_headers
23 | from .util.retry import Retry
24 | from .util.timeout import Timeout
25 |
26 | # Ensure that Python is compiled with OpenSSL 1.1.1+
27 | # If the 'ssl' module isn't available at all that's
28 | # fine, we only care if the module is available.
29 | try:
30 | import ssl
31 | except ImportError:
32 | pass
33 | else:
34 | if not ssl.OPENSSL_VERSION.startswith("OpenSSL "): # Defensive:
35 | warnings.warn(
36 | "urllib3 v2 only supports OpenSSL 1.1.1+, currently "
37 | f"the 'ssl' module is compiled with {ssl.OPENSSL_VERSION!r}. "
38 | "See: https://github.com/urllib3/urllib3/issues/3020",
39 | exceptions.NotOpenSSLWarning,
40 | )
41 | elif ssl.OPENSSL_VERSION_INFO < (1, 1, 1): # Defensive:
42 | raise ImportError(
43 | "urllib3 v2 only supports OpenSSL 1.1.1+, currently "
44 | f"the 'ssl' module is compiled with {ssl.OPENSSL_VERSION!r}. "
45 | "See: https://github.com/urllib3/urllib3/issues/2168"
46 | )
47 |
48 | __author__ = "Andrey Petrov ([email protected])"
49 | __license__ = "MIT"
50 | __version__ = __version__
51 |
52 | __all__ = (
53 | "HTTPConnectionPool",
54 | "HTTPHeaderDict",
55 | "HTTPSConnectionPool",
56 | "PoolManager",
57 | "ProxyManager",
58 | "HTTPResponse",
59 | "Retry",
60 | "Timeout",
61 | "add_stderr_logger",
62 | "connection_from_url",
63 | "disable_warnings",
64 | "encode_multipart_formdata",
65 | "make_headers",
66 | "proxy_from_url",
67 | "request",
68 | "BaseHTTPResponse",
69 | )
70 |
71 | logging.getLogger(__name__).addHandler(NullHandler())
72 |
73 |
74 | def add_stderr_logger(
75 | level: int = logging.DEBUG,
76 | ) -> logging.StreamHandler[typing.TextIO]:
77 | """
78 | Helper for quickly adding a StreamHandler to the logger. Useful for
79 | debugging.
80 |
81 | Returns the handler after adding it.
82 | """
83 | # This method needs to be in this __init__.py to get the __name__ correct
84 | # even if urllib3 is vendored within another package.
85 | logger = logging.getLogger(__name__)
86 | handler = logging.StreamHandler()
87 | handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s %(message)s"))
88 | logger.addHandler(handler)
89 | logger.setLevel(level)
90 | logger.debug("Added a stderr logging handler to logger: %s", __name__)
91 | return handler
92 |
93 |
94 | # ... Clean up.
95 | del NullHandler
96 |
97 |
98 | # All warning filters *must* be appended unless you're really certain that they
99 | # shouldn't be: otherwise, it's very hard for users to use most Python
100 | # mechanisms to silence them.
101 | # SecurityWarning's always go off by default.
102 | warnings.simplefilter("always", exceptions.SecurityWarning, append=True)
103 | # InsecurePlatformWarning's don't vary between requests, so we keep it default.
104 | warnings.simplefilter("default", exceptions.InsecurePlatformWarning, append=True)
105 |
106 |
107 | def disable_warnings(category: type[Warning] = exceptions.HTTPWarning) -> None:
108 | """
109 | Helper for quickly disabling all urllib3 warnings.
110 | """
111 | warnings.simplefilter("ignore", category)
112 |
113 |
114 | _DEFAULT_POOL = PoolManager()
115 |
116 |
117 | def request(
118 | method: str,
119 | url: str,
120 | *,
121 | body: _TYPE_BODY | None = None,
122 | fields: _TYPE_FIELDS | None = None,
123 | headers: typing.Mapping[str, str] | None = None,
124 | preload_content: bool | None = True,
125 | decode_content: bool | None = True,
126 | redirect: bool | None = True,
127 | retries: Retry | bool | int | None = None,
128 | timeout: Timeout | float | int | None = 3,
129 | json: typing.Any | None = None,
130 | ) -> BaseHTTPResponse:
131 | """
132 | A convenience, top-level request method. It uses a module-global ``PoolManager`` instance.
133 | Therefore, its side effects could be shared across dependencies relying on it.
134 | To avoid side effects create a new ``PoolManager`` instance and use it instead.
135 | The method does not accept low-level ``**urlopen_kw`` keyword arguments.
136 |
137 | :param method:
138 | HTTP request method (such as GET, POST, PUT, etc.)
139 |
140 | :param url:
141 | The URL to perform the request on.
142 |
143 | :param body:
144 | Data to send in the request body, either :class:`str`, :class:`bytes`,
145 | an iterable of :class:`str`/:class:`bytes`, or a file-like object.
146 |
147 | :param fields:
148 | Data to encode and send in the request body.
149 |
150 | :param headers:
151 | Dictionary of custom headers to send, such as User-Agent,
152 | If-None-Match, etc.
153 |
154 | :param bool preload_content:
155 | If True, the response's body will be preloaded into memory.
156 |
157 | :param bool decode_content:
158 | If True, will attempt to decode the body based on the
159 | 'content-encoding' header.
160 |
161 | :param redirect:
162 | If True, automatically handle redirects (status codes 301, 302,
163 | 303, 307, 308). Each redirect counts as a retry. Disabling retries
164 | will disable redirect, too.
165 |
166 | :param retries:
167 | Configure the number of retries to allow before raising a
168 | :class:`~urllib3.exceptions.MaxRetryError` exception.
169 |
170 | If ``None`` (default) will retry 3 times, see ``Retry.DEFAULT``. Pass a
171 | :class:`~urllib3.util.retry.Retry` object for fine-grained control
172 | over different types of retries.
173 | Pass an integer number to retry connection errors that many times,
174 | but no other types of errors. Pass zero to never retry.
175 |
176 | If ``False``, then retries are disabled and any exception is raised
177 | immediately. Also, instead of raising a MaxRetryError on redirects,
178 | the redirect response will be returned.
179 |
180 | :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int.
181 |
182 | :param timeout:
183 | If specified, overrides the default timeout for this one
184 | request. It may be a float (in seconds) or an instance of
185 | :class:`urllib3.util.Timeout`.
186 |
187 | :param json:
188 | Data to encode and send as JSON with UTF-encoded in the request body.
189 | The ``"Content-Type"`` header will be set to ``"application/json"``
190 | unless specified otherwise.
191 | """
192 |
193 | return _DEFAULT_POOL.request(
194 | method,
195 | url,
196 | body=body,
197 | fields=fields,
198 | headers=headers,
199 | preload_content=preload_content,
200 | decode_content=decode_content,
201 | redirect=redirect,
202 | retries=retries,
203 | timeout=timeout,
204 | json=json,
205 | )
206 |
207 |
208 | if sys.platform == "emscripten":
209 | from .contrib.emscripten import inject_into_urllib3 # noqa: 401
210 |
211 | inject_into_urllib3()
212 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py:
--------------------------------------------------------------------------------
```python
1 | from .palette import Palette
2 |
3 |
4 | # Taken from https://en.wikipedia.org/wiki/ANSI_escape_code (Windows 10 column)
5 | WINDOWS_PALETTE = Palette(
6 | [
7 | (12, 12, 12),
8 | (197, 15, 31),
9 | (19, 161, 14),
10 | (193, 156, 0),
11 | (0, 55, 218),
12 | (136, 23, 152),
13 | (58, 150, 221),
14 | (204, 204, 204),
15 | (118, 118, 118),
16 | (231, 72, 86),
17 | (22, 198, 12),
18 | (249, 241, 165),
19 | (59, 120, 255),
20 | (180, 0, 158),
21 | (97, 214, 214),
22 | (242, 242, 242),
23 | ]
24 | )
25 |
26 | # # The standard ansi colors (including bright variants)
27 | STANDARD_PALETTE = Palette(
28 | [
29 | (0, 0, 0),
30 | (170, 0, 0),
31 | (0, 170, 0),
32 | (170, 85, 0),
33 | (0, 0, 170),
34 | (170, 0, 170),
35 | (0, 170, 170),
36 | (170, 170, 170),
37 | (85, 85, 85),
38 | (255, 85, 85),
39 | (85, 255, 85),
40 | (255, 255, 85),
41 | (85, 85, 255),
42 | (255, 85, 255),
43 | (85, 255, 255),
44 | (255, 255, 255),
45 | ]
46 | )
47 |
48 |
49 | # The 256 color palette
50 | EIGHT_BIT_PALETTE = Palette(
51 | [
52 | (0, 0, 0),
53 | (128, 0, 0),
54 | (0, 128, 0),
55 | (128, 128, 0),
56 | (0, 0, 128),
57 | (128, 0, 128),
58 | (0, 128, 128),
59 | (192, 192, 192),
60 | (128, 128, 128),
61 | (255, 0, 0),
62 | (0, 255, 0),
63 | (255, 255, 0),
64 | (0, 0, 255),
65 | (255, 0, 255),
66 | (0, 255, 255),
67 | (255, 255, 255),
68 | (0, 0, 0),
69 | (0, 0, 95),
70 | (0, 0, 135),
71 | (0, 0, 175),
72 | (0, 0, 215),
73 | (0, 0, 255),
74 | (0, 95, 0),
75 | (0, 95, 95),
76 | (0, 95, 135),
77 | (0, 95, 175),
78 | (0, 95, 215),
79 | (0, 95, 255),
80 | (0, 135, 0),
81 | (0, 135, 95),
82 | (0, 135, 135),
83 | (0, 135, 175),
84 | (0, 135, 215),
85 | (0, 135, 255),
86 | (0, 175, 0),
87 | (0, 175, 95),
88 | (0, 175, 135),
89 | (0, 175, 175),
90 | (0, 175, 215),
91 | (0, 175, 255),
92 | (0, 215, 0),
93 | (0, 215, 95),
94 | (0, 215, 135),
95 | (0, 215, 175),
96 | (0, 215, 215),
97 | (0, 215, 255),
98 | (0, 255, 0),
99 | (0, 255, 95),
100 | (0, 255, 135),
101 | (0, 255, 175),
102 | (0, 255, 215),
103 | (0, 255, 255),
104 | (95, 0, 0),
105 | (95, 0, 95),
106 | (95, 0, 135),
107 | (95, 0, 175),
108 | (95, 0, 215),
109 | (95, 0, 255),
110 | (95, 95, 0),
111 | (95, 95, 95),
112 | (95, 95, 135),
113 | (95, 95, 175),
114 | (95, 95, 215),
115 | (95, 95, 255),
116 | (95, 135, 0),
117 | (95, 135, 95),
118 | (95, 135, 135),
119 | (95, 135, 175),
120 | (95, 135, 215),
121 | (95, 135, 255),
122 | (95, 175, 0),
123 | (95, 175, 95),
124 | (95, 175, 135),
125 | (95, 175, 175),
126 | (95, 175, 215),
127 | (95, 175, 255),
128 | (95, 215, 0),
129 | (95, 215, 95),
130 | (95, 215, 135),
131 | (95, 215, 175),
132 | (95, 215, 215),
133 | (95, 215, 255),
134 | (95, 255, 0),
135 | (95, 255, 95),
136 | (95, 255, 135),
137 | (95, 255, 175),
138 | (95, 255, 215),
139 | (95, 255, 255),
140 | (135, 0, 0),
141 | (135, 0, 95),
142 | (135, 0, 135),
143 | (135, 0, 175),
144 | (135, 0, 215),
145 | (135, 0, 255),
146 | (135, 95, 0),
147 | (135, 95, 95),
148 | (135, 95, 135),
149 | (135, 95, 175),
150 | (135, 95, 215),
151 | (135, 95, 255),
152 | (135, 135, 0),
153 | (135, 135, 95),
154 | (135, 135, 135),
155 | (135, 135, 175),
156 | (135, 135, 215),
157 | (135, 135, 255),
158 | (135, 175, 0),
159 | (135, 175, 95),
160 | (135, 175, 135),
161 | (135, 175, 175),
162 | (135, 175, 215),
163 | (135, 175, 255),
164 | (135, 215, 0),
165 | (135, 215, 95),
166 | (135, 215, 135),
167 | (135, 215, 175),
168 | (135, 215, 215),
169 | (135, 215, 255),
170 | (135, 255, 0),
171 | (135, 255, 95),
172 | (135, 255, 135),
173 | (135, 255, 175),
174 | (135, 255, 215),
175 | (135, 255, 255),
176 | (175, 0, 0),
177 | (175, 0, 95),
178 | (175, 0, 135),
179 | (175, 0, 175),
180 | (175, 0, 215),
181 | (175, 0, 255),
182 | (175, 95, 0),
183 | (175, 95, 95),
184 | (175, 95, 135),
185 | (175, 95, 175),
186 | (175, 95, 215),
187 | (175, 95, 255),
188 | (175, 135, 0),
189 | (175, 135, 95),
190 | (175, 135, 135),
191 | (175, 135, 175),
192 | (175, 135, 215),
193 | (175, 135, 255),
194 | (175, 175, 0),
195 | (175, 175, 95),
196 | (175, 175, 135),
197 | (175, 175, 175),
198 | (175, 175, 215),
199 | (175, 175, 255),
200 | (175, 215, 0),
201 | (175, 215, 95),
202 | (175, 215, 135),
203 | (175, 215, 175),
204 | (175, 215, 215),
205 | (175, 215, 255),
206 | (175, 255, 0),
207 | (175, 255, 95),
208 | (175, 255, 135),
209 | (175, 255, 175),
210 | (175, 255, 215),
211 | (175, 255, 255),
212 | (215, 0, 0),
213 | (215, 0, 95),
214 | (215, 0, 135),
215 | (215, 0, 175),
216 | (215, 0, 215),
217 | (215, 0, 255),
218 | (215, 95, 0),
219 | (215, 95, 95),
220 | (215, 95, 135),
221 | (215, 95, 175),
222 | (215, 95, 215),
223 | (215, 95, 255),
224 | (215, 135, 0),
225 | (215, 135, 95),
226 | (215, 135, 135),
227 | (215, 135, 175),
228 | (215, 135, 215),
229 | (215, 135, 255),
230 | (215, 175, 0),
231 | (215, 175, 95),
232 | (215, 175, 135),
233 | (215, 175, 175),
234 | (215, 175, 215),
235 | (215, 175, 255),
236 | (215, 215, 0),
237 | (215, 215, 95),
238 | (215, 215, 135),
239 | (215, 215, 175),
240 | (215, 215, 215),
241 | (215, 215, 255),
242 | (215, 255, 0),
243 | (215, 255, 95),
244 | (215, 255, 135),
245 | (215, 255, 175),
246 | (215, 255, 215),
247 | (215, 255, 255),
248 | (255, 0, 0),
249 | (255, 0, 95),
250 | (255, 0, 135),
251 | (255, 0, 175),
252 | (255, 0, 215),
253 | (255, 0, 255),
254 | (255, 95, 0),
255 | (255, 95, 95),
256 | (255, 95, 135),
257 | (255, 95, 175),
258 | (255, 95, 215),
259 | (255, 95, 255),
260 | (255, 135, 0),
261 | (255, 135, 95),
262 | (255, 135, 135),
263 | (255, 135, 175),
264 | (255, 135, 215),
265 | (255, 135, 255),
266 | (255, 175, 0),
267 | (255, 175, 95),
268 | (255, 175, 135),
269 | (255, 175, 175),
270 | (255, 175, 215),
271 | (255, 175, 255),
272 | (255, 215, 0),
273 | (255, 215, 95),
274 | (255, 215, 135),
275 | (255, 215, 175),
276 | (255, 215, 215),
277 | (255, 215, 255),
278 | (255, 255, 0),
279 | (255, 255, 95),
280 | (255, 255, 135),
281 | (255, 255, 175),
282 | (255, 255, 215),
283 | (255, 255, 255),
284 | (8, 8, 8),
285 | (18, 18, 18),
286 | (28, 28, 28),
287 | (38, 38, 38),
288 | (48, 48, 48),
289 | (58, 58, 58),
290 | (68, 68, 68),
291 | (78, 78, 78),
292 | (88, 88, 88),
293 | (98, 98, 98),
294 | (108, 108, 108),
295 | (118, 118, 118),
296 | (128, 128, 128),
297 | (138, 138, 138),
298 | (148, 148, 148),
299 | (158, 158, 158),
300 | (168, 168, 168),
301 | (178, 178, 178),
302 | (188, 188, 188),
303 | (198, 198, 198),
304 | (208, 208, 208),
305 | (218, 218, 218),
306 | (228, 228, 228),
307 | (238, 238, 238),
308 | ]
309 | )
310 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py:
--------------------------------------------------------------------------------
```python
1 | # -*- coding: utf-8 -*-
2 | """
3 | This module contains provisional support for SOCKS proxies from within
4 | urllib3. This module supports SOCKS4, SOCKS4A (an extension of SOCKS4), and
5 | SOCKS5. To enable its functionality, either install PySocks or install this
6 | module with the ``socks`` extra.
7 |
8 | The SOCKS implementation supports the full range of urllib3 features. It also
9 | supports the following SOCKS features:
10 |
11 | - SOCKS4A (``proxy_url='socks4a://...``)
12 | - SOCKS4 (``proxy_url='socks4://...``)
13 | - SOCKS5 with remote DNS (``proxy_url='socks5h://...``)
14 | - SOCKS5 with local DNS (``proxy_url='socks5://...``)
15 | - Usernames and passwords for the SOCKS proxy
16 |
17 | .. note::
18 | It is recommended to use ``socks5h://`` or ``socks4a://`` schemes in
19 | your ``proxy_url`` to ensure that DNS resolution is done from the remote
20 | server instead of client-side when connecting to a domain name.
21 |
22 | SOCKS4 supports IPv4 and domain names with the SOCKS4A extension. SOCKS5
23 | supports IPv4, IPv6, and domain names.
24 |
25 | When connecting to a SOCKS4 proxy the ``username`` portion of the ``proxy_url``
26 | will be sent as the ``userid`` section of the SOCKS request:
27 |
28 | .. code-block:: python
29 |
30 | proxy_url="socks4a://<userid>@proxy-host"
31 |
32 | When connecting to a SOCKS5 proxy the ``username`` and ``password`` portion
33 | of the ``proxy_url`` will be sent as the username/password to authenticate
34 | with the proxy:
35 |
36 | .. code-block:: python
37 |
38 | proxy_url="socks5h://<username>:<password>@proxy-host"
39 |
40 | """
41 | from __future__ import absolute_import
42 |
43 | try:
44 | import socks
45 | except ImportError:
46 | import warnings
47 |
48 | from ..exceptions import DependencyWarning
49 |
50 | warnings.warn(
51 | (
52 | "SOCKS support in urllib3 requires the installation of optional "
53 | "dependencies: specifically, PySocks. For more information, see "
54 | "https://urllib3.readthedocs.io/en/1.26.x/contrib.html#socks-proxies"
55 | ),
56 | DependencyWarning,
57 | )
58 | raise
59 |
60 | from socket import error as SocketError
61 | from socket import timeout as SocketTimeout
62 |
63 | from ..connection import HTTPConnection, HTTPSConnection
64 | from ..connectionpool import HTTPConnectionPool, HTTPSConnectionPool
65 | from ..exceptions import ConnectTimeoutError, NewConnectionError
66 | from ..poolmanager import PoolManager
67 | from ..util.url import parse_url
68 |
69 | try:
70 | import ssl
71 | except ImportError:
72 | ssl = None
73 |
74 |
75 | class SOCKSConnection(HTTPConnection):
76 | """
77 | A plain-text HTTP connection that connects via a SOCKS proxy.
78 | """
79 |
80 | def __init__(self, *args, **kwargs):
81 | self._socks_options = kwargs.pop("_socks_options")
82 | super(SOCKSConnection, self).__init__(*args, **kwargs)
83 |
84 | def _new_conn(self):
85 | """
86 | Establish a new connection via the SOCKS proxy.
87 | """
88 | extra_kw = {}
89 | if self.source_address:
90 | extra_kw["source_address"] = self.source_address
91 |
92 | if self.socket_options:
93 | extra_kw["socket_options"] = self.socket_options
94 |
95 | try:
96 | conn = socks.create_connection(
97 | (self.host, self.port),
98 | proxy_type=self._socks_options["socks_version"],
99 | proxy_addr=self._socks_options["proxy_host"],
100 | proxy_port=self._socks_options["proxy_port"],
101 | proxy_username=self._socks_options["username"],
102 | proxy_password=self._socks_options["password"],
103 | proxy_rdns=self._socks_options["rdns"],
104 | timeout=self.timeout,
105 | **extra_kw
106 | )
107 |
108 | except SocketTimeout:
109 | raise ConnectTimeoutError(
110 | self,
111 | "Connection to %s timed out. (connect timeout=%s)"
112 | % (self.host, self.timeout),
113 | )
114 |
115 | except socks.ProxyError as e:
116 | # This is fragile as hell, but it seems to be the only way to raise
117 | # useful errors here.
118 | if e.socket_err:
119 | error = e.socket_err
120 | if isinstance(error, SocketTimeout):
121 | raise ConnectTimeoutError(
122 | self,
123 | "Connection to %s timed out. (connect timeout=%s)"
124 | % (self.host, self.timeout),
125 | )
126 | else:
127 | raise NewConnectionError(
128 | self, "Failed to establish a new connection: %s" % error
129 | )
130 | else:
131 | raise NewConnectionError(
132 | self, "Failed to establish a new connection: %s" % e
133 | )
134 |
135 | except SocketError as e: # Defensive: PySocks should catch all these.
136 | raise NewConnectionError(
137 | self, "Failed to establish a new connection: %s" % e
138 | )
139 |
140 | return conn
141 |
142 |
143 | # We don't need to duplicate the Verified/Unverified distinction from
144 | # urllib3/connection.py here because the HTTPSConnection will already have been
145 | # correctly set to either the Verified or Unverified form by that module. This
146 | # means the SOCKSHTTPSConnection will automatically be the correct type.
147 | class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection):
148 | pass
149 |
150 |
151 | class SOCKSHTTPConnectionPool(HTTPConnectionPool):
152 | ConnectionCls = SOCKSConnection
153 |
154 |
155 | class SOCKSHTTPSConnectionPool(HTTPSConnectionPool):
156 | ConnectionCls = SOCKSHTTPSConnection
157 |
158 |
159 | class SOCKSProxyManager(PoolManager):
160 | """
161 | A version of the urllib3 ProxyManager that routes connections via the
162 | defined SOCKS proxy.
163 | """
164 |
165 | pool_classes_by_scheme = {
166 | "http": SOCKSHTTPConnectionPool,
167 | "https": SOCKSHTTPSConnectionPool,
168 | }
169 |
170 | def __init__(
171 | self,
172 | proxy_url,
173 | username=None,
174 | password=None,
175 | num_pools=10,
176 | headers=None,
177 | **connection_pool_kw
178 | ):
179 | parsed = parse_url(proxy_url)
180 |
181 | if username is None and password is None and parsed.auth is not None:
182 | split = parsed.auth.split(":")
183 | if len(split) == 2:
184 | username, password = split
185 | if parsed.scheme == "socks5":
186 | socks_version = socks.PROXY_TYPE_SOCKS5
187 | rdns = False
188 | elif parsed.scheme == "socks5h":
189 | socks_version = socks.PROXY_TYPE_SOCKS5
190 | rdns = True
191 | elif parsed.scheme == "socks4":
192 | socks_version = socks.PROXY_TYPE_SOCKS4
193 | rdns = False
194 | elif parsed.scheme == "socks4a":
195 | socks_version = socks.PROXY_TYPE_SOCKS4
196 | rdns = True
197 | else:
198 | raise ValueError("Unable to determine SOCKS version from %s" % proxy_url)
199 |
200 | self.proxy_url = proxy_url
201 |
202 | socks_options = {
203 | "socks_version": socks_version,
204 | "proxy_host": parsed.host,
205 | "proxy_port": parsed.port,
206 | "username": username,
207 | "password": password,
208 | "rdns": rdns,
209 | }
210 | connection_pool_kw["_socks_options"] = socks_options
211 |
212 | super(SOCKSProxyManager, self).__init__(
213 | num_pools, headers, **connection_pool_kw
214 | )
215 |
216 | self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme
217 |
```