#
tokens: 44147/50000 1/808 files (page 134/168)
lines: on (toggle) GitHub
raw markdown copy reset
This is page 134 of 168. Use http://codebase.md/romanshablio/mcp_server?lines=true&page={x} to view the full context.

# Directory Structure

```
├── .DS_Store
├── .venv
│   ├── __pycache__
│   │   └── hello.cpython-312.pyc
│   ├── bin
│   │   ├── activate
│   │   ├── activate.csh
│   │   ├── activate.fish
│   │   ├── Activate.ps1
│   │   ├── flask
│   │   ├── normalizer
│   │   ├── pip
│   │   ├── pip3
│   │   ├── pip3.12
│   │   ├── python
│   │   ├── python3
│   │   └── python3.12
│   ├── hello.py
│   ├── lib
│   │   └── python3.12
│   │       └── site-packages
│   │           ├── beautifulsoup4-4.12.3.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── licenses
│   │           │   │   ├── AUTHORS
│   │           │   │   └── LICENSE
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── REQUESTED
│   │           │   └── WHEEL
│   │           ├── blinker
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── _utilities.cpython-312.pyc
│   │           │   │   └── base.cpython-312.pyc
│   │           │   ├── _utilities.py
│   │           │   ├── base.py
│   │           │   └── py.typed
│   │           ├── blinker-1.8.2.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   └── WHEEL
│   │           ├── bs4
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── css.cpython-312.pyc
│   │           │   │   ├── dammit.cpython-312.pyc
│   │           │   │   ├── diagnose.cpython-312.pyc
│   │           │   │   ├── element.cpython-312.pyc
│   │           │   │   └── formatter.cpython-312.pyc
│   │           │   ├── builder
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── _html5lib.cpython-312.pyc
│   │           │   │   │   ├── _htmlparser.cpython-312.pyc
│   │           │   │   │   └── _lxml.cpython-312.pyc
│   │           │   │   ├── _html5lib.py
│   │           │   │   ├── _htmlparser.py
│   │           │   │   └── _lxml.py
│   │           │   ├── css.py
│   │           │   ├── dammit.py
│   │           │   ├── diagnose.py
│   │           │   ├── element.py
│   │           │   ├── formatter.py
│   │           │   └── tests
│   │           │       ├── __init__.py
│   │           │       ├── __pycache__
│   │           │       │   ├── __init__.cpython-312.pyc
│   │           │       │   ├── test_builder_registry.cpython-312.pyc
│   │           │       │   ├── test_builder.cpython-312.pyc
│   │           │       │   ├── test_css.cpython-312.pyc
│   │           │       │   ├── test_dammit.cpython-312.pyc
│   │           │       │   ├── test_docs.cpython-312.pyc
│   │           │       │   ├── test_element.cpython-312.pyc
│   │           │       │   ├── test_formatter.cpython-312.pyc
│   │           │       │   ├── test_fuzz.cpython-312.pyc
│   │           │       │   ├── test_html5lib.cpython-312.pyc
│   │           │       │   ├── test_htmlparser.cpython-312.pyc
│   │           │       │   ├── test_lxml.cpython-312.pyc
│   │           │       │   ├── test_navigablestring.cpython-312.pyc
│   │           │       │   ├── test_pageelement.cpython-312.pyc
│   │           │       │   ├── test_soup.cpython-312.pyc
│   │           │       │   ├── test_tag.cpython-312.pyc
│   │           │       │   └── test_tree.cpython-312.pyc
│   │           │       ├── fuzz
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase
│   │           │       │   ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase
│   │           │       │   ├── crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase
│   │           │       │   └── crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase
│   │           │       ├── test_builder_registry.py
│   │           │       ├── test_builder.py
│   │           │       ├── test_css.py
│   │           │       ├── test_dammit.py
│   │           │       ├── test_docs.py
│   │           │       ├── test_element.py
│   │           │       ├── test_formatter.py
│   │           │       ├── test_fuzz.py
│   │           │       ├── test_html5lib.py
│   │           │       ├── test_htmlparser.py
│   │           │       ├── test_lxml.py
│   │           │       ├── test_navigablestring.py
│   │           │       ├── test_pageelement.py
│   │           │       ├── test_soup.py
│   │           │       ├── test_tag.py
│   │           │       └── test_tree.py
│   │           ├── certifi
│   │           │   ├── __init__.py
│   │           │   ├── __main__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── __main__.cpython-312.pyc
│   │           │   │   └── core.cpython-312.pyc
│   │           │   ├── cacert.pem
│   │           │   ├── core.py
│   │           │   └── py.typed
│   │           ├── certifi-2024.8.30.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── charset_normalizer
│   │           │   ├── __init__.py
│   │           │   ├── __main__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── __main__.cpython-312.pyc
│   │           │   │   ├── api.cpython-312.pyc
│   │           │   │   ├── cd.cpython-312.pyc
│   │           │   │   ├── constant.cpython-312.pyc
│   │           │   │   ├── legacy.cpython-312.pyc
│   │           │   │   ├── md.cpython-312.pyc
│   │           │   │   ├── models.cpython-312.pyc
│   │           │   │   ├── utils.cpython-312.pyc
│   │           │   │   └── version.cpython-312.pyc
│   │           │   ├── api.py
│   │           │   ├── cd.py
│   │           │   ├── cli
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __main__.py
│   │           │   │   └── __pycache__
│   │           │   │       ├── __init__.cpython-312.pyc
│   │           │   │       └── __main__.cpython-312.pyc
│   │           │   ├── constant.py
│   │           │   ├── legacy.py
│   │           │   ├── md__mypyc.cpython-312-darwin.so
│   │           │   ├── md.cpython-312-darwin.so
│   │           │   ├── md.py
│   │           │   ├── models.py
│   │           │   ├── py.typed
│   │           │   ├── utils.py
│   │           │   └── version.py
│   │           ├── charset_normalizer-3.4.0.dist-info
│   │           │   ├── entry_points.txt
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── click
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── _compat.cpython-312.pyc
│   │           │   │   ├── _termui_impl.cpython-312.pyc
│   │           │   │   ├── _textwrap.cpython-312.pyc
│   │           │   │   ├── _winconsole.cpython-312.pyc
│   │           │   │   ├── core.cpython-312.pyc
│   │           │   │   ├── decorators.cpython-312.pyc
│   │           │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   ├── formatting.cpython-312.pyc
│   │           │   │   ├── globals.cpython-312.pyc
│   │           │   │   ├── parser.cpython-312.pyc
│   │           │   │   ├── shell_completion.cpython-312.pyc
│   │           │   │   ├── termui.cpython-312.pyc
│   │           │   │   ├── testing.cpython-312.pyc
│   │           │   │   ├── types.cpython-312.pyc
│   │           │   │   └── utils.cpython-312.pyc
│   │           │   ├── _compat.py
│   │           │   ├── _termui_impl.py
│   │           │   ├── _textwrap.py
│   │           │   ├── _winconsole.py
│   │           │   ├── core.py
│   │           │   ├── decorators.py
│   │           │   ├── exceptions.py
│   │           │   ├── formatting.py
│   │           │   ├── globals.py
│   │           │   ├── parser.py
│   │           │   ├── py.typed
│   │           │   ├── shell_completion.py
│   │           │   ├── termui.py
│   │           │   ├── testing.py
│   │           │   ├── types.py
│   │           │   └── utils.py
│   │           ├── click-8.1.7.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.rst
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── fake_useragent
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── errors.cpython-312.pyc
│   │           │   │   ├── fake.cpython-312.pyc
│   │           │   │   ├── log.cpython-312.pyc
│   │           │   │   ├── settings.cpython-312.pyc
│   │           │   │   └── utils.cpython-312.pyc
│   │           │   ├── data
│   │           │   │   └── browsers.json
│   │           │   ├── errors.py
│   │           │   ├── fake.py
│   │           │   ├── log.py
│   │           │   ├── settings.py
│   │           │   └── utils.py
│   │           ├── fake_useragent-1.5.1.dist-info
│   │           │   ├── AUTHORS
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── REQUESTED
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── flask
│   │           │   ├── __init__.py
│   │           │   ├── __main__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── __main__.cpython-312.pyc
│   │           │   │   ├── app.cpython-312.pyc
│   │           │   │   ├── blueprints.cpython-312.pyc
│   │           │   │   ├── cli.cpython-312.pyc
│   │           │   │   ├── config.cpython-312.pyc
│   │           │   │   ├── ctx.cpython-312.pyc
│   │           │   │   ├── debughelpers.cpython-312.pyc
│   │           │   │   ├── globals.cpython-312.pyc
│   │           │   │   ├── helpers.cpython-312.pyc
│   │           │   │   ├── logging.cpython-312.pyc
│   │           │   │   ├── sessions.cpython-312.pyc
│   │           │   │   ├── signals.cpython-312.pyc
│   │           │   │   ├── templating.cpython-312.pyc
│   │           │   │   ├── testing.cpython-312.pyc
│   │           │   │   ├── typing.cpython-312.pyc
│   │           │   │   ├── views.cpython-312.pyc
│   │           │   │   └── wrappers.cpython-312.pyc
│   │           │   ├── app.py
│   │           │   ├── blueprints.py
│   │           │   ├── cli.py
│   │           │   ├── config.py
│   │           │   ├── ctx.py
│   │           │   ├── debughelpers.py
│   │           │   ├── globals.py
│   │           │   ├── helpers.py
│   │           │   ├── json
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── provider.cpython-312.pyc
│   │           │   │   │   └── tag.cpython-312.pyc
│   │           │   │   ├── provider.py
│   │           │   │   └── tag.py
│   │           │   ├── logging.py
│   │           │   ├── py.typed
│   │           │   ├── sansio
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── app.cpython-312.pyc
│   │           │   │   │   ├── blueprints.cpython-312.pyc
│   │           │   │   │   └── scaffold.cpython-312.pyc
│   │           │   │   ├── app.py
│   │           │   │   ├── blueprints.py
│   │           │   │   ├── README.md
│   │           │   │   └── scaffold.py
│   │           │   ├── sessions.py
│   │           │   ├── signals.py
│   │           │   ├── templating.py
│   │           │   ├── testing.py
│   │           │   ├── typing.py
│   │           │   ├── views.py
│   │           │   └── wrappers.py
│   │           ├── flask-3.0.3.dist-info
│   │           │   ├── entry_points.txt
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── REQUESTED
│   │           │   └── WHEEL
│   │           ├── idna
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── codec.cpython-312.pyc
│   │           │   │   ├── compat.cpython-312.pyc
│   │           │   │   ├── core.cpython-312.pyc
│   │           │   │   ├── idnadata.cpython-312.pyc
│   │           │   │   ├── intranges.cpython-312.pyc
│   │           │   │   ├── package_data.cpython-312.pyc
│   │           │   │   └── uts46data.cpython-312.pyc
│   │           │   ├── codec.py
│   │           │   ├── compat.py
│   │           │   ├── core.py
│   │           │   ├── idnadata.py
│   │           │   ├── intranges.py
│   │           │   ├── package_data.py
│   │           │   ├── py.typed
│   │           │   └── uts46data.py
│   │           ├── idna-3.10.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.md
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   └── WHEEL
│   │           ├── itsdangerous
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── _json.cpython-312.pyc
│   │           │   │   ├── encoding.cpython-312.pyc
│   │           │   │   ├── exc.cpython-312.pyc
│   │           │   │   ├── serializer.cpython-312.pyc
│   │           │   │   ├── signer.cpython-312.pyc
│   │           │   │   ├── timed.cpython-312.pyc
│   │           │   │   └── url_safe.cpython-312.pyc
│   │           │   ├── _json.py
│   │           │   ├── encoding.py
│   │           │   ├── exc.py
│   │           │   ├── py.typed
│   │           │   ├── serializer.py
│   │           │   ├── signer.py
│   │           │   ├── timed.py
│   │           │   └── url_safe.py
│   │           ├── itsdangerous-2.2.0.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   └── WHEEL
│   │           ├── jinja2
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── _identifier.cpython-312.pyc
│   │           │   │   ├── async_utils.cpython-312.pyc
│   │           │   │   ├── bccache.cpython-312.pyc
│   │           │   │   ├── compiler.cpython-312.pyc
│   │           │   │   ├── constants.cpython-312.pyc
│   │           │   │   ├── debug.cpython-312.pyc
│   │           │   │   ├── defaults.cpython-312.pyc
│   │           │   │   ├── environment.cpython-312.pyc
│   │           │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   ├── ext.cpython-312.pyc
│   │           │   │   ├── filters.cpython-312.pyc
│   │           │   │   ├── idtracking.cpython-312.pyc
│   │           │   │   ├── lexer.cpython-312.pyc
│   │           │   │   ├── loaders.cpython-312.pyc
│   │           │   │   ├── meta.cpython-312.pyc
│   │           │   │   ├── nativetypes.cpython-312.pyc
│   │           │   │   ├── nodes.cpython-312.pyc
│   │           │   │   ├── optimizer.cpython-312.pyc
│   │           │   │   ├── parser.cpython-312.pyc
│   │           │   │   ├── runtime.cpython-312.pyc
│   │           │   │   ├── sandbox.cpython-312.pyc
│   │           │   │   ├── tests.cpython-312.pyc
│   │           │   │   ├── utils.cpython-312.pyc
│   │           │   │   └── visitor.cpython-312.pyc
│   │           │   ├── _identifier.py
│   │           │   ├── async_utils.py
│   │           │   ├── bccache.py
│   │           │   ├── compiler.py
│   │           │   ├── constants.py
│   │           │   ├── debug.py
│   │           │   ├── defaults.py
│   │           │   ├── environment.py
│   │           │   ├── exceptions.py
│   │           │   ├── ext.py
│   │           │   ├── filters.py
│   │           │   ├── idtracking.py
│   │           │   ├── lexer.py
│   │           │   ├── loaders.py
│   │           │   ├── meta.py
│   │           │   ├── nativetypes.py
│   │           │   ├── nodes.py
│   │           │   ├── optimizer.py
│   │           │   ├── parser.py
│   │           │   ├── py.typed
│   │           │   ├── runtime.py
│   │           │   ├── sandbox.py
│   │           │   ├── tests.py
│   │           │   ├── utils.py
│   │           │   └── visitor.py
│   │           ├── jinja2-3.1.4.dist-info
│   │           │   ├── entry_points.txt
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   └── WHEEL
│   │           ├── lxml
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── _elementpath.cpython-312.pyc
│   │           │   │   ├── builder.cpython-312.pyc
│   │           │   │   ├── cssselect.cpython-312.pyc
│   │           │   │   ├── doctestcompare.cpython-312.pyc
│   │           │   │   ├── ElementInclude.cpython-312.pyc
│   │           │   │   ├── pyclasslookup.cpython-312.pyc
│   │           │   │   ├── sax.cpython-312.pyc
│   │           │   │   └── usedoctest.cpython-312.pyc
│   │           │   ├── _elementpath.cpython-312-darwin.so
│   │           │   ├── _elementpath.py
│   │           │   ├── apihelpers.pxi
│   │           │   ├── builder.cpython-312-darwin.so
│   │           │   ├── builder.py
│   │           │   ├── classlookup.pxi
│   │           │   ├── cleanup.pxi
│   │           │   ├── cssselect.py
│   │           │   ├── debug.pxi
│   │           │   ├── docloader.pxi
│   │           │   ├── doctestcompare.py
│   │           │   ├── dtd.pxi
│   │           │   ├── ElementInclude.py
│   │           │   ├── etree_api.h
│   │           │   ├── etree.cpython-312-darwin.so
│   │           │   ├── etree.h
│   │           │   ├── etree.pyx
│   │           │   ├── extensions.pxi
│   │           │   ├── html
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── _diffcommand.cpython-312.pyc
│   │           │   │   │   ├── _html5builder.cpython-312.pyc
│   │           │   │   │   ├── _setmixin.cpython-312.pyc
│   │           │   │   │   ├── builder.cpython-312.pyc
│   │           │   │   │   ├── clean.cpython-312.pyc
│   │           │   │   │   ├── defs.cpython-312.pyc
│   │           │   │   │   ├── diff.cpython-312.pyc
│   │           │   │   │   ├── ElementSoup.cpython-312.pyc
│   │           │   │   │   ├── formfill.cpython-312.pyc
│   │           │   │   │   ├── html5parser.cpython-312.pyc
│   │           │   │   │   ├── soupparser.cpython-312.pyc
│   │           │   │   │   └── usedoctest.cpython-312.pyc
│   │           │   │   ├── _diffcommand.py
│   │           │   │   ├── _html5builder.py
│   │           │   │   ├── _setmixin.py
│   │           │   │   ├── builder.py
│   │           │   │   ├── clean.py
│   │           │   │   ├── defs.py
│   │           │   │   ├── diff.cpython-312-darwin.so
│   │           │   │   ├── diff.py
│   │           │   │   ├── ElementSoup.py
│   │           │   │   ├── formfill.py
│   │           │   │   ├── html5parser.py
│   │           │   │   ├── soupparser.py
│   │           │   │   └── usedoctest.py
│   │           │   ├── includes
│   │           │   │   ├── __init__.pxd
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   └── __init__.cpython-312.pyc
│   │           │   │   ├── c14n.pxd
│   │           │   │   ├── config.pxd
│   │           │   │   ├── dtdvalid.pxd
│   │           │   │   ├── etree_defs.h
│   │           │   │   ├── etreepublic.pxd
│   │           │   │   ├── extlibs
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   └── __init__.cpython-312.pyc
│   │           │   │   │   ├── libcharset.h
│   │           │   │   │   ├── localcharset.h
│   │           │   │   │   ├── zconf.h
│   │           │   │   │   └── zlib.h
│   │           │   │   ├── htmlparser.pxd
│   │           │   │   ├── libexslt
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   └── __init__.cpython-312.pyc
│   │           │   │   │   ├── exslt.h
│   │           │   │   │   ├── exsltconfig.h
│   │           │   │   │   └── exsltexports.h
│   │           │   │   ├── libxml
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   └── __init__.cpython-312.pyc
│   │           │   │   │   ├── c14n.h
│   │           │   │   │   ├── catalog.h
│   │           │   │   │   ├── chvalid.h
│   │           │   │   │   ├── debugXML.h
│   │           │   │   │   ├── dict.h
│   │           │   │   │   ├── encoding.h
│   │           │   │   │   ├── entities.h
│   │           │   │   │   ├── globals.h
│   │           │   │   │   ├── hash.h
│   │           │   │   │   ├── HTMLparser.h
│   │           │   │   │   ├── HTMLtree.h
│   │           │   │   │   ├── list.h
│   │           │   │   │   ├── nanoftp.h
│   │           │   │   │   ├── nanohttp.h
│   │           │   │   │   ├── parser.h
│   │           │   │   │   ├── parserInternals.h
│   │           │   │   │   ├── relaxng.h
│   │           │   │   │   ├── SAX.h
│   │           │   │   │   ├── SAX2.h
│   │           │   │   │   ├── schemasInternals.h
│   │           │   │   │   ├── schematron.h
│   │           │   │   │   ├── threads.h
│   │           │   │   │   ├── tree.h
│   │           │   │   │   ├── uri.h
│   │           │   │   │   ├── valid.h
│   │           │   │   │   ├── xinclude.h
│   │           │   │   │   ├── xlink.h
│   │           │   │   │   ├── xmlautomata.h
│   │           │   │   │   ├── xmlerror.h
│   │           │   │   │   ├── xmlexports.h
│   │           │   │   │   ├── xmlIO.h
│   │           │   │   │   ├── xmlmemory.h
│   │           │   │   │   ├── xmlmodule.h
│   │           │   │   │   ├── xmlreader.h
│   │           │   │   │   ├── xmlregexp.h
│   │           │   │   │   ├── xmlsave.h
│   │           │   │   │   ├── xmlschemas.h
│   │           │   │   │   ├── xmlschemastypes.h
│   │           │   │   │   ├── xmlstring.h
│   │           │   │   │   ├── xmlunicode.h
│   │           │   │   │   ├── xmlversion.h
│   │           │   │   │   ├── xmlwriter.h
│   │           │   │   │   ├── xpath.h
│   │           │   │   │   ├── xpathInternals.h
│   │           │   │   │   └── xpointer.h
│   │           │   │   ├── libxslt
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   └── __init__.cpython-312.pyc
│   │           │   │   │   ├── attributes.h
│   │           │   │   │   ├── documents.h
│   │           │   │   │   ├── extensions.h
│   │           │   │   │   ├── extra.h
│   │           │   │   │   ├── functions.h
│   │           │   │   │   ├── imports.h
│   │           │   │   │   ├── keys.h
│   │           │   │   │   ├── namespaces.h
│   │           │   │   │   ├── numbersInternals.h
│   │           │   │   │   ├── pattern.h
│   │           │   │   │   ├── preproc.h
│   │           │   │   │   ├── security.h
│   │           │   │   │   ├── templates.h
│   │           │   │   │   ├── transform.h
│   │           │   │   │   ├── variables.h
│   │           │   │   │   ├── xslt.h
│   │           │   │   │   ├── xsltconfig.h
│   │           │   │   │   ├── xsltexports.h
│   │           │   │   │   ├── xsltInternals.h
│   │           │   │   │   ├── xsltlocale.h
│   │           │   │   │   └── xsltutils.h
│   │           │   │   ├── lxml-version.h
│   │           │   │   ├── relaxng.pxd
│   │           │   │   ├── schematron.pxd
│   │           │   │   ├── tree.pxd
│   │           │   │   ├── uri.pxd
│   │           │   │   ├── xinclude.pxd
│   │           │   │   ├── xmlerror.pxd
│   │           │   │   ├── xmlparser.pxd
│   │           │   │   ├── xmlschema.pxd
│   │           │   │   ├── xpath.pxd
│   │           │   │   └── xslt.pxd
│   │           │   ├── isoschematron
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   └── __init__.cpython-312.pyc
│   │           │   │   └── resources
│   │           │   │       ├── rng
│   │           │   │       │   └── iso-schematron.rng
│   │           │   │       └── xsl
│   │           │   │           ├── iso-schematron-xslt1
│   │           │   │           │   ├── iso_abstract_expand.xsl
│   │           │   │           │   ├── iso_dsdl_include.xsl
│   │           │   │           │   ├── iso_schematron_message.xsl
│   │           │   │           │   ├── iso_schematron_skeleton_for_xslt1.xsl
│   │           │   │           │   ├── iso_svrl_for_xslt1.xsl
│   │           │   │           │   └── readme.txt
│   │           │   │           ├── RNG2Schtrn.xsl
│   │           │   │           └── XSD2Schtrn.xsl
│   │           │   ├── iterparse.pxi
│   │           │   ├── lxml.etree_api.h
│   │           │   ├── lxml.etree.h
│   │           │   ├── nsclasses.pxi
│   │           │   ├── objectify.cpython-312-darwin.so
│   │           │   ├── objectify.pyx
│   │           │   ├── objectpath.pxi
│   │           │   ├── parser.pxi
│   │           │   ├── parsertarget.pxi
│   │           │   ├── proxy.pxi
│   │           │   ├── public-api.pxi
│   │           │   ├── pyclasslookup.py
│   │           │   ├── readonlytree.pxi
│   │           │   ├── relaxng.pxi
│   │           │   ├── sax.cpython-312-darwin.so
│   │           │   ├── sax.py
│   │           │   ├── saxparser.pxi
│   │           │   ├── schematron.pxi
│   │           │   ├── serializer.pxi
│   │           │   ├── usedoctest.py
│   │           │   ├── xinclude.pxi
│   │           │   ├── xmlerror.pxi
│   │           │   ├── xmlid.pxi
│   │           │   ├── xmlschema.pxi
│   │           │   ├── xpath.pxi
│   │           │   ├── xslt.pxi
│   │           │   └── xsltext.pxi
│   │           ├── lxml-5.3.0.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── LICENSES.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── REQUESTED
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── markupsafe
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   └── _native.cpython-312.pyc
│   │           │   ├── _native.py
│   │           │   ├── _speedups.c
│   │           │   ├── _speedups.cpython-312-darwin.so
│   │           │   ├── _speedups.pyi
│   │           │   └── py.typed
│   │           ├── MarkupSafe-3.0.1.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── pip
│   │           │   ├── __init__.py
│   │           │   ├── __main__.py
│   │           │   ├── __pip-runner__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── __main__.cpython-312.pyc
│   │           │   │   └── __pip-runner__.cpython-312.pyc
│   │           │   ├── _internal
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── build_env.cpython-312.pyc
│   │           │   │   │   ├── cache.cpython-312.pyc
│   │           │   │   │   ├── configuration.cpython-312.pyc
│   │           │   │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   │   ├── main.cpython-312.pyc
│   │           │   │   │   ├── pyproject.cpython-312.pyc
│   │           │   │   │   ├── self_outdated_check.cpython-312.pyc
│   │           │   │   │   └── wheel_builder.cpython-312.pyc
│   │           │   │   ├── build_env.py
│   │           │   │   ├── cache.py
│   │           │   │   ├── cli
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── autocompletion.cpython-312.pyc
│   │           │   │   │   │   ├── base_command.cpython-312.pyc
│   │           │   │   │   │   ├── cmdoptions.cpython-312.pyc
│   │           │   │   │   │   ├── command_context.cpython-312.pyc
│   │           │   │   │   │   ├── index_command.cpython-312.pyc
│   │           │   │   │   │   ├── main_parser.cpython-312.pyc
│   │           │   │   │   │   ├── main.cpython-312.pyc
│   │           │   │   │   │   ├── parser.cpython-312.pyc
│   │           │   │   │   │   ├── progress_bars.cpython-312.pyc
│   │           │   │   │   │   ├── req_command.cpython-312.pyc
│   │           │   │   │   │   ├── spinners.cpython-312.pyc
│   │           │   │   │   │   └── status_codes.cpython-312.pyc
│   │           │   │   │   ├── autocompletion.py
│   │           │   │   │   ├── base_command.py
│   │           │   │   │   ├── cmdoptions.py
│   │           │   │   │   ├── command_context.py
│   │           │   │   │   ├── index_command.py
│   │           │   │   │   ├── main_parser.py
│   │           │   │   │   ├── main.py
│   │           │   │   │   ├── parser.py
│   │           │   │   │   ├── progress_bars.py
│   │           │   │   │   ├── req_command.py
│   │           │   │   │   ├── spinners.py
│   │           │   │   │   └── status_codes.py
│   │           │   │   ├── commands
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── cache.cpython-312.pyc
│   │           │   │   │   │   ├── check.cpython-312.pyc
│   │           │   │   │   │   ├── completion.cpython-312.pyc
│   │           │   │   │   │   ├── configuration.cpython-312.pyc
│   │           │   │   │   │   ├── debug.cpython-312.pyc
│   │           │   │   │   │   ├── download.cpython-312.pyc
│   │           │   │   │   │   ├── freeze.cpython-312.pyc
│   │           │   │   │   │   ├── hash.cpython-312.pyc
│   │           │   │   │   │   ├── help.cpython-312.pyc
│   │           │   │   │   │   ├── index.cpython-312.pyc
│   │           │   │   │   │   ├── inspect.cpython-312.pyc
│   │           │   │   │   │   ├── install.cpython-312.pyc
│   │           │   │   │   │   ├── list.cpython-312.pyc
│   │           │   │   │   │   ├── search.cpython-312.pyc
│   │           │   │   │   │   ├── show.cpython-312.pyc
│   │           │   │   │   │   ├── uninstall.cpython-312.pyc
│   │           │   │   │   │   └── wheel.cpython-312.pyc
│   │           │   │   │   ├── cache.py
│   │           │   │   │   ├── check.py
│   │           │   │   │   ├── completion.py
│   │           │   │   │   ├── configuration.py
│   │           │   │   │   ├── debug.py
│   │           │   │   │   ├── download.py
│   │           │   │   │   ├── freeze.py
│   │           │   │   │   ├── hash.py
│   │           │   │   │   ├── help.py
│   │           │   │   │   ├── index.py
│   │           │   │   │   ├── inspect.py
│   │           │   │   │   ├── install.py
│   │           │   │   │   ├── list.py
│   │           │   │   │   ├── search.py
│   │           │   │   │   ├── show.py
│   │           │   │   │   ├── uninstall.py
│   │           │   │   │   └── wheel.py
│   │           │   │   ├── configuration.py
│   │           │   │   ├── distributions
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── base.cpython-312.pyc
│   │           │   │   │   │   ├── installed.cpython-312.pyc
│   │           │   │   │   │   ├── sdist.cpython-312.pyc
│   │           │   │   │   │   └── wheel.cpython-312.pyc
│   │           │   │   │   ├── base.py
│   │           │   │   │   ├── installed.py
│   │           │   │   │   ├── sdist.py
│   │           │   │   │   └── wheel.py
│   │           │   │   ├── exceptions.py
│   │           │   │   ├── index
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── collector.cpython-312.pyc
│   │           │   │   │   │   ├── package_finder.cpython-312.pyc
│   │           │   │   │   │   └── sources.cpython-312.pyc
│   │           │   │   │   ├── collector.py
│   │           │   │   │   ├── package_finder.py
│   │           │   │   │   └── sources.py
│   │           │   │   ├── locations
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _distutils.cpython-312.pyc
│   │           │   │   │   │   ├── _sysconfig.cpython-312.pyc
│   │           │   │   │   │   └── base.cpython-312.pyc
│   │           │   │   │   ├── _distutils.py
│   │           │   │   │   ├── _sysconfig.py
│   │           │   │   │   └── base.py
│   │           │   │   ├── main.py
│   │           │   │   ├── metadata
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _json.cpython-312.pyc
│   │           │   │   │   │   ├── base.cpython-312.pyc
│   │           │   │   │   │   └── pkg_resources.cpython-312.pyc
│   │           │   │   │   ├── _json.py
│   │           │   │   │   ├── base.py
│   │           │   │   │   ├── importlib
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   ├── _compat.cpython-312.pyc
│   │           │   │   │   │   │   ├── _dists.cpython-312.pyc
│   │           │   │   │   │   │   └── _envs.cpython-312.pyc
│   │           │   │   │   │   ├── _compat.py
│   │           │   │   │   │   ├── _dists.py
│   │           │   │   │   │   └── _envs.py
│   │           │   │   │   └── pkg_resources.py
│   │           │   │   ├── models
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── candidate.cpython-312.pyc
│   │           │   │   │   │   ├── direct_url.cpython-312.pyc
│   │           │   │   │   │   ├── format_control.cpython-312.pyc
│   │           │   │   │   │   ├── index.cpython-312.pyc
│   │           │   │   │   │   ├── installation_report.cpython-312.pyc
│   │           │   │   │   │   ├── link.cpython-312.pyc
│   │           │   │   │   │   ├── scheme.cpython-312.pyc
│   │           │   │   │   │   ├── search_scope.cpython-312.pyc
│   │           │   │   │   │   ├── selection_prefs.cpython-312.pyc
│   │           │   │   │   │   ├── target_python.cpython-312.pyc
│   │           │   │   │   │   └── wheel.cpython-312.pyc
│   │           │   │   │   ├── candidate.py
│   │           │   │   │   ├── direct_url.py
│   │           │   │   │   ├── format_control.py
│   │           │   │   │   ├── index.py
│   │           │   │   │   ├── installation_report.py
│   │           │   │   │   ├── link.py
│   │           │   │   │   ├── scheme.py
│   │           │   │   │   ├── search_scope.py
│   │           │   │   │   ├── selection_prefs.py
│   │           │   │   │   ├── target_python.py
│   │           │   │   │   └── wheel.py
│   │           │   │   ├── network
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── auth.cpython-312.pyc
│   │           │   │   │   │   ├── cache.cpython-312.pyc
│   │           │   │   │   │   ├── download.cpython-312.pyc
│   │           │   │   │   │   ├── lazy_wheel.cpython-312.pyc
│   │           │   │   │   │   ├── session.cpython-312.pyc
│   │           │   │   │   │   ├── utils.cpython-312.pyc
│   │           │   │   │   │   └── xmlrpc.cpython-312.pyc
│   │           │   │   │   ├── auth.py
│   │           │   │   │   ├── cache.py
│   │           │   │   │   ├── download.py
│   │           │   │   │   ├── lazy_wheel.py
│   │           │   │   │   ├── session.py
│   │           │   │   │   ├── utils.py
│   │           │   │   │   └── xmlrpc.py
│   │           │   │   ├── operations
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── check.cpython-312.pyc
│   │           │   │   │   │   ├── freeze.cpython-312.pyc
│   │           │   │   │   │   └── prepare.cpython-312.pyc
│   │           │   │   │   ├── build
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   ├── build_tracker.cpython-312.pyc
│   │           │   │   │   │   │   ├── metadata_editable.cpython-312.pyc
│   │           │   │   │   │   │   ├── metadata_legacy.cpython-312.pyc
│   │           │   │   │   │   │   ├── metadata.cpython-312.pyc
│   │           │   │   │   │   │   ├── wheel_editable.cpython-312.pyc
│   │           │   │   │   │   │   ├── wheel_legacy.cpython-312.pyc
│   │           │   │   │   │   │   └── wheel.cpython-312.pyc
│   │           │   │   │   │   ├── build_tracker.py
│   │           │   │   │   │   ├── metadata_editable.py
│   │           │   │   │   │   ├── metadata_legacy.py
│   │           │   │   │   │   ├── metadata.py
│   │           │   │   │   │   ├── wheel_editable.py
│   │           │   │   │   │   ├── wheel_legacy.py
│   │           │   │   │   │   └── wheel.py
│   │           │   │   │   ├── check.py
│   │           │   │   │   ├── freeze.py
│   │           │   │   │   ├── install
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   ├── editable_legacy.cpython-312.pyc
│   │           │   │   │   │   │   └── wheel.cpython-312.pyc
│   │           │   │   │   │   ├── editable_legacy.py
│   │           │   │   │   │   └── wheel.py
│   │           │   │   │   └── prepare.py
│   │           │   │   ├── pyproject.py
│   │           │   │   ├── req
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── constructors.cpython-312.pyc
│   │           │   │   │   │   ├── req_file.cpython-312.pyc
│   │           │   │   │   │   ├── req_install.cpython-312.pyc
│   │           │   │   │   │   ├── req_set.cpython-312.pyc
│   │           │   │   │   │   └── req_uninstall.cpython-312.pyc
│   │           │   │   │   ├── constructors.py
│   │           │   │   │   ├── req_file.py
│   │           │   │   │   ├── req_install.py
│   │           │   │   │   ├── req_set.py
│   │           │   │   │   └── req_uninstall.py
│   │           │   │   ├── resolution
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   └── base.cpython-312.pyc
│   │           │   │   │   ├── base.py
│   │           │   │   │   ├── legacy
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   └── resolver.cpython-312.pyc
│   │           │   │   │   │   └── resolver.py
│   │           │   │   │   └── resolvelib
│   │           │   │   │       ├── __init__.py
│   │           │   │   │       ├── __pycache__
│   │           │   │   │       │   ├── __init__.cpython-312.pyc
│   │           │   │   │       │   ├── base.cpython-312.pyc
│   │           │   │   │       │   ├── candidates.cpython-312.pyc
│   │           │   │   │       │   ├── factory.cpython-312.pyc
│   │           │   │   │       │   ├── found_candidates.cpython-312.pyc
│   │           │   │   │       │   ├── provider.cpython-312.pyc
│   │           │   │   │       │   ├── reporter.cpython-312.pyc
│   │           │   │   │       │   ├── requirements.cpython-312.pyc
│   │           │   │   │       │   └── resolver.cpython-312.pyc
│   │           │   │   │       ├── base.py
│   │           │   │   │       ├── candidates.py
│   │           │   │   │       ├── factory.py
│   │           │   │   │       ├── found_candidates.py
│   │           │   │   │       ├── provider.py
│   │           │   │   │       ├── reporter.py
│   │           │   │   │       ├── requirements.py
│   │           │   │   │       └── resolver.py
│   │           │   │   ├── self_outdated_check.py
│   │           │   │   ├── utils
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _jaraco_text.cpython-312.pyc
│   │           │   │   │   │   ├── _log.cpython-312.pyc
│   │           │   │   │   │   ├── appdirs.cpython-312.pyc
│   │           │   │   │   │   ├── compat.cpython-312.pyc
│   │           │   │   │   │   ├── compatibility_tags.cpython-312.pyc
│   │           │   │   │   │   ├── datetime.cpython-312.pyc
│   │           │   │   │   │   ├── deprecation.cpython-312.pyc
│   │           │   │   │   │   ├── direct_url_helpers.cpython-312.pyc
│   │           │   │   │   │   ├── egg_link.cpython-312.pyc
│   │           │   │   │   │   ├── encoding.cpython-312.pyc
│   │           │   │   │   │   ├── entrypoints.cpython-312.pyc
│   │           │   │   │   │   ├── filesystem.cpython-312.pyc
│   │           │   │   │   │   ├── filetypes.cpython-312.pyc
│   │           │   │   │   │   ├── glibc.cpython-312.pyc
│   │           │   │   │   │   ├── hashes.cpython-312.pyc
│   │           │   │   │   │   ├── logging.cpython-312.pyc
│   │           │   │   │   │   ├── misc.cpython-312.pyc
│   │           │   │   │   │   ├── packaging.cpython-312.pyc
│   │           │   │   │   │   ├── retry.cpython-312.pyc
│   │           │   │   │   │   ├── setuptools_build.cpython-312.pyc
│   │           │   │   │   │   ├── subprocess.cpython-312.pyc
│   │           │   │   │   │   ├── temp_dir.cpython-312.pyc
│   │           │   │   │   │   ├── unpacking.cpython-312.pyc
│   │           │   │   │   │   ├── urls.cpython-312.pyc
│   │           │   │   │   │   ├── virtualenv.cpython-312.pyc
│   │           │   │   │   │   └── wheel.cpython-312.pyc
│   │           │   │   │   ├── _jaraco_text.py
│   │           │   │   │   ├── _log.py
│   │           │   │   │   ├── appdirs.py
│   │           │   │   │   ├── compat.py
│   │           │   │   │   ├── compatibility_tags.py
│   │           │   │   │   ├── datetime.py
│   │           │   │   │   ├── deprecation.py
│   │           │   │   │   ├── direct_url_helpers.py
│   │           │   │   │   ├── egg_link.py
│   │           │   │   │   ├── encoding.py
│   │           │   │   │   ├── entrypoints.py
│   │           │   │   │   ├── filesystem.py
│   │           │   │   │   ├── filetypes.py
│   │           │   │   │   ├── glibc.py
│   │           │   │   │   ├── hashes.py
│   │           │   │   │   ├── logging.py
│   │           │   │   │   ├── misc.py
│   │           │   │   │   ├── packaging.py
│   │           │   │   │   ├── retry.py
│   │           │   │   │   ├── setuptools_build.py
│   │           │   │   │   ├── subprocess.py
│   │           │   │   │   ├── temp_dir.py
│   │           │   │   │   ├── unpacking.py
│   │           │   │   │   ├── urls.py
│   │           │   │   │   ├── virtualenv.py
│   │           │   │   │   └── wheel.py
│   │           │   │   ├── vcs
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── bazaar.cpython-312.pyc
│   │           │   │   │   │   ├── git.cpython-312.pyc
│   │           │   │   │   │   ├── mercurial.cpython-312.pyc
│   │           │   │   │   │   ├── subversion.cpython-312.pyc
│   │           │   │   │   │   └── versioncontrol.cpython-312.pyc
│   │           │   │   │   ├── bazaar.py
│   │           │   │   │   ├── git.py
│   │           │   │   │   ├── mercurial.py
│   │           │   │   │   ├── subversion.py
│   │           │   │   │   └── versioncontrol.py
│   │           │   │   └── wheel_builder.py
│   │           │   ├── _vendor
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   └── typing_extensions.cpython-312.pyc
│   │           │   │   ├── cachecontrol
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _cmd.cpython-312.pyc
│   │           │   │   │   │   ├── adapter.cpython-312.pyc
│   │           │   │   │   │   ├── cache.cpython-312.pyc
│   │           │   │   │   │   ├── controller.cpython-312.pyc
│   │           │   │   │   │   ├── filewrapper.cpython-312.pyc
│   │           │   │   │   │   ├── heuristics.cpython-312.pyc
│   │           │   │   │   │   ├── serialize.cpython-312.pyc
│   │           │   │   │   │   └── wrapper.cpython-312.pyc
│   │           │   │   │   ├── _cmd.py
│   │           │   │   │   ├── adapter.py
│   │           │   │   │   ├── cache.py
│   │           │   │   │   ├── caches
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   ├── file_cache.cpython-312.pyc
│   │           │   │   │   │   │   └── redis_cache.cpython-312.pyc
│   │           │   │   │   │   ├── file_cache.py
│   │           │   │   │   │   └── redis_cache.py
│   │           │   │   │   ├── controller.py
│   │           │   │   │   ├── filewrapper.py
│   │           │   │   │   ├── heuristics.py
│   │           │   │   │   ├── py.typed
│   │           │   │   │   ├── serialize.py
│   │           │   │   │   └── wrapper.py
│   │           │   │   ├── certifi
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __main__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── __main__.cpython-312.pyc
│   │           │   │   │   │   └── core.cpython-312.pyc
│   │           │   │   │   ├── cacert.pem
│   │           │   │   │   ├── core.py
│   │           │   │   │   └── py.typed
│   │           │   │   ├── distlib
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── compat.cpython-312.pyc
│   │           │   │   │   │   ├── database.cpython-312.pyc
│   │           │   │   │   │   ├── index.cpython-312.pyc
│   │           │   │   │   │   ├── locators.cpython-312.pyc
│   │           │   │   │   │   ├── manifest.cpython-312.pyc
│   │           │   │   │   │   ├── markers.cpython-312.pyc
│   │           │   │   │   │   ├── metadata.cpython-312.pyc
│   │           │   │   │   │   ├── resources.cpython-312.pyc
│   │           │   │   │   │   ├── scripts.cpython-312.pyc
│   │           │   │   │   │   ├── util.cpython-312.pyc
│   │           │   │   │   │   ├── version.cpython-312.pyc
│   │           │   │   │   │   └── wheel.cpython-312.pyc
│   │           │   │   │   ├── compat.py
│   │           │   │   │   ├── database.py
│   │           │   │   │   ├── index.py
│   │           │   │   │   ├── locators.py
│   │           │   │   │   ├── manifest.py
│   │           │   │   │   ├── markers.py
│   │           │   │   │   ├── metadata.py
│   │           │   │   │   ├── resources.py
│   │           │   │   │   ├── scripts.py
│   │           │   │   │   ├── t32.exe
│   │           │   │   │   ├── t64-arm.exe
│   │           │   │   │   ├── t64.exe
│   │           │   │   │   ├── util.py
│   │           │   │   │   ├── version.py
│   │           │   │   │   ├── w32.exe
│   │           │   │   │   ├── w64-arm.exe
│   │           │   │   │   ├── w64.exe
│   │           │   │   │   └── wheel.py
│   │           │   │   ├── distro
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __main__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── __main__.cpython-312.pyc
│   │           │   │   │   │   └── distro.cpython-312.pyc
│   │           │   │   │   ├── distro.py
│   │           │   │   │   └── py.typed
│   │           │   │   ├── idna
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── codec.cpython-312.pyc
│   │           │   │   │   │   ├── compat.cpython-312.pyc
│   │           │   │   │   │   ├── core.cpython-312.pyc
│   │           │   │   │   │   ├── idnadata.cpython-312.pyc
│   │           │   │   │   │   ├── intranges.cpython-312.pyc
│   │           │   │   │   │   ├── package_data.cpython-312.pyc
│   │           │   │   │   │   └── uts46data.cpython-312.pyc
│   │           │   │   │   ├── codec.py
│   │           │   │   │   ├── compat.py
│   │           │   │   │   ├── core.py
│   │           │   │   │   ├── idnadata.py
│   │           │   │   │   ├── intranges.py
│   │           │   │   │   ├── package_data.py
│   │           │   │   │   ├── py.typed
│   │           │   │   │   └── uts46data.py
│   │           │   │   ├── msgpack
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   │   │   ├── ext.cpython-312.pyc
│   │           │   │   │   │   └── fallback.cpython-312.pyc
│   │           │   │   │   ├── exceptions.py
│   │           │   │   │   ├── ext.py
│   │           │   │   │   └── fallback.py
│   │           │   │   ├── packaging
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _elffile.cpython-312.pyc
│   │           │   │   │   │   ├── _manylinux.cpython-312.pyc
│   │           │   │   │   │   ├── _musllinux.cpython-312.pyc
│   │           │   │   │   │   ├── _parser.cpython-312.pyc
│   │           │   │   │   │   ├── _structures.cpython-312.pyc
│   │           │   │   │   │   ├── _tokenizer.cpython-312.pyc
│   │           │   │   │   │   ├── markers.cpython-312.pyc
│   │           │   │   │   │   ├── metadata.cpython-312.pyc
│   │           │   │   │   │   ├── requirements.cpython-312.pyc
│   │           │   │   │   │   ├── specifiers.cpython-312.pyc
│   │           │   │   │   │   ├── tags.cpython-312.pyc
│   │           │   │   │   │   ├── utils.cpython-312.pyc
│   │           │   │   │   │   └── version.cpython-312.pyc
│   │           │   │   │   ├── _elffile.py
│   │           │   │   │   ├── _manylinux.py
│   │           │   │   │   ├── _musllinux.py
│   │           │   │   │   ├── _parser.py
│   │           │   │   │   ├── _structures.py
│   │           │   │   │   ├── _tokenizer.py
│   │           │   │   │   ├── markers.py
│   │           │   │   │   ├── metadata.py
│   │           │   │   │   ├── py.typed
│   │           │   │   │   ├── requirements.py
│   │           │   │   │   ├── specifiers.py
│   │           │   │   │   ├── tags.py
│   │           │   │   │   ├── utils.py
│   │           │   │   │   └── version.py
│   │           │   │   ├── pkg_resources
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   └── __pycache__
│   │           │   │   │       └── __init__.cpython-312.pyc
│   │           │   │   ├── platformdirs
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __main__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── __main__.cpython-312.pyc
│   │           │   │   │   │   ├── android.cpython-312.pyc
│   │           │   │   │   │   ├── api.cpython-312.pyc
│   │           │   │   │   │   ├── macos.cpython-312.pyc
│   │           │   │   │   │   ├── unix.cpython-312.pyc
│   │           │   │   │   │   ├── version.cpython-312.pyc
│   │           │   │   │   │   └── windows.cpython-312.pyc
│   │           │   │   │   ├── android.py
│   │           │   │   │   ├── api.py
│   │           │   │   │   ├── macos.py
│   │           │   │   │   ├── py.typed
│   │           │   │   │   ├── unix.py
│   │           │   │   │   ├── version.py
│   │           │   │   │   └── windows.py
│   │           │   │   ├── pygments
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __main__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── __main__.cpython-312.pyc
│   │           │   │   │   │   ├── cmdline.cpython-312.pyc
│   │           │   │   │   │   ├── console.cpython-312.pyc
│   │           │   │   │   │   ├── filter.cpython-312.pyc
│   │           │   │   │   │   ├── formatter.cpython-312.pyc
│   │           │   │   │   │   ├── lexer.cpython-312.pyc
│   │           │   │   │   │   ├── modeline.cpython-312.pyc
│   │           │   │   │   │   ├── plugin.cpython-312.pyc
│   │           │   │   │   │   ├── regexopt.cpython-312.pyc
│   │           │   │   │   │   ├── scanner.cpython-312.pyc
│   │           │   │   │   │   ├── sphinxext.cpython-312.pyc
│   │           │   │   │   │   ├── style.cpython-312.pyc
│   │           │   │   │   │   ├── token.cpython-312.pyc
│   │           │   │   │   │   ├── unistring.cpython-312.pyc
│   │           │   │   │   │   └── util.cpython-312.pyc
│   │           │   │   │   ├── cmdline.py
│   │           │   │   │   ├── console.py
│   │           │   │   │   ├── filter.py
│   │           │   │   │   ├── filters
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   └── __pycache__
│   │           │   │   │   │       └── __init__.cpython-312.pyc
│   │           │   │   │   ├── formatter.py
│   │           │   │   │   ├── formatters
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   ├── _mapping.cpython-312.pyc
│   │           │   │   │   │   │   ├── bbcode.cpython-312.pyc
│   │           │   │   │   │   │   ├── groff.cpython-312.pyc
│   │           │   │   │   │   │   ├── html.cpython-312.pyc
│   │           │   │   │   │   │   ├── img.cpython-312.pyc
│   │           │   │   │   │   │   ├── irc.cpython-312.pyc
│   │           │   │   │   │   │   ├── latex.cpython-312.pyc
│   │           │   │   │   │   │   ├── other.cpython-312.pyc
│   │           │   │   │   │   │   ├── pangomarkup.cpython-312.pyc
│   │           │   │   │   │   │   ├── rtf.cpython-312.pyc
│   │           │   │   │   │   │   ├── svg.cpython-312.pyc
│   │           │   │   │   │   │   ├── terminal.cpython-312.pyc
│   │           │   │   │   │   │   └── terminal256.cpython-312.pyc
│   │           │   │   │   │   ├── _mapping.py
│   │           │   │   │   │   ├── bbcode.py
│   │           │   │   │   │   ├── groff.py
│   │           │   │   │   │   ├── html.py
│   │           │   │   │   │   ├── img.py
│   │           │   │   │   │   ├── irc.py
│   │           │   │   │   │   ├── latex.py
│   │           │   │   │   │   ├── other.py
│   │           │   │   │   │   ├── pangomarkup.py
│   │           │   │   │   │   ├── rtf.py
│   │           │   │   │   │   ├── svg.py
│   │           │   │   │   │   ├── terminal.py
│   │           │   │   │   │   └── terminal256.py
│   │           │   │   │   ├── lexer.py
│   │           │   │   │   ├── lexers
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   ├── _mapping.cpython-312.pyc
│   │           │   │   │   │   │   └── python.cpython-312.pyc
│   │           │   │   │   │   ├── _mapping.py
│   │           │   │   │   │   └── python.py
│   │           │   │   │   ├── modeline.py
│   │           │   │   │   ├── plugin.py
│   │           │   │   │   ├── regexopt.py
│   │           │   │   │   ├── scanner.py
│   │           │   │   │   ├── sphinxext.py
│   │           │   │   │   ├── style.py
│   │           │   │   │   ├── styles
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   └── _mapping.cpython-312.pyc
│   │           │   │   │   │   └── _mapping.py
│   │           │   │   │   ├── token.py
│   │           │   │   │   ├── unistring.py
│   │           │   │   │   └── util.py
│   │           │   │   ├── pyproject_hooks
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _compat.cpython-312.pyc
│   │           │   │   │   │   └── _impl.cpython-312.pyc
│   │           │   │   │   ├── _compat.py
│   │           │   │   │   ├── _impl.py
│   │           │   │   │   └── _in_process
│   │           │   │   │       ├── __init__.py
│   │           │   │   │       ├── __pycache__
│   │           │   │   │       │   ├── __init__.cpython-312.pyc
│   │           │   │   │       │   └── _in_process.cpython-312.pyc
│   │           │   │   │       └── _in_process.py
│   │           │   │   ├── requests
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── __version__.cpython-312.pyc
│   │           │   │   │   │   ├── _internal_utils.cpython-312.pyc
│   │           │   │   │   │   ├── adapters.cpython-312.pyc
│   │           │   │   │   │   ├── api.cpython-312.pyc
│   │           │   │   │   │   ├── auth.cpython-312.pyc
│   │           │   │   │   │   ├── certs.cpython-312.pyc
│   │           │   │   │   │   ├── compat.cpython-312.pyc
│   │           │   │   │   │   ├── cookies.cpython-312.pyc
│   │           │   │   │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   │   │   ├── help.cpython-312.pyc
│   │           │   │   │   │   ├── hooks.cpython-312.pyc
│   │           │   │   │   │   ├── models.cpython-312.pyc
│   │           │   │   │   │   ├── packages.cpython-312.pyc
│   │           │   │   │   │   ├── sessions.cpython-312.pyc
│   │           │   │   │   │   ├── status_codes.cpython-312.pyc
│   │           │   │   │   │   ├── structures.cpython-312.pyc
│   │           │   │   │   │   └── utils.cpython-312.pyc
│   │           │   │   │   ├── __version__.py
│   │           │   │   │   ├── _internal_utils.py
│   │           │   │   │   ├── adapters.py
│   │           │   │   │   ├── api.py
│   │           │   │   │   ├── auth.py
│   │           │   │   │   ├── certs.py
│   │           │   │   │   ├── compat.py
│   │           │   │   │   ├── cookies.py
│   │           │   │   │   ├── exceptions.py
│   │           │   │   │   ├── help.py
│   │           │   │   │   ├── hooks.py
│   │           │   │   │   ├── models.py
│   │           │   │   │   ├── packages.py
│   │           │   │   │   ├── sessions.py
│   │           │   │   │   ├── status_codes.py
│   │           │   │   │   ├── structures.py
│   │           │   │   │   └── utils.py
│   │           │   │   ├── resolvelib
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── providers.cpython-312.pyc
│   │           │   │   │   │   ├── reporters.cpython-312.pyc
│   │           │   │   │   │   ├── resolvers.cpython-312.pyc
│   │           │   │   │   │   └── structs.cpython-312.pyc
│   │           │   │   │   ├── compat
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   └── collections_abc.cpython-312.pyc
│   │           │   │   │   │   └── collections_abc.py
│   │           │   │   │   ├── providers.py
│   │           │   │   │   ├── py.typed
│   │           │   │   │   ├── reporters.py
│   │           │   │   │   ├── resolvers.py
│   │           │   │   │   └── structs.py
│   │           │   │   ├── rich
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __main__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── __main__.cpython-312.pyc
│   │           │   │   │   │   ├── _cell_widths.cpython-312.pyc
│   │           │   │   │   │   ├── _emoji_codes.cpython-312.pyc
│   │           │   │   │   │   ├── _emoji_replace.cpython-312.pyc
│   │           │   │   │   │   ├── _export_format.cpython-312.pyc
│   │           │   │   │   │   ├── _extension.cpython-312.pyc
│   │           │   │   │   │   ├── _fileno.cpython-312.pyc
│   │           │   │   │   │   ├── _inspect.cpython-312.pyc
│   │           │   │   │   │   ├── _log_render.cpython-312.pyc
│   │           │   │   │   │   ├── _loop.cpython-312.pyc
│   │           │   │   │   │   ├── _null_file.cpython-312.pyc
│   │           │   │   │   │   ├── _palettes.cpython-312.pyc
│   │           │   │   │   │   ├── _pick.cpython-312.pyc
│   │           │   │   │   │   ├── _ratio.cpython-312.pyc
│   │           │   │   │   │   ├── _spinners.cpython-312.pyc
│   │           │   │   │   │   ├── _stack.cpython-312.pyc
│   │           │   │   │   │   ├── _timer.cpython-312.pyc
│   │           │   │   │   │   ├── _win32_console.cpython-312.pyc
│   │           │   │   │   │   ├── _windows_renderer.cpython-312.pyc
│   │           │   │   │   │   ├── _windows.cpython-312.pyc
│   │           │   │   │   │   ├── _wrap.cpython-312.pyc
│   │           │   │   │   │   ├── abc.cpython-312.pyc
│   │           │   │   │   │   ├── align.cpython-312.pyc
│   │           │   │   │   │   ├── ansi.cpython-312.pyc
│   │           │   │   │   │   ├── bar.cpython-312.pyc
│   │           │   │   │   │   ├── box.cpython-312.pyc
│   │           │   │   │   │   ├── cells.cpython-312.pyc
│   │           │   │   │   │   ├── color_triplet.cpython-312.pyc
│   │           │   │   │   │   ├── color.cpython-312.pyc
│   │           │   │   │   │   ├── columns.cpython-312.pyc
│   │           │   │   │   │   ├── console.cpython-312.pyc
│   │           │   │   │   │   ├── constrain.cpython-312.pyc
│   │           │   │   │   │   ├── containers.cpython-312.pyc
│   │           │   │   │   │   ├── control.cpython-312.pyc
│   │           │   │   │   │   ├── default_styles.cpython-312.pyc
│   │           │   │   │   │   ├── diagnose.cpython-312.pyc
│   │           │   │   │   │   ├── emoji.cpython-312.pyc
│   │           │   │   │   │   ├── errors.cpython-312.pyc
│   │           │   │   │   │   ├── file_proxy.cpython-312.pyc
│   │           │   │   │   │   ├── filesize.cpython-312.pyc
│   │           │   │   │   │   ├── highlighter.cpython-312.pyc
│   │           │   │   │   │   ├── json.cpython-312.pyc
│   │           │   │   │   │   ├── jupyter.cpython-312.pyc
│   │           │   │   │   │   ├── layout.cpython-312.pyc
│   │           │   │   │   │   ├── live_render.cpython-312.pyc
│   │           │   │   │   │   ├── live.cpython-312.pyc
│   │           │   │   │   │   ├── logging.cpython-312.pyc
│   │           │   │   │   │   ├── markup.cpython-312.pyc
│   │           │   │   │   │   ├── measure.cpython-312.pyc
│   │           │   │   │   │   ├── padding.cpython-312.pyc
│   │           │   │   │   │   ├── pager.cpython-312.pyc
│   │           │   │   │   │   ├── palette.cpython-312.pyc
│   │           │   │   │   │   ├── panel.cpython-312.pyc
│   │           │   │   │   │   ├── pretty.cpython-312.pyc
│   │           │   │   │   │   ├── progress_bar.cpython-312.pyc
│   │           │   │   │   │   ├── progress.cpython-312.pyc
│   │           │   │   │   │   ├── prompt.cpython-312.pyc
│   │           │   │   │   │   ├── protocol.cpython-312.pyc
│   │           │   │   │   │   ├── region.cpython-312.pyc
│   │           │   │   │   │   ├── repr.cpython-312.pyc
│   │           │   │   │   │   ├── rule.cpython-312.pyc
│   │           │   │   │   │   ├── scope.cpython-312.pyc
│   │           │   │   │   │   ├── screen.cpython-312.pyc
│   │           │   │   │   │   ├── segment.cpython-312.pyc
│   │           │   │   │   │   ├── spinner.cpython-312.pyc
│   │           │   │   │   │   ├── status.cpython-312.pyc
│   │           │   │   │   │   ├── style.cpython-312.pyc
│   │           │   │   │   │   ├── styled.cpython-312.pyc
│   │           │   │   │   │   ├── syntax.cpython-312.pyc
│   │           │   │   │   │   ├── table.cpython-312.pyc
│   │           │   │   │   │   ├── terminal_theme.cpython-312.pyc
│   │           │   │   │   │   ├── text.cpython-312.pyc
│   │           │   │   │   │   ├── theme.cpython-312.pyc
│   │           │   │   │   │   ├── themes.cpython-312.pyc
│   │           │   │   │   │   ├── traceback.cpython-312.pyc
│   │           │   │   │   │   └── tree.cpython-312.pyc
│   │           │   │   │   ├── _cell_widths.py
│   │           │   │   │   ├── _emoji_codes.py
│   │           │   │   │   ├── _emoji_replace.py
│   │           │   │   │   ├── _export_format.py
│   │           │   │   │   ├── _extension.py
│   │           │   │   │   ├── _fileno.py
│   │           │   │   │   ├── _inspect.py
│   │           │   │   │   ├── _log_render.py
│   │           │   │   │   ├── _loop.py
│   │           │   │   │   ├── _null_file.py
│   │           │   │   │   ├── _palettes.py
│   │           │   │   │   ├── _pick.py
│   │           │   │   │   ├── _ratio.py
│   │           │   │   │   ├── _spinners.py
│   │           │   │   │   ├── _stack.py
│   │           │   │   │   ├── _timer.py
│   │           │   │   │   ├── _win32_console.py
│   │           │   │   │   ├── _windows_renderer.py
│   │           │   │   │   ├── _windows.py
│   │           │   │   │   ├── _wrap.py
│   │           │   │   │   ├── abc.py
│   │           │   │   │   ├── align.py
│   │           │   │   │   ├── ansi.py
│   │           │   │   │   ├── bar.py
│   │           │   │   │   ├── box.py
│   │           │   │   │   ├── cells.py
│   │           │   │   │   ├── color_triplet.py
│   │           │   │   │   ├── color.py
│   │           │   │   │   ├── columns.py
│   │           │   │   │   ├── console.py
│   │           │   │   │   ├── constrain.py
│   │           │   │   │   ├── containers.py
│   │           │   │   │   ├── control.py
│   │           │   │   │   ├── default_styles.py
│   │           │   │   │   ├── diagnose.py
│   │           │   │   │   ├── emoji.py
│   │           │   │   │   ├── errors.py
│   │           │   │   │   ├── file_proxy.py
│   │           │   │   │   ├── filesize.py
│   │           │   │   │   ├── highlighter.py
│   │           │   │   │   ├── json.py
│   │           │   │   │   ├── jupyter.py
│   │           │   │   │   ├── layout.py
│   │           │   │   │   ├── live_render.py
│   │           │   │   │   ├── live.py
│   │           │   │   │   ├── logging.py
│   │           │   │   │   ├── markup.py
│   │           │   │   │   ├── measure.py
│   │           │   │   │   ├── padding.py
│   │           │   │   │   ├── pager.py
│   │           │   │   │   ├── palette.py
│   │           │   │   │   ├── panel.py
│   │           │   │   │   ├── pretty.py
│   │           │   │   │   ├── progress_bar.py
│   │           │   │   │   ├── progress.py
│   │           │   │   │   ├── prompt.py
│   │           │   │   │   ├── protocol.py
│   │           │   │   │   ├── py.typed
│   │           │   │   │   ├── region.py
│   │           │   │   │   ├── repr.py
│   │           │   │   │   ├── rule.py
│   │           │   │   │   ├── scope.py
│   │           │   │   │   ├── screen.py
│   │           │   │   │   ├── segment.py
│   │           │   │   │   ├── spinner.py
│   │           │   │   │   ├── status.py
│   │           │   │   │   ├── style.py
│   │           │   │   │   ├── styled.py
│   │           │   │   │   ├── syntax.py
│   │           │   │   │   ├── table.py
│   │           │   │   │   ├── terminal_theme.py
│   │           │   │   │   ├── text.py
│   │           │   │   │   ├── theme.py
│   │           │   │   │   ├── themes.py
│   │           │   │   │   ├── traceback.py
│   │           │   │   │   └── tree.py
│   │           │   │   ├── tomli
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _parser.cpython-312.pyc
│   │           │   │   │   │   ├── _re.cpython-312.pyc
│   │           │   │   │   │   └── _types.cpython-312.pyc
│   │           │   │   │   ├── _parser.py
│   │           │   │   │   ├── _re.py
│   │           │   │   │   ├── _types.py
│   │           │   │   │   └── py.typed
│   │           │   │   ├── truststore
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _api.cpython-312.pyc
│   │           │   │   │   │   ├── _macos.cpython-312.pyc
│   │           │   │   │   │   ├── _openssl.cpython-312.pyc
│   │           │   │   │   │   ├── _ssl_constants.cpython-312.pyc
│   │           │   │   │   │   └── _windows.cpython-312.pyc
│   │           │   │   │   ├── _api.py
│   │           │   │   │   ├── _macos.py
│   │           │   │   │   ├── _openssl.py
│   │           │   │   │   ├── _ssl_constants.py
│   │           │   │   │   ├── _windows.py
│   │           │   │   │   └── py.typed
│   │           │   │   ├── typing_extensions.py
│   │           │   │   ├── urllib3
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── _collections.cpython-312.pyc
│   │           │   │   │   │   ├── _version.cpython-312.pyc
│   │           │   │   │   │   ├── connection.cpython-312.pyc
│   │           │   │   │   │   ├── connectionpool.cpython-312.pyc
│   │           │   │   │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   │   │   ├── fields.cpython-312.pyc
│   │           │   │   │   │   ├── filepost.cpython-312.pyc
│   │           │   │   │   │   ├── poolmanager.cpython-312.pyc
│   │           │   │   │   │   ├── request.cpython-312.pyc
│   │           │   │   │   │   └── response.cpython-312.pyc
│   │           │   │   │   ├── _collections.py
│   │           │   │   │   ├── _version.py
│   │           │   │   │   ├── connection.py
│   │           │   │   │   ├── connectionpool.py
│   │           │   │   │   ├── contrib
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   ├── _appengine_environ.cpython-312.pyc
│   │           │   │   │   │   │   ├── appengine.cpython-312.pyc
│   │           │   │   │   │   │   ├── ntlmpool.cpython-312.pyc
│   │           │   │   │   │   │   ├── pyopenssl.cpython-312.pyc
│   │           │   │   │   │   │   ├── securetransport.cpython-312.pyc
│   │           │   │   │   │   │   └── socks.cpython-312.pyc
│   │           │   │   │   │   ├── _appengine_environ.py
│   │           │   │   │   │   ├── _securetransport
│   │           │   │   │   │   │   ├── __init__.py
│   │           │   │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   │   ├── bindings.cpython-312.pyc
│   │           │   │   │   │   │   │   └── low_level.cpython-312.pyc
│   │           │   │   │   │   │   ├── bindings.py
│   │           │   │   │   │   │   └── low_level.py
│   │           │   │   │   │   ├── appengine.py
│   │           │   │   │   │   ├── ntlmpool.py
│   │           │   │   │   │   ├── pyopenssl.py
│   │           │   │   │   │   ├── securetransport.py
│   │           │   │   │   │   └── socks.py
│   │           │   │   │   ├── exceptions.py
│   │           │   │   │   ├── fields.py
│   │           │   │   │   ├── filepost.py
│   │           │   │   │   ├── packages
│   │           │   │   │   │   ├── __init__.py
│   │           │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   └── six.cpython-312.pyc
│   │           │   │   │   │   ├── backports
│   │           │   │   │   │   │   ├── __init__.py
│   │           │   │   │   │   │   ├── __pycache__
│   │           │   │   │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   │   │   ├── makefile.cpython-312.pyc
│   │           │   │   │   │   │   │   └── weakref_finalize.cpython-312.pyc
│   │           │   │   │   │   │   ├── makefile.py
│   │           │   │   │   │   │   └── weakref_finalize.py
│   │           │   │   │   │   └── six.py
│   │           │   │   │   ├── poolmanager.py
│   │           │   │   │   ├── request.py
│   │           │   │   │   ├── response.py
│   │           │   │   │   └── util
│   │           │   │   │       ├── __init__.py
│   │           │   │   │       ├── __pycache__
│   │           │   │   │       │   ├── __init__.cpython-312.pyc
│   │           │   │   │       │   ├── connection.cpython-312.pyc
│   │           │   │   │       │   ├── proxy.cpython-312.pyc
│   │           │   │   │       │   ├── queue.cpython-312.pyc
│   │           │   │   │       │   ├── request.cpython-312.pyc
│   │           │   │   │       │   ├── response.cpython-312.pyc
│   │           │   │   │       │   ├── retry.cpython-312.pyc
│   │           │   │   │       │   ├── ssl_.cpython-312.pyc
│   │           │   │   │       │   ├── ssl_match_hostname.cpython-312.pyc
│   │           │   │   │       │   ├── ssltransport.cpython-312.pyc
│   │           │   │   │       │   ├── timeout.cpython-312.pyc
│   │           │   │   │       │   ├── url.cpython-312.pyc
│   │           │   │   │       │   └── wait.cpython-312.pyc
│   │           │   │   │       ├── connection.py
│   │           │   │   │       ├── proxy.py
│   │           │   │   │       ├── queue.py
│   │           │   │   │       ├── request.py
│   │           │   │   │       ├── response.py
│   │           │   │   │       ├── retry.py
│   │           │   │   │       ├── ssl_.py
│   │           │   │   │       ├── ssl_match_hostname.py
│   │           │   │   │       ├── ssltransport.py
│   │           │   │   │       ├── timeout.py
│   │           │   │   │       ├── url.py
│   │           │   │   │       └── wait.py
│   │           │   │   └── vendor.txt
│   │           │   └── py.typed
│   │           ├── pip-24.2.dist-info
│   │           │   ├── AUTHORS.txt
│   │           │   ├── entry_points.txt
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── REQUESTED
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── requests
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── __version__.cpython-312.pyc
│   │           │   │   ├── _internal_utils.cpython-312.pyc
│   │           │   │   ├── adapters.cpython-312.pyc
│   │           │   │   ├── api.cpython-312.pyc
│   │           │   │   ├── auth.cpython-312.pyc
│   │           │   │   ├── certs.cpython-312.pyc
│   │           │   │   ├── compat.cpython-312.pyc
│   │           │   │   ├── cookies.cpython-312.pyc
│   │           │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   ├── help.cpython-312.pyc
│   │           │   │   ├── hooks.cpython-312.pyc
│   │           │   │   ├── models.cpython-312.pyc
│   │           │   │   ├── packages.cpython-312.pyc
│   │           │   │   ├── sessions.cpython-312.pyc
│   │           │   │   ├── status_codes.cpython-312.pyc
│   │           │   │   ├── structures.cpython-312.pyc
│   │           │   │   └── utils.cpython-312.pyc
│   │           │   ├── __version__.py
│   │           │   ├── _internal_utils.py
│   │           │   ├── adapters.py
│   │           │   ├── api.py
│   │           │   ├── auth.py
│   │           │   ├── certs.py
│   │           │   ├── compat.py
│   │           │   ├── cookies.py
│   │           │   ├── exceptions.py
│   │           │   ├── help.py
│   │           │   ├── hooks.py
│   │           │   ├── models.py
│   │           │   ├── packages.py
│   │           │   ├── sessions.py
│   │           │   ├── status_codes.py
│   │           │   ├── structures.py
│   │           │   └── utils.py
│   │           ├── requests-2.32.3.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── REQUESTED
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── soupsieve
│   │           │   ├── __init__.py
│   │           │   ├── __meta__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── __meta__.cpython-312.pyc
│   │           │   │   ├── css_match.cpython-312.pyc
│   │           │   │   ├── css_parser.cpython-312.pyc
│   │           │   │   ├── css_types.cpython-312.pyc
│   │           │   │   ├── pretty.cpython-312.pyc
│   │           │   │   └── util.cpython-312.pyc
│   │           │   ├── css_match.py
│   │           │   ├── css_parser.py
│   │           │   ├── css_types.py
│   │           │   ├── pretty.py
│   │           │   ├── py.typed
│   │           │   └── util.py
│   │           ├── soupsieve-2.6.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── licenses
│   │           │   │   └── LICENSE.md
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   └── WHEEL
│   │           ├── urllib3
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── _base_connection.cpython-312.pyc
│   │           │   │   ├── _collections.cpython-312.pyc
│   │           │   │   ├── _request_methods.cpython-312.pyc
│   │           │   │   ├── _version.cpython-312.pyc
│   │           │   │   ├── connection.cpython-312.pyc
│   │           │   │   ├── connectionpool.cpython-312.pyc
│   │           │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   ├── fields.cpython-312.pyc
│   │           │   │   ├── filepost.cpython-312.pyc
│   │           │   │   ├── poolmanager.cpython-312.pyc
│   │           │   │   └── response.cpython-312.pyc
│   │           │   ├── _base_connection.py
│   │           │   ├── _collections.py
│   │           │   ├── _request_methods.py
│   │           │   ├── _version.py
│   │           │   ├── connection.py
│   │           │   ├── connectionpool.py
│   │           │   ├── contrib
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── pyopenssl.cpython-312.pyc
│   │           │   │   │   └── socks.cpython-312.pyc
│   │           │   │   ├── emscripten
│   │           │   │   │   ├── __init__.py
│   │           │   │   │   ├── __pycache__
│   │           │   │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   │   ├── connection.cpython-312.pyc
│   │           │   │   │   │   ├── fetch.cpython-312.pyc
│   │           │   │   │   │   ├── request.cpython-312.pyc
│   │           │   │   │   │   └── response.cpython-312.pyc
│   │           │   │   │   ├── connection.py
│   │           │   │   │   ├── emscripten_fetch_worker.js
│   │           │   │   │   ├── fetch.py
│   │           │   │   │   ├── request.py
│   │           │   │   │   └── response.py
│   │           │   │   ├── pyopenssl.py
│   │           │   │   └── socks.py
│   │           │   ├── exceptions.py
│   │           │   ├── fields.py
│   │           │   ├── filepost.py
│   │           │   ├── http2
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── connection.cpython-312.pyc
│   │           │   │   │   └── probe.cpython-312.pyc
│   │           │   │   ├── connection.py
│   │           │   │   └── probe.py
│   │           │   ├── poolmanager.py
│   │           │   ├── py.typed
│   │           │   ├── response.py
│   │           │   └── util
│   │           │       ├── __init__.py
│   │           │       ├── __pycache__
│   │           │       │   ├── __init__.cpython-312.pyc
│   │           │       │   ├── connection.cpython-312.pyc
│   │           │       │   ├── proxy.cpython-312.pyc
│   │           │       │   ├── request.cpython-312.pyc
│   │           │       │   ├── response.cpython-312.pyc
│   │           │       │   ├── retry.cpython-312.pyc
│   │           │       │   ├── ssl_.cpython-312.pyc
│   │           │       │   ├── ssl_match_hostname.cpython-312.pyc
│   │           │       │   ├── ssltransport.cpython-312.pyc
│   │           │       │   ├── timeout.cpython-312.pyc
│   │           │       │   ├── url.cpython-312.pyc
│   │           │       │   ├── util.cpython-312.pyc
│   │           │       │   └── wait.cpython-312.pyc
│   │           │       ├── connection.py
│   │           │       ├── proxy.py
│   │           │       ├── request.py
│   │           │       ├── response.py
│   │           │       ├── retry.py
│   │           │       ├── ssl_.py
│   │           │       ├── ssl_match_hostname.py
│   │           │       ├── ssltransport.py
│   │           │       ├── timeout.py
│   │           │       ├── url.py
│   │           │       ├── util.py
│   │           │       └── wait.py
│   │           ├── urllib3-2.2.3.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── licenses
│   │           │   │   └── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   └── WHEEL
│   │           ├── useragent
│   │           │   ├── __init__.py
│   │           │   ├── __init__.pyc
│   │           │   ├── __pycache__
│   │           │   │   └── __init__.cpython-312.pyc
│   │           │   ├── resources
│   │           │   │   └── user_agent_data.json
│   │           │   └── test
│   │           │       ├── __init__.py
│   │           │       ├── __pycache__
│   │           │       │   └── __init__.cpython-312.pyc
│   │           │       ├── test_additional_os.json
│   │           │       ├── test_browser.json
│   │           │       ├── test_device.json
│   │           │       ├── test_firefox.json
│   │           │       ├── test_os.json
│   │           │       └── test_pgts_browser.json
│   │           ├── useragent-0.1.1.dist-info
│   │           │   ├── INSTALLER
│   │           │   ├── LICENSE.txt
│   │           │   ├── METADATA
│   │           │   ├── RECORD
│   │           │   ├── REQUESTED
│   │           │   ├── top_level.txt
│   │           │   └── WHEEL
│   │           ├── werkzeug
│   │           │   ├── __init__.py
│   │           │   ├── __pycache__
│   │           │   │   ├── __init__.cpython-312.pyc
│   │           │   │   ├── _internal.cpython-312.pyc
│   │           │   │   ├── _reloader.cpython-312.pyc
│   │           │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   ├── formparser.cpython-312.pyc
│   │           │   │   ├── http.cpython-312.pyc
│   │           │   │   ├── local.cpython-312.pyc
│   │           │   │   ├── security.cpython-312.pyc
│   │           │   │   ├── serving.cpython-312.pyc
│   │           │   │   ├── test.cpython-312.pyc
│   │           │   │   ├── testapp.cpython-312.pyc
│   │           │   │   ├── urls.cpython-312.pyc
│   │           │   │   ├── user_agent.cpython-312.pyc
│   │           │   │   ├── utils.cpython-312.pyc
│   │           │   │   └── wsgi.cpython-312.pyc
│   │           │   ├── _internal.py
│   │           │   ├── _reloader.py
│   │           │   ├── datastructures
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── accept.cpython-312.pyc
│   │           │   │   │   ├── auth.cpython-312.pyc
│   │           │   │   │   ├── cache_control.cpython-312.pyc
│   │           │   │   │   ├── csp.cpython-312.pyc
│   │           │   │   │   ├── etag.cpython-312.pyc
│   │           │   │   │   ├── file_storage.cpython-312.pyc
│   │           │   │   │   ├── headers.cpython-312.pyc
│   │           │   │   │   ├── mixins.cpython-312.pyc
│   │           │   │   │   ├── range.cpython-312.pyc
│   │           │   │   │   └── structures.cpython-312.pyc
│   │           │   │   ├── accept.py
│   │           │   │   ├── accept.pyi
│   │           │   │   ├── auth.py
│   │           │   │   ├── cache_control.py
│   │           │   │   ├── cache_control.pyi
│   │           │   │   ├── csp.py
│   │           │   │   ├── csp.pyi
│   │           │   │   ├── etag.py
│   │           │   │   ├── etag.pyi
│   │           │   │   ├── file_storage.py
│   │           │   │   ├── file_storage.pyi
│   │           │   │   ├── headers.py
│   │           │   │   ├── headers.pyi
│   │           │   │   ├── mixins.py
│   │           │   │   ├── mixins.pyi
│   │           │   │   ├── range.py
│   │           │   │   ├── range.pyi
│   │           │   │   ├── structures.py
│   │           │   │   └── structures.pyi
│   │           │   ├── debug
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── console.cpython-312.pyc
│   │           │   │   │   ├── repr.cpython-312.pyc
│   │           │   │   │   └── tbtools.cpython-312.pyc
│   │           │   │   ├── console.py
│   │           │   │   ├── repr.py
│   │           │   │   ├── shared
│   │           │   │   │   ├── console.png
│   │           │   │   │   ├── debugger.js
│   │           │   │   │   ├── ICON_LICENSE.md
│   │           │   │   │   ├── less.png
│   │           │   │   │   ├── more.png
│   │           │   │   │   └── style.css
│   │           │   │   └── tbtools.py
│   │           │   ├── exceptions.py
│   │           │   ├── formparser.py
│   │           │   ├── http.py
│   │           │   ├── local.py
│   │           │   ├── middleware
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── dispatcher.cpython-312.pyc
│   │           │   │   │   ├── http_proxy.cpython-312.pyc
│   │           │   │   │   ├── lint.cpython-312.pyc
│   │           │   │   │   ├── profiler.cpython-312.pyc
│   │           │   │   │   ├── proxy_fix.cpython-312.pyc
│   │           │   │   │   └── shared_data.cpython-312.pyc
│   │           │   │   ├── dispatcher.py
│   │           │   │   ├── http_proxy.py
│   │           │   │   ├── lint.py
│   │           │   │   ├── profiler.py
│   │           │   │   ├── proxy_fix.py
│   │           │   │   └── shared_data.py
│   │           │   ├── py.typed
│   │           │   ├── routing
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── converters.cpython-312.pyc
│   │           │   │   │   ├── exceptions.cpython-312.pyc
│   │           │   │   │   ├── map.cpython-312.pyc
│   │           │   │   │   ├── matcher.cpython-312.pyc
│   │           │   │   │   └── rules.cpython-312.pyc
│   │           │   │   ├── converters.py
│   │           │   │   ├── exceptions.py
│   │           │   │   ├── map.py
│   │           │   │   ├── matcher.py
│   │           │   │   └── rules.py
│   │           │   ├── sansio
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── http.cpython-312.pyc
│   │           │   │   │   ├── multipart.cpython-312.pyc
│   │           │   │   │   ├── request.cpython-312.pyc
│   │           │   │   │   ├── response.cpython-312.pyc
│   │           │   │   │   └── utils.cpython-312.pyc
│   │           │   │   ├── http.py
│   │           │   │   ├── multipart.py
│   │           │   │   ├── request.py
│   │           │   │   ├── response.py
│   │           │   │   └── utils.py
│   │           │   ├── security.py
│   │           │   ├── serving.py
│   │           │   ├── test.py
│   │           │   ├── testapp.py
│   │           │   ├── urls.py
│   │           │   ├── user_agent.py
│   │           │   ├── utils.py
│   │           │   ├── wrappers
│   │           │   │   ├── __init__.py
│   │           │   │   ├── __pycache__
│   │           │   │   │   ├── __init__.cpython-312.pyc
│   │           │   │   │   ├── request.cpython-312.pyc
│   │           │   │   │   └── response.cpython-312.pyc
│   │           │   │   ├── request.py
│   │           │   │   └── response.py
│   │           │   └── wsgi.py
│   │           └── werkzeug-3.0.4.dist-info
│   │               ├── INSTALLER
│   │               ├── LICENSE.txt
│   │               ├── METADATA
│   │               ├── RECORD
│   │               └── WHEEL
│   ├── pyvenv.cfg
│   ├── static
│   │   └── styles.css
│   ├── templates
│   │   └── index.html
│   └── test.py
├── cline_config.json
├── mcp_server.py
├── README.md
├── search_results.json
├── settings.json
└── test_files
    ├── text1.txt
    └── text2.txt
```

# Files

--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py:
--------------------------------------------------------------------------------

```python
   1 | # -*- coding: utf-8 -*-
   2 | #
   3 | # Copyright (C) 2013-2023 Vinay Sajip.
   4 | # Licensed to the Python Software Foundation under a contributor agreement.
   5 | # See LICENSE.txt and CONTRIBUTORS.txt.
   6 | #
   7 | from __future__ import unicode_literals
   8 | 
   9 | import base64
  10 | import codecs
  11 | import datetime
  12 | from email import message_from_file
  13 | import hashlib
  14 | import json
  15 | import logging
  16 | import os
  17 | import posixpath
  18 | import re
  19 | import shutil
  20 | import sys
  21 | import tempfile
  22 | import zipfile
  23 | 
  24 | from . import __version__, DistlibException
  25 | from .compat import sysconfig, ZipFile, fsdecode, text_type, filter
  26 | from .database import InstalledDistribution
  27 | from .metadata import Metadata, WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME
  28 | from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache,
  29 |                    cached_property, get_cache_base, read_exports, tempdir,
  30 |                    get_platform)
  31 | from .version import NormalizedVersion, UnsupportedVersionError
  32 | 
  33 | logger = logging.getLogger(__name__)
  34 | 
  35 | cache = None  # created when needed
  36 | 
  37 | if hasattr(sys, 'pypy_version_info'):  # pragma: no cover
  38 |     IMP_PREFIX = 'pp'
  39 | elif sys.platform.startswith('java'):  # pragma: no cover
  40 |     IMP_PREFIX = 'jy'
  41 | elif sys.platform == 'cli':  # pragma: no cover
  42 |     IMP_PREFIX = 'ip'
  43 | else:
  44 |     IMP_PREFIX = 'cp'
  45 | 
  46 | VER_SUFFIX = sysconfig.get_config_var('py_version_nodot')
  47 | if not VER_SUFFIX:  # pragma: no cover
  48 |     VER_SUFFIX = '%s%s' % sys.version_info[:2]
  49 | PYVER = 'py' + VER_SUFFIX
  50 | IMPVER = IMP_PREFIX + VER_SUFFIX
  51 | 
  52 | ARCH = get_platform().replace('-', '_').replace('.', '_')
  53 | 
  54 | ABI = sysconfig.get_config_var('SOABI')
  55 | if ABI and ABI.startswith('cpython-'):
  56 |     ABI = ABI.replace('cpython-', 'cp').split('-')[0]
  57 | else:
  58 | 
  59 |     def _derive_abi():
  60 |         parts = ['cp', VER_SUFFIX]
  61 |         if sysconfig.get_config_var('Py_DEBUG'):
  62 |             parts.append('d')
  63 |         if IMP_PREFIX == 'cp':
  64 |             vi = sys.version_info[:2]
  65 |             if vi < (3, 8):
  66 |                 wpm = sysconfig.get_config_var('WITH_PYMALLOC')
  67 |                 if wpm is None:
  68 |                     wpm = True
  69 |                 if wpm:
  70 |                     parts.append('m')
  71 |                 if vi < (3, 3):
  72 |                     us = sysconfig.get_config_var('Py_UNICODE_SIZE')
  73 |                     if us == 4 or (us is None and sys.maxunicode == 0x10FFFF):
  74 |                         parts.append('u')
  75 |         return ''.join(parts)
  76 | 
  77 |     ABI = _derive_abi()
  78 |     del _derive_abi
  79 | 
  80 | FILENAME_RE = re.compile(
  81 |     r'''
  82 | (?P<nm>[^-]+)
  83 | -(?P<vn>\d+[^-]*)
  84 | (-(?P<bn>\d+[^-]*))?
  85 | -(?P<py>\w+\d+(\.\w+\d+)*)
  86 | -(?P<bi>\w+)
  87 | -(?P<ar>\w+(\.\w+)*)
  88 | \.whl$
  89 | ''', re.IGNORECASE | re.VERBOSE)
  90 | 
  91 | NAME_VERSION_RE = re.compile(
  92 |     r'''
  93 | (?P<nm>[^-]+)
  94 | -(?P<vn>\d+[^-]*)
  95 | (-(?P<bn>\d+[^-]*))?$
  96 | ''', re.IGNORECASE | re.VERBOSE)
  97 | 
  98 | SHEBANG_RE = re.compile(br'\s*#![^\r\n]*')
  99 | SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$')
 100 | SHEBANG_PYTHON = b'#!python'
 101 | SHEBANG_PYTHONW = b'#!pythonw'
 102 | 
 103 | if os.sep == '/':
 104 |     to_posix = lambda o: o
 105 | else:
 106 |     to_posix = lambda o: o.replace(os.sep, '/')
 107 | 
 108 | if sys.version_info[0] < 3:
 109 |     import imp
 110 | else:
 111 |     imp = None
 112 |     import importlib.machinery
 113 |     import importlib.util
 114 | 
 115 | 
 116 | def _get_suffixes():
 117 |     if imp:
 118 |         return [s[0] for s in imp.get_suffixes()]
 119 |     else:
 120 |         return importlib.machinery.EXTENSION_SUFFIXES
 121 | 
 122 | 
 123 | def _load_dynamic(name, path):
 124 |     # https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly
 125 |     if imp:
 126 |         return imp.load_dynamic(name, path)
 127 |     else:
 128 |         spec = importlib.util.spec_from_file_location(name, path)
 129 |         module = importlib.util.module_from_spec(spec)
 130 |         sys.modules[name] = module
 131 |         spec.loader.exec_module(module)
 132 |         return module
 133 | 
 134 | 
 135 | class Mounter(object):
 136 | 
 137 |     def __init__(self):
 138 |         self.impure_wheels = {}
 139 |         self.libs = {}
 140 | 
 141 |     def add(self, pathname, extensions):
 142 |         self.impure_wheels[pathname] = extensions
 143 |         self.libs.update(extensions)
 144 | 
 145 |     def remove(self, pathname):
 146 |         extensions = self.impure_wheels.pop(pathname)
 147 |         for k, v in extensions:
 148 |             if k in self.libs:
 149 |                 del self.libs[k]
 150 | 
 151 |     def find_module(self, fullname, path=None):
 152 |         if fullname in self.libs:
 153 |             result = self
 154 |         else:
 155 |             result = None
 156 |         return result
 157 | 
 158 |     def load_module(self, fullname):
 159 |         if fullname in sys.modules:
 160 |             result = sys.modules[fullname]
 161 |         else:
 162 |             if fullname not in self.libs:
 163 |                 raise ImportError('unable to find extension for %s' % fullname)
 164 |             result = _load_dynamic(fullname, self.libs[fullname])
 165 |             result.__loader__ = self
 166 |             parts = fullname.rsplit('.', 1)
 167 |             if len(parts) > 1:
 168 |                 result.__package__ = parts[0]
 169 |         return result
 170 | 
 171 | 
 172 | _hook = Mounter()
 173 | 
 174 | 
 175 | class Wheel(object):
 176 |     """
 177 |     Class to build and install from Wheel files (PEP 427).
 178 |     """
 179 | 
 180 |     wheel_version = (1, 1)
 181 |     hash_kind = 'sha256'
 182 | 
 183 |     def __init__(self, filename=None, sign=False, verify=False):
 184 |         """
 185 |         Initialise an instance using a (valid) filename.
 186 |         """
 187 |         self.sign = sign
 188 |         self.should_verify = verify
 189 |         self.buildver = ''
 190 |         self.pyver = [PYVER]
 191 |         self.abi = ['none']
 192 |         self.arch = ['any']
 193 |         self.dirname = os.getcwd()
 194 |         if filename is None:
 195 |             self.name = 'dummy'
 196 |             self.version = '0.1'
 197 |             self._filename = self.filename
 198 |         else:
 199 |             m = NAME_VERSION_RE.match(filename)
 200 |             if m:
 201 |                 info = m.groupdict('')
 202 |                 self.name = info['nm']
 203 |                 # Reinstate the local version separator
 204 |                 self.version = info['vn'].replace('_', '-')
 205 |                 self.buildver = info['bn']
 206 |                 self._filename = self.filename
 207 |             else:
 208 |                 dirname, filename = os.path.split(filename)
 209 |                 m = FILENAME_RE.match(filename)
 210 |                 if not m:
 211 |                     raise DistlibException('Invalid name or '
 212 |                                            'filename: %r' % filename)
 213 |                 if dirname:
 214 |                     self.dirname = os.path.abspath(dirname)
 215 |                 self._filename = filename
 216 |                 info = m.groupdict('')
 217 |                 self.name = info['nm']
 218 |                 self.version = info['vn']
 219 |                 self.buildver = info['bn']
 220 |                 self.pyver = info['py'].split('.')
 221 |                 self.abi = info['bi'].split('.')
 222 |                 self.arch = info['ar'].split('.')
 223 | 
 224 |     @property
 225 |     def filename(self):
 226 |         """
 227 |         Build and return a filename from the various components.
 228 |         """
 229 |         if self.buildver:
 230 |             buildver = '-' + self.buildver
 231 |         else:
 232 |             buildver = ''
 233 |         pyver = '.'.join(self.pyver)
 234 |         abi = '.'.join(self.abi)
 235 |         arch = '.'.join(self.arch)
 236 |         # replace - with _ as a local version separator
 237 |         version = self.version.replace('-', '_')
 238 |         return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, pyver,
 239 |                                          abi, arch)
 240 | 
 241 |     @property
 242 |     def exists(self):
 243 |         path = os.path.join(self.dirname, self.filename)
 244 |         return os.path.isfile(path)
 245 | 
 246 |     @property
 247 |     def tags(self):
 248 |         for pyver in self.pyver:
 249 |             for abi in self.abi:
 250 |                 for arch in self.arch:
 251 |                     yield pyver, abi, arch
 252 | 
 253 |     @cached_property
 254 |     def metadata(self):
 255 |         pathname = os.path.join(self.dirname, self.filename)
 256 |         name_ver = '%s-%s' % (self.name, self.version)
 257 |         info_dir = '%s.dist-info' % name_ver
 258 |         wrapper = codecs.getreader('utf-8')
 259 |         with ZipFile(pathname, 'r') as zf:
 260 |             self.get_wheel_metadata(zf)
 261 |             # wv = wheel_metadata['Wheel-Version'].split('.', 1)
 262 |             # file_version = tuple([int(i) for i in wv])
 263 |             # if file_version < (1, 1):
 264 |             # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME,
 265 |             # LEGACY_METADATA_FILENAME]
 266 |             # else:
 267 |             # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME]
 268 |             fns = [WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME]
 269 |             result = None
 270 |             for fn in fns:
 271 |                 try:
 272 |                     metadata_filename = posixpath.join(info_dir, fn)
 273 |                     with zf.open(metadata_filename) as bf:
 274 |                         wf = wrapper(bf)
 275 |                         result = Metadata(fileobj=wf)
 276 |                         if result:
 277 |                             break
 278 |                 except KeyError:
 279 |                     pass
 280 |             if not result:
 281 |                 raise ValueError('Invalid wheel, because metadata is '
 282 |                                  'missing: looked in %s' % ', '.join(fns))
 283 |         return result
 284 | 
 285 |     def get_wheel_metadata(self, zf):
 286 |         name_ver = '%s-%s' % (self.name, self.version)
 287 |         info_dir = '%s.dist-info' % name_ver
 288 |         metadata_filename = posixpath.join(info_dir, 'WHEEL')
 289 |         with zf.open(metadata_filename) as bf:
 290 |             wf = codecs.getreader('utf-8')(bf)
 291 |             message = message_from_file(wf)
 292 |         return dict(message)
 293 | 
 294 |     @cached_property
 295 |     def info(self):
 296 |         pathname = os.path.join(self.dirname, self.filename)
 297 |         with ZipFile(pathname, 'r') as zf:
 298 |             result = self.get_wheel_metadata(zf)
 299 |         return result
 300 | 
 301 |     def process_shebang(self, data):
 302 |         m = SHEBANG_RE.match(data)
 303 |         if m:
 304 |             end = m.end()
 305 |             shebang, data_after_shebang = data[:end], data[end:]
 306 |             # Preserve any arguments after the interpreter
 307 |             if b'pythonw' in shebang.lower():
 308 |                 shebang_python = SHEBANG_PYTHONW
 309 |             else:
 310 |                 shebang_python = SHEBANG_PYTHON
 311 |             m = SHEBANG_DETAIL_RE.match(shebang)
 312 |             if m:
 313 |                 args = b' ' + m.groups()[-1]
 314 |             else:
 315 |                 args = b''
 316 |             shebang = shebang_python + args
 317 |             data = shebang + data_after_shebang
 318 |         else:
 319 |             cr = data.find(b'\r')
 320 |             lf = data.find(b'\n')
 321 |             if cr < 0 or cr > lf:
 322 |                 term = b'\n'
 323 |             else:
 324 |                 if data[cr:cr + 2] == b'\r\n':
 325 |                     term = b'\r\n'
 326 |                 else:
 327 |                     term = b'\r'
 328 |             data = SHEBANG_PYTHON + term + data
 329 |         return data
 330 | 
 331 |     def get_hash(self, data, hash_kind=None):
 332 |         if hash_kind is None:
 333 |             hash_kind = self.hash_kind
 334 |         try:
 335 |             hasher = getattr(hashlib, hash_kind)
 336 |         except AttributeError:
 337 |             raise DistlibException('Unsupported hash algorithm: %r' %
 338 |                                    hash_kind)
 339 |         result = hasher(data).digest()
 340 |         result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii')
 341 |         return hash_kind, result
 342 | 
 343 |     def write_record(self, records, record_path, archive_record_path):
 344 |         records = list(records)  # make a copy, as mutated
 345 |         records.append((archive_record_path, '', ''))
 346 |         with CSVWriter(record_path) as writer:
 347 |             for row in records:
 348 |                 writer.writerow(row)
 349 | 
 350 |     def write_records(self, info, libdir, archive_paths):
 351 |         records = []
 352 |         distinfo, info_dir = info
 353 |         # hasher = getattr(hashlib, self.hash_kind)
 354 |         for ap, p in archive_paths:
 355 |             with open(p, 'rb') as f:
 356 |                 data = f.read()
 357 |             digest = '%s=%s' % self.get_hash(data)
 358 |             size = os.path.getsize(p)
 359 |             records.append((ap, digest, size))
 360 | 
 361 |         p = os.path.join(distinfo, 'RECORD')
 362 |         ap = to_posix(os.path.join(info_dir, 'RECORD'))
 363 |         self.write_record(records, p, ap)
 364 |         archive_paths.append((ap, p))
 365 | 
 366 |     def build_zip(self, pathname, archive_paths):
 367 |         with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf:
 368 |             for ap, p in archive_paths:
 369 |                 logger.debug('Wrote %s to %s in wheel', p, ap)
 370 |                 zf.write(p, ap)
 371 | 
 372 |     def build(self, paths, tags=None, wheel_version=None):
 373 |         """
 374 |         Build a wheel from files in specified paths, and use any specified tags
 375 |         when determining the name of the wheel.
 376 |         """
 377 |         if tags is None:
 378 |             tags = {}
 379 | 
 380 |         libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0]
 381 |         if libkey == 'platlib':
 382 |             is_pure = 'false'
 383 |             default_pyver = [IMPVER]
 384 |             default_abi = [ABI]
 385 |             default_arch = [ARCH]
 386 |         else:
 387 |             is_pure = 'true'
 388 |             default_pyver = [PYVER]
 389 |             default_abi = ['none']
 390 |             default_arch = ['any']
 391 | 
 392 |         self.pyver = tags.get('pyver', default_pyver)
 393 |         self.abi = tags.get('abi', default_abi)
 394 |         self.arch = tags.get('arch', default_arch)
 395 | 
 396 |         libdir = paths[libkey]
 397 | 
 398 |         name_ver = '%s-%s' % (self.name, self.version)
 399 |         data_dir = '%s.data' % name_ver
 400 |         info_dir = '%s.dist-info' % name_ver
 401 | 
 402 |         archive_paths = []
 403 | 
 404 |         # First, stuff which is not in site-packages
 405 |         for key in ('data', 'headers', 'scripts'):
 406 |             if key not in paths:
 407 |                 continue
 408 |             path = paths[key]
 409 |             if os.path.isdir(path):
 410 |                 for root, dirs, files in os.walk(path):
 411 |                     for fn in files:
 412 |                         p = fsdecode(os.path.join(root, fn))
 413 |                         rp = os.path.relpath(p, path)
 414 |                         ap = to_posix(os.path.join(data_dir, key, rp))
 415 |                         archive_paths.append((ap, p))
 416 |                         if key == 'scripts' and not p.endswith('.exe'):
 417 |                             with open(p, 'rb') as f:
 418 |                                 data = f.read()
 419 |                             data = self.process_shebang(data)
 420 |                             with open(p, 'wb') as f:
 421 |                                 f.write(data)
 422 | 
 423 |         # Now, stuff which is in site-packages, other than the
 424 |         # distinfo stuff.
 425 |         path = libdir
 426 |         distinfo = None
 427 |         for root, dirs, files in os.walk(path):
 428 |             if root == path:
 429 |                 # At the top level only, save distinfo for later
 430 |                 # and skip it for now
 431 |                 for i, dn in enumerate(dirs):
 432 |                     dn = fsdecode(dn)
 433 |                     if dn.endswith('.dist-info'):
 434 |                         distinfo = os.path.join(root, dn)
 435 |                         del dirs[i]
 436 |                         break
 437 |                 assert distinfo, '.dist-info directory expected, not found'
 438 | 
 439 |             for fn in files:
 440 |                 # comment out next suite to leave .pyc files in
 441 |                 if fsdecode(fn).endswith(('.pyc', '.pyo')):
 442 |                     continue
 443 |                 p = os.path.join(root, fn)
 444 |                 rp = to_posix(os.path.relpath(p, path))
 445 |                 archive_paths.append((rp, p))
 446 | 
 447 |         # Now distinfo. Assumed to be flat, i.e. os.listdir is enough.
 448 |         files = os.listdir(distinfo)
 449 |         for fn in files:
 450 |             if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'):
 451 |                 p = fsdecode(os.path.join(distinfo, fn))
 452 |                 ap = to_posix(os.path.join(info_dir, fn))
 453 |                 archive_paths.append((ap, p))
 454 | 
 455 |         wheel_metadata = [
 456 |             'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version),
 457 |             'Generator: distlib %s' % __version__,
 458 |             'Root-Is-Purelib: %s' % is_pure,
 459 |         ]
 460 |         for pyver, abi, arch in self.tags:
 461 |             wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch))
 462 |         p = os.path.join(distinfo, 'WHEEL')
 463 |         with open(p, 'w') as f:
 464 |             f.write('\n'.join(wheel_metadata))
 465 |         ap = to_posix(os.path.join(info_dir, 'WHEEL'))
 466 |         archive_paths.append((ap, p))
 467 | 
 468 |         # sort the entries by archive path. Not needed by any spec, but it
 469 |         # keeps the archive listing and RECORD tidier than they would otherwise
 470 |         # be. Use the number of path segments to keep directory entries together,
 471 |         # and keep the dist-info stuff at the end.
 472 |         def sorter(t):
 473 |             ap = t[0]
 474 |             n = ap.count('/')
 475 |             if '.dist-info' in ap:
 476 |                 n += 10000
 477 |             return (n, ap)
 478 | 
 479 |         archive_paths = sorted(archive_paths, key=sorter)
 480 | 
 481 |         # Now, at last, RECORD.
 482 |         # Paths in here are archive paths - nothing else makes sense.
 483 |         self.write_records((distinfo, info_dir), libdir, archive_paths)
 484 |         # Now, ready to build the zip file
 485 |         pathname = os.path.join(self.dirname, self.filename)
 486 |         self.build_zip(pathname, archive_paths)
 487 |         return pathname
 488 | 
 489 |     def skip_entry(self, arcname):
 490 |         """
 491 |         Determine whether an archive entry should be skipped when verifying
 492 |         or installing.
 493 |         """
 494 |         # The signature file won't be in RECORD,
 495 |         # and we  don't currently don't do anything with it
 496 |         # We also skip directories, as they won't be in RECORD
 497 |         # either. See:
 498 |         #
 499 |         # https://github.com/pypa/wheel/issues/294
 500 |         # https://github.com/pypa/wheel/issues/287
 501 |         # https://github.com/pypa/wheel/pull/289
 502 |         #
 503 |         return arcname.endswith(('/', '/RECORD.jws'))
 504 | 
 505 |     def install(self, paths, maker, **kwargs):
 506 |         """
 507 |         Install a wheel to the specified paths. If kwarg ``warner`` is
 508 |         specified, it should be a callable, which will be called with two
 509 |         tuples indicating the wheel version of this software and the wheel
 510 |         version in the file, if there is a discrepancy in the versions.
 511 |         This can be used to issue any warnings to raise any exceptions.
 512 |         If kwarg ``lib_only`` is True, only the purelib/platlib files are
 513 |         installed, and the headers, scripts, data and dist-info metadata are
 514 |         not written. If kwarg ``bytecode_hashed_invalidation`` is True, written
 515 |         bytecode will try to use file-hash based invalidation (PEP-552) on
 516 |         supported interpreter versions (CPython 2.7+).
 517 | 
 518 |         The return value is a :class:`InstalledDistribution` instance unless
 519 |         ``options.lib_only`` is True, in which case the return value is ``None``.
 520 |         """
 521 | 
 522 |         dry_run = maker.dry_run
 523 |         warner = kwargs.get('warner')
 524 |         lib_only = kwargs.get('lib_only', False)
 525 |         bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation',
 526 |                                             False)
 527 | 
 528 |         pathname = os.path.join(self.dirname, self.filename)
 529 |         name_ver = '%s-%s' % (self.name, self.version)
 530 |         data_dir = '%s.data' % name_ver
 531 |         info_dir = '%s.dist-info' % name_ver
 532 | 
 533 |         metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME)
 534 |         wheel_metadata_name = posixpath.join(info_dir, 'WHEEL')
 535 |         record_name = posixpath.join(info_dir, 'RECORD')
 536 | 
 537 |         wrapper = codecs.getreader('utf-8')
 538 | 
 539 |         with ZipFile(pathname, 'r') as zf:
 540 |             with zf.open(wheel_metadata_name) as bwf:
 541 |                 wf = wrapper(bwf)
 542 |                 message = message_from_file(wf)
 543 |             wv = message['Wheel-Version'].split('.', 1)
 544 |             file_version = tuple([int(i) for i in wv])
 545 |             if (file_version != self.wheel_version) and warner:
 546 |                 warner(self.wheel_version, file_version)
 547 | 
 548 |             if message['Root-Is-Purelib'] == 'true':
 549 |                 libdir = paths['purelib']
 550 |             else:
 551 |                 libdir = paths['platlib']
 552 | 
 553 |             records = {}
 554 |             with zf.open(record_name) as bf:
 555 |                 with CSVReader(stream=bf) as reader:
 556 |                     for row in reader:
 557 |                         p = row[0]
 558 |                         records[p] = row
 559 | 
 560 |             data_pfx = posixpath.join(data_dir, '')
 561 |             info_pfx = posixpath.join(info_dir, '')
 562 |             script_pfx = posixpath.join(data_dir, 'scripts', '')
 563 | 
 564 |             # make a new instance rather than a copy of maker's,
 565 |             # as we mutate it
 566 |             fileop = FileOperator(dry_run=dry_run)
 567 |             fileop.record = True  # so we can rollback if needed
 568 | 
 569 |             bc = not sys.dont_write_bytecode  # Double negatives. Lovely!
 570 | 
 571 |             outfiles = []  # for RECORD writing
 572 | 
 573 |             # for script copying/shebang processing
 574 |             workdir = tempfile.mkdtemp()
 575 |             # set target dir later
 576 |             # we default add_launchers to False, as the
 577 |             # Python Launcher should be used instead
 578 |             maker.source_dir = workdir
 579 |             maker.target_dir = None
 580 |             try:
 581 |                 for zinfo in zf.infolist():
 582 |                     arcname = zinfo.filename
 583 |                     if isinstance(arcname, text_type):
 584 |                         u_arcname = arcname
 585 |                     else:
 586 |                         u_arcname = arcname.decode('utf-8')
 587 |                     if self.skip_entry(u_arcname):
 588 |                         continue
 589 |                     row = records[u_arcname]
 590 |                     if row[2] and str(zinfo.file_size) != row[2]:
 591 |                         raise DistlibException('size mismatch for '
 592 |                                                '%s' % u_arcname)
 593 |                     if row[1]:
 594 |                         kind, value = row[1].split('=', 1)
 595 |                         with zf.open(arcname) as bf:
 596 |                             data = bf.read()
 597 |                         _, digest = self.get_hash(data, kind)
 598 |                         if digest != value:
 599 |                             raise DistlibException('digest mismatch for '
 600 |                                                    '%s' % arcname)
 601 | 
 602 |                     if lib_only and u_arcname.startswith((info_pfx, data_pfx)):
 603 |                         logger.debug('lib_only: skipping %s', u_arcname)
 604 |                         continue
 605 |                     is_script = (u_arcname.startswith(script_pfx)
 606 |                                  and not u_arcname.endswith('.exe'))
 607 | 
 608 |                     if u_arcname.startswith(data_pfx):
 609 |                         _, where, rp = u_arcname.split('/', 2)
 610 |                         outfile = os.path.join(paths[where], convert_path(rp))
 611 |                     else:
 612 |                         # meant for site-packages.
 613 |                         if u_arcname in (wheel_metadata_name, record_name):
 614 |                             continue
 615 |                         outfile = os.path.join(libdir, convert_path(u_arcname))
 616 |                     if not is_script:
 617 |                         with zf.open(arcname) as bf:
 618 |                             fileop.copy_stream(bf, outfile)
 619 |                         # Issue #147: permission bits aren't preserved. Using
 620 |                         # zf.extract(zinfo, libdir) should have worked, but didn't,
 621 |                         # see https://www.thetopsites.net/article/53834422.shtml
 622 |                         # So ... manually preserve permission bits as given in zinfo
 623 |                         if os.name == 'posix':
 624 |                             # just set the normal permission bits
 625 |                             os.chmod(outfile,
 626 |                                      (zinfo.external_attr >> 16) & 0x1FF)
 627 |                         outfiles.append(outfile)
 628 |                         # Double check the digest of the written file
 629 |                         if not dry_run and row[1]:
 630 |                             with open(outfile, 'rb') as bf:
 631 |                                 data = bf.read()
 632 |                                 _, newdigest = self.get_hash(data, kind)
 633 |                                 if newdigest != digest:
 634 |                                     raise DistlibException('digest mismatch '
 635 |                                                            'on write for '
 636 |                                                            '%s' % outfile)
 637 |                         if bc and outfile.endswith('.py'):
 638 |                             try:
 639 |                                 pyc = fileop.byte_compile(
 640 |                                     outfile,
 641 |                                     hashed_invalidation=bc_hashed_invalidation)
 642 |                                 outfiles.append(pyc)
 643 |                             except Exception:
 644 |                                 # Don't give up if byte-compilation fails,
 645 |                                 # but log it and perhaps warn the user
 646 |                                 logger.warning('Byte-compilation failed',
 647 |                                                exc_info=True)
 648 |                     else:
 649 |                         fn = os.path.basename(convert_path(arcname))
 650 |                         workname = os.path.join(workdir, fn)
 651 |                         with zf.open(arcname) as bf:
 652 |                             fileop.copy_stream(bf, workname)
 653 | 
 654 |                         dn, fn = os.path.split(outfile)
 655 |                         maker.target_dir = dn
 656 |                         filenames = maker.make(fn)
 657 |                         fileop.set_executable_mode(filenames)
 658 |                         outfiles.extend(filenames)
 659 | 
 660 |                 if lib_only:
 661 |                     logger.debug('lib_only: returning None')
 662 |                     dist = None
 663 |                 else:
 664 |                     # Generate scripts
 665 | 
 666 |                     # Try to get pydist.json so we can see if there are
 667 |                     # any commands to generate. If this fails (e.g. because
 668 |                     # of a legacy wheel), log a warning but don't give up.
 669 |                     commands = None
 670 |                     file_version = self.info['Wheel-Version']
 671 |                     if file_version == '1.0':
 672 |                         # Use legacy info
 673 |                         ep = posixpath.join(info_dir, 'entry_points.txt')
 674 |                         try:
 675 |                             with zf.open(ep) as bwf:
 676 |                                 epdata = read_exports(bwf)
 677 |                             commands = {}
 678 |                             for key in ('console', 'gui'):
 679 |                                 k = '%s_scripts' % key
 680 |                                 if k in epdata:
 681 |                                     commands['wrap_%s' % key] = d = {}
 682 |                                     for v in epdata[k].values():
 683 |                                         s = '%s:%s' % (v.prefix, v.suffix)
 684 |                                         if v.flags:
 685 |                                             s += ' [%s]' % ','.join(v.flags)
 686 |                                         d[v.name] = s
 687 |                         except Exception:
 688 |                             logger.warning('Unable to read legacy script '
 689 |                                            'metadata, so cannot generate '
 690 |                                            'scripts')
 691 |                     else:
 692 |                         try:
 693 |                             with zf.open(metadata_name) as bwf:
 694 |                                 wf = wrapper(bwf)
 695 |                                 commands = json.load(wf).get('extensions')
 696 |                                 if commands:
 697 |                                     commands = commands.get('python.commands')
 698 |                         except Exception:
 699 |                             logger.warning('Unable to read JSON metadata, so '
 700 |                                            'cannot generate scripts')
 701 |                     if commands:
 702 |                         console_scripts = commands.get('wrap_console', {})
 703 |                         gui_scripts = commands.get('wrap_gui', {})
 704 |                         if console_scripts or gui_scripts:
 705 |                             script_dir = paths.get('scripts', '')
 706 |                             if not os.path.isdir(script_dir):
 707 |                                 raise ValueError('Valid script path not '
 708 |                                                  'specified')
 709 |                             maker.target_dir = script_dir
 710 |                             for k, v in console_scripts.items():
 711 |                                 script = '%s = %s' % (k, v)
 712 |                                 filenames = maker.make(script)
 713 |                                 fileop.set_executable_mode(filenames)
 714 | 
 715 |                             if gui_scripts:
 716 |                                 options = {'gui': True}
 717 |                                 for k, v in gui_scripts.items():
 718 |                                     script = '%s = %s' % (k, v)
 719 |                                     filenames = maker.make(script, options)
 720 |                                     fileop.set_executable_mode(filenames)
 721 | 
 722 |                     p = os.path.join(libdir, info_dir)
 723 |                     dist = InstalledDistribution(p)
 724 | 
 725 |                     # Write SHARED
 726 |                     paths = dict(paths)  # don't change passed in dict
 727 |                     del paths['purelib']
 728 |                     del paths['platlib']
 729 |                     paths['lib'] = libdir
 730 |                     p = dist.write_shared_locations(paths, dry_run)
 731 |                     if p:
 732 |                         outfiles.append(p)
 733 | 
 734 |                     # Write RECORD
 735 |                     dist.write_installed_files(outfiles, paths['prefix'],
 736 |                                                dry_run)
 737 |                 return dist
 738 |             except Exception:  # pragma: no cover
 739 |                 logger.exception('installation failed.')
 740 |                 fileop.rollback()
 741 |                 raise
 742 |             finally:
 743 |                 shutil.rmtree(workdir)
 744 | 
 745 |     def _get_dylib_cache(self):
 746 |         global cache
 747 |         if cache is None:
 748 |             # Use native string to avoid issues on 2.x: see Python #20140.
 749 |             base = os.path.join(get_cache_base(), str('dylib-cache'),
 750 |                                 '%s.%s' % sys.version_info[:2])
 751 |             cache = Cache(base)
 752 |         return cache
 753 | 
 754 |     def _get_extensions(self):
 755 |         pathname = os.path.join(self.dirname, self.filename)
 756 |         name_ver = '%s-%s' % (self.name, self.version)
 757 |         info_dir = '%s.dist-info' % name_ver
 758 |         arcname = posixpath.join(info_dir, 'EXTENSIONS')
 759 |         wrapper = codecs.getreader('utf-8')
 760 |         result = []
 761 |         with ZipFile(pathname, 'r') as zf:
 762 |             try:
 763 |                 with zf.open(arcname) as bf:
 764 |                     wf = wrapper(bf)
 765 |                     extensions = json.load(wf)
 766 |                     cache = self._get_dylib_cache()
 767 |                     prefix = cache.prefix_to_dir(pathname)
 768 |                     cache_base = os.path.join(cache.base, prefix)
 769 |                     if not os.path.isdir(cache_base):
 770 |                         os.makedirs(cache_base)
 771 |                     for name, relpath in extensions.items():
 772 |                         dest = os.path.join(cache_base, convert_path(relpath))
 773 |                         if not os.path.exists(dest):
 774 |                             extract = True
 775 |                         else:
 776 |                             file_time = os.stat(dest).st_mtime
 777 |                             file_time = datetime.datetime.fromtimestamp(
 778 |                                 file_time)
 779 |                             info = zf.getinfo(relpath)
 780 |                             wheel_time = datetime.datetime(*info.date_time)
 781 |                             extract = wheel_time > file_time
 782 |                         if extract:
 783 |                             zf.extract(relpath, cache_base)
 784 |                         result.append((name, dest))
 785 |             except KeyError:
 786 |                 pass
 787 |         return result
 788 | 
 789 |     def is_compatible(self):
 790 |         """
 791 |         Determine if a wheel is compatible with the running system.
 792 |         """
 793 |         return is_compatible(self)
 794 | 
 795 |     def is_mountable(self):
 796 |         """
 797 |         Determine if a wheel is asserted as mountable by its metadata.
 798 |         """
 799 |         return True  # for now - metadata details TBD
 800 | 
 801 |     def mount(self, append=False):
 802 |         pathname = os.path.abspath(os.path.join(self.dirname, self.filename))
 803 |         if not self.is_compatible():
 804 |             msg = 'Wheel %s not compatible with this Python.' % pathname
 805 |             raise DistlibException(msg)
 806 |         if not self.is_mountable():
 807 |             msg = 'Wheel %s is marked as not mountable.' % pathname
 808 |             raise DistlibException(msg)
 809 |         if pathname in sys.path:
 810 |             logger.debug('%s already in path', pathname)
 811 |         else:
 812 |             if append:
 813 |                 sys.path.append(pathname)
 814 |             else:
 815 |                 sys.path.insert(0, pathname)
 816 |             extensions = self._get_extensions()
 817 |             if extensions:
 818 |                 if _hook not in sys.meta_path:
 819 |                     sys.meta_path.append(_hook)
 820 |                 _hook.add(pathname, extensions)
 821 | 
 822 |     def unmount(self):
 823 |         pathname = os.path.abspath(os.path.join(self.dirname, self.filename))
 824 |         if pathname not in sys.path:
 825 |             logger.debug('%s not in path', pathname)
 826 |         else:
 827 |             sys.path.remove(pathname)
 828 |             if pathname in _hook.impure_wheels:
 829 |                 _hook.remove(pathname)
 830 |             if not _hook.impure_wheels:
 831 |                 if _hook in sys.meta_path:
 832 |                     sys.meta_path.remove(_hook)
 833 | 
 834 |     def verify(self):
 835 |         pathname = os.path.join(self.dirname, self.filename)
 836 |         name_ver = '%s-%s' % (self.name, self.version)
 837 |         # data_dir = '%s.data' % name_ver
 838 |         info_dir = '%s.dist-info' % name_ver
 839 | 
 840 |         # metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME)
 841 |         wheel_metadata_name = posixpath.join(info_dir, 'WHEEL')
 842 |         record_name = posixpath.join(info_dir, 'RECORD')
 843 | 
 844 |         wrapper = codecs.getreader('utf-8')
 845 | 
 846 |         with ZipFile(pathname, 'r') as zf:
 847 |             with zf.open(wheel_metadata_name) as bwf:
 848 |                 wf = wrapper(bwf)
 849 |                 message_from_file(wf)
 850 |             # wv = message['Wheel-Version'].split('.', 1)
 851 |             # file_version = tuple([int(i) for i in wv])
 852 |             # TODO version verification
 853 | 
 854 |             records = {}
 855 |             with zf.open(record_name) as bf:
 856 |                 with CSVReader(stream=bf) as reader:
 857 |                     for row in reader:
 858 |                         p = row[0]
 859 |                         records[p] = row
 860 | 
 861 |             for zinfo in zf.infolist():
 862 |                 arcname = zinfo.filename
 863 |                 if isinstance(arcname, text_type):
 864 |                     u_arcname = arcname
 865 |                 else:
 866 |                     u_arcname = arcname.decode('utf-8')
 867 |                 # See issue #115: some wheels have .. in their entries, but
 868 |                 # in the filename ... e.g. __main__..py ! So the check is
 869 |                 # updated to look for .. in the directory portions
 870 |                 p = u_arcname.split('/')
 871 |                 if '..' in p:
 872 |                     raise DistlibException('invalid entry in '
 873 |                                            'wheel: %r' % u_arcname)
 874 | 
 875 |                 if self.skip_entry(u_arcname):
 876 |                     continue
 877 |                 row = records[u_arcname]
 878 |                 if row[2] and str(zinfo.file_size) != row[2]:
 879 |                     raise DistlibException('size mismatch for '
 880 |                                            '%s' % u_arcname)
 881 |                 if row[1]:
 882 |                     kind, value = row[1].split('=', 1)
 883 |                     with zf.open(arcname) as bf:
 884 |                         data = bf.read()
 885 |                     _, digest = self.get_hash(data, kind)
 886 |                     if digest != value:
 887 |                         raise DistlibException('digest mismatch for '
 888 |                                                '%s' % arcname)
 889 | 
 890 |     def update(self, modifier, dest_dir=None, **kwargs):
 891 |         """
 892 |         Update the contents of a wheel in a generic way. The modifier should
 893 |         be a callable which expects a dictionary argument: its keys are
 894 |         archive-entry paths, and its values are absolute filesystem paths
 895 |         where the contents the corresponding archive entries can be found. The
 896 |         modifier is free to change the contents of the files pointed to, add
 897 |         new entries and remove entries, before returning. This method will
 898 |         extract the entire contents of the wheel to a temporary location, call
 899 |         the modifier, and then use the passed (and possibly updated)
 900 |         dictionary to write a new wheel. If ``dest_dir`` is specified, the new
 901 |         wheel is written there -- otherwise, the original wheel is overwritten.
 902 | 
 903 |         The modifier should return True if it updated the wheel, else False.
 904 |         This method returns the same value the modifier returns.
 905 |         """
 906 | 
 907 |         def get_version(path_map, info_dir):
 908 |             version = path = None
 909 |             key = '%s/%s' % (info_dir, LEGACY_METADATA_FILENAME)
 910 |             if key not in path_map:
 911 |                 key = '%s/PKG-INFO' % info_dir
 912 |             if key in path_map:
 913 |                 path = path_map[key]
 914 |                 version = Metadata(path=path).version
 915 |             return version, path
 916 | 
 917 |         def update_version(version, path):
 918 |             updated = None
 919 |             try:
 920 |                 NormalizedVersion(version)
 921 |                 i = version.find('-')
 922 |                 if i < 0:
 923 |                     updated = '%s+1' % version
 924 |                 else:
 925 |                     parts = [int(s) for s in version[i + 1:].split('.')]
 926 |                     parts[-1] += 1
 927 |                     updated = '%s+%s' % (version[:i], '.'.join(
 928 |                         str(i) for i in parts))
 929 |             except UnsupportedVersionError:
 930 |                 logger.debug(
 931 |                     'Cannot update non-compliant (PEP-440) '
 932 |                     'version %r', version)
 933 |             if updated:
 934 |                 md = Metadata(path=path)
 935 |                 md.version = updated
 936 |                 legacy = path.endswith(LEGACY_METADATA_FILENAME)
 937 |                 md.write(path=path, legacy=legacy)
 938 |                 logger.debug('Version updated from %r to %r', version, updated)
 939 | 
 940 |         pathname = os.path.join(self.dirname, self.filename)
 941 |         name_ver = '%s-%s' % (self.name, self.version)
 942 |         info_dir = '%s.dist-info' % name_ver
 943 |         record_name = posixpath.join(info_dir, 'RECORD')
 944 |         with tempdir() as workdir:
 945 |             with ZipFile(pathname, 'r') as zf:
 946 |                 path_map = {}
 947 |                 for zinfo in zf.infolist():
 948 |                     arcname = zinfo.filename
 949 |                     if isinstance(arcname, text_type):
 950 |                         u_arcname = arcname
 951 |                     else:
 952 |                         u_arcname = arcname.decode('utf-8')
 953 |                     if u_arcname == record_name:
 954 |                         continue
 955 |                     if '..' in u_arcname:
 956 |                         raise DistlibException('invalid entry in '
 957 |                                                'wheel: %r' % u_arcname)
 958 |                     zf.extract(zinfo, workdir)
 959 |                     path = os.path.join(workdir, convert_path(u_arcname))
 960 |                     path_map[u_arcname] = path
 961 | 
 962 |             # Remember the version.
 963 |             original_version, _ = get_version(path_map, info_dir)
 964 |             # Files extracted. Call the modifier.
 965 |             modified = modifier(path_map, **kwargs)
 966 |             if modified:
 967 |                 # Something changed - need to build a new wheel.
 968 |                 current_version, path = get_version(path_map, info_dir)
 969 |                 if current_version and (current_version == original_version):
 970 |                     # Add or update local version to signify changes.
 971 |                     update_version(current_version, path)
 972 |                 # Decide where the new wheel goes.
 973 |                 if dest_dir is None:
 974 |                     fd, newpath = tempfile.mkstemp(suffix='.whl',
 975 |                                                    prefix='wheel-update-',
 976 |                                                    dir=workdir)
 977 |                     os.close(fd)
 978 |                 else:
 979 |                     if not os.path.isdir(dest_dir):
 980 |                         raise DistlibException('Not a directory: %r' %
 981 |                                                dest_dir)
 982 |                     newpath = os.path.join(dest_dir, self.filename)
 983 |                 archive_paths = list(path_map.items())
 984 |                 distinfo = os.path.join(workdir, info_dir)
 985 |                 info = distinfo, info_dir
 986 |                 self.write_records(info, workdir, archive_paths)
 987 |                 self.build_zip(newpath, archive_paths)
 988 |                 if dest_dir is None:
 989 |                     shutil.copyfile(newpath, pathname)
 990 |         return modified
 991 | 
 992 | 
 993 | def _get_glibc_version():
 994 |     import platform
 995 |     ver = platform.libc_ver()
 996 |     result = []
 997 |     if ver[0] == 'glibc':
 998 |         for s in ver[1].split('.'):
 999 |             result.append(int(s) if s.isdigit() else 0)
1000 |         result = tuple(result)
1001 |     return result
1002 | 
1003 | 
1004 | def compatible_tags():
1005 |     """
1006 |     Return (pyver, abi, arch) tuples compatible with this Python.
1007 |     """
1008 |     versions = [VER_SUFFIX]
1009 |     major = VER_SUFFIX[0]
1010 |     for minor in range(sys.version_info[1] - 1, -1, -1):
1011 |         versions.append(''.join([major, str(minor)]))
1012 | 
1013 |     abis = []
1014 |     for suffix in _get_suffixes():
1015 |         if suffix.startswith('.abi'):
1016 |             abis.append(suffix.split('.', 2)[1])
1017 |     abis.sort()
1018 |     if ABI != 'none':
1019 |         abis.insert(0, ABI)
1020 |     abis.append('none')
1021 |     result = []
1022 | 
1023 |     arches = [ARCH]
1024 |     if sys.platform == 'darwin':
1025 |         m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH)
1026 |         if m:
1027 |             name, major, minor, arch = m.groups()
1028 |             minor = int(minor)
1029 |             matches = [arch]
1030 |             if arch in ('i386', 'ppc'):
1031 |                 matches.append('fat')
1032 |             if arch in ('i386', 'ppc', 'x86_64'):
1033 |                 matches.append('fat3')
1034 |             if arch in ('ppc64', 'x86_64'):
1035 |                 matches.append('fat64')
1036 |             if arch in ('i386', 'x86_64'):
1037 |                 matches.append('intel')
1038 |             if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'):
1039 |                 matches.append('universal')
1040 |             while minor >= 0:
1041 |                 for match in matches:
1042 |                     s = '%s_%s_%s_%s' % (name, major, minor, match)
1043 |                     if s != ARCH:  # already there
1044 |                         arches.append(s)
1045 |                 minor -= 1
1046 | 
1047 |     # Most specific - our Python version, ABI and arch
1048 |     for abi in abis:
1049 |         for arch in arches:
1050 |             result.append((''.join((IMP_PREFIX, versions[0])), abi, arch))
1051 |             # manylinux
1052 |             if abi != 'none' and sys.platform.startswith('linux'):
1053 |                 arch = arch.replace('linux_', '')
1054 |                 parts = _get_glibc_version()
1055 |                 if len(parts) == 2:
1056 |                     if parts >= (2, 5):
1057 |                         result.append((''.join((IMP_PREFIX, versions[0])), abi,
1058 |                                        'manylinux1_%s' % arch))
1059 |                     if parts >= (2, 12):
1060 |                         result.append((''.join((IMP_PREFIX, versions[0])), abi,
1061 |                                        'manylinux2010_%s' % arch))
1062 |                     if parts >= (2, 17):
1063 |                         result.append((''.join((IMP_PREFIX, versions[0])), abi,
1064 |                                        'manylinux2014_%s' % arch))
1065 |                     result.append(
1066 |                         (''.join((IMP_PREFIX, versions[0])), abi,
1067 |                          'manylinux_%s_%s_%s' % (parts[0], parts[1], arch)))
1068 | 
1069 |     # where no ABI / arch dependency, but IMP_PREFIX dependency
1070 |     for i, version in enumerate(versions):
1071 |         result.append((''.join((IMP_PREFIX, version)), 'none', 'any'))
1072 |         if i == 0:
1073 |             result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any'))
1074 | 
1075 |     # no IMP_PREFIX, ABI or arch dependency
1076 |     for i, version in enumerate(versions):
1077 |         result.append((''.join(('py', version)), 'none', 'any'))
1078 |         if i == 0:
1079 |             result.append((''.join(('py', version[0])), 'none', 'any'))
1080 | 
1081 |     return set(result)
1082 | 
1083 | 
1084 | COMPATIBLE_TAGS = compatible_tags()
1085 | 
1086 | del compatible_tags
1087 | 
1088 | 
1089 | def is_compatible(wheel, tags=None):
1090 |     if not isinstance(wheel, Wheel):
1091 |         wheel = Wheel(wheel)  # assume it's a filename
1092 |     result = False
1093 |     if tags is None:
1094 |         tags = COMPATIBLE_TAGS
1095 |     for ver, abi, arch in tags:
1096 |         if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch:
1097 |             result = True
1098 |             break
1099 |     return result
1100 | 
```
Page 134/168FirstPrevNextLast