This is page 61 of 168. Use http://codebase.md/romanshablio/mcp_server?lines=true&page={x} to view the full context.
# Directory Structure
```
├── .DS_Store
├── .venv
│ ├── __pycache__
│ │ └── hello.cpython-312.pyc
│ ├── bin
│ │ ├── activate
│ │ ├── activate.csh
│ │ ├── activate.fish
│ │ ├── Activate.ps1
│ │ ├── flask
│ │ ├── normalizer
│ │ ├── pip
│ │ ├── pip3
│ │ ├── pip3.12
│ │ ├── python
│ │ ├── python3
│ │ └── python3.12
│ ├── hello.py
│ ├── lib
│ │ └── python3.12
│ │ └── site-packages
│ │ ├── beautifulsoup4-4.12.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ ├── AUTHORS
│ │ │ │ └── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── blinker
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _utilities.cpython-312.pyc
│ │ │ │ └── base.cpython-312.pyc
│ │ │ ├── _utilities.py
│ │ │ ├── base.py
│ │ │ └── py.typed
│ │ ├── blinker-1.8.2.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── bs4
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── css.cpython-312.pyc
│ │ │ │ ├── dammit.cpython-312.pyc
│ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ ├── element.cpython-312.pyc
│ │ │ │ └── formatter.cpython-312.pyc
│ │ │ ├── builder
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _html5lib.cpython-312.pyc
│ │ │ │ │ ├── _htmlparser.cpython-312.pyc
│ │ │ │ │ └── _lxml.cpython-312.pyc
│ │ │ │ ├── _html5lib.py
│ │ │ │ ├── _htmlparser.py
│ │ │ │ └── _lxml.py
│ │ │ ├── css.py
│ │ │ ├── dammit.py
│ │ │ ├── diagnose.py
│ │ │ ├── element.py
│ │ │ ├── formatter.py
│ │ │ └── tests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── test_builder_registry.cpython-312.pyc
│ │ │ │ ├── test_builder.cpython-312.pyc
│ │ │ │ ├── test_css.cpython-312.pyc
│ │ │ │ ├── test_dammit.cpython-312.pyc
│ │ │ │ ├── test_docs.cpython-312.pyc
│ │ │ │ ├── test_element.cpython-312.pyc
│ │ │ │ ├── test_formatter.cpython-312.pyc
│ │ │ │ ├── test_fuzz.cpython-312.pyc
│ │ │ │ ├── test_html5lib.cpython-312.pyc
│ │ │ │ ├── test_htmlparser.cpython-312.pyc
│ │ │ │ ├── test_lxml.cpython-312.pyc
│ │ │ │ ├── test_navigablestring.cpython-312.pyc
│ │ │ │ ├── test_pageelement.cpython-312.pyc
│ │ │ │ ├── test_soup.cpython-312.pyc
│ │ │ │ ├── test_tag.cpython-312.pyc
│ │ │ │ └── test_tree.cpython-312.pyc
│ │ │ ├── fuzz
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4670634698080256.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4818336571064320.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-4999465949331456.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5000587759190016.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5167584867909632.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5270998950477824.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5375146639360000.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5492400320282624.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5703933063462912.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5843991618256896.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-5984173902397440.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6124268085182464.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6241471367348224.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6306874195312640.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6450958476902400.testcase
│ │ │ │ ├── clusterfuzz-testcase-minimized-bs4_fuzzer-6600557255327744.testcase
│ │ │ │ ├── crash-0d306a50c8ed8bcd0785b67000fcd5dea1d33f08.testcase
│ │ │ │ └── crash-ffbdfa8a2b26f13537b68d3794b0478a4090ee4a.testcase
│ │ │ ├── test_builder_registry.py
│ │ │ ├── test_builder.py
│ │ │ ├── test_css.py
│ │ │ ├── test_dammit.py
│ │ │ ├── test_docs.py
│ │ │ ├── test_element.py
│ │ │ ├── test_formatter.py
│ │ │ ├── test_fuzz.py
│ │ │ ├── test_html5lib.py
│ │ │ ├── test_htmlparser.py
│ │ │ ├── test_lxml.py
│ │ │ ├── test_navigablestring.py
│ │ │ ├── test_pageelement.py
│ │ │ ├── test_soup.py
│ │ │ ├── test_tag.py
│ │ │ └── test_tree.py
│ │ ├── certifi
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── core.cpython-312.pyc
│ │ │ ├── cacert.pem
│ │ │ ├── core.py
│ │ │ └── py.typed
│ │ ├── certifi-2024.8.30.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── charset_normalizer
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── cd.cpython-312.pyc
│ │ │ │ ├── constant.cpython-312.pyc
│ │ │ │ ├── legacy.cpython-312.pyc
│ │ │ │ ├── md.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── version.cpython-312.pyc
│ │ │ ├── api.py
│ │ │ ├── cd.py
│ │ │ ├── cli
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __main__.py
│ │ │ │ └── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── __main__.cpython-312.pyc
│ │ │ ├── constant.py
│ │ │ ├── legacy.py
│ │ │ ├── md__mypyc.cpython-312-darwin.so
│ │ │ ├── md.cpython-312-darwin.so
│ │ │ ├── md.py
│ │ │ ├── models.py
│ │ │ ├── py.typed
│ │ │ ├── utils.py
│ │ │ └── version.py
│ │ ├── charset_normalizer-3.4.0.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── click
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ ├── _termui_impl.cpython-312.pyc
│ │ │ │ ├── _textwrap.cpython-312.pyc
│ │ │ │ ├── _winconsole.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── decorators.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formatting.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── shell_completion.cpython-312.pyc
│ │ │ │ ├── termui.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── types.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── _compat.py
│ │ │ ├── _termui_impl.py
│ │ │ ├── _textwrap.py
│ │ │ ├── _winconsole.py
│ │ │ ├── core.py
│ │ │ ├── decorators.py
│ │ │ ├── exceptions.py
│ │ │ ├── formatting.py
│ │ │ ├── globals.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── shell_completion.py
│ │ │ ├── termui.py
│ │ │ ├── testing.py
│ │ │ ├── types.py
│ │ │ └── utils.py
│ │ ├── click-8.1.7.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.rst
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── fake_useragent
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ ├── fake.cpython-312.pyc
│ │ │ │ ├── log.cpython-312.pyc
│ │ │ │ ├── settings.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── data
│ │ │ │ └── browsers.json
│ │ │ ├── errors.py
│ │ │ ├── fake.py
│ │ │ ├── log.py
│ │ │ ├── settings.py
│ │ │ └── utils.py
│ │ ├── fake_useragent-1.5.1.dist-info
│ │ │ ├── AUTHORS
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── flask
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ ├── cli.cpython-312.pyc
│ │ │ │ ├── config.cpython-312.pyc
│ │ │ │ ├── ctx.cpython-312.pyc
│ │ │ │ ├── debughelpers.cpython-312.pyc
│ │ │ │ ├── globals.cpython-312.pyc
│ │ │ │ ├── helpers.cpython-312.pyc
│ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── signals.cpython-312.pyc
│ │ │ │ ├── templating.cpython-312.pyc
│ │ │ │ ├── testing.cpython-312.pyc
│ │ │ │ ├── typing.cpython-312.pyc
│ │ │ │ ├── views.cpython-312.pyc
│ │ │ │ └── wrappers.cpython-312.pyc
│ │ │ ├── app.py
│ │ │ ├── blueprints.py
│ │ │ ├── cli.py
│ │ │ ├── config.py
│ │ │ ├── ctx.py
│ │ │ ├── debughelpers.py
│ │ │ ├── globals.py
│ │ │ ├── helpers.py
│ │ │ ├── json
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ └── tag.cpython-312.pyc
│ │ │ │ ├── provider.py
│ │ │ │ └── tag.py
│ │ │ ├── logging.py
│ │ │ ├── py.typed
│ │ │ ├── sansio
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── app.cpython-312.pyc
│ │ │ │ │ ├── blueprints.cpython-312.pyc
│ │ │ │ │ └── scaffold.cpython-312.pyc
│ │ │ │ ├── app.py
│ │ │ │ ├── blueprints.py
│ │ │ │ ├── README.md
│ │ │ │ └── scaffold.py
│ │ │ ├── sessions.py
│ │ │ ├── signals.py
│ │ │ ├── templating.py
│ │ │ ├── testing.py
│ │ │ ├── typing.py
│ │ │ ├── views.py
│ │ │ └── wrappers.py
│ │ ├── flask-3.0.3.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ └── WHEEL
│ │ ├── idna
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ ├── codec.py
│ │ │ ├── compat.py
│ │ │ ├── core.py
│ │ │ ├── idnadata.py
│ │ │ ├── intranges.py
│ │ │ ├── package_data.py
│ │ │ ├── py.typed
│ │ │ └── uts46data.py
│ │ ├── idna-3.10.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── itsdangerous
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ ├── exc.cpython-312.pyc
│ │ │ │ ├── serializer.cpython-312.pyc
│ │ │ │ ├── signer.cpython-312.pyc
│ │ │ │ ├── timed.cpython-312.pyc
│ │ │ │ └── url_safe.cpython-312.pyc
│ │ │ ├── _json.py
│ │ │ ├── encoding.py
│ │ │ ├── exc.py
│ │ │ ├── py.typed
│ │ │ ├── serializer.py
│ │ │ ├── signer.py
│ │ │ ├── timed.py
│ │ │ └── url_safe.py
│ │ ├── itsdangerous-2.2.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── jinja2
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _identifier.cpython-312.pyc
│ │ │ │ ├── async_utils.cpython-312.pyc
│ │ │ │ ├── bccache.cpython-312.pyc
│ │ │ │ ├── compiler.cpython-312.pyc
│ │ │ │ ├── constants.cpython-312.pyc
│ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ ├── defaults.cpython-312.pyc
│ │ │ │ ├── environment.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ ├── filters.cpython-312.pyc
│ │ │ │ ├── idtracking.cpython-312.pyc
│ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ ├── loaders.cpython-312.pyc
│ │ │ │ ├── meta.cpython-312.pyc
│ │ │ │ ├── nativetypes.cpython-312.pyc
│ │ │ │ ├── nodes.cpython-312.pyc
│ │ │ │ ├── optimizer.cpython-312.pyc
│ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ ├── runtime.cpython-312.pyc
│ │ │ │ ├── sandbox.cpython-312.pyc
│ │ │ │ ├── tests.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── visitor.cpython-312.pyc
│ │ │ ├── _identifier.py
│ │ │ ├── async_utils.py
│ │ │ ├── bccache.py
│ │ │ ├── compiler.py
│ │ │ ├── constants.py
│ │ │ ├── debug.py
│ │ │ ├── defaults.py
│ │ │ ├── environment.py
│ │ │ ├── exceptions.py
│ │ │ ├── ext.py
│ │ │ ├── filters.py
│ │ │ ├── idtracking.py
│ │ │ ├── lexer.py
│ │ │ ├── loaders.py
│ │ │ ├── meta.py
│ │ │ ├── nativetypes.py
│ │ │ ├── nodes.py
│ │ │ ├── optimizer.py
│ │ │ ├── parser.py
│ │ │ ├── py.typed
│ │ │ ├── runtime.py
│ │ │ ├── sandbox.py
│ │ │ ├── tests.py
│ │ │ ├── utils.py
│ │ │ └── visitor.py
│ │ ├── jinja2-3.1.4.dist-info
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── lxml
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _elementpath.cpython-312.pyc
│ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ ├── cssselect.cpython-312.pyc
│ │ │ │ ├── doctestcompare.cpython-312.pyc
│ │ │ │ ├── ElementInclude.cpython-312.pyc
│ │ │ │ ├── pyclasslookup.cpython-312.pyc
│ │ │ │ ├── sax.cpython-312.pyc
│ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ ├── _elementpath.cpython-312-darwin.so
│ │ │ ├── _elementpath.py
│ │ │ ├── apihelpers.pxi
│ │ │ ├── builder.cpython-312-darwin.so
│ │ │ ├── builder.py
│ │ │ ├── classlookup.pxi
│ │ │ ├── cleanup.pxi
│ │ │ ├── cssselect.py
│ │ │ ├── debug.pxi
│ │ │ ├── docloader.pxi
│ │ │ ├── doctestcompare.py
│ │ │ ├── dtd.pxi
│ │ │ ├── ElementInclude.py
│ │ │ ├── etree_api.h
│ │ │ ├── etree.cpython-312-darwin.so
│ │ │ ├── etree.h
│ │ │ ├── etree.pyx
│ │ │ ├── extensions.pxi
│ │ │ ├── html
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── _diffcommand.cpython-312.pyc
│ │ │ │ │ ├── _html5builder.cpython-312.pyc
│ │ │ │ │ ├── _setmixin.cpython-312.pyc
│ │ │ │ │ ├── builder.cpython-312.pyc
│ │ │ │ │ ├── clean.cpython-312.pyc
│ │ │ │ │ ├── defs.cpython-312.pyc
│ │ │ │ │ ├── diff.cpython-312.pyc
│ │ │ │ │ ├── ElementSoup.cpython-312.pyc
│ │ │ │ │ ├── formfill.cpython-312.pyc
│ │ │ │ │ ├── html5parser.cpython-312.pyc
│ │ │ │ │ ├── soupparser.cpython-312.pyc
│ │ │ │ │ └── usedoctest.cpython-312.pyc
│ │ │ │ ├── _diffcommand.py
│ │ │ │ ├── _html5builder.py
│ │ │ │ ├── _setmixin.py
│ │ │ │ ├── builder.py
│ │ │ │ ├── clean.py
│ │ │ │ ├── defs.py
│ │ │ │ ├── diff.cpython-312-darwin.so
│ │ │ │ ├── diff.py
│ │ │ │ ├── ElementSoup.py
│ │ │ │ ├── formfill.py
│ │ │ │ ├── html5parser.py
│ │ │ │ ├── soupparser.py
│ │ │ │ └── usedoctest.py
│ │ │ ├── includes
│ │ │ │ ├── __init__.pxd
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── c14n.pxd
│ │ │ │ ├── config.pxd
│ │ │ │ ├── dtdvalid.pxd
│ │ │ │ ├── etree_defs.h
│ │ │ │ ├── etreepublic.pxd
│ │ │ │ ├── extlibs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── libcharset.h
│ │ │ │ │ ├── localcharset.h
│ │ │ │ │ ├── zconf.h
│ │ │ │ │ └── zlib.h
│ │ │ │ ├── htmlparser.pxd
│ │ │ │ ├── libexslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── exslt.h
│ │ │ │ │ ├── exsltconfig.h
│ │ │ │ │ └── exsltexports.h
│ │ │ │ ├── libxml
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── c14n.h
│ │ │ │ │ ├── catalog.h
│ │ │ │ │ ├── chvalid.h
│ │ │ │ │ ├── debugXML.h
│ │ │ │ │ ├── dict.h
│ │ │ │ │ ├── encoding.h
│ │ │ │ │ ├── entities.h
│ │ │ │ │ ├── globals.h
│ │ │ │ │ ├── hash.h
│ │ │ │ │ ├── HTMLparser.h
│ │ │ │ │ ├── HTMLtree.h
│ │ │ │ │ ├── list.h
│ │ │ │ │ ├── nanoftp.h
│ │ │ │ │ ├── nanohttp.h
│ │ │ │ │ ├── parser.h
│ │ │ │ │ ├── parserInternals.h
│ │ │ │ │ ├── relaxng.h
│ │ │ │ │ ├── SAX.h
│ │ │ │ │ ├── SAX2.h
│ │ │ │ │ ├── schemasInternals.h
│ │ │ │ │ ├── schematron.h
│ │ │ │ │ ├── threads.h
│ │ │ │ │ ├── tree.h
│ │ │ │ │ ├── uri.h
│ │ │ │ │ ├── valid.h
│ │ │ │ │ ├── xinclude.h
│ │ │ │ │ ├── xlink.h
│ │ │ │ │ ├── xmlautomata.h
│ │ │ │ │ ├── xmlerror.h
│ │ │ │ │ ├── xmlexports.h
│ │ │ │ │ ├── xmlIO.h
│ │ │ │ │ ├── xmlmemory.h
│ │ │ │ │ ├── xmlmodule.h
│ │ │ │ │ ├── xmlreader.h
│ │ │ │ │ ├── xmlregexp.h
│ │ │ │ │ ├── xmlsave.h
│ │ │ │ │ ├── xmlschemas.h
│ │ │ │ │ ├── xmlschemastypes.h
│ │ │ │ │ ├── xmlstring.h
│ │ │ │ │ ├── xmlunicode.h
│ │ │ │ │ ├── xmlversion.h
│ │ │ │ │ ├── xmlwriter.h
│ │ │ │ │ ├── xpath.h
│ │ │ │ │ ├── xpathInternals.h
│ │ │ │ │ └── xpointer.h
│ │ │ │ ├── libxslt
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── attributes.h
│ │ │ │ │ ├── documents.h
│ │ │ │ │ ├── extensions.h
│ │ │ │ │ ├── extra.h
│ │ │ │ │ ├── functions.h
│ │ │ │ │ ├── imports.h
│ │ │ │ │ ├── keys.h
│ │ │ │ │ ├── namespaces.h
│ │ │ │ │ ├── numbersInternals.h
│ │ │ │ │ ├── pattern.h
│ │ │ │ │ ├── preproc.h
│ │ │ │ │ ├── security.h
│ │ │ │ │ ├── templates.h
│ │ │ │ │ ├── transform.h
│ │ │ │ │ ├── variables.h
│ │ │ │ │ ├── xslt.h
│ │ │ │ │ ├── xsltconfig.h
│ │ │ │ │ ├── xsltexports.h
│ │ │ │ │ ├── xsltInternals.h
│ │ │ │ │ ├── xsltlocale.h
│ │ │ │ │ └── xsltutils.h
│ │ │ │ ├── lxml-version.h
│ │ │ │ ├── relaxng.pxd
│ │ │ │ ├── schematron.pxd
│ │ │ │ ├── tree.pxd
│ │ │ │ ├── uri.pxd
│ │ │ │ ├── xinclude.pxd
│ │ │ │ ├── xmlerror.pxd
│ │ │ │ ├── xmlparser.pxd
│ │ │ │ ├── xmlschema.pxd
│ │ │ │ ├── xpath.pxd
│ │ │ │ └── xslt.pxd
│ │ │ ├── isoschematron
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ └── resources
│ │ │ │ ├── rng
│ │ │ │ │ └── iso-schematron.rng
│ │ │ │ └── xsl
│ │ │ │ ├── iso-schematron-xslt1
│ │ │ │ │ ├── iso_abstract_expand.xsl
│ │ │ │ │ ├── iso_dsdl_include.xsl
│ │ │ │ │ ├── iso_schematron_message.xsl
│ │ │ │ │ ├── iso_schematron_skeleton_for_xslt1.xsl
│ │ │ │ │ ├── iso_svrl_for_xslt1.xsl
│ │ │ │ │ └── readme.txt
│ │ │ │ ├── RNG2Schtrn.xsl
│ │ │ │ └── XSD2Schtrn.xsl
│ │ │ ├── iterparse.pxi
│ │ │ ├── lxml.etree_api.h
│ │ │ ├── lxml.etree.h
│ │ │ ├── nsclasses.pxi
│ │ │ ├── objectify.cpython-312-darwin.so
│ │ │ ├── objectify.pyx
│ │ │ ├── objectpath.pxi
│ │ │ ├── parser.pxi
│ │ │ ├── parsertarget.pxi
│ │ │ ├── proxy.pxi
│ │ │ ├── public-api.pxi
│ │ │ ├── pyclasslookup.py
│ │ │ ├── readonlytree.pxi
│ │ │ ├── relaxng.pxi
│ │ │ ├── sax.cpython-312-darwin.so
│ │ │ ├── sax.py
│ │ │ ├── saxparser.pxi
│ │ │ ├── schematron.pxi
│ │ │ ├── serializer.pxi
│ │ │ ├── usedoctest.py
│ │ │ ├── xinclude.pxi
│ │ │ ├── xmlerror.pxi
│ │ │ ├── xmlid.pxi
│ │ │ ├── xmlschema.pxi
│ │ │ ├── xpath.pxi
│ │ │ ├── xslt.pxi
│ │ │ └── xsltext.pxi
│ │ ├── lxml-5.3.0.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── LICENSES.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── markupsafe
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ └── _native.cpython-312.pyc
│ │ │ ├── _native.py
│ │ │ ├── _speedups.c
│ │ │ ├── _speedups.cpython-312-darwin.so
│ │ │ ├── _speedups.pyi
│ │ │ └── py.typed
│ │ ├── MarkupSafe-3.0.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── pip
│ │ │ ├── __init__.py
│ │ │ ├── __main__.py
│ │ │ ├── __pip-runner__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ └── __pip-runner__.cpython-312.pyc
│ │ │ ├── _internal
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── build_env.cpython-312.pyc
│ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ ├── pyproject.cpython-312.pyc
│ │ │ │ │ ├── self_outdated_check.cpython-312.pyc
│ │ │ │ │ └── wheel_builder.cpython-312.pyc
│ │ │ │ ├── build_env.py
│ │ │ │ ├── cache.py
│ │ │ │ ├── cli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── autocompletion.cpython-312.pyc
│ │ │ │ │ │ ├── base_command.cpython-312.pyc
│ │ │ │ │ │ ├── cmdoptions.cpython-312.pyc
│ │ │ │ │ │ ├── command_context.cpython-312.pyc
│ │ │ │ │ │ ├── index_command.cpython-312.pyc
│ │ │ │ │ │ ├── main_parser.cpython-312.pyc
│ │ │ │ │ │ ├── main.cpython-312.pyc
│ │ │ │ │ │ ├── parser.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bars.cpython-312.pyc
│ │ │ │ │ │ ├── req_command.cpython-312.pyc
│ │ │ │ │ │ ├── spinners.cpython-312.pyc
│ │ │ │ │ │ └── status_codes.cpython-312.pyc
│ │ │ │ │ ├── autocompletion.py
│ │ │ │ │ ├── base_command.py
│ │ │ │ │ ├── cmdoptions.py
│ │ │ │ │ ├── command_context.py
│ │ │ │ │ ├── index_command.py
│ │ │ │ │ ├── main_parser.py
│ │ │ │ │ ├── main.py
│ │ │ │ │ ├── parser.py
│ │ │ │ │ ├── progress_bars.py
│ │ │ │ │ ├── req_command.py
│ │ │ │ │ ├── spinners.py
│ │ │ │ │ └── status_codes.py
│ │ │ │ ├── commands
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── completion.cpython-312.pyc
│ │ │ │ │ │ ├── configuration.cpython-312.pyc
│ │ │ │ │ │ ├── debug.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ ├── hash.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── inspect.cpython-312.pyc
│ │ │ │ │ │ ├── install.cpython-312.pyc
│ │ │ │ │ │ ├── list.cpython-312.pyc
│ │ │ │ │ │ ├── search.cpython-312.pyc
│ │ │ │ │ │ ├── show.cpython-312.pyc
│ │ │ │ │ │ ├── uninstall.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── completion.py
│ │ │ │ │ ├── configuration.py
│ │ │ │ │ ├── debug.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── hash.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── inspect.py
│ │ │ │ │ ├── install.py
│ │ │ │ │ ├── list.py
│ │ │ │ │ ├── search.py
│ │ │ │ │ ├── show.py
│ │ │ │ │ ├── uninstall.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── configuration.py
│ │ │ │ ├── distributions
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── installed.cpython-312.pyc
│ │ │ │ │ │ ├── sdist.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── installed.py
│ │ │ │ │ ├── sdist.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── index
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── collector.cpython-312.pyc
│ │ │ │ │ │ ├── package_finder.cpython-312.pyc
│ │ │ │ │ │ └── sources.cpython-312.pyc
│ │ │ │ │ ├── collector.py
│ │ │ │ │ ├── package_finder.py
│ │ │ │ │ └── sources.py
│ │ │ │ ├── locations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _distutils.cpython-312.pyc
│ │ │ │ │ │ ├── _sysconfig.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── _distutils.py
│ │ │ │ │ ├── _sysconfig.py
│ │ │ │ │ └── base.py
│ │ │ │ ├── main.py
│ │ │ │ ├── metadata
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _json.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ └── pkg_resources.cpython-312.pyc
│ │ │ │ │ ├── _json.py
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── importlib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ │ ├── _dists.cpython-312.pyc
│ │ │ │ │ │ │ └── _envs.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.py
│ │ │ │ │ │ ├── _dists.py
│ │ │ │ │ │ └── _envs.py
│ │ │ │ │ └── pkg_resources.py
│ │ │ │ ├── models
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── candidate.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url.cpython-312.pyc
│ │ │ │ │ │ ├── format_control.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── installation_report.cpython-312.pyc
│ │ │ │ │ │ ├── link.cpython-312.pyc
│ │ │ │ │ │ ├── scheme.cpython-312.pyc
│ │ │ │ │ │ ├── search_scope.cpython-312.pyc
│ │ │ │ │ │ ├── selection_prefs.cpython-312.pyc
│ │ │ │ │ │ ├── target_python.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── candidate.py
│ │ │ │ │ ├── direct_url.py
│ │ │ │ │ ├── format_control.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── installation_report.py
│ │ │ │ │ ├── link.py
│ │ │ │ │ ├── scheme.py
│ │ │ │ │ ├── search_scope.py
│ │ │ │ │ ├── selection_prefs.py
│ │ │ │ │ ├── target_python.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── network
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── download.cpython-312.pyc
│ │ │ │ │ │ ├── lazy_wheel.cpython-312.pyc
│ │ │ │ │ │ ├── session.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── xmlrpc.cpython-312.pyc
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── download.py
│ │ │ │ │ ├── lazy_wheel.py
│ │ │ │ │ ├── session.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── xmlrpc.py
│ │ │ │ ├── operations
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── check.cpython-312.pyc
│ │ │ │ │ │ ├── freeze.cpython-312.pyc
│ │ │ │ │ │ └── prepare.cpython-312.pyc
│ │ │ │ │ ├── build
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── build_tracker.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata_legacy.cpython-312.pyc
│ │ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_editable.cpython-312.pyc
│ │ │ │ │ │ │ ├── wheel_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── build_tracker.py
│ │ │ │ │ │ ├── metadata_editable.py
│ │ │ │ │ │ ├── metadata_legacy.py
│ │ │ │ │ │ ├── metadata.py
│ │ │ │ │ │ ├── wheel_editable.py
│ │ │ │ │ │ ├── wheel_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ ├── check.py
│ │ │ │ │ ├── freeze.py
│ │ │ │ │ ├── install
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── editable_legacy.cpython-312.pyc
│ │ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ │ ├── editable_legacy.py
│ │ │ │ │ │ └── wheel.py
│ │ │ │ │ └── prepare.py
│ │ │ │ ├── pyproject.py
│ │ │ │ ├── req
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── constructors.cpython-312.pyc
│ │ │ │ │ │ ├── req_file.cpython-312.pyc
│ │ │ │ │ │ ├── req_install.cpython-312.pyc
│ │ │ │ │ │ ├── req_set.cpython-312.pyc
│ │ │ │ │ │ └── req_uninstall.cpython-312.pyc
│ │ │ │ │ ├── constructors.py
│ │ │ │ │ ├── req_file.py
│ │ │ │ │ ├── req_install.py
│ │ │ │ │ ├── req_set.py
│ │ │ │ │ └── req_uninstall.py
│ │ │ │ ├── resolution
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── base.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── legacy
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ │ └── resolver.py
│ │ │ │ │ └── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── base.cpython-312.pyc
│ │ │ │ │ │ ├── candidates.cpython-312.pyc
│ │ │ │ │ │ ├── factory.cpython-312.pyc
│ │ │ │ │ │ ├── found_candidates.cpython-312.pyc
│ │ │ │ │ │ ├── provider.cpython-312.pyc
│ │ │ │ │ │ ├── reporter.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ └── resolver.cpython-312.pyc
│ │ │ │ │ ├── base.py
│ │ │ │ │ ├── candidates.py
│ │ │ │ │ ├── factory.py
│ │ │ │ │ ├── found_candidates.py
│ │ │ │ │ ├── provider.py
│ │ │ │ │ ├── reporter.py
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ └── resolver.py
│ │ │ │ ├── self_outdated_check.py
│ │ │ │ ├── utils
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _jaraco_text.cpython-312.pyc
│ │ │ │ │ │ ├── _log.cpython-312.pyc
│ │ │ │ │ │ ├── appdirs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── compatibility_tags.cpython-312.pyc
│ │ │ │ │ │ ├── datetime.cpython-312.pyc
│ │ │ │ │ │ ├── deprecation.cpython-312.pyc
│ │ │ │ │ │ ├── direct_url_helpers.cpython-312.pyc
│ │ │ │ │ │ ├── egg_link.cpython-312.pyc
│ │ │ │ │ │ ├── encoding.cpython-312.pyc
│ │ │ │ │ │ ├── entrypoints.cpython-312.pyc
│ │ │ │ │ │ ├── filesystem.cpython-312.pyc
│ │ │ │ │ │ ├── filetypes.cpython-312.pyc
│ │ │ │ │ │ ├── glibc.cpython-312.pyc
│ │ │ │ │ │ ├── hashes.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── misc.cpython-312.pyc
│ │ │ │ │ │ ├── packaging.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── setuptools_build.cpython-312.pyc
│ │ │ │ │ │ ├── subprocess.cpython-312.pyc
│ │ │ │ │ │ ├── temp_dir.cpython-312.pyc
│ │ │ │ │ │ ├── unpacking.cpython-312.pyc
│ │ │ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ │ │ ├── virtualenv.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── _jaraco_text.py
│ │ │ │ │ ├── _log.py
│ │ │ │ │ ├── appdirs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── compatibility_tags.py
│ │ │ │ │ ├── datetime.py
│ │ │ │ │ ├── deprecation.py
│ │ │ │ │ ├── direct_url_helpers.py
│ │ │ │ │ ├── egg_link.py
│ │ │ │ │ ├── encoding.py
│ │ │ │ │ ├── entrypoints.py
│ │ │ │ │ ├── filesystem.py
│ │ │ │ │ ├── filetypes.py
│ │ │ │ │ ├── glibc.py
│ │ │ │ │ ├── hashes.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── misc.py
│ │ │ │ │ ├── packaging.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── setuptools_build.py
│ │ │ │ │ ├── subprocess.py
│ │ │ │ │ ├── temp_dir.py
│ │ │ │ │ ├── unpacking.py
│ │ │ │ │ ├── urls.py
│ │ │ │ │ ├── virtualenv.py
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── vcs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── bazaar.cpython-312.pyc
│ │ │ │ │ │ ├── git.cpython-312.pyc
│ │ │ │ │ │ ├── mercurial.cpython-312.pyc
│ │ │ │ │ │ ├── subversion.cpython-312.pyc
│ │ │ │ │ │ └── versioncontrol.cpython-312.pyc
│ │ │ │ │ ├── bazaar.py
│ │ │ │ │ ├── git.py
│ │ │ │ │ ├── mercurial.py
│ │ │ │ │ ├── subversion.py
│ │ │ │ │ └── versioncontrol.py
│ │ │ │ └── wheel_builder.py
│ │ │ ├── _vendor
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ └── typing_extensions.cpython-312.pyc
│ │ │ │ ├── cachecontrol
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _cmd.cpython-312.pyc
│ │ │ │ │ │ ├── adapter.cpython-312.pyc
│ │ │ │ │ │ ├── cache.cpython-312.pyc
│ │ │ │ │ │ ├── controller.cpython-312.pyc
│ │ │ │ │ │ ├── filewrapper.cpython-312.pyc
│ │ │ │ │ │ ├── heuristics.cpython-312.pyc
│ │ │ │ │ │ ├── serialize.cpython-312.pyc
│ │ │ │ │ │ └── wrapper.cpython-312.pyc
│ │ │ │ │ ├── _cmd.py
│ │ │ │ │ ├── adapter.py
│ │ │ │ │ ├── cache.py
│ │ │ │ │ ├── caches
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── file_cache.cpython-312.pyc
│ │ │ │ │ │ │ └── redis_cache.cpython-312.pyc
│ │ │ │ │ │ ├── file_cache.py
│ │ │ │ │ │ └── redis_cache.py
│ │ │ │ │ ├── controller.py
│ │ │ │ │ ├── filewrapper.py
│ │ │ │ │ ├── heuristics.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── serialize.py
│ │ │ │ │ └── wrapper.py
│ │ │ │ ├── certifi
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── core.cpython-312.pyc
│ │ │ │ │ ├── cacert.pem
│ │ │ │ │ ├── core.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── distlib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── database.cpython-312.pyc
│ │ │ │ │ │ ├── index.cpython-312.pyc
│ │ │ │ │ │ ├── locators.cpython-312.pyc
│ │ │ │ │ │ ├── manifest.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── resources.cpython-312.pyc
│ │ │ │ │ │ ├── scripts.cpython-312.pyc
│ │ │ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── wheel.cpython-312.pyc
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── database.py
│ │ │ │ │ ├── index.py
│ │ │ │ │ ├── locators.py
│ │ │ │ │ ├── manifest.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── resources.py
│ │ │ │ │ ├── scripts.py
│ │ │ │ │ ├── t32.exe
│ │ │ │ │ ├── t64-arm.exe
│ │ │ │ │ ├── t64.exe
│ │ │ │ │ ├── util.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ ├── w32.exe
│ │ │ │ │ ├── w64-arm.exe
│ │ │ │ │ ├── w64.exe
│ │ │ │ │ └── wheel.py
│ │ │ │ ├── distro
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ └── distro.cpython-312.pyc
│ │ │ │ │ ├── distro.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── idna
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── codec.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── core.cpython-312.pyc
│ │ │ │ │ │ ├── idnadata.cpython-312.pyc
│ │ │ │ │ │ ├── intranges.cpython-312.pyc
│ │ │ │ │ │ ├── package_data.cpython-312.pyc
│ │ │ │ │ │ └── uts46data.cpython-312.pyc
│ │ │ │ │ ├── codec.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── core.py
│ │ │ │ │ ├── idnadata.py
│ │ │ │ │ ├── intranges.py
│ │ │ │ │ ├── package_data.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ └── uts46data.py
│ │ │ │ ├── msgpack
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── ext.cpython-312.pyc
│ │ │ │ │ │ └── fallback.cpython-312.pyc
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── ext.py
│ │ │ │ │ └── fallback.py
│ │ │ │ ├── packaging
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _elffile.cpython-312.pyc
│ │ │ │ │ │ ├── _manylinux.cpython-312.pyc
│ │ │ │ │ │ ├── _musllinux.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _structures.cpython-312.pyc
│ │ │ │ │ │ ├── _tokenizer.cpython-312.pyc
│ │ │ │ │ │ ├── markers.cpython-312.pyc
│ │ │ │ │ │ ├── metadata.cpython-312.pyc
│ │ │ │ │ │ ├── requirements.cpython-312.pyc
│ │ │ │ │ │ ├── specifiers.cpython-312.pyc
│ │ │ │ │ │ ├── tags.cpython-312.pyc
│ │ │ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ │ │ └── version.cpython-312.pyc
│ │ │ │ │ ├── _elffile.py
│ │ │ │ │ ├── _manylinux.py
│ │ │ │ │ ├── _musllinux.py
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _structures.py
│ │ │ │ │ ├── _tokenizer.py
│ │ │ │ │ ├── markers.py
│ │ │ │ │ ├── metadata.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── requirements.py
│ │ │ │ │ ├── specifiers.py
│ │ │ │ │ ├── tags.py
│ │ │ │ │ ├── utils.py
│ │ │ │ │ └── version.py
│ │ │ │ ├── pkg_resources
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── __pycache__
│ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ ├── platformdirs
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── android.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── macos.cpython-312.pyc
│ │ │ │ │ │ ├── unix.cpython-312.pyc
│ │ │ │ │ │ ├── version.cpython-312.pyc
│ │ │ │ │ │ └── windows.cpython-312.pyc
│ │ │ │ │ ├── android.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── macos.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── unix.py
│ │ │ │ │ ├── version.py
│ │ │ │ │ └── windows.py
│ │ │ │ ├── pygments
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── cmdline.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── filter.cpython-312.pyc
│ │ │ │ │ │ ├── formatter.cpython-312.pyc
│ │ │ │ │ │ ├── lexer.cpython-312.pyc
│ │ │ │ │ │ ├── modeline.cpython-312.pyc
│ │ │ │ │ │ ├── plugin.cpython-312.pyc
│ │ │ │ │ │ ├── regexopt.cpython-312.pyc
│ │ │ │ │ │ ├── scanner.cpython-312.pyc
│ │ │ │ │ │ ├── sphinxext.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── token.cpython-312.pyc
│ │ │ │ │ │ ├── unistring.cpython-312.pyc
│ │ │ │ │ │ └── util.cpython-312.pyc
│ │ │ │ │ ├── cmdline.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── filter.py
│ │ │ │ │ ├── filters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ └── __pycache__
│ │ │ │ │ │ └── __init__.cpython-312.pyc
│ │ │ │ │ ├── formatter.py
│ │ │ │ │ ├── formatters
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ ├── bbcode.cpython-312.pyc
│ │ │ │ │ │ │ ├── groff.cpython-312.pyc
│ │ │ │ │ │ │ ├── html.cpython-312.pyc
│ │ │ │ │ │ │ ├── img.cpython-312.pyc
│ │ │ │ │ │ │ ├── irc.cpython-312.pyc
│ │ │ │ │ │ │ ├── latex.cpython-312.pyc
│ │ │ │ │ │ │ ├── other.cpython-312.pyc
│ │ │ │ │ │ │ ├── pangomarkup.cpython-312.pyc
│ │ │ │ │ │ │ ├── rtf.cpython-312.pyc
│ │ │ │ │ │ │ ├── svg.cpython-312.pyc
│ │ │ │ │ │ │ ├── terminal.cpython-312.pyc
│ │ │ │ │ │ │ └── terminal256.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ ├── bbcode.py
│ │ │ │ │ │ ├── groff.py
│ │ │ │ │ │ ├── html.py
│ │ │ │ │ │ ├── img.py
│ │ │ │ │ │ ├── irc.py
│ │ │ │ │ │ ├── latex.py
│ │ │ │ │ │ ├── other.py
│ │ │ │ │ │ ├── pangomarkup.py
│ │ │ │ │ │ ├── rtf.py
│ │ │ │ │ │ ├── svg.py
│ │ │ │ │ │ ├── terminal.py
│ │ │ │ │ │ └── terminal256.py
│ │ │ │ │ ├── lexer.py
│ │ │ │ │ ├── lexers
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _mapping.cpython-312.pyc
│ │ │ │ │ │ │ └── python.cpython-312.pyc
│ │ │ │ │ │ ├── _mapping.py
│ │ │ │ │ │ └── python.py
│ │ │ │ │ ├── modeline.py
│ │ │ │ │ ├── plugin.py
│ │ │ │ │ ├── regexopt.py
│ │ │ │ │ ├── scanner.py
│ │ │ │ │ ├── sphinxext.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styles
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── _mapping.cpython-312.pyc
│ │ │ │ │ │ └── _mapping.py
│ │ │ │ │ ├── token.py
│ │ │ │ │ ├── unistring.py
│ │ │ │ │ └── util.py
│ │ │ │ ├── pyproject_hooks
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _compat.cpython-312.pyc
│ │ │ │ │ │ └── _impl.cpython-312.pyc
│ │ │ │ │ ├── _compat.py
│ │ │ │ │ ├── _impl.py
│ │ │ │ │ └── _in_process
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ └── _in_process.cpython-312.pyc
│ │ │ │ │ └── _in_process.py
│ │ │ │ ├── requests
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ │ ├── __version__.py
│ │ │ │ │ ├── _internal_utils.py
│ │ │ │ │ ├── adapters.py
│ │ │ │ │ ├── api.py
│ │ │ │ │ ├── auth.py
│ │ │ │ │ ├── certs.py
│ │ │ │ │ ├── compat.py
│ │ │ │ │ ├── cookies.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── help.py
│ │ │ │ │ ├── hooks.py
│ │ │ │ │ ├── models.py
│ │ │ │ │ ├── packages.py
│ │ │ │ │ ├── sessions.py
│ │ │ │ │ ├── status_codes.py
│ │ │ │ │ ├── structures.py
│ │ │ │ │ └── utils.py
│ │ │ │ ├── resolvelib
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── providers.cpython-312.pyc
│ │ │ │ │ │ ├── reporters.cpython-312.pyc
│ │ │ │ │ │ ├── resolvers.cpython-312.pyc
│ │ │ │ │ │ └── structs.cpython-312.pyc
│ │ │ │ │ ├── compat
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── collections_abc.cpython-312.pyc
│ │ │ │ │ │ └── collections_abc.py
│ │ │ │ │ ├── providers.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── reporters.py
│ │ │ │ │ ├── resolvers.py
│ │ │ │ │ └── structs.py
│ │ │ │ ├── rich
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __main__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── __main__.cpython-312.pyc
│ │ │ │ │ │ ├── _cell_widths.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_codes.cpython-312.pyc
│ │ │ │ │ │ ├── _emoji_replace.cpython-312.pyc
│ │ │ │ │ │ ├── _export_format.cpython-312.pyc
│ │ │ │ │ │ ├── _extension.cpython-312.pyc
│ │ │ │ │ │ ├── _fileno.cpython-312.pyc
│ │ │ │ │ │ ├── _inspect.cpython-312.pyc
│ │ │ │ │ │ ├── _log_render.cpython-312.pyc
│ │ │ │ │ │ ├── _loop.cpython-312.pyc
│ │ │ │ │ │ ├── _null_file.cpython-312.pyc
│ │ │ │ │ │ ├── _palettes.cpython-312.pyc
│ │ │ │ │ │ ├── _pick.cpython-312.pyc
│ │ │ │ │ │ ├── _ratio.cpython-312.pyc
│ │ │ │ │ │ ├── _spinners.cpython-312.pyc
│ │ │ │ │ │ ├── _stack.cpython-312.pyc
│ │ │ │ │ │ ├── _timer.cpython-312.pyc
│ │ │ │ │ │ ├── _win32_console.cpython-312.pyc
│ │ │ │ │ │ ├── _windows_renderer.cpython-312.pyc
│ │ │ │ │ │ ├── _windows.cpython-312.pyc
│ │ │ │ │ │ ├── _wrap.cpython-312.pyc
│ │ │ │ │ │ ├── abc.cpython-312.pyc
│ │ │ │ │ │ ├── align.cpython-312.pyc
│ │ │ │ │ │ ├── ansi.cpython-312.pyc
│ │ │ │ │ │ ├── bar.cpython-312.pyc
│ │ │ │ │ │ ├── box.cpython-312.pyc
│ │ │ │ │ │ ├── cells.cpython-312.pyc
│ │ │ │ │ │ ├── color_triplet.cpython-312.pyc
│ │ │ │ │ │ ├── color.cpython-312.pyc
│ │ │ │ │ │ ├── columns.cpython-312.pyc
│ │ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ │ ├── constrain.cpython-312.pyc
│ │ │ │ │ │ ├── containers.cpython-312.pyc
│ │ │ │ │ │ ├── control.cpython-312.pyc
│ │ │ │ │ │ ├── default_styles.cpython-312.pyc
│ │ │ │ │ │ ├── diagnose.cpython-312.pyc
│ │ │ │ │ │ ├── emoji.cpython-312.pyc
│ │ │ │ │ │ ├── errors.cpython-312.pyc
│ │ │ │ │ │ ├── file_proxy.cpython-312.pyc
│ │ │ │ │ │ ├── filesize.cpython-312.pyc
│ │ │ │ │ │ ├── highlighter.cpython-312.pyc
│ │ │ │ │ │ ├── json.cpython-312.pyc
│ │ │ │ │ │ ├── jupyter.cpython-312.pyc
│ │ │ │ │ │ ├── layout.cpython-312.pyc
│ │ │ │ │ │ ├── live_render.cpython-312.pyc
│ │ │ │ │ │ ├── live.cpython-312.pyc
│ │ │ │ │ │ ├── logging.cpython-312.pyc
│ │ │ │ │ │ ├── markup.cpython-312.pyc
│ │ │ │ │ │ ├── measure.cpython-312.pyc
│ │ │ │ │ │ ├── padding.cpython-312.pyc
│ │ │ │ │ │ ├── pager.cpython-312.pyc
│ │ │ │ │ │ ├── palette.cpython-312.pyc
│ │ │ │ │ │ ├── panel.cpython-312.pyc
│ │ │ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ │ │ ├── progress_bar.cpython-312.pyc
│ │ │ │ │ │ ├── progress.cpython-312.pyc
│ │ │ │ │ │ ├── prompt.cpython-312.pyc
│ │ │ │ │ │ ├── protocol.cpython-312.pyc
│ │ │ │ │ │ ├── region.cpython-312.pyc
│ │ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ │ ├── rule.cpython-312.pyc
│ │ │ │ │ │ ├── scope.cpython-312.pyc
│ │ │ │ │ │ ├── screen.cpython-312.pyc
│ │ │ │ │ │ ├── segment.cpython-312.pyc
│ │ │ │ │ │ ├── spinner.cpython-312.pyc
│ │ │ │ │ │ ├── status.cpython-312.pyc
│ │ │ │ │ │ ├── style.cpython-312.pyc
│ │ │ │ │ │ ├── styled.cpython-312.pyc
│ │ │ │ │ │ ├── syntax.cpython-312.pyc
│ │ │ │ │ │ ├── table.cpython-312.pyc
│ │ │ │ │ │ ├── terminal_theme.cpython-312.pyc
│ │ │ │ │ │ ├── text.cpython-312.pyc
│ │ │ │ │ │ ├── theme.cpython-312.pyc
│ │ │ │ │ │ ├── themes.cpython-312.pyc
│ │ │ │ │ │ ├── traceback.cpython-312.pyc
│ │ │ │ │ │ └── tree.cpython-312.pyc
│ │ │ │ │ ├── _cell_widths.py
│ │ │ │ │ ├── _emoji_codes.py
│ │ │ │ │ ├── _emoji_replace.py
│ │ │ │ │ ├── _export_format.py
│ │ │ │ │ ├── _extension.py
│ │ │ │ │ ├── _fileno.py
│ │ │ │ │ ├── _inspect.py
│ │ │ │ │ ├── _log_render.py
│ │ │ │ │ ├── _loop.py
│ │ │ │ │ ├── _null_file.py
│ │ │ │ │ ├── _palettes.py
│ │ │ │ │ ├── _pick.py
│ │ │ │ │ ├── _ratio.py
│ │ │ │ │ ├── _spinners.py
│ │ │ │ │ ├── _stack.py
│ │ │ │ │ ├── _timer.py
│ │ │ │ │ ├── _win32_console.py
│ │ │ │ │ ├── _windows_renderer.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ ├── _wrap.py
│ │ │ │ │ ├── abc.py
│ │ │ │ │ ├── align.py
│ │ │ │ │ ├── ansi.py
│ │ │ │ │ ├── bar.py
│ │ │ │ │ ├── box.py
│ │ │ │ │ ├── cells.py
│ │ │ │ │ ├── color_triplet.py
│ │ │ │ │ ├── color.py
│ │ │ │ │ ├── columns.py
│ │ │ │ │ ├── console.py
│ │ │ │ │ ├── constrain.py
│ │ │ │ │ ├── containers.py
│ │ │ │ │ ├── control.py
│ │ │ │ │ ├── default_styles.py
│ │ │ │ │ ├── diagnose.py
│ │ │ │ │ ├── emoji.py
│ │ │ │ │ ├── errors.py
│ │ │ │ │ ├── file_proxy.py
│ │ │ │ │ ├── filesize.py
│ │ │ │ │ ├── highlighter.py
│ │ │ │ │ ├── json.py
│ │ │ │ │ ├── jupyter.py
│ │ │ │ │ ├── layout.py
│ │ │ │ │ ├── live_render.py
│ │ │ │ │ ├── live.py
│ │ │ │ │ ├── logging.py
│ │ │ │ │ ├── markup.py
│ │ │ │ │ ├── measure.py
│ │ │ │ │ ├── padding.py
│ │ │ │ │ ├── pager.py
│ │ │ │ │ ├── palette.py
│ │ │ │ │ ├── panel.py
│ │ │ │ │ ├── pretty.py
│ │ │ │ │ ├── progress_bar.py
│ │ │ │ │ ├── progress.py
│ │ │ │ │ ├── prompt.py
│ │ │ │ │ ├── protocol.py
│ │ │ │ │ ├── py.typed
│ │ │ │ │ ├── region.py
│ │ │ │ │ ├── repr.py
│ │ │ │ │ ├── rule.py
│ │ │ │ │ ├── scope.py
│ │ │ │ │ ├── screen.py
│ │ │ │ │ ├── segment.py
│ │ │ │ │ ├── spinner.py
│ │ │ │ │ ├── status.py
│ │ │ │ │ ├── style.py
│ │ │ │ │ ├── styled.py
│ │ │ │ │ ├── syntax.py
│ │ │ │ │ ├── table.py
│ │ │ │ │ ├── terminal_theme.py
│ │ │ │ │ ├── text.py
│ │ │ │ │ ├── theme.py
│ │ │ │ │ ├── themes.py
│ │ │ │ │ ├── traceback.py
│ │ │ │ │ └── tree.py
│ │ │ │ ├── tomli
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _parser.cpython-312.pyc
│ │ │ │ │ │ ├── _re.cpython-312.pyc
│ │ │ │ │ │ └── _types.cpython-312.pyc
│ │ │ │ │ ├── _parser.py
│ │ │ │ │ ├── _re.py
│ │ │ │ │ ├── _types.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── truststore
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _api.cpython-312.pyc
│ │ │ │ │ │ ├── _macos.cpython-312.pyc
│ │ │ │ │ │ ├── _openssl.cpython-312.pyc
│ │ │ │ │ │ ├── _ssl_constants.cpython-312.pyc
│ │ │ │ │ │ └── _windows.cpython-312.pyc
│ │ │ │ │ ├── _api.py
│ │ │ │ │ ├── _macos.py
│ │ │ │ │ ├── _openssl.py
│ │ │ │ │ ├── _ssl_constants.py
│ │ │ │ │ ├── _windows.py
│ │ │ │ │ └── py.typed
│ │ │ │ ├── typing_extensions.py
│ │ │ │ ├── urllib3
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── _collections.py
│ │ │ │ │ ├── _version.py
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── connectionpool.py
│ │ │ │ │ ├── contrib
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ ├── _appengine_environ.cpython-312.pyc
│ │ │ │ │ │ │ ├── appengine.cpython-312.pyc
│ │ │ │ │ │ │ ├── ntlmpool.cpython-312.pyc
│ │ │ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ │ │ ├── securetransport.cpython-312.pyc
│ │ │ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ │ │ ├── _appengine_environ.py
│ │ │ │ │ │ ├── _securetransport
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── bindings.cpython-312.pyc
│ │ │ │ │ │ │ │ └── low_level.cpython-312.pyc
│ │ │ │ │ │ │ ├── bindings.py
│ │ │ │ │ │ │ └── low_level.py
│ │ │ │ │ │ ├── appengine.py
│ │ │ │ │ │ ├── ntlmpool.py
│ │ │ │ │ │ ├── pyopenssl.py
│ │ │ │ │ │ ├── securetransport.py
│ │ │ │ │ │ └── socks.py
│ │ │ │ │ ├── exceptions.py
│ │ │ │ │ ├── fields.py
│ │ │ │ │ ├── filepost.py
│ │ │ │ │ ├── packages
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ └── six.cpython-312.pyc
│ │ │ │ │ │ ├── backports
│ │ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ │ │ ├── makefile.cpython-312.pyc
│ │ │ │ │ │ │ │ └── weakref_finalize.cpython-312.pyc
│ │ │ │ │ │ │ ├── makefile.py
│ │ │ │ │ │ │ └── weakref_finalize.py
│ │ │ │ │ │ └── six.py
│ │ │ │ │ ├── poolmanager.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ └── util
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ │ │ ├── queue.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ │ │ └── wait.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── proxy.py
│ │ │ │ │ ├── queue.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ ├── response.py
│ │ │ │ │ ├── retry.py
│ │ │ │ │ ├── ssl_.py
│ │ │ │ │ ├── ssl_match_hostname.py
│ │ │ │ │ ├── ssltransport.py
│ │ │ │ │ ├── timeout.py
│ │ │ │ │ ├── url.py
│ │ │ │ │ └── wait.py
│ │ │ │ └── vendor.txt
│ │ │ └── py.typed
│ │ ├── pip-24.2.dist-info
│ │ │ ├── AUTHORS.txt
│ │ │ ├── entry_points.txt
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── requests
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __version__.cpython-312.pyc
│ │ │ │ ├── _internal_utils.cpython-312.pyc
│ │ │ │ ├── adapters.cpython-312.pyc
│ │ │ │ ├── api.cpython-312.pyc
│ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ ├── certs.cpython-312.pyc
│ │ │ │ ├── compat.cpython-312.pyc
│ │ │ │ ├── cookies.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── help.cpython-312.pyc
│ │ │ │ ├── hooks.cpython-312.pyc
│ │ │ │ ├── models.cpython-312.pyc
│ │ │ │ ├── packages.cpython-312.pyc
│ │ │ │ ├── sessions.cpython-312.pyc
│ │ │ │ ├── status_codes.cpython-312.pyc
│ │ │ │ ├── structures.cpython-312.pyc
│ │ │ │ └── utils.cpython-312.pyc
│ │ │ ├── __version__.py
│ │ │ ├── _internal_utils.py
│ │ │ ├── adapters.py
│ │ │ ├── api.py
│ │ │ ├── auth.py
│ │ │ ├── certs.py
│ │ │ ├── compat.py
│ │ │ ├── cookies.py
│ │ │ ├── exceptions.py
│ │ │ ├── help.py
│ │ │ ├── hooks.py
│ │ │ ├── models.py
│ │ │ ├── packages.py
│ │ │ ├── sessions.py
│ │ │ ├── status_codes.py
│ │ │ ├── structures.py
│ │ │ └── utils.py
│ │ ├── requests-2.32.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── soupsieve
│ │ │ ├── __init__.py
│ │ │ ├── __meta__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── __meta__.cpython-312.pyc
│ │ │ │ ├── css_match.cpython-312.pyc
│ │ │ │ ├── css_parser.cpython-312.pyc
│ │ │ │ ├── css_types.cpython-312.pyc
│ │ │ │ ├── pretty.cpython-312.pyc
│ │ │ │ └── util.cpython-312.pyc
│ │ │ ├── css_match.py
│ │ │ ├── css_parser.py
│ │ │ ├── css_types.py
│ │ │ ├── pretty.py
│ │ │ ├── py.typed
│ │ │ └── util.py
│ │ ├── soupsieve-2.6.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.md
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── urllib3
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _base_connection.cpython-312.pyc
│ │ │ │ ├── _collections.cpython-312.pyc
│ │ │ │ ├── _request_methods.cpython-312.pyc
│ │ │ │ ├── _version.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── connectionpool.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── fields.cpython-312.pyc
│ │ │ │ ├── filepost.cpython-312.pyc
│ │ │ │ ├── poolmanager.cpython-312.pyc
│ │ │ │ └── response.cpython-312.pyc
│ │ │ ├── _base_connection.py
│ │ │ ├── _collections.py
│ │ │ ├── _request_methods.py
│ │ │ ├── _version.py
│ │ │ ├── connection.py
│ │ │ ├── connectionpool.py
│ │ │ ├── contrib
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── pyopenssl.cpython-312.pyc
│ │ │ │ │ └── socks.cpython-312.pyc
│ │ │ │ ├── emscripten
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── __pycache__
│ │ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ │ ├── fetch.cpython-312.pyc
│ │ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ │ ├── connection.py
│ │ │ │ │ ├── emscripten_fetch_worker.js
│ │ │ │ │ ├── fetch.py
│ │ │ │ │ ├── request.py
│ │ │ │ │ └── response.py
│ │ │ │ ├── pyopenssl.py
│ │ │ │ └── socks.py
│ │ │ ├── exceptions.py
│ │ │ ├── fields.py
│ │ │ ├── filepost.py
│ │ │ ├── http2
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ │ └── probe.cpython-312.pyc
│ │ │ │ ├── connection.py
│ │ │ │ └── probe.py
│ │ │ ├── poolmanager.py
│ │ │ ├── py.typed
│ │ │ ├── response.py
│ │ │ └── util
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── connection.cpython-312.pyc
│ │ │ │ ├── proxy.cpython-312.pyc
│ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ ├── retry.cpython-312.pyc
│ │ │ │ ├── ssl_.cpython-312.pyc
│ │ │ │ ├── ssl_match_hostname.cpython-312.pyc
│ │ │ │ ├── ssltransport.cpython-312.pyc
│ │ │ │ ├── timeout.cpython-312.pyc
│ │ │ │ ├── url.cpython-312.pyc
│ │ │ │ ├── util.cpython-312.pyc
│ │ │ │ └── wait.cpython-312.pyc
│ │ │ ├── connection.py
│ │ │ ├── proxy.py
│ │ │ ├── request.py
│ │ │ ├── response.py
│ │ │ ├── retry.py
│ │ │ ├── ssl_.py
│ │ │ ├── ssl_match_hostname.py
│ │ │ ├── ssltransport.py
│ │ │ ├── timeout.py
│ │ │ ├── url.py
│ │ │ ├── util.py
│ │ │ └── wait.py
│ │ ├── urllib3-2.2.3.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── licenses
│ │ │ │ └── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── WHEEL
│ │ ├── useragent
│ │ │ ├── __init__.py
│ │ │ ├── __init__.pyc
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── resources
│ │ │ │ └── user_agent_data.json
│ │ │ └── test
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ └── __init__.cpython-312.pyc
│ │ │ ├── test_additional_os.json
│ │ │ ├── test_browser.json
│ │ │ ├── test_device.json
│ │ │ ├── test_firefox.json
│ │ │ ├── test_os.json
│ │ │ └── test_pgts_browser.json
│ │ ├── useragent-0.1.1.dist-info
│ │ │ ├── INSTALLER
│ │ │ ├── LICENSE.txt
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ ├── REQUESTED
│ │ │ ├── top_level.txt
│ │ │ └── WHEEL
│ │ ├── werkzeug
│ │ │ ├── __init__.py
│ │ │ ├── __pycache__
│ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ ├── _internal.cpython-312.pyc
│ │ │ │ ├── _reloader.cpython-312.pyc
│ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ ├── formparser.cpython-312.pyc
│ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ ├── local.cpython-312.pyc
│ │ │ │ ├── security.cpython-312.pyc
│ │ │ │ ├── serving.cpython-312.pyc
│ │ │ │ ├── test.cpython-312.pyc
│ │ │ │ ├── testapp.cpython-312.pyc
│ │ │ │ ├── urls.cpython-312.pyc
│ │ │ │ ├── user_agent.cpython-312.pyc
│ │ │ │ ├── utils.cpython-312.pyc
│ │ │ │ └── wsgi.cpython-312.pyc
│ │ │ ├── _internal.py
│ │ │ ├── _reloader.py
│ │ │ ├── datastructures
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── accept.cpython-312.pyc
│ │ │ │ │ ├── auth.cpython-312.pyc
│ │ │ │ │ ├── cache_control.cpython-312.pyc
│ │ │ │ │ ├── csp.cpython-312.pyc
│ │ │ │ │ ├── etag.cpython-312.pyc
│ │ │ │ │ ├── file_storage.cpython-312.pyc
│ │ │ │ │ ├── headers.cpython-312.pyc
│ │ │ │ │ ├── mixins.cpython-312.pyc
│ │ │ │ │ ├── range.cpython-312.pyc
│ │ │ │ │ └── structures.cpython-312.pyc
│ │ │ │ ├── accept.py
│ │ │ │ ├── accept.pyi
│ │ │ │ ├── auth.py
│ │ │ │ ├── cache_control.py
│ │ │ │ ├── cache_control.pyi
│ │ │ │ ├── csp.py
│ │ │ │ ├── csp.pyi
│ │ │ │ ├── etag.py
│ │ │ │ ├── etag.pyi
│ │ │ │ ├── file_storage.py
│ │ │ │ ├── file_storage.pyi
│ │ │ │ ├── headers.py
│ │ │ │ ├── headers.pyi
│ │ │ │ ├── mixins.py
│ │ │ │ ├── mixins.pyi
│ │ │ │ ├── range.py
│ │ │ │ ├── range.pyi
│ │ │ │ ├── structures.py
│ │ │ │ └── structures.pyi
│ │ │ ├── debug
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── console.cpython-312.pyc
│ │ │ │ │ ├── repr.cpython-312.pyc
│ │ │ │ │ └── tbtools.cpython-312.pyc
│ │ │ │ ├── console.py
│ │ │ │ ├── repr.py
│ │ │ │ ├── shared
│ │ │ │ │ ├── console.png
│ │ │ │ │ ├── debugger.js
│ │ │ │ │ ├── ICON_LICENSE.md
│ │ │ │ │ ├── less.png
│ │ │ │ │ ├── more.png
│ │ │ │ │ └── style.css
│ │ │ │ └── tbtools.py
│ │ │ ├── exceptions.py
│ │ │ ├── formparser.py
│ │ │ ├── http.py
│ │ │ ├── local.py
│ │ │ ├── middleware
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── dispatcher.cpython-312.pyc
│ │ │ │ │ ├── http_proxy.cpython-312.pyc
│ │ │ │ │ ├── lint.cpython-312.pyc
│ │ │ │ │ ├── profiler.cpython-312.pyc
│ │ │ │ │ ├── proxy_fix.cpython-312.pyc
│ │ │ │ │ └── shared_data.cpython-312.pyc
│ │ │ │ ├── dispatcher.py
│ │ │ │ ├── http_proxy.py
│ │ │ │ ├── lint.py
│ │ │ │ ├── profiler.py
│ │ │ │ ├── proxy_fix.py
│ │ │ │ └── shared_data.py
│ │ │ ├── py.typed
│ │ │ ├── routing
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── converters.cpython-312.pyc
│ │ │ │ │ ├── exceptions.cpython-312.pyc
│ │ │ │ │ ├── map.cpython-312.pyc
│ │ │ │ │ ├── matcher.cpython-312.pyc
│ │ │ │ │ └── rules.cpython-312.pyc
│ │ │ │ ├── converters.py
│ │ │ │ ├── exceptions.py
│ │ │ │ ├── map.py
│ │ │ │ ├── matcher.py
│ │ │ │ └── rules.py
│ │ │ ├── sansio
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── http.cpython-312.pyc
│ │ │ │ │ ├── multipart.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ ├── response.cpython-312.pyc
│ │ │ │ │ └── utils.cpython-312.pyc
│ │ │ │ ├── http.py
│ │ │ │ ├── multipart.py
│ │ │ │ ├── request.py
│ │ │ │ ├── response.py
│ │ │ │ └── utils.py
│ │ │ ├── security.py
│ │ │ ├── serving.py
│ │ │ ├── test.py
│ │ │ ├── testapp.py
│ │ │ ├── urls.py
│ │ │ ├── user_agent.py
│ │ │ ├── utils.py
│ │ │ ├── wrappers
│ │ │ │ ├── __init__.py
│ │ │ │ ├── __pycache__
│ │ │ │ │ ├── __init__.cpython-312.pyc
│ │ │ │ │ ├── request.cpython-312.pyc
│ │ │ │ │ └── response.cpython-312.pyc
│ │ │ │ ├── request.py
│ │ │ │ └── response.py
│ │ │ └── wsgi.py
│ │ └── werkzeug-3.0.4.dist-info
│ │ ├── INSTALLER
│ │ ├── LICENSE.txt
│ │ ├── METADATA
│ │ ├── RECORD
│ │ └── WHEEL
│ ├── pyvenv.cfg
│ ├── static
│ │ └── styles.css
│ ├── templates
│ │ └── index.html
│ └── test.py
├── cline_config.json
├── mcp_server.py
├── README.md
├── search_results.json
├── settings.json
└── test_files
├── text1.txt
└── text2.txt
```
# Files
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py:
--------------------------------------------------------------------------------
```python
1 | import logging
2 | import os.path
3 | import pathlib
4 | import re
5 | import urllib.parse
6 | import urllib.request
7 | from dataclasses import replace
8 | from typing import List, Optional, Tuple
9 |
10 | from pip._internal.exceptions import BadCommand, InstallationError
11 | from pip._internal.utils.misc import HiddenText, display_path, hide_url
12 | from pip._internal.utils.subprocess import make_command
13 | from pip._internal.vcs.versioncontrol import (
14 | AuthInfo,
15 | RemoteNotFoundError,
16 | RemoteNotValidError,
17 | RevOptions,
18 | VersionControl,
19 | find_path_to_project_root_from_repo_root,
20 | vcs,
21 | )
22 |
23 | urlsplit = urllib.parse.urlsplit
24 | urlunsplit = urllib.parse.urlunsplit
25 |
26 |
27 | logger = logging.getLogger(__name__)
28 |
29 |
30 | GIT_VERSION_REGEX = re.compile(
31 | r"^git version " # Prefix.
32 | r"(\d+)" # Major.
33 | r"\.(\d+)" # Dot, minor.
34 | r"(?:\.(\d+))?" # Optional dot, patch.
35 | r".*$" # Suffix, including any pre- and post-release segments we don't care about.
36 | )
37 |
38 | HASH_REGEX = re.compile("^[a-fA-F0-9]{40}$")
39 |
40 | # SCP (Secure copy protocol) shorthand. e.g. '[email protected]:foo/bar.git'
41 | SCP_REGEX = re.compile(
42 | r"""^
43 | # Optional user, e.g. 'git@'
44 | (\w+@)?
45 | # Server, e.g. 'github.com'.
46 | ([^/:]+):
47 | # The server-side path. e.g. 'user/project.git'. Must start with an
48 | # alphanumeric character so as not to be confusable with a Windows paths
49 | # like 'C:/foo/bar' or 'C:\foo\bar'.
50 | (\w[^:]*)
51 | $""",
52 | re.VERBOSE,
53 | )
54 |
55 |
56 | def looks_like_hash(sha: str) -> bool:
57 | return bool(HASH_REGEX.match(sha))
58 |
59 |
60 | class Git(VersionControl):
61 | name = "git"
62 | dirname = ".git"
63 | repo_name = "clone"
64 | schemes = (
65 | "git+http",
66 | "git+https",
67 | "git+ssh",
68 | "git+git",
69 | "git+file",
70 | )
71 | # Prevent the user's environment variables from interfering with pip:
72 | # https://github.com/pypa/pip/issues/1130
73 | unset_environ = ("GIT_DIR", "GIT_WORK_TREE")
74 | default_arg_rev = "HEAD"
75 |
76 | @staticmethod
77 | def get_base_rev_args(rev: str) -> List[str]:
78 | return [rev]
79 |
80 | def is_immutable_rev_checkout(self, url: str, dest: str) -> bool:
81 | _, rev_options = self.get_url_rev_options(hide_url(url))
82 | if not rev_options.rev:
83 | return False
84 | if not self.is_commit_id_equal(dest, rev_options.rev):
85 | # the current commit is different from rev,
86 | # which means rev was something else than a commit hash
87 | return False
88 | # return False in the rare case rev is both a commit hash
89 | # and a tag or a branch; we don't want to cache in that case
90 | # because that branch/tag could point to something else in the future
91 | is_tag_or_branch = bool(self.get_revision_sha(dest, rev_options.rev)[0])
92 | return not is_tag_or_branch
93 |
94 | def get_git_version(self) -> Tuple[int, ...]:
95 | version = self.run_command(
96 | ["version"],
97 | command_desc="git version",
98 | show_stdout=False,
99 | stdout_only=True,
100 | )
101 | match = GIT_VERSION_REGEX.match(version)
102 | if not match:
103 | logger.warning("Can't parse git version: %s", version)
104 | return ()
105 | return (int(match.group(1)), int(match.group(2)))
106 |
107 | @classmethod
108 | def get_current_branch(cls, location: str) -> Optional[str]:
109 | """
110 | Return the current branch, or None if HEAD isn't at a branch
111 | (e.g. detached HEAD).
112 | """
113 | # git-symbolic-ref exits with empty stdout if "HEAD" is a detached
114 | # HEAD rather than a symbolic ref. In addition, the -q causes the
115 | # command to exit with status code 1 instead of 128 in this case
116 | # and to suppress the message to stderr.
117 | args = ["symbolic-ref", "-q", "HEAD"]
118 | output = cls.run_command(
119 | args,
120 | extra_ok_returncodes=(1,),
121 | show_stdout=False,
122 | stdout_only=True,
123 | cwd=location,
124 | )
125 | ref = output.strip()
126 |
127 | if ref.startswith("refs/heads/"):
128 | return ref[len("refs/heads/") :]
129 |
130 | return None
131 |
132 | @classmethod
133 | def get_revision_sha(cls, dest: str, rev: str) -> Tuple[Optional[str], bool]:
134 | """
135 | Return (sha_or_none, is_branch), where sha_or_none is a commit hash
136 | if the revision names a remote branch or tag, otherwise None.
137 |
138 | Args:
139 | dest: the repository directory.
140 | rev: the revision name.
141 | """
142 | # Pass rev to pre-filter the list.
143 | output = cls.run_command(
144 | ["show-ref", rev],
145 | cwd=dest,
146 | show_stdout=False,
147 | stdout_only=True,
148 | on_returncode="ignore",
149 | )
150 | refs = {}
151 | # NOTE: We do not use splitlines here since that would split on other
152 | # unicode separators, which can be maliciously used to install a
153 | # different revision.
154 | for line in output.strip().split("\n"):
155 | line = line.rstrip("\r")
156 | if not line:
157 | continue
158 | try:
159 | ref_sha, ref_name = line.split(" ", maxsplit=2)
160 | except ValueError:
161 | # Include the offending line to simplify troubleshooting if
162 | # this error ever occurs.
163 | raise ValueError(f"unexpected show-ref line: {line!r}")
164 |
165 | refs[ref_name] = ref_sha
166 |
167 | branch_ref = f"refs/remotes/origin/{rev}"
168 | tag_ref = f"refs/tags/{rev}"
169 |
170 | sha = refs.get(branch_ref)
171 | if sha is not None:
172 | return (sha, True)
173 |
174 | sha = refs.get(tag_ref)
175 |
176 | return (sha, False)
177 |
178 | @classmethod
179 | def _should_fetch(cls, dest: str, rev: str) -> bool:
180 | """
181 | Return true if rev is a ref or is a commit that we don't have locally.
182 |
183 | Branches and tags are not considered in this method because they are
184 | assumed to be always available locally (which is a normal outcome of
185 | ``git clone`` and ``git fetch --tags``).
186 | """
187 | if rev.startswith("refs/"):
188 | # Always fetch remote refs.
189 | return True
190 |
191 | if not looks_like_hash(rev):
192 | # Git fetch would fail with abbreviated commits.
193 | return False
194 |
195 | if cls.has_commit(dest, rev):
196 | # Don't fetch if we have the commit locally.
197 | return False
198 |
199 | return True
200 |
201 | @classmethod
202 | def resolve_revision(
203 | cls, dest: str, url: HiddenText, rev_options: RevOptions
204 | ) -> RevOptions:
205 | """
206 | Resolve a revision to a new RevOptions object with the SHA1 of the
207 | branch, tag, or ref if found.
208 |
209 | Args:
210 | rev_options: a RevOptions object.
211 | """
212 | rev = rev_options.arg_rev
213 | # The arg_rev property's implementation for Git ensures that the
214 | # rev return value is always non-None.
215 | assert rev is not None
216 |
217 | sha, is_branch = cls.get_revision_sha(dest, rev)
218 |
219 | if sha is not None:
220 | rev_options = rev_options.make_new(sha)
221 | rev_options = replace(rev_options, branch_name=(rev if is_branch else None))
222 |
223 | return rev_options
224 |
225 | # Do not show a warning for the common case of something that has
226 | # the form of a Git commit hash.
227 | if not looks_like_hash(rev):
228 | logger.warning(
229 | "Did not find branch or tag '%s', assuming revision or ref.",
230 | rev,
231 | )
232 |
233 | if not cls._should_fetch(dest, rev):
234 | return rev_options
235 |
236 | # fetch the requested revision
237 | cls.run_command(
238 | make_command("fetch", "-q", url, rev_options.to_args()),
239 | cwd=dest,
240 | )
241 | # Change the revision to the SHA of the ref we fetched
242 | sha = cls.get_revision(dest, rev="FETCH_HEAD")
243 | rev_options = rev_options.make_new(sha)
244 |
245 | return rev_options
246 |
247 | @classmethod
248 | def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool:
249 | """
250 | Return whether the current commit hash equals the given name.
251 |
252 | Args:
253 | dest: the repository directory.
254 | name: a string name.
255 | """
256 | if not name:
257 | # Then avoid an unnecessary subprocess call.
258 | return False
259 |
260 | return cls.get_revision(dest) == name
261 |
262 | def fetch_new(
263 | self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int
264 | ) -> None:
265 | rev_display = rev_options.to_display()
266 | logger.info("Cloning %s%s to %s", url, rev_display, display_path(dest))
267 | if verbosity <= 0:
268 | flags: Tuple[str, ...] = ("--quiet",)
269 | elif verbosity == 1:
270 | flags = ()
271 | else:
272 | flags = ("--verbose", "--progress")
273 | if self.get_git_version() >= (2, 17):
274 | # Git added support for partial clone in 2.17
275 | # https://git-scm.com/docs/partial-clone
276 | # Speeds up cloning by functioning without a complete copy of repository
277 | self.run_command(
278 | make_command(
279 | "clone",
280 | "--filter=blob:none",
281 | *flags,
282 | url,
283 | dest,
284 | )
285 | )
286 | else:
287 | self.run_command(make_command("clone", *flags, url, dest))
288 |
289 | if rev_options.rev:
290 | # Then a specific revision was requested.
291 | rev_options = self.resolve_revision(dest, url, rev_options)
292 | branch_name = getattr(rev_options, "branch_name", None)
293 | logger.debug("Rev options %s, branch_name %s", rev_options, branch_name)
294 | if branch_name is None:
295 | # Only do a checkout if the current commit id doesn't match
296 | # the requested revision.
297 | if not self.is_commit_id_equal(dest, rev_options.rev):
298 | cmd_args = make_command(
299 | "checkout",
300 | "-q",
301 | rev_options.to_args(),
302 | )
303 | self.run_command(cmd_args, cwd=dest)
304 | elif self.get_current_branch(dest) != branch_name:
305 | # Then a specific branch was requested, and that branch
306 | # is not yet checked out.
307 | track_branch = f"origin/{branch_name}"
308 | cmd_args = [
309 | "checkout",
310 | "-b",
311 | branch_name,
312 | "--track",
313 | track_branch,
314 | ]
315 | self.run_command(cmd_args, cwd=dest)
316 | else:
317 | sha = self.get_revision(dest)
318 | rev_options = rev_options.make_new(sha)
319 |
320 | logger.info("Resolved %s to commit %s", url, rev_options.rev)
321 |
322 | #: repo may contain submodules
323 | self.update_submodules(dest)
324 |
325 | def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
326 | self.run_command(
327 | make_command("config", "remote.origin.url", url),
328 | cwd=dest,
329 | )
330 | cmd_args = make_command("checkout", "-q", rev_options.to_args())
331 | self.run_command(cmd_args, cwd=dest)
332 |
333 | self.update_submodules(dest)
334 |
335 | def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
336 | # First fetch changes from the default remote
337 | if self.get_git_version() >= (1, 9):
338 | # fetch tags in addition to everything else
339 | self.run_command(["fetch", "-q", "--tags"], cwd=dest)
340 | else:
341 | self.run_command(["fetch", "-q"], cwd=dest)
342 | # Then reset to wanted revision (maybe even origin/master)
343 | rev_options = self.resolve_revision(dest, url, rev_options)
344 | cmd_args = make_command("reset", "--hard", "-q", rev_options.to_args())
345 | self.run_command(cmd_args, cwd=dest)
346 | #: update submodules
347 | self.update_submodules(dest)
348 |
349 | @classmethod
350 | def get_remote_url(cls, location: str) -> str:
351 | """
352 | Return URL of the first remote encountered.
353 |
354 | Raises RemoteNotFoundError if the repository does not have a remote
355 | url configured.
356 | """
357 | # We need to pass 1 for extra_ok_returncodes since the command
358 | # exits with return code 1 if there are no matching lines.
359 | stdout = cls.run_command(
360 | ["config", "--get-regexp", r"remote\..*\.url"],
361 | extra_ok_returncodes=(1,),
362 | show_stdout=False,
363 | stdout_only=True,
364 | cwd=location,
365 | )
366 | remotes = stdout.splitlines()
367 | try:
368 | found_remote = remotes[0]
369 | except IndexError:
370 | raise RemoteNotFoundError
371 |
372 | for remote in remotes:
373 | if remote.startswith("remote.origin.url "):
374 | found_remote = remote
375 | break
376 | url = found_remote.split(" ")[1]
377 | return cls._git_remote_to_pip_url(url.strip())
378 |
379 | @staticmethod
380 | def _git_remote_to_pip_url(url: str) -> str:
381 | """
382 | Convert a remote url from what git uses to what pip accepts.
383 |
384 | There are 3 legal forms **url** may take:
385 |
386 | 1. A fully qualified url: ssh://[email protected]/foo/bar.git
387 | 2. A local project.git folder: /path/to/bare/repository.git
388 | 3. SCP shorthand for form 1: [email protected]:foo/bar.git
389 |
390 | Form 1 is output as-is. Form 2 must be converted to URI and form 3 must
391 | be converted to form 1.
392 |
393 | See the corresponding test test_git_remote_url_to_pip() for examples of
394 | sample inputs/outputs.
395 | """
396 | if re.match(r"\w+://", url):
397 | # This is already valid. Pass it though as-is.
398 | return url
399 | if os.path.exists(url):
400 | # A local bare remote (git clone --mirror).
401 | # Needs a file:// prefix.
402 | return pathlib.PurePath(url).as_uri()
403 | scp_match = SCP_REGEX.match(url)
404 | if scp_match:
405 | # Add an ssh:// prefix and replace the ':' with a '/'.
406 | return scp_match.expand(r"ssh://\1\2/\3")
407 | # Otherwise, bail out.
408 | raise RemoteNotValidError(url)
409 |
410 | @classmethod
411 | def has_commit(cls, location: str, rev: str) -> bool:
412 | """
413 | Check if rev is a commit that is available in the local repository.
414 | """
415 | try:
416 | cls.run_command(
417 | ["rev-parse", "-q", "--verify", "sha^" + rev],
418 | cwd=location,
419 | log_failed_cmd=False,
420 | )
421 | except InstallationError:
422 | return False
423 | else:
424 | return True
425 |
426 | @classmethod
427 | def get_revision(cls, location: str, rev: Optional[str] = None) -> str:
428 | if rev is None:
429 | rev = "HEAD"
430 | current_rev = cls.run_command(
431 | ["rev-parse", rev],
432 | show_stdout=False,
433 | stdout_only=True,
434 | cwd=location,
435 | )
436 | return current_rev.strip()
437 |
438 | @classmethod
439 | def get_subdirectory(cls, location: str) -> Optional[str]:
440 | """
441 | Return the path to Python project root, relative to the repo root.
442 | Return None if the project root is in the repo root.
443 | """
444 | # find the repo root
445 | git_dir = cls.run_command(
446 | ["rev-parse", "--git-dir"],
447 | show_stdout=False,
448 | stdout_only=True,
449 | cwd=location,
450 | ).strip()
451 | if not os.path.isabs(git_dir):
452 | git_dir = os.path.join(location, git_dir)
453 | repo_root = os.path.abspath(os.path.join(git_dir, ".."))
454 | return find_path_to_project_root_from_repo_root(location, repo_root)
455 |
456 | @classmethod
457 | def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]:
458 | """
459 | Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'.
460 | That's required because although they use SSH they sometimes don't
461 | work with a ssh:// scheme (e.g. GitHub). But we need a scheme for
462 | parsing. Hence we remove it again afterwards and return it as a stub.
463 | """
464 | # Works around an apparent Git bug
465 | # (see https://article.gmane.org/gmane.comp.version-control.git/146500)
466 | scheme, netloc, path, query, fragment = urlsplit(url)
467 | if scheme.endswith("file"):
468 | initial_slashes = path[: -len(path.lstrip("/"))]
469 | newpath = initial_slashes + urllib.request.url2pathname(path).replace(
470 | "\\", "/"
471 | ).lstrip("/")
472 | after_plus = scheme.find("+") + 1
473 | url = scheme[:after_plus] + urlunsplit(
474 | (scheme[after_plus:], netloc, newpath, query, fragment),
475 | )
476 |
477 | if "://" not in url:
478 | assert "file:" not in url
479 | url = url.replace("git+", "git+ssh://")
480 | url, rev, user_pass = super().get_url_rev_and_auth(url)
481 | url = url.replace("ssh://", "")
482 | else:
483 | url, rev, user_pass = super().get_url_rev_and_auth(url)
484 |
485 | return url, rev, user_pass
486 |
487 | @classmethod
488 | def update_submodules(cls, location: str) -> None:
489 | if not os.path.exists(os.path.join(location, ".gitmodules")):
490 | return
491 | cls.run_command(
492 | ["submodule", "update", "--init", "--recursive", "-q"],
493 | cwd=location,
494 | )
495 |
496 | @classmethod
497 | def get_repository_root(cls, location: str) -> Optional[str]:
498 | loc = super().get_repository_root(location)
499 | if loc:
500 | return loc
501 | try:
502 | r = cls.run_command(
503 | ["rev-parse", "--show-toplevel"],
504 | cwd=location,
505 | show_stdout=False,
506 | stdout_only=True,
507 | on_returncode="raise",
508 | log_failed_cmd=False,
509 | )
510 | except BadCommand:
511 | logger.debug(
512 | "could not determine if %s is under git control "
513 | "because git is not available",
514 | location,
515 | )
516 | return None
517 | except InstallationError:
518 | return None
519 | return os.path.normpath(r.rstrip("\r\n"))
520 |
521 | @staticmethod
522 | def should_add_vcs_url_prefix(repo_url: str) -> bool:
523 | """In either https or ssh form, requirements must be prefixed with git+."""
524 | return True
525 |
526 |
527 | vcs.register(Git)
528 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py:
--------------------------------------------------------------------------------
```python
1 | import platform
2 | import re
3 | from colorsys import rgb_to_hls
4 | from enum import IntEnum
5 | from functools import lru_cache
6 | from typing import TYPE_CHECKING, NamedTuple, Optional, Tuple
7 |
8 | from ._palettes import EIGHT_BIT_PALETTE, STANDARD_PALETTE, WINDOWS_PALETTE
9 | from .color_triplet import ColorTriplet
10 | from .repr import Result, rich_repr
11 | from .terminal_theme import DEFAULT_TERMINAL_THEME
12 |
13 | if TYPE_CHECKING: # pragma: no cover
14 | from .terminal_theme import TerminalTheme
15 | from .text import Text
16 |
17 |
18 | WINDOWS = platform.system() == "Windows"
19 |
20 |
21 | class ColorSystem(IntEnum):
22 | """One of the 3 color system supported by terminals."""
23 |
24 | STANDARD = 1
25 | EIGHT_BIT = 2
26 | TRUECOLOR = 3
27 | WINDOWS = 4
28 |
29 | def __repr__(self) -> str:
30 | return f"ColorSystem.{self.name}"
31 |
32 | def __str__(self) -> str:
33 | return repr(self)
34 |
35 |
36 | class ColorType(IntEnum):
37 | """Type of color stored in Color class."""
38 |
39 | DEFAULT = 0
40 | STANDARD = 1
41 | EIGHT_BIT = 2
42 | TRUECOLOR = 3
43 | WINDOWS = 4
44 |
45 | def __repr__(self) -> str:
46 | return f"ColorType.{self.name}"
47 |
48 |
49 | ANSI_COLOR_NAMES = {
50 | "black": 0,
51 | "red": 1,
52 | "green": 2,
53 | "yellow": 3,
54 | "blue": 4,
55 | "magenta": 5,
56 | "cyan": 6,
57 | "white": 7,
58 | "bright_black": 8,
59 | "bright_red": 9,
60 | "bright_green": 10,
61 | "bright_yellow": 11,
62 | "bright_blue": 12,
63 | "bright_magenta": 13,
64 | "bright_cyan": 14,
65 | "bright_white": 15,
66 | "grey0": 16,
67 | "gray0": 16,
68 | "navy_blue": 17,
69 | "dark_blue": 18,
70 | "blue3": 20,
71 | "blue1": 21,
72 | "dark_green": 22,
73 | "deep_sky_blue4": 25,
74 | "dodger_blue3": 26,
75 | "dodger_blue2": 27,
76 | "green4": 28,
77 | "spring_green4": 29,
78 | "turquoise4": 30,
79 | "deep_sky_blue3": 32,
80 | "dodger_blue1": 33,
81 | "green3": 40,
82 | "spring_green3": 41,
83 | "dark_cyan": 36,
84 | "light_sea_green": 37,
85 | "deep_sky_blue2": 38,
86 | "deep_sky_blue1": 39,
87 | "spring_green2": 47,
88 | "cyan3": 43,
89 | "dark_turquoise": 44,
90 | "turquoise2": 45,
91 | "green1": 46,
92 | "spring_green1": 48,
93 | "medium_spring_green": 49,
94 | "cyan2": 50,
95 | "cyan1": 51,
96 | "dark_red": 88,
97 | "deep_pink4": 125,
98 | "purple4": 55,
99 | "purple3": 56,
100 | "blue_violet": 57,
101 | "orange4": 94,
102 | "grey37": 59,
103 | "gray37": 59,
104 | "medium_purple4": 60,
105 | "slate_blue3": 62,
106 | "royal_blue1": 63,
107 | "chartreuse4": 64,
108 | "dark_sea_green4": 71,
109 | "pale_turquoise4": 66,
110 | "steel_blue": 67,
111 | "steel_blue3": 68,
112 | "cornflower_blue": 69,
113 | "chartreuse3": 76,
114 | "cadet_blue": 73,
115 | "sky_blue3": 74,
116 | "steel_blue1": 81,
117 | "pale_green3": 114,
118 | "sea_green3": 78,
119 | "aquamarine3": 79,
120 | "medium_turquoise": 80,
121 | "chartreuse2": 112,
122 | "sea_green2": 83,
123 | "sea_green1": 85,
124 | "aquamarine1": 122,
125 | "dark_slate_gray2": 87,
126 | "dark_magenta": 91,
127 | "dark_violet": 128,
128 | "purple": 129,
129 | "light_pink4": 95,
130 | "plum4": 96,
131 | "medium_purple3": 98,
132 | "slate_blue1": 99,
133 | "yellow4": 106,
134 | "wheat4": 101,
135 | "grey53": 102,
136 | "gray53": 102,
137 | "light_slate_grey": 103,
138 | "light_slate_gray": 103,
139 | "medium_purple": 104,
140 | "light_slate_blue": 105,
141 | "dark_olive_green3": 149,
142 | "dark_sea_green": 108,
143 | "light_sky_blue3": 110,
144 | "sky_blue2": 111,
145 | "dark_sea_green3": 150,
146 | "dark_slate_gray3": 116,
147 | "sky_blue1": 117,
148 | "chartreuse1": 118,
149 | "light_green": 120,
150 | "pale_green1": 156,
151 | "dark_slate_gray1": 123,
152 | "red3": 160,
153 | "medium_violet_red": 126,
154 | "magenta3": 164,
155 | "dark_orange3": 166,
156 | "indian_red": 167,
157 | "hot_pink3": 168,
158 | "medium_orchid3": 133,
159 | "medium_orchid": 134,
160 | "medium_purple2": 140,
161 | "dark_goldenrod": 136,
162 | "light_salmon3": 173,
163 | "rosy_brown": 138,
164 | "grey63": 139,
165 | "gray63": 139,
166 | "medium_purple1": 141,
167 | "gold3": 178,
168 | "dark_khaki": 143,
169 | "navajo_white3": 144,
170 | "grey69": 145,
171 | "gray69": 145,
172 | "light_steel_blue3": 146,
173 | "light_steel_blue": 147,
174 | "yellow3": 184,
175 | "dark_sea_green2": 157,
176 | "light_cyan3": 152,
177 | "light_sky_blue1": 153,
178 | "green_yellow": 154,
179 | "dark_olive_green2": 155,
180 | "dark_sea_green1": 193,
181 | "pale_turquoise1": 159,
182 | "deep_pink3": 162,
183 | "magenta2": 200,
184 | "hot_pink2": 169,
185 | "orchid": 170,
186 | "medium_orchid1": 207,
187 | "orange3": 172,
188 | "light_pink3": 174,
189 | "pink3": 175,
190 | "plum3": 176,
191 | "violet": 177,
192 | "light_goldenrod3": 179,
193 | "tan": 180,
194 | "misty_rose3": 181,
195 | "thistle3": 182,
196 | "plum2": 183,
197 | "khaki3": 185,
198 | "light_goldenrod2": 222,
199 | "light_yellow3": 187,
200 | "grey84": 188,
201 | "gray84": 188,
202 | "light_steel_blue1": 189,
203 | "yellow2": 190,
204 | "dark_olive_green1": 192,
205 | "honeydew2": 194,
206 | "light_cyan1": 195,
207 | "red1": 196,
208 | "deep_pink2": 197,
209 | "deep_pink1": 199,
210 | "magenta1": 201,
211 | "orange_red1": 202,
212 | "indian_red1": 204,
213 | "hot_pink": 206,
214 | "dark_orange": 208,
215 | "salmon1": 209,
216 | "light_coral": 210,
217 | "pale_violet_red1": 211,
218 | "orchid2": 212,
219 | "orchid1": 213,
220 | "orange1": 214,
221 | "sandy_brown": 215,
222 | "light_salmon1": 216,
223 | "light_pink1": 217,
224 | "pink1": 218,
225 | "plum1": 219,
226 | "gold1": 220,
227 | "navajo_white1": 223,
228 | "misty_rose1": 224,
229 | "thistle1": 225,
230 | "yellow1": 226,
231 | "light_goldenrod1": 227,
232 | "khaki1": 228,
233 | "wheat1": 229,
234 | "cornsilk1": 230,
235 | "grey100": 231,
236 | "gray100": 231,
237 | "grey3": 232,
238 | "gray3": 232,
239 | "grey7": 233,
240 | "gray7": 233,
241 | "grey11": 234,
242 | "gray11": 234,
243 | "grey15": 235,
244 | "gray15": 235,
245 | "grey19": 236,
246 | "gray19": 236,
247 | "grey23": 237,
248 | "gray23": 237,
249 | "grey27": 238,
250 | "gray27": 238,
251 | "grey30": 239,
252 | "gray30": 239,
253 | "grey35": 240,
254 | "gray35": 240,
255 | "grey39": 241,
256 | "gray39": 241,
257 | "grey42": 242,
258 | "gray42": 242,
259 | "grey46": 243,
260 | "gray46": 243,
261 | "grey50": 244,
262 | "gray50": 244,
263 | "grey54": 245,
264 | "gray54": 245,
265 | "grey58": 246,
266 | "gray58": 246,
267 | "grey62": 247,
268 | "gray62": 247,
269 | "grey66": 248,
270 | "gray66": 248,
271 | "grey70": 249,
272 | "gray70": 249,
273 | "grey74": 250,
274 | "gray74": 250,
275 | "grey78": 251,
276 | "gray78": 251,
277 | "grey82": 252,
278 | "gray82": 252,
279 | "grey85": 253,
280 | "gray85": 253,
281 | "grey89": 254,
282 | "gray89": 254,
283 | "grey93": 255,
284 | "gray93": 255,
285 | }
286 |
287 |
288 | class ColorParseError(Exception):
289 | """The color could not be parsed."""
290 |
291 |
292 | RE_COLOR = re.compile(
293 | r"""^
294 | \#([0-9a-f]{6})$|
295 | color\(([0-9]{1,3})\)$|
296 | rgb\(([\d\s,]+)\)$
297 | """,
298 | re.VERBOSE,
299 | )
300 |
301 |
302 | @rich_repr
303 | class Color(NamedTuple):
304 | """Terminal color definition."""
305 |
306 | name: str
307 | """The name of the color (typically the input to Color.parse)."""
308 | type: ColorType
309 | """The type of the color."""
310 | number: Optional[int] = None
311 | """The color number, if a standard color, or None."""
312 | triplet: Optional[ColorTriplet] = None
313 | """A triplet of color components, if an RGB color."""
314 |
315 | def __rich__(self) -> "Text":
316 | """Displays the actual color if Rich printed."""
317 | from .style import Style
318 | from .text import Text
319 |
320 | return Text.assemble(
321 | f"<color {self.name!r} ({self.type.name.lower()})",
322 | ("⬤", Style(color=self)),
323 | " >",
324 | )
325 |
326 | def __rich_repr__(self) -> Result:
327 | yield self.name
328 | yield self.type
329 | yield "number", self.number, None
330 | yield "triplet", self.triplet, None
331 |
332 | @property
333 | def system(self) -> ColorSystem:
334 | """Get the native color system for this color."""
335 | if self.type == ColorType.DEFAULT:
336 | return ColorSystem.STANDARD
337 | return ColorSystem(int(self.type))
338 |
339 | @property
340 | def is_system_defined(self) -> bool:
341 | """Check if the color is ultimately defined by the system."""
342 | return self.system not in (ColorSystem.EIGHT_BIT, ColorSystem.TRUECOLOR)
343 |
344 | @property
345 | def is_default(self) -> bool:
346 | """Check if the color is a default color."""
347 | return self.type == ColorType.DEFAULT
348 |
349 | def get_truecolor(
350 | self, theme: Optional["TerminalTheme"] = None, foreground: bool = True
351 | ) -> ColorTriplet:
352 | """Get an equivalent color triplet for this color.
353 |
354 | Args:
355 | theme (TerminalTheme, optional): Optional terminal theme, or None to use default. Defaults to None.
356 | foreground (bool, optional): True for a foreground color, or False for background. Defaults to True.
357 |
358 | Returns:
359 | ColorTriplet: A color triplet containing RGB components.
360 | """
361 |
362 | if theme is None:
363 | theme = DEFAULT_TERMINAL_THEME
364 | if self.type == ColorType.TRUECOLOR:
365 | assert self.triplet is not None
366 | return self.triplet
367 | elif self.type == ColorType.EIGHT_BIT:
368 | assert self.number is not None
369 | return EIGHT_BIT_PALETTE[self.number]
370 | elif self.type == ColorType.STANDARD:
371 | assert self.number is not None
372 | return theme.ansi_colors[self.number]
373 | elif self.type == ColorType.WINDOWS:
374 | assert self.number is not None
375 | return WINDOWS_PALETTE[self.number]
376 | else: # self.type == ColorType.DEFAULT:
377 | assert self.number is None
378 | return theme.foreground_color if foreground else theme.background_color
379 |
380 | @classmethod
381 | def from_ansi(cls, number: int) -> "Color":
382 | """Create a Color number from it's 8-bit ansi number.
383 |
384 | Args:
385 | number (int): A number between 0-255 inclusive.
386 |
387 | Returns:
388 | Color: A new Color instance.
389 | """
390 | return cls(
391 | name=f"color({number})",
392 | type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT),
393 | number=number,
394 | )
395 |
396 | @classmethod
397 | def from_triplet(cls, triplet: "ColorTriplet") -> "Color":
398 | """Create a truecolor RGB color from a triplet of values.
399 |
400 | Args:
401 | triplet (ColorTriplet): A color triplet containing red, green and blue components.
402 |
403 | Returns:
404 | Color: A new color object.
405 | """
406 | return cls(name=triplet.hex, type=ColorType.TRUECOLOR, triplet=triplet)
407 |
408 | @classmethod
409 | def from_rgb(cls, red: float, green: float, blue: float) -> "Color":
410 | """Create a truecolor from three color components in the range(0->255).
411 |
412 | Args:
413 | red (float): Red component in range 0-255.
414 | green (float): Green component in range 0-255.
415 | blue (float): Blue component in range 0-255.
416 |
417 | Returns:
418 | Color: A new color object.
419 | """
420 | return cls.from_triplet(ColorTriplet(int(red), int(green), int(blue)))
421 |
422 | @classmethod
423 | def default(cls) -> "Color":
424 | """Get a Color instance representing the default color.
425 |
426 | Returns:
427 | Color: Default color.
428 | """
429 | return cls(name="default", type=ColorType.DEFAULT)
430 |
431 | @classmethod
432 | @lru_cache(maxsize=1024)
433 | def parse(cls, color: str) -> "Color":
434 | """Parse a color definition."""
435 | original_color = color
436 | color = color.lower().strip()
437 |
438 | if color == "default":
439 | return cls(color, type=ColorType.DEFAULT)
440 |
441 | color_number = ANSI_COLOR_NAMES.get(color)
442 | if color_number is not None:
443 | return cls(
444 | color,
445 | type=(ColorType.STANDARD if color_number < 16 else ColorType.EIGHT_BIT),
446 | number=color_number,
447 | )
448 |
449 | color_match = RE_COLOR.match(color)
450 | if color_match is None:
451 | raise ColorParseError(f"{original_color!r} is not a valid color")
452 |
453 | color_24, color_8, color_rgb = color_match.groups()
454 | if color_24:
455 | triplet = ColorTriplet(
456 | int(color_24[0:2], 16), int(color_24[2:4], 16), int(color_24[4:6], 16)
457 | )
458 | return cls(color, ColorType.TRUECOLOR, triplet=triplet)
459 |
460 | elif color_8:
461 | number = int(color_8)
462 | if number > 255:
463 | raise ColorParseError(f"color number must be <= 255 in {color!r}")
464 | return cls(
465 | color,
466 | type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT),
467 | number=number,
468 | )
469 |
470 | else: # color_rgb:
471 | components = color_rgb.split(",")
472 | if len(components) != 3:
473 | raise ColorParseError(
474 | f"expected three components in {original_color!r}"
475 | )
476 | red, green, blue = components
477 | triplet = ColorTriplet(int(red), int(green), int(blue))
478 | if not all(component <= 255 for component in triplet):
479 | raise ColorParseError(
480 | f"color components must be <= 255 in {original_color!r}"
481 | )
482 | return cls(color, ColorType.TRUECOLOR, triplet=triplet)
483 |
484 | @lru_cache(maxsize=1024)
485 | def get_ansi_codes(self, foreground: bool = True) -> Tuple[str, ...]:
486 | """Get the ANSI escape codes for this color."""
487 | _type = self.type
488 | if _type == ColorType.DEFAULT:
489 | return ("39" if foreground else "49",)
490 |
491 | elif _type == ColorType.WINDOWS:
492 | number = self.number
493 | assert number is not None
494 | fore, back = (30, 40) if number < 8 else (82, 92)
495 | return (str(fore + number if foreground else back + number),)
496 |
497 | elif _type == ColorType.STANDARD:
498 | number = self.number
499 | assert number is not None
500 | fore, back = (30, 40) if number < 8 else (82, 92)
501 | return (str(fore + number if foreground else back + number),)
502 |
503 | elif _type == ColorType.EIGHT_BIT:
504 | assert self.number is not None
505 | return ("38" if foreground else "48", "5", str(self.number))
506 |
507 | else: # self.standard == ColorStandard.TRUECOLOR:
508 | assert self.triplet is not None
509 | red, green, blue = self.triplet
510 | return ("38" if foreground else "48", "2", str(red), str(green), str(blue))
511 |
512 | @lru_cache(maxsize=1024)
513 | def downgrade(self, system: ColorSystem) -> "Color":
514 | """Downgrade a color system to a system with fewer colors."""
515 |
516 | if self.type in (ColorType.DEFAULT, system):
517 | return self
518 | # Convert to 8-bit color from truecolor color
519 | if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR:
520 | assert self.triplet is not None
521 | _h, l, s = rgb_to_hls(*self.triplet.normalized)
522 | # If saturation is under 15% assume it is grayscale
523 | if s < 0.15:
524 | gray = round(l * 25.0)
525 | if gray == 0:
526 | color_number = 16
527 | elif gray == 25:
528 | color_number = 231
529 | else:
530 | color_number = 231 + gray
531 | return Color(self.name, ColorType.EIGHT_BIT, number=color_number)
532 |
533 | red, green, blue = self.triplet
534 | six_red = red / 95 if red < 95 else 1 + (red - 95) / 40
535 | six_green = green / 95 if green < 95 else 1 + (green - 95) / 40
536 | six_blue = blue / 95 if blue < 95 else 1 + (blue - 95) / 40
537 |
538 | color_number = (
539 | 16 + 36 * round(six_red) + 6 * round(six_green) + round(six_blue)
540 | )
541 | return Color(self.name, ColorType.EIGHT_BIT, number=color_number)
542 |
543 | # Convert to standard from truecolor or 8-bit
544 | elif system == ColorSystem.STANDARD:
545 | if self.system == ColorSystem.TRUECOLOR:
546 | assert self.triplet is not None
547 | triplet = self.triplet
548 | else: # self.system == ColorSystem.EIGHT_BIT
549 | assert self.number is not None
550 | triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number])
551 |
552 | color_number = STANDARD_PALETTE.match(triplet)
553 | return Color(self.name, ColorType.STANDARD, number=color_number)
554 |
555 | elif system == ColorSystem.WINDOWS:
556 | if self.system == ColorSystem.TRUECOLOR:
557 | assert self.triplet is not None
558 | triplet = self.triplet
559 | else: # self.system == ColorSystem.EIGHT_BIT
560 | assert self.number is not None
561 | if self.number < 16:
562 | return Color(self.name, ColorType.WINDOWS, number=self.number)
563 | triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number])
564 |
565 | color_number = WINDOWS_PALETTE.match(triplet)
566 | return Color(self.name, ColorType.WINDOWS, number=color_number)
567 |
568 | return self
569 |
570 |
571 | def parse_rgb_hex(hex_color: str) -> ColorTriplet:
572 | """Parse six hex characters in to RGB triplet."""
573 | assert len(hex_color) == 6, "must be 6 characters"
574 | color = ColorTriplet(
575 | int(hex_color[0:2], 16), int(hex_color[2:4], 16), int(hex_color[4:6], 16)
576 | )
577 | return color
578 |
579 |
580 | def blend_rgb(
581 | color1: ColorTriplet, color2: ColorTriplet, cross_fade: float = 0.5
582 | ) -> ColorTriplet:
583 | """Blend one RGB color in to another."""
584 | r1, g1, b1 = color1
585 | r2, g2, b2 = color2
586 | new_color = ColorTriplet(
587 | int(r1 + (r2 - r1) * cross_fade),
588 | int(g1 + (g2 - g1) * cross_fade),
589 | int(b1 + (b2 - b1) * cross_fade),
590 | )
591 | return new_color
592 |
593 |
594 | if __name__ == "__main__": # pragma: no cover
595 | from .console import Console
596 | from .table import Table
597 | from .text import Text
598 |
599 | console = Console()
600 |
601 | table = Table(show_footer=False, show_edge=True)
602 | table.add_column("Color", width=10, overflow="ellipsis")
603 | table.add_column("Number", justify="right", style="yellow")
604 | table.add_column("Name", style="green")
605 | table.add_column("Hex", style="blue")
606 | table.add_column("RGB", style="magenta")
607 |
608 | colors = sorted((v, k) for k, v in ANSI_COLOR_NAMES.items())
609 | for color_number, name in colors:
610 | if "grey" in name:
611 | continue
612 | color_cell = Text(" " * 10, style=f"on {name}")
613 | if color_number < 16:
614 | table.add_row(color_cell, f"{color_number}", Text(f'"{name}"'))
615 | else:
616 | color = EIGHT_BIT_PALETTE[color_number] # type: ignore[has-type]
617 | table.add_row(
618 | color_cell, str(color_number), Text(f'"{name}"'), color.hex, color.rgb
619 | )
620 |
621 | console.print(table)
622 |
```
--------------------------------------------------------------------------------
/.venv/lib/python3.12/site-packages/lxml/includes/libxml/xpathInternals.h:
--------------------------------------------------------------------------------
```
1 | /*
2 | * Summary: internal interfaces for XML Path Language implementation
3 | * Description: internal interfaces for XML Path Language implementation
4 | * used to build new modules on top of XPath like XPointer and
5 | * XSLT
6 | *
7 | * Copy: See Copyright for the status of this software.
8 | *
9 | * Author: Daniel Veillard
10 | */
11 |
12 | #ifndef __XML_XPATH_INTERNALS_H__
13 | #define __XML_XPATH_INTERNALS_H__
14 |
15 | #include <stdio.h>
16 | #include <libxml/xmlversion.h>
17 | #include <libxml/xpath.h>
18 |
19 | #ifdef LIBXML_XPATH_ENABLED
20 |
21 | #ifdef __cplusplus
22 | extern "C" {
23 | #endif
24 |
25 | /************************************************************************
26 | * *
27 | * Helpers *
28 | * *
29 | ************************************************************************/
30 |
31 | /*
32 | * Many of these macros may later turn into functions. They
33 | * shouldn't be used in #ifdef's preprocessor instructions.
34 | */
35 | /**
36 | * xmlXPathSetError:
37 | * @ctxt: an XPath parser context
38 | * @err: an xmlXPathError code
39 | *
40 | * Raises an error.
41 | */
42 | #define xmlXPathSetError(ctxt, err) \
43 | { xmlXPatherror((ctxt), __FILE__, __LINE__, (err)); \
44 | if ((ctxt) != NULL) (ctxt)->error = (err); }
45 |
46 | /**
47 | * xmlXPathSetArityError:
48 | * @ctxt: an XPath parser context
49 | *
50 | * Raises an XPATH_INVALID_ARITY error.
51 | */
52 | #define xmlXPathSetArityError(ctxt) \
53 | xmlXPathSetError((ctxt), XPATH_INVALID_ARITY)
54 |
55 | /**
56 | * xmlXPathSetTypeError:
57 | * @ctxt: an XPath parser context
58 | *
59 | * Raises an XPATH_INVALID_TYPE error.
60 | */
61 | #define xmlXPathSetTypeError(ctxt) \
62 | xmlXPathSetError((ctxt), XPATH_INVALID_TYPE)
63 |
64 | /**
65 | * xmlXPathGetError:
66 | * @ctxt: an XPath parser context
67 | *
68 | * Get the error code of an XPath context.
69 | *
70 | * Returns the context error.
71 | */
72 | #define xmlXPathGetError(ctxt) ((ctxt)->error)
73 |
74 | /**
75 | * xmlXPathCheckError:
76 | * @ctxt: an XPath parser context
77 | *
78 | * Check if an XPath error was raised.
79 | *
80 | * Returns true if an error has been raised, false otherwise.
81 | */
82 | #define xmlXPathCheckError(ctxt) ((ctxt)->error != XPATH_EXPRESSION_OK)
83 |
84 | /**
85 | * xmlXPathGetDocument:
86 | * @ctxt: an XPath parser context
87 | *
88 | * Get the document of an XPath context.
89 | *
90 | * Returns the context document.
91 | */
92 | #define xmlXPathGetDocument(ctxt) ((ctxt)->context->doc)
93 |
94 | /**
95 | * xmlXPathGetContextNode:
96 | * @ctxt: an XPath parser context
97 | *
98 | * Get the context node of an XPath context.
99 | *
100 | * Returns the context node.
101 | */
102 | #define xmlXPathGetContextNode(ctxt) ((ctxt)->context->node)
103 |
104 | XMLPUBFUN int
105 | xmlXPathPopBoolean (xmlXPathParserContextPtr ctxt);
106 | XMLPUBFUN double
107 | xmlXPathPopNumber (xmlXPathParserContextPtr ctxt);
108 | XMLPUBFUN xmlChar *
109 | xmlXPathPopString (xmlXPathParserContextPtr ctxt);
110 | XMLPUBFUN xmlNodeSetPtr
111 | xmlXPathPopNodeSet (xmlXPathParserContextPtr ctxt);
112 | XMLPUBFUN void *
113 | xmlXPathPopExternal (xmlXPathParserContextPtr ctxt);
114 |
115 | /**
116 | * xmlXPathReturnBoolean:
117 | * @ctxt: an XPath parser context
118 | * @val: a boolean
119 | *
120 | * Pushes the boolean @val on the context stack.
121 | */
122 | #define xmlXPathReturnBoolean(ctxt, val) \
123 | valuePush((ctxt), xmlXPathNewBoolean(val))
124 |
125 | /**
126 | * xmlXPathReturnTrue:
127 | * @ctxt: an XPath parser context
128 | *
129 | * Pushes true on the context stack.
130 | */
131 | #define xmlXPathReturnTrue(ctxt) xmlXPathReturnBoolean((ctxt), 1)
132 |
133 | /**
134 | * xmlXPathReturnFalse:
135 | * @ctxt: an XPath parser context
136 | *
137 | * Pushes false on the context stack.
138 | */
139 | #define xmlXPathReturnFalse(ctxt) xmlXPathReturnBoolean((ctxt), 0)
140 |
141 | /**
142 | * xmlXPathReturnNumber:
143 | * @ctxt: an XPath parser context
144 | * @val: a double
145 | *
146 | * Pushes the double @val on the context stack.
147 | */
148 | #define xmlXPathReturnNumber(ctxt, val) \
149 | valuePush((ctxt), xmlXPathNewFloat(val))
150 |
151 | /**
152 | * xmlXPathReturnString:
153 | * @ctxt: an XPath parser context
154 | * @str: a string
155 | *
156 | * Pushes the string @str on the context stack.
157 | */
158 | #define xmlXPathReturnString(ctxt, str) \
159 | valuePush((ctxt), xmlXPathWrapString(str))
160 |
161 | /**
162 | * xmlXPathReturnEmptyString:
163 | * @ctxt: an XPath parser context
164 | *
165 | * Pushes an empty string on the stack.
166 | */
167 | #define xmlXPathReturnEmptyString(ctxt) \
168 | valuePush((ctxt), xmlXPathNewCString(""))
169 |
170 | /**
171 | * xmlXPathReturnNodeSet:
172 | * @ctxt: an XPath parser context
173 | * @ns: a node-set
174 | *
175 | * Pushes the node-set @ns on the context stack.
176 | */
177 | #define xmlXPathReturnNodeSet(ctxt, ns) \
178 | valuePush((ctxt), xmlXPathWrapNodeSet(ns))
179 |
180 | /**
181 | * xmlXPathReturnEmptyNodeSet:
182 | * @ctxt: an XPath parser context
183 | *
184 | * Pushes an empty node-set on the context stack.
185 | */
186 | #define xmlXPathReturnEmptyNodeSet(ctxt) \
187 | valuePush((ctxt), xmlXPathNewNodeSet(NULL))
188 |
189 | /**
190 | * xmlXPathReturnExternal:
191 | * @ctxt: an XPath parser context
192 | * @val: user data
193 | *
194 | * Pushes user data on the context stack.
195 | */
196 | #define xmlXPathReturnExternal(ctxt, val) \
197 | valuePush((ctxt), xmlXPathWrapExternal(val))
198 |
199 | /**
200 | * xmlXPathStackIsNodeSet:
201 | * @ctxt: an XPath parser context
202 | *
203 | * Check if the current value on the XPath stack is a node set or
204 | * an XSLT value tree.
205 | *
206 | * Returns true if the current object on the stack is a node-set.
207 | */
208 | #define xmlXPathStackIsNodeSet(ctxt) \
209 | (((ctxt)->value != NULL) \
210 | && (((ctxt)->value->type == XPATH_NODESET) \
211 | || ((ctxt)->value->type == XPATH_XSLT_TREE)))
212 |
213 | /**
214 | * xmlXPathStackIsExternal:
215 | * @ctxt: an XPath parser context
216 | *
217 | * Checks if the current value on the XPath stack is an external
218 | * object.
219 | *
220 | * Returns true if the current object on the stack is an external
221 | * object.
222 | */
223 | #define xmlXPathStackIsExternal(ctxt) \
224 | ((ctxt->value != NULL) && (ctxt->value->type == XPATH_USERS))
225 |
226 | /**
227 | * xmlXPathEmptyNodeSet:
228 | * @ns: a node-set
229 | *
230 | * Empties a node-set.
231 | */
232 | #define xmlXPathEmptyNodeSet(ns) \
233 | { while ((ns)->nodeNr > 0) (ns)->nodeTab[--(ns)->nodeNr] = NULL; }
234 |
235 | /**
236 | * CHECK_ERROR:
237 | *
238 | * Macro to return from the function if an XPath error was detected.
239 | */
240 | #define CHECK_ERROR \
241 | if (ctxt->error != XPATH_EXPRESSION_OK) return
242 |
243 | /**
244 | * CHECK_ERROR0:
245 | *
246 | * Macro to return 0 from the function if an XPath error was detected.
247 | */
248 | #define CHECK_ERROR0 \
249 | if (ctxt->error != XPATH_EXPRESSION_OK) return(0)
250 |
251 | /**
252 | * XP_ERROR:
253 | * @X: the error code
254 | *
255 | * Macro to raise an XPath error and return.
256 | */
257 | #define XP_ERROR(X) \
258 | { xmlXPathErr(ctxt, X); return; }
259 |
260 | /**
261 | * XP_ERROR0:
262 | * @X: the error code
263 | *
264 | * Macro to raise an XPath error and return 0.
265 | */
266 | #define XP_ERROR0(X) \
267 | { xmlXPathErr(ctxt, X); return(0); }
268 |
269 | /**
270 | * CHECK_TYPE:
271 | * @typeval: the XPath type
272 | *
273 | * Macro to check that the value on top of the XPath stack is of a given
274 | * type.
275 | */
276 | #define CHECK_TYPE(typeval) \
277 | if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \
278 | XP_ERROR(XPATH_INVALID_TYPE)
279 |
280 | /**
281 | * CHECK_TYPE0:
282 | * @typeval: the XPath type
283 | *
284 | * Macro to check that the value on top of the XPath stack is of a given
285 | * type. Return(0) in case of failure
286 | */
287 | #define CHECK_TYPE0(typeval) \
288 | if ((ctxt->value == NULL) || (ctxt->value->type != typeval)) \
289 | XP_ERROR0(XPATH_INVALID_TYPE)
290 |
291 | /**
292 | * CHECK_ARITY:
293 | * @x: the number of expected args
294 | *
295 | * Macro to check that the number of args passed to an XPath function matches.
296 | */
297 | #define CHECK_ARITY(x) \
298 | if (ctxt == NULL) return; \
299 | if (nargs != (x)) \
300 | XP_ERROR(XPATH_INVALID_ARITY); \
301 | if (ctxt->valueNr < (x)) \
302 | XP_ERROR(XPATH_STACK_ERROR);
303 |
304 | /**
305 | * CAST_TO_STRING:
306 | *
307 | * Macro to try to cast the value on the top of the XPath stack to a string.
308 | */
309 | #define CAST_TO_STRING \
310 | if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_STRING)) \
311 | xmlXPathStringFunction(ctxt, 1);
312 |
313 | /**
314 | * CAST_TO_NUMBER:
315 | *
316 | * Macro to try to cast the value on the top of the XPath stack to a number.
317 | */
318 | #define CAST_TO_NUMBER \
319 | if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_NUMBER)) \
320 | xmlXPathNumberFunction(ctxt, 1);
321 |
322 | /**
323 | * CAST_TO_BOOLEAN:
324 | *
325 | * Macro to try to cast the value on the top of the XPath stack to a boolean.
326 | */
327 | #define CAST_TO_BOOLEAN \
328 | if ((ctxt->value != NULL) && (ctxt->value->type != XPATH_BOOLEAN)) \
329 | xmlXPathBooleanFunction(ctxt, 1);
330 |
331 | /*
332 | * Variable Lookup forwarding.
333 | */
334 |
335 | XMLPUBFUN void
336 | xmlXPathRegisterVariableLookup (xmlXPathContextPtr ctxt,
337 | xmlXPathVariableLookupFunc f,
338 | void *data);
339 |
340 | /*
341 | * Function Lookup forwarding.
342 | */
343 |
344 | XMLPUBFUN void
345 | xmlXPathRegisterFuncLookup (xmlXPathContextPtr ctxt,
346 | xmlXPathFuncLookupFunc f,
347 | void *funcCtxt);
348 |
349 | /*
350 | * Error reporting.
351 | */
352 | XMLPUBFUN void
353 | xmlXPatherror (xmlXPathParserContextPtr ctxt,
354 | const char *file,
355 | int line,
356 | int no);
357 |
358 | XMLPUBFUN void
359 | xmlXPathErr (xmlXPathParserContextPtr ctxt,
360 | int error);
361 |
362 | #ifdef LIBXML_DEBUG_ENABLED
363 | XMLPUBFUN void
364 | xmlXPathDebugDumpObject (FILE *output,
365 | xmlXPathObjectPtr cur,
366 | int depth);
367 | XMLPUBFUN void
368 | xmlXPathDebugDumpCompExpr(FILE *output,
369 | xmlXPathCompExprPtr comp,
370 | int depth);
371 | #endif
372 | /**
373 | * NodeSet handling.
374 | */
375 | XMLPUBFUN int
376 | xmlXPathNodeSetContains (xmlNodeSetPtr cur,
377 | xmlNodePtr val);
378 | XMLPUBFUN xmlNodeSetPtr
379 | xmlXPathDifference (xmlNodeSetPtr nodes1,
380 | xmlNodeSetPtr nodes2);
381 | XMLPUBFUN xmlNodeSetPtr
382 | xmlXPathIntersection (xmlNodeSetPtr nodes1,
383 | xmlNodeSetPtr nodes2);
384 |
385 | XMLPUBFUN xmlNodeSetPtr
386 | xmlXPathDistinctSorted (xmlNodeSetPtr nodes);
387 | XMLPUBFUN xmlNodeSetPtr
388 | xmlXPathDistinct (xmlNodeSetPtr nodes);
389 |
390 | XMLPUBFUN int
391 | xmlXPathHasSameNodes (xmlNodeSetPtr nodes1,
392 | xmlNodeSetPtr nodes2);
393 |
394 | XMLPUBFUN xmlNodeSetPtr
395 | xmlXPathNodeLeadingSorted (xmlNodeSetPtr nodes,
396 | xmlNodePtr node);
397 | XMLPUBFUN xmlNodeSetPtr
398 | xmlXPathLeadingSorted (xmlNodeSetPtr nodes1,
399 | xmlNodeSetPtr nodes2);
400 | XMLPUBFUN xmlNodeSetPtr
401 | xmlXPathNodeLeading (xmlNodeSetPtr nodes,
402 | xmlNodePtr node);
403 | XMLPUBFUN xmlNodeSetPtr
404 | xmlXPathLeading (xmlNodeSetPtr nodes1,
405 | xmlNodeSetPtr nodes2);
406 |
407 | XMLPUBFUN xmlNodeSetPtr
408 | xmlXPathNodeTrailingSorted (xmlNodeSetPtr nodes,
409 | xmlNodePtr node);
410 | XMLPUBFUN xmlNodeSetPtr
411 | xmlXPathTrailingSorted (xmlNodeSetPtr nodes1,
412 | xmlNodeSetPtr nodes2);
413 | XMLPUBFUN xmlNodeSetPtr
414 | xmlXPathNodeTrailing (xmlNodeSetPtr nodes,
415 | xmlNodePtr node);
416 | XMLPUBFUN xmlNodeSetPtr
417 | xmlXPathTrailing (xmlNodeSetPtr nodes1,
418 | xmlNodeSetPtr nodes2);
419 |
420 |
421 | /**
422 | * Extending a context.
423 | */
424 |
425 | XMLPUBFUN int
426 | xmlXPathRegisterNs (xmlXPathContextPtr ctxt,
427 | const xmlChar *prefix,
428 | const xmlChar *ns_uri);
429 | XMLPUBFUN const xmlChar *
430 | xmlXPathNsLookup (xmlXPathContextPtr ctxt,
431 | const xmlChar *prefix);
432 | XMLPUBFUN void
433 | xmlXPathRegisteredNsCleanup (xmlXPathContextPtr ctxt);
434 |
435 | XMLPUBFUN int
436 | xmlXPathRegisterFunc (xmlXPathContextPtr ctxt,
437 | const xmlChar *name,
438 | xmlXPathFunction f);
439 | XMLPUBFUN int
440 | xmlXPathRegisterFuncNS (xmlXPathContextPtr ctxt,
441 | const xmlChar *name,
442 | const xmlChar *ns_uri,
443 | xmlXPathFunction f);
444 | XMLPUBFUN int
445 | xmlXPathRegisterVariable (xmlXPathContextPtr ctxt,
446 | const xmlChar *name,
447 | xmlXPathObjectPtr value);
448 | XMLPUBFUN int
449 | xmlXPathRegisterVariableNS (xmlXPathContextPtr ctxt,
450 | const xmlChar *name,
451 | const xmlChar *ns_uri,
452 | xmlXPathObjectPtr value);
453 | XMLPUBFUN xmlXPathFunction
454 | xmlXPathFunctionLookup (xmlXPathContextPtr ctxt,
455 | const xmlChar *name);
456 | XMLPUBFUN xmlXPathFunction
457 | xmlXPathFunctionLookupNS (xmlXPathContextPtr ctxt,
458 | const xmlChar *name,
459 | const xmlChar *ns_uri);
460 | XMLPUBFUN void
461 | xmlXPathRegisteredFuncsCleanup (xmlXPathContextPtr ctxt);
462 | XMLPUBFUN xmlXPathObjectPtr
463 | xmlXPathVariableLookup (xmlXPathContextPtr ctxt,
464 | const xmlChar *name);
465 | XMLPUBFUN xmlXPathObjectPtr
466 | xmlXPathVariableLookupNS (xmlXPathContextPtr ctxt,
467 | const xmlChar *name,
468 | const xmlChar *ns_uri);
469 | XMLPUBFUN void
470 | xmlXPathRegisteredVariablesCleanup(xmlXPathContextPtr ctxt);
471 |
472 | /**
473 | * Utilities to extend XPath.
474 | */
475 | XMLPUBFUN xmlXPathParserContextPtr
476 | xmlXPathNewParserContext (const xmlChar *str,
477 | xmlXPathContextPtr ctxt);
478 | XMLPUBFUN void
479 | xmlXPathFreeParserContext (xmlXPathParserContextPtr ctxt);
480 |
481 | /* TODO: remap to xmlXPathValuePop and Push. */
482 | XMLPUBFUN xmlXPathObjectPtr
483 | valuePop (xmlXPathParserContextPtr ctxt);
484 | XMLPUBFUN int
485 | valuePush (xmlXPathParserContextPtr ctxt,
486 | xmlXPathObjectPtr value);
487 |
488 | XMLPUBFUN xmlXPathObjectPtr
489 | xmlXPathNewString (const xmlChar *val);
490 | XMLPUBFUN xmlXPathObjectPtr
491 | xmlXPathNewCString (const char *val);
492 | XMLPUBFUN xmlXPathObjectPtr
493 | xmlXPathWrapString (xmlChar *val);
494 | XMLPUBFUN xmlXPathObjectPtr
495 | xmlXPathWrapCString (char * val);
496 | XMLPUBFUN xmlXPathObjectPtr
497 | xmlXPathNewFloat (double val);
498 | XMLPUBFUN xmlXPathObjectPtr
499 | xmlXPathNewBoolean (int val);
500 | XMLPUBFUN xmlXPathObjectPtr
501 | xmlXPathNewNodeSet (xmlNodePtr val);
502 | XMLPUBFUN xmlXPathObjectPtr
503 | xmlXPathNewValueTree (xmlNodePtr val);
504 | XMLPUBFUN int
505 | xmlXPathNodeSetAdd (xmlNodeSetPtr cur,
506 | xmlNodePtr val);
507 | XMLPUBFUN int
508 | xmlXPathNodeSetAddUnique (xmlNodeSetPtr cur,
509 | xmlNodePtr val);
510 | XMLPUBFUN int
511 | xmlXPathNodeSetAddNs (xmlNodeSetPtr cur,
512 | xmlNodePtr node,
513 | xmlNsPtr ns);
514 | XMLPUBFUN void
515 | xmlXPathNodeSetSort (xmlNodeSetPtr set);
516 |
517 | XMLPUBFUN void
518 | xmlXPathRoot (xmlXPathParserContextPtr ctxt);
519 | XMLPUBFUN void
520 | xmlXPathEvalExpr (xmlXPathParserContextPtr ctxt);
521 | XMLPUBFUN xmlChar *
522 | xmlXPathParseName (xmlXPathParserContextPtr ctxt);
523 | XMLPUBFUN xmlChar *
524 | xmlXPathParseNCName (xmlXPathParserContextPtr ctxt);
525 |
526 | /*
527 | * Existing functions.
528 | */
529 | XMLPUBFUN double
530 | xmlXPathStringEvalNumber (const xmlChar *str);
531 | XMLPUBFUN int
532 | xmlXPathEvaluatePredicateResult (xmlXPathParserContextPtr ctxt,
533 | xmlXPathObjectPtr res);
534 | XMLPUBFUN void
535 | xmlXPathRegisterAllFunctions (xmlXPathContextPtr ctxt);
536 | XMLPUBFUN xmlNodeSetPtr
537 | xmlXPathNodeSetMerge (xmlNodeSetPtr val1,
538 | xmlNodeSetPtr val2);
539 | XMLPUBFUN void
540 | xmlXPathNodeSetDel (xmlNodeSetPtr cur,
541 | xmlNodePtr val);
542 | XMLPUBFUN void
543 | xmlXPathNodeSetRemove (xmlNodeSetPtr cur,
544 | int val);
545 | XMLPUBFUN xmlXPathObjectPtr
546 | xmlXPathNewNodeSetList (xmlNodeSetPtr val);
547 | XMLPUBFUN xmlXPathObjectPtr
548 | xmlXPathWrapNodeSet (xmlNodeSetPtr val);
549 | XMLPUBFUN xmlXPathObjectPtr
550 | xmlXPathWrapExternal (void *val);
551 |
552 | XMLPUBFUN int xmlXPathEqualValues(xmlXPathParserContextPtr ctxt);
553 | XMLPUBFUN int xmlXPathNotEqualValues(xmlXPathParserContextPtr ctxt);
554 | XMLPUBFUN int xmlXPathCompareValues(xmlXPathParserContextPtr ctxt, int inf, int strict);
555 | XMLPUBFUN void xmlXPathValueFlipSign(xmlXPathParserContextPtr ctxt);
556 | XMLPUBFUN void xmlXPathAddValues(xmlXPathParserContextPtr ctxt);
557 | XMLPUBFUN void xmlXPathSubValues(xmlXPathParserContextPtr ctxt);
558 | XMLPUBFUN void xmlXPathMultValues(xmlXPathParserContextPtr ctxt);
559 | XMLPUBFUN void xmlXPathDivValues(xmlXPathParserContextPtr ctxt);
560 | XMLPUBFUN void xmlXPathModValues(xmlXPathParserContextPtr ctxt);
561 |
562 | XMLPUBFUN int xmlXPathIsNodeType(const xmlChar *name);
563 |
564 | /*
565 | * Some of the axis navigation routines.
566 | */
567 | XMLPUBFUN xmlNodePtr xmlXPathNextSelf(xmlXPathParserContextPtr ctxt,
568 | xmlNodePtr cur);
569 | XMLPUBFUN xmlNodePtr xmlXPathNextChild(xmlXPathParserContextPtr ctxt,
570 | xmlNodePtr cur);
571 | XMLPUBFUN xmlNodePtr xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt,
572 | xmlNodePtr cur);
573 | XMLPUBFUN xmlNodePtr xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt,
574 | xmlNodePtr cur);
575 | XMLPUBFUN xmlNodePtr xmlXPathNextParent(xmlXPathParserContextPtr ctxt,
576 | xmlNodePtr cur);
577 | XMLPUBFUN xmlNodePtr xmlXPathNextAncestorOrSelf(xmlXPathParserContextPtr ctxt,
578 | xmlNodePtr cur);
579 | XMLPUBFUN xmlNodePtr xmlXPathNextFollowingSibling(xmlXPathParserContextPtr ctxt,
580 | xmlNodePtr cur);
581 | XMLPUBFUN xmlNodePtr xmlXPathNextFollowing(xmlXPathParserContextPtr ctxt,
582 | xmlNodePtr cur);
583 | XMLPUBFUN xmlNodePtr xmlXPathNextNamespace(xmlXPathParserContextPtr ctxt,
584 | xmlNodePtr cur);
585 | XMLPUBFUN xmlNodePtr xmlXPathNextAttribute(xmlXPathParserContextPtr ctxt,
586 | xmlNodePtr cur);
587 | XMLPUBFUN xmlNodePtr xmlXPathNextPreceding(xmlXPathParserContextPtr ctxt,
588 | xmlNodePtr cur);
589 | XMLPUBFUN xmlNodePtr xmlXPathNextAncestor(xmlXPathParserContextPtr ctxt,
590 | xmlNodePtr cur);
591 | XMLPUBFUN xmlNodePtr xmlXPathNextPrecedingSibling(xmlXPathParserContextPtr ctxt,
592 | xmlNodePtr cur);
593 | /*
594 | * The official core of XPath functions.
595 | */
596 | XMLPUBFUN void xmlXPathLastFunction(xmlXPathParserContextPtr ctxt, int nargs);
597 | XMLPUBFUN void xmlXPathPositionFunction(xmlXPathParserContextPtr ctxt, int nargs);
598 | XMLPUBFUN void xmlXPathCountFunction(xmlXPathParserContextPtr ctxt, int nargs);
599 | XMLPUBFUN void xmlXPathIdFunction(xmlXPathParserContextPtr ctxt, int nargs);
600 | XMLPUBFUN void xmlXPathLocalNameFunction(xmlXPathParserContextPtr ctxt, int nargs);
601 | XMLPUBFUN void xmlXPathNamespaceURIFunction(xmlXPathParserContextPtr ctxt, int nargs);
602 | XMLPUBFUN void xmlXPathStringFunction(xmlXPathParserContextPtr ctxt, int nargs);
603 | XMLPUBFUN void xmlXPathStringLengthFunction(xmlXPathParserContextPtr ctxt, int nargs);
604 | XMLPUBFUN void xmlXPathConcatFunction(xmlXPathParserContextPtr ctxt, int nargs);
605 | XMLPUBFUN void xmlXPathContainsFunction(xmlXPathParserContextPtr ctxt, int nargs);
606 | XMLPUBFUN void xmlXPathStartsWithFunction(xmlXPathParserContextPtr ctxt, int nargs);
607 | XMLPUBFUN void xmlXPathSubstringFunction(xmlXPathParserContextPtr ctxt, int nargs);
608 | XMLPUBFUN void xmlXPathSubstringBeforeFunction(xmlXPathParserContextPtr ctxt, int nargs);
609 | XMLPUBFUN void xmlXPathSubstringAfterFunction(xmlXPathParserContextPtr ctxt, int nargs);
610 | XMLPUBFUN void xmlXPathNormalizeFunction(xmlXPathParserContextPtr ctxt, int nargs);
611 | XMLPUBFUN void xmlXPathTranslateFunction(xmlXPathParserContextPtr ctxt, int nargs);
612 | XMLPUBFUN void xmlXPathNotFunction(xmlXPathParserContextPtr ctxt, int nargs);
613 | XMLPUBFUN void xmlXPathTrueFunction(xmlXPathParserContextPtr ctxt, int nargs);
614 | XMLPUBFUN void xmlXPathFalseFunction(xmlXPathParserContextPtr ctxt, int nargs);
615 | XMLPUBFUN void xmlXPathLangFunction(xmlXPathParserContextPtr ctxt, int nargs);
616 | XMLPUBFUN void xmlXPathNumberFunction(xmlXPathParserContextPtr ctxt, int nargs);
617 | XMLPUBFUN void xmlXPathSumFunction(xmlXPathParserContextPtr ctxt, int nargs);
618 | XMLPUBFUN void xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs);
619 | XMLPUBFUN void xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs);
620 | XMLPUBFUN void xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs);
621 | XMLPUBFUN void xmlXPathBooleanFunction(xmlXPathParserContextPtr ctxt, int nargs);
622 |
623 | /**
624 | * Really internal functions
625 | */
626 | XMLPUBFUN void xmlXPathNodeSetFreeNs(xmlNsPtr ns);
627 |
628 | #ifdef __cplusplus
629 | }
630 | #endif
631 |
632 | #endif /* LIBXML_XPATH_ENABLED */
633 | #endif /* ! __XML_XPATH_INTERNALS_H__ */
634 |
```