From df0de2c695ea84bbafe8574c666115fb81329621 Mon Sep 17 00:00:00 2001 From: Marco Costa Date: Fri, 18 Sep 2026 21:32:27 -0300 Subject: [PATCH] trererere --- __pycache__/main.cpython-311.pyc | Bin 11072 -> 0 bytes venv/bin/Activate.ps1 | 3 +- venv/bin/activate | 41 +- venv/bin/activate.csh | 7 +- venv/bin/activate.fish | 8 +- venv/bin/dotenv | 2 +- venv/bin/httpx | 2 +- venv/bin/idna | 2 +- venv/bin/pip | 2 +- venv/bin/pip3 | 2 +- venv/bin/pip3.11 | 8 - venv/bin/python3.11 | 1 - .../typing_extensions.cpython-311.pyc | Bin 182675 -> 0 bytes .../site-packages/_distutils_hack/__init__.py | 222 - .../__pycache__/__init__.cpython-311.pyc | Bin 11157 -> 0 bytes .../__pycache__/override.cpython-311.pyc | Bin 314 -> 0 bytes .../site-packages/_distutils_hack/override.py | 1 - .../anyio-4.15.0.dist-info/INSTALLER | 1 - .../anyio-4.15.0.dist-info/METADATA | 108 - .../anyio-4.15.0.dist-info/RECORD | 100 - .../anyio-4.15.0.dist-info/WHEEL | 5 - .../anyio-4.15.0.dist-info/entry_points.txt | 2 - .../anyio-4.15.0.dist-info/licenses/LICENSE | 20 - .../anyio-4.15.0.dist-info/top_level.txt | 1 - .../site-packages/anyio/__init__.py | 128 - .../__pycache__/__init__.cpython-311.pyc | Bin 6260 -> 0 bytes .../__pycache__/_lazyimport.cpython-311.pyc | Bin 8651 -> 0 bytes .../__pycache__/from_thread.cpython-311.pyc | Bin 28249 -> 0 bytes .../__pycache__/functools.cpython-311.pyc | Bin 17673 -> 0 bytes .../__pycache__/itertools.cpython-311.pyc | Bin 27298 -> 0 bytes .../__pycache__/lowlevel.cpython-311.pyc | Bin 9916 -> 0 bytes .../__pycache__/pytest_plugin.cpython-311.pyc | Bin 20313 -> 0 bytes .../to_interpreter.cpython-311.pyc | Bin 11433 -> 0 bytes .../__pycache__/to_process.cpython-311.pyc | Bin 13942 -> 0 bytes .../__pycache__/to_thread.cpython-311.pyc | Bin 3511 -> 0 bytes .../site-packages/anyio/_backends/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 192 -> 0 bytes .../__pycache__/_asyncio.cpython-311.pyc | Bin 160750 -> 0 bytes .../__pycache__/_trio.cpython-311.pyc | Bin 85270 -> 0 bytes .../site-packages/anyio/_backends/_asyncio.py | 3201 --- .../site-packages/anyio/_backends/_trio.py | 1473 -- .../site-packages/anyio/_core/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 188 -> 0 bytes .../_asyncio_selector_thread.cpython-311.pyc | Bin 9086 -> 0 bytes .../_concurrency_utils.cpython-311.pyc | Bin 9565 -> 0 bytes .../_contextmanagers.cpython-311.pyc | Bin 9672 -> 0 bytes .../__pycache__/_eventloop.cpython-311.pyc | Bin 9338 -> 0 bytes .../__pycache__/_exceptions.cpython-311.pyc | Bin 11055 -> 0 bytes .../_core/__pycache__/_fileio.cpython-311.pyc | Bin 52799 -> 0 bytes .../__pycache__/_futures.cpython-311.pyc | Bin 9217 -> 0 bytes .../__pycache__/_resources.cpython-311.pyc | Bin 1112 -> 0 bytes .../__pycache__/_signals.cpython-311.pyc | Bin 1468 -> 0 bytes .../__pycache__/_sockets.cpython-311.pyc | Bin 43084 -> 0 bytes .../__pycache__/_streams.cpython-311.pyc | Bin 2654 -> 0 bytes .../__pycache__/_subprocesses.cpython-311.pyc | Bin 9634 -> 0 bytes .../_synchronization.cpython-311.pyc | Bin 37135 -> 0 bytes .../_core/__pycache__/_tasks.cpython-311.pyc | Bin 21851 -> 0 bytes .../__pycache__/_tempfile.cpython-311.pyc | Bin 28785 -> 0 bytes .../__pycache__/_testing.cpython-311.pyc | Bin 4090 -> 0 bytes .../__pycache__/_typedattr.cpython-311.pyc | Bin 4566 -> 0 bytes .../anyio/_core/_asyncio_selector_thread.py | 167 - .../anyio/_core/_concurrency_utils.py | 156 - .../anyio/_core/_contextmanagers.py | 200 - .../site-packages/anyio/_core/_eventloop.py | 240 - .../site-packages/anyio/_core/_exceptions.py | 205 - .../site-packages/anyio/_core/_fileio.py | 1045 - .../site-packages/anyio/_core/_futures.py | 191 - .../site-packages/anyio/_core/_resources.py | 18 - .../site-packages/anyio/_core/_signals.py | 29 - .../site-packages/anyio/_core/_sockets.py | 1011 - .../site-packages/anyio/_core/_streams.py | 52 - .../anyio/_core/_subprocesses.py | 196 - .../anyio/_core/_synchronization.py | 778 - .../site-packages/anyio/_core/_tasks.py | 464 - .../site-packages/anyio/_core/_tempfile.py | 615 - .../site-packages/anyio/_core/_testing.py | 82 - .../site-packages/anyio/_core/_typedattr.py | 85 - .../site-packages/anyio/_lazyimport.py | 170 - .../site-packages/anyio/abc/__init__.py | 63 - .../abc/__pycache__/__init__.cpython-311.pyc | Bin 3053 -> 0 bytes .../__pycache__/_eventloop.cpython-311.pyc | Bin 18841 -> 0 bytes .../__pycache__/_resources.cpython-311.pyc | Bin 1986 -> 0 bytes .../abc/__pycache__/_sockets.cpython-311.pyc | Bin 20108 -> 0 bytes .../abc/__pycache__/_streams.cpython-311.pyc | Bin 11177 -> 0 bytes .../__pycache__/_subprocesses.cpython-311.pyc | Bin 3739 -> 0 bytes .../abc/__pycache__/_tasks.cpython-311.pyc | Bin 10522 -> 0 bytes .../abc/__pycache__/_testing.cpython-311.pyc | Bin 3543 -> 0 bytes .../site-packages/anyio/abc/_eventloop.py | 428 - .../site-packages/anyio/abc/_resources.py | 39 - .../site-packages/anyio/abc/_sockets.py | 401 - .../site-packages/anyio/abc/_streams.py | 237 - .../site-packages/anyio/abc/_subprocesses.py | 82 - .../site-packages/anyio/abc/_tasks.py | 223 - .../site-packages/anyio/abc/_testing.py | 79 - .../site-packages/anyio/from_thread.py | 588 - .../site-packages/anyio/functools.py | 400 - .../site-packages/anyio/itertools.py | 629 - .../site-packages/anyio/lowlevel.py | 228 - .../python3.11/site-packages/anyio/py.typed | 0 .../site-packages/anyio/pytest_plugin.py | 404 - .../site-packages/anyio/streams/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 190 -> 0 bytes .../__pycache__/buffered.cpython-311.pyc | Bin 10401 -> 0 bytes .../streams/__pycache__/file.cpython-311.pyc | Bin 8146 -> 0 bytes .../__pycache__/memory.cpython-311.pyc | Bin 16101 -> 0 bytes .../__pycache__/stapled.cpython-311.pyc | Bin 9031 -> 0 bytes .../streams/__pycache__/text.cpython-311.pyc | Bin 10217 -> 0 bytes .../streams/__pycache__/tls.cpython-311.pyc | Bin 21392 -> 0 bytes .../site-packages/anyio/streams/buffered.py | 201 - .../site-packages/anyio/streams/file.py | 157 - .../site-packages/anyio/streams/memory.py | 326 - .../site-packages/anyio/streams/stapled.py | 160 - .../site-packages/anyio/streams/text.py | 176 - .../site-packages/anyio/streams/tls.py | 436 - .../site-packages/anyio/to_interpreter.py | 246 - .../site-packages/anyio/to_process.py | 269 - .../site-packages/anyio/to_thread.py | 80 - .../certifi-2026.7.22.dist-info/INSTALLER | 1 - .../certifi-2026.7.22.dist-info/METADATA | 78 - .../certifi-2026.7.22.dist-info/RECORD | 18 - .../certifi-2026.7.22.dist-info/WHEEL | 5 - .../licenses/LICENSE | 20 - .../certifi-2026.7.22.dist-info/top_level.txt | 1 - .../site-packages/certifi/__init__.py | 4 - .../site-packages/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-311.pyc | Bin 326 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 715 -> 0 bytes .../certifi/__pycache__/core.cpython-311.pyc | Bin 2385 -> 0 bytes .../site-packages/certifi/cacert.pem | 3959 ---- .../python3.11/site-packages/certifi/core.py | 83 - .../python3.11/site-packages/certifi/py.typed | 0 .../site-packages/certifi/tests/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 190 -> 0 bytes .../__pycache__/test_certify.cpython-311.pyc | Bin 1666 -> 0 bytes .../certifi/tests/test_certify.py | 18 - .../site-packages/distutils-precedence.pth | 1 - .../site-packages/dotenv/__init__.py | 49 - .../site-packages/dotenv/__main__.py | 6 - .../__pycache__/__init__.cpython-311.pyc | Bin 2026 -> 0 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 390 -> 0 bytes .../dotenv/__pycache__/cli.cpython-311.pyc | Bin 10794 -> 0 bytes .../__pycache__/ipython.cpython-311.pyc | Bin 2306 -> 0 bytes .../dotenv/__pycache__/main.cpython-311.pyc | Bin 18547 -> 0 bytes .../dotenv/__pycache__/parser.cpython-311.pyc | Bin 11363 -> 0 bytes .../__pycache__/variables.cpython-311.pyc | Bin 5524 -> 0 bytes .../__pycache__/version.cpython-311.pyc | Bin 202 -> 0 bytes .../python3.11/site-packages/dotenv/cli.py | 190 - .../site-packages/dotenv/ipython.py | 39 - .../python3.11/site-packages/dotenv/main.py | 398 - .../python3.11/site-packages/dotenv/parser.py | 175 - .../python3.11/site-packages/dotenv/py.typed | 1 - .../site-packages/dotenv/variables.py | 86 - .../site-packages/dotenv/version.py | 1 - .../h11-0.16.0.dist-info/INSTALLER | 1 - .../h11-0.16.0.dist-info/METADATA | 202 - .../site-packages/h11-0.16.0.dist-info/RECORD | 29 - .../site-packages/h11-0.16.0.dist-info/WHEEL | 5 - .../h11-0.16.0.dist-info/licenses/LICENSE.txt | 22 - .../h11-0.16.0.dist-info/top_level.txt | 1 - .../python3.11/site-packages/h11/__init__.py | 62 - .../h11/__pycache__/__init__.cpython-311.pyc | Bin 1313 -> 0 bytes .../h11/__pycache__/_abnf.cpython-311.pyc | Bin 1818 -> 0 bytes .../__pycache__/_connection.cpython-311.pyc | Bin 24947 -> 0 bytes .../h11/__pycache__/_events.cpython-311.pyc | Bin 15108 -> 0 bytes .../h11/__pycache__/_headers.cpython-311.pyc | Bin 9269 -> 0 bytes .../h11/__pycache__/_readers.cpython-311.pyc | Bin 11057 -> 0 bytes .../_receivebuffer.cpython-311.pyc | Bin 5145 -> 0 bytes .../h11/__pycache__/_state.cpython-311.pyc | Bin 9687 -> 0 bytes .../h11/__pycache__/_util.cpython-311.pyc | Bin 5366 -> 0 bytes .../h11/__pycache__/_version.cpython-311.pyc | Bin 203 -> 0 bytes .../h11/__pycache__/_writers.cpython-311.pyc | Bin 7303 -> 0 bytes .../lib/python3.11/site-packages/h11/_abnf.py | 132 - .../site-packages/h11/_connection.py | 659 - .../python3.11/site-packages/h11/_events.py | 369 - .../python3.11/site-packages/h11/_headers.py | 282 - .../python3.11/site-packages/h11/_readers.py | 250 - .../site-packages/h11/_receivebuffer.py | 153 - .../python3.11/site-packages/h11/_state.py | 365 - .../lib/python3.11/site-packages/h11/_util.py | 135 - .../python3.11/site-packages/h11/_version.py | 16 - .../python3.11/site-packages/h11/_writers.py | 145 - .../lib/python3.11/site-packages/h11/py.typed | 1 - .../httpcore-1.0.9.dist-info/INSTALLER | 1 - .../httpcore-1.0.9.dist-info/METADATA | 625 - .../httpcore-1.0.9.dist-info/RECORD | 68 - .../httpcore-1.0.9.dist-info/WHEEL | 4 - .../licenses/LICENSE.md | 27 - .../site-packages/httpcore/__init__.py | 141 - .../__pycache__/__init__.cpython-311.pyc | Bin 3924 -> 0 bytes .../httpcore/__pycache__/_api.cpython-311.pyc | Bin 4087 -> 0 bytes .../__pycache__/_exceptions.cpython-311.pyc | Bin 3803 -> 0 bytes .../__pycache__/_models.cpython-311.pyc | Bin 24537 -> 0 bytes .../httpcore/__pycache__/_ssl.cpython-311.pyc | Bin 631 -> 0 bytes .../_synchronization.cpython-311.pyc | Bin 15821 -> 0 bytes .../__pycache__/_trace.cpython-311.pyc | Bin 5891 -> 0 bytes .../__pycache__/_utils.cpython-311.pyc | Bin 1413 -> 0 bytes .../python3.11/site-packages/httpcore/_api.py | 94 - .../site-packages/httpcore/_async/__init__.py | 39 - .../__pycache__/__init__.cpython-311.pyc | Bin 1917 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 12312 -> 0 bytes .../connection_pool.cpython-311.pyc | Bin 21613 -> 0 bytes .../_async/__pycache__/http11.cpython-311.pyc | Bin 21493 -> 0 bytes .../_async/__pycache__/http2.cpython-311.pyc | Bin 32785 -> 0 bytes .../__pycache__/http_proxy.cpython-311.pyc | Bin 18744 -> 0 bytes .../__pycache__/interfaces.cpython-311.pyc | Bin 6315 -> 0 bytes .../__pycache__/socks_proxy.cpython-311.pyc | Bin 17298 -> 0 bytes .../httpcore/_async/connection.py | 222 - .../httpcore/_async/connection_pool.py | 420 - .../site-packages/httpcore/_async/http11.py | 379 - .../site-packages/httpcore/_async/http2.py | 592 - .../httpcore/_async/http_proxy.py | 367 - .../httpcore/_async/interfaces.py | 137 - .../httpcore/_async/socks_proxy.py | 341 - .../httpcore/_backends/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 195 -> 0 bytes .../__pycache__/anyio.cpython-311.pyc | Bin 9565 -> 0 bytes .../__pycache__/auto.cpython-311.pyc | Bin 2873 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 5311 -> 0 bytes .../__pycache__/mock.cpython-311.pyc | Bin 8020 -> 0 bytes .../__pycache__/sync.cpython-311.pyc | Bin 12713 -> 0 bytes .../__pycache__/trio.cpython-311.pyc | Bin 10085 -> 0 bytes .../site-packages/httpcore/_backends/anyio.py | 146 - .../site-packages/httpcore/_backends/auto.py | 52 - .../site-packages/httpcore/_backends/base.py | 101 - .../site-packages/httpcore/_backends/mock.py | 143 - .../site-packages/httpcore/_backends/sync.py | 241 - .../site-packages/httpcore/_backends/trio.py | 159 - .../site-packages/httpcore/_exceptions.py | 81 - .../site-packages/httpcore/_models.py | 516 - .../python3.11/site-packages/httpcore/_ssl.py | 9 - .../site-packages/httpcore/_sync/__init__.py | 39 - .../__pycache__/__init__.cpython-311.pyc | Bin 1871 -> 0 bytes .../__pycache__/connection.cpython-311.pyc | Bin 11113 -> 0 bytes .../connection_pool.cpython-311.pyc | Bin 20921 -> 0 bytes .../_sync/__pycache__/http11.cpython-311.pyc | Bin 19429 -> 0 bytes .../_sync/__pycache__/http2.cpython-311.pyc | Bin 29462 -> 0 bytes .../__pycache__/http_proxy.cpython-311.pyc | Bin 18038 -> 0 bytes .../__pycache__/interfaces.cpython-311.pyc | Bin 5973 -> 0 bytes .../__pycache__/socks_proxy.cpython-311.pyc | Bin 16275 -> 0 bytes .../httpcore/_sync/connection.py | 222 - .../httpcore/_sync/connection_pool.py | 420 - .../site-packages/httpcore/_sync/http11.py | 379 - .../site-packages/httpcore/_sync/http2.py | 592 - .../httpcore/_sync/http_proxy.py | 367 - .../httpcore/_sync/interfaces.py | 137 - .../httpcore/_sync/socks_proxy.py | 341 - .../httpcore/_synchronization.py | 318 - .../site-packages/httpcore/_trace.py | 107 - .../site-packages/httpcore/_utils.py | 37 - .../site-packages/httpcore/py.typed | 0 .../httpx-0.28.1.dist-info/INSTALLER | 1 - .../httpx-0.28.1.dist-info/METADATA | 203 - .../httpx-0.28.1.dist-info/RECORD | 54 - .../httpx-0.28.1.dist-info/WHEEL | 4 - .../httpx-0.28.1.dist-info/entry_points.txt | 2 - .../licenses/LICENSE.md | 12 - .../site-packages/httpx/__init__.py | 105 - .../__pycache__/__init__.cpython-311.pyc | Bin 2373 -> 0 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 305 -> 0 bytes .../httpx/__pycache__/_api.cpython-311.pyc | Bin 9703 -> 0 bytes .../httpx/__pycache__/_auth.cpython-311.pyc | Bin 17045 -> 0 bytes .../httpx/__pycache__/_client.cpython-311.pyc | Bin 65528 -> 0 bytes .../httpx/__pycache__/_config.cpython-311.pyc | Bin 11502 -> 0 bytes .../__pycache__/_content.cpython-311.pyc | Bin 11939 -> 0 bytes .../__pycache__/_decoders.cpython-311.pyc | Bin 18903 -> 0 bytes .../__pycache__/_exceptions.cpython-311.pyc | Bin 14477 -> 0 bytes .../httpx/__pycache__/_main.cpython-311.pyc | Bin 23047 -> 0 bytes .../httpx/__pycache__/_models.cpython-311.pyc | Bin 66368 -> 0 bytes .../__pycache__/_multipart.cpython-311.pyc | Bin 15614 -> 0 bytes .../__pycache__/_status_codes.cpython-311.pyc | Bin 7548 -> 0 bytes .../httpx/__pycache__/_types.cpython-311.pyc | Bin 4652 -> 0 bytes .../__pycache__/_urlparse.cpython-311.pyc | Bin 20276 -> 0 bytes .../httpx/__pycache__/_urls.cpython-311.pyc | Bin 30747 -> 0 bytes .../httpx/__pycache__/_utils.cpython-311.pyc | Bin 10374 -> 0 bytes .../site-packages/httpx/__version__.py | 3 - .../python3.11/site-packages/httpx/_api.py | 438 - .../python3.11/site-packages/httpx/_auth.py | 348 - .../python3.11/site-packages/httpx/_client.py | 2019 -- .../python3.11/site-packages/httpx/_config.py | 248 - .../site-packages/httpx/_content.py | 240 - .../site-packages/httpx/_decoders.py | 393 - .../site-packages/httpx/_exceptions.py | 379 - .../python3.11/site-packages/httpx/_main.py | 506 - .../python3.11/site-packages/httpx/_models.py | 1277 -- .../site-packages/httpx/_multipart.py | 300 - .../site-packages/httpx/_status_codes.py | 162 - .../httpx/_transports/__init__.py | 15 - .../__pycache__/__init__.cpython-311.pyc | Bin 479 -> 0 bytes .../__pycache__/asgi.cpython-311.pyc | Bin 8122 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 4206 -> 0 bytes .../__pycache__/default.cpython-311.pyc | Bin 17503 -> 0 bytes .../__pycache__/mock.cpython-311.pyc | Bin 2125 -> 0 bytes .../__pycache__/wsgi.cpython-311.pyc | Bin 7389 -> 0 bytes .../site-packages/httpx/_transports/asgi.py | 187 - .../site-packages/httpx/_transports/base.py | 86 - .../httpx/_transports/default.py | 406 - .../site-packages/httpx/_transports/mock.py | 43 - .../site-packages/httpx/_transports/wsgi.py | 149 - .../python3.11/site-packages/httpx/_types.py | 114 - .../site-packages/httpx/_urlparse.py | 527 - .../python3.11/site-packages/httpx/_urls.py | 641 - .../python3.11/site-packages/httpx/_utils.py | 242 - .../python3.11/site-packages/httpx/py.typed | 0 .../idna-3.19.dist-info/INSTALLER | 1 - .../idna-3.19.dist-info/METADATA | 209 - .../site-packages/idna-3.19.dist-info/RECORD | 28 - .../site-packages/idna-3.19.dist-info/WHEEL | 4 - .../idna-3.19.dist-info/entry_points.txt | 3 - .../idna-3.19.dist-info/licenses/LICENSE.md | 31 - .../python3.11/site-packages/idna/__init__.py | 47 - .../python3.11/site-packages/idna/__main__.py | 6 - .../idna/__pycache__/__init__.cpython-311.pyc | Bin 1150 -> 0 bytes .../idna/__pycache__/__main__.cpython-311.pyc | Bin 387 -> 0 bytes .../idna/__pycache__/cli.cpython-311.pyc | Bin 6745 -> 0 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 7332 -> 0 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 2059 -> 0 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 37955 -> 0 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 22040 -> 0 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 2905 -> 0 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 204 -> 0 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 96326 -> 0 bytes venv/lib/python3.11/site-packages/idna/cli.py | 132 - .../python3.11/site-packages/idna/codec.py | 163 - .../python3.11/site-packages/idna/compat.py | 43 - .../lib/python3.11/site-packages/idna/core.py | 862 - .../python3.11/site-packages/idna/idnadata.py | 1897 -- .../site-packages/idna/intranges.py | 55 - .../site-packages/idna/package_data.py | 1 - .../python3.11/site-packages/idna/py.typed | 0 .../site-packages/idna/uts46data.py | 16897 ---------------- .../pip-26.2.1.dist-info/INSTALLER | 1 - .../pip-26.2.1.dist-info/METADATA | 110 - .../site-packages/pip-26.2.1.dist-info/RECORD | 885 - .../pip-26.2.1.dist-info/REQUESTED | 0 .../site-packages/pip-26.2.1.dist-info/WHEEL | 4 - .../pip-26.2.1.dist-info/entry_points.txt | 4 - .../pip-26.2.1.dist-info/licenses/AUTHORS.txt | 888 - .../pip-26.2.1.dist-info/licenses/LICENSE.txt | 20 - .../src/pip/_vendor/cachecontrol/LICENSE.txt | 13 - .../licenses/src/pip/_vendor/certifi/LICENSE | 20 - .../src/pip/_vendor/distlib/LICENSE.txt | 284 - .../licenses/src/pip/_vendor/distro/LICENSE | 202 - .../licenses/src/pip/_vendor/idna/LICENSE.md | 31 - .../licenses/src/pip/_vendor/msgpack/COPYING | 14 - .../src/pip/_vendor/packaging/LICENSE | 3 - .../src/pip/_vendor/packaging/LICENSE.APACHE | 177 - .../src/pip/_vendor/packaging/LICENSE.BSD | 23 - .../src/pip/_vendor/pkg_resources/LICENSE | 17 - .../src/pip/_vendor/platformdirs/LICENSE | 21 - .../licenses/src/pip/_vendor/pygments/LICENSE | 25 - .../src/pip/_vendor/pyproject_hooks/LICENSE | 21 - .../licenses/src/pip/_vendor/requests/LICENSE | 175 - .../src/pip/_vendor/resolvelib/LICENSE | 13 - .../licenses/src/pip/_vendor/rich/LICENSE | 19 - .../licenses/src/pip/_vendor/tomli/LICENSE | 21 - .../licenses/src/pip/_vendor/tomli_w/LICENSE | 21 - .../src/pip/_vendor/truststore/LICENSE | 21 - .../src/pip/_vendor/urllib3/LICENSE.txt | 21 - .../python3.11/site-packages/pip/__init__.py | 13 - .../python3.11/site-packages/pip/__main__.py | 24 - .../site-packages/pip/__pip-runner__.py | 50 - .../pip/__pycache__/__init__.cpython-311.pyc | Bin 735 -> 0 bytes .../pip/__pycache__/__main__.cpython-311.pyc | Bin 914 -> 0 bytes .../__pip-runner__.cpython-311.pyc | Bin 2506 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 18 - .../__pycache__/__init__.cpython-311.pyc | Bin 849 -> 0 bytes .../__pycache__/cache.cpython-311.pyc | Bin 14140 -> 0 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 20402 -> 0 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 58817 -> 0 bytes .../__pycache__/main.cpython-311.pyc | Bin 718 -> 0 bytes .../__pycache__/pyproject.cpython-311.pyc | Bin 4647 -> 0 bytes .../self_outdated_check.cpython-311.pyc | Bin 11003 -> 0 bytes .../__pycache__/wheel_builder.cpython-311.pyc | Bin 11961 -> 0 bytes .../pip/_internal/build_env/__init__.py | 25 - .../__pycache__/__init__.cpython-311.pyc | Bin 991 -> 0 bytes .../__pycache__/base.cpython-311.pyc | Bin 5458 -> 0 bytes .../__pycache__/installer.cpython-311.pyc | Bin 15489 -> 0 bytes .../__pycache__/noop.cpython-311.pyc | Bin 2264 -> 0 bytes .../__pycache__/venv.cpython-311.pyc | Bin 7224 -> 0 bytes .../__pycache__/virtual.cpython-311.pyc | Bin 8263 -> 0 bytes .../pip/_internal/build_env/base.py | 103 - .../pip/_internal/build_env/installer.py | 333 - .../pip/_internal/build_env/noop.py | 42 - .../pip/_internal/build_env/venv.py | 145 - .../pip/_internal/build_env/virtual.py | 139 - .../site-packages/pip/_internal/cache.py | 294 - .../pip/_internal/cli/__init__.py | 3 - .../cli/__pycache__/__init__.cpython-311.pyc | Bin 278 -> 0 bytes .../autocompletion.cpython-311.pyc | Bin 11006 -> 0 bytes .../__pycache__/base_command.cpython-311.pyc | Bin 13042 -> 0 bytes .../__pycache__/cmdoptions.cpython-311.pyc | Bin 44300 -> 0 bytes .../command_context.cpython-311.pyc | Bin 2157 -> 0 bytes .../__pycache__/index_command.cpython-311.pyc | Bin 9962 -> 0 bytes .../cli/__pycache__/main.cpython-311.pyc | Bin 2529 -> 0 bytes .../__pycache__/main_parser.cpython-311.pyc | Bin 5547 -> 0 bytes .../cli/__pycache__/parser.cpython-311.pyc | Bin 21696 -> 0 bytes .../__pycache__/progress_bars.cpython-311.pyc | Bin 7050 -> 0 bytes .../__pycache__/req_command.cpython-311.pyc | Bin 19114 -> 0 bytes .../cli/__pycache__/spinners.cpython-311.pyc | Bin 12854 -> 0 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 402 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 187 - .../pip/_internal/cli/base_command.py | 261 - .../pip/_internal/cli/cmdoptions.py | 1409 -- .../pip/_internal/cli/command_context.py | 28 - .../pip/_internal/cli/index_command.py | 217 - .../site-packages/pip/_internal/cli/main.py | 86 - .../pip/_internal/cli/main_parser.py | 135 - .../site-packages/pip/_internal/cli/parser.py | 366 - .../pip/_internal/cli/progress_bars.py | 153 - .../pip/_internal/cli/req_command.py | 504 - .../pip/_internal/cli/spinners.py | 235 - .../pip/_internal/cli/status_codes.py | 7 - .../pip/_internal/commands/__init__.py | 139 - .../__pycache__/__init__.cpython-311.pyc | Bin 4621 -> 0 bytes .../__pycache__/cache.cpython-311.pyc | Bin 12840 -> 0 bytes .../__pycache__/check.cpython-311.pyc | Bin 2958 -> 0 bytes .../__pycache__/completion.cpython-311.pyc | Bin 5877 -> 0 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 15229 -> 0 bytes .../__pycache__/debug.cpython-311.pyc | Bin 11911 -> 0 bytes .../__pycache__/download.cpython-311.pyc | Bin 7903 -> 0 bytes .../__pycache__/freeze.cpython-311.pyc | Bin 4574 -> 0 bytes .../commands/__pycache__/hash.cpython-311.pyc | Bin 3307 -> 0 bytes .../commands/__pycache__/help.cpython-311.pyc | Bin 1919 -> 0 bytes .../__pycache__/index.cpython-311.pyc | Bin 8624 -> 0 bytes .../__pycache__/inspect.cpython-311.pyc | Bin 4414 -> 0 bytes .../__pycache__/install.cpython-311.pyc | Bin 36760 -> 0 bytes .../commands/__pycache__/list.cpython-311.pyc | Bin 19947 -> 0 bytes .../commands/__pycache__/lock.cpython-311.pyc | Bin 8776 -> 0 bytes .../__pycache__/search.cpython-311.pyc | Bin 8970 -> 0 bytes .../commands/__pycache__/show.cpython-311.pyc | Bin 13120 -> 0 bytes 430 files changed, 39 insertions(+), 70148 deletions(-) delete mode 100755 __pycache__/main.cpython-311.pyc mode change 100755 => 100644 venv/bin/Activate.ps1 mode change 100755 => 100644 venv/bin/activate mode change 100755 => 100644 venv/bin/activate.csh mode change 100755 => 100644 venv/bin/activate.fish delete mode 100755 venv/bin/pip3.11 delete mode 120000 venv/bin/python3.11 delete mode 100755 venv/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/_distutils_hack/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/_distutils_hack/override.py delete mode 100755 venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/INSTALLER delete mode 100755 venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/METADATA delete mode 100755 venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/RECORD delete mode 100755 venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/WHEEL delete mode 100755 venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/entry_points.txt delete mode 100755 venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/licenses/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/top_level.txt delete mode 100755 venv/lib/python3.11/site-packages/anyio/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/__pycache__/_lazyimport.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/__pycache__/from_thread.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/__pycache__/functools.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/__pycache__/itertools.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/__pycache__/lowlevel.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/__pycache__/pytest_plugin.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/__pycache__/to_interpreter.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/__pycache__/to_process.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/__pycache__/to_thread.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_backends/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/_asyncio.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/_trio.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_backends/_trio.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_concurrency_utils.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_contextmanagers.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_eventloop.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_exceptions.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_fileio.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_futures.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_resources.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_signals.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_sockets.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_streams.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_synchronization.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_tasks.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_tempfile.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_testing.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_typedattr.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_asyncio_selector_thread.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_concurrency_utils.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_contextmanagers.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_eventloop.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_exceptions.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_fileio.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_futures.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_resources.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_signals.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_sockets.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_streams.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_subprocesses.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_synchronization.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_tasks.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_tempfile.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_testing.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_core/_typedattr.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/_lazyimport.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_eventloop.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_resources.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_sockets.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_streams.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_tasks.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_testing.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/_eventloop.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/_resources.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/_sockets.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/_streams.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/_subprocesses.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/_tasks.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/abc/_testing.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/from_thread.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/functools.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/itertools.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/lowlevel.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/py.typed delete mode 100755 venv/lib/python3.11/site-packages/anyio/pytest_plugin.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/streams/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/buffered.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/file.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/memory.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/stapled.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/text.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/streams/__pycache__/tls.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/anyio/streams/buffered.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/streams/file.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/streams/memory.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/streams/stapled.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/streams/text.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/streams/tls.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/to_interpreter.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/to_process.py delete mode 100755 venv/lib/python3.11/site-packages/anyio/to_thread.py delete mode 100755 venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/INSTALLER delete mode 100755 venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/METADATA delete mode 100755 venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/RECORD delete mode 100755 venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/WHEEL delete mode 100755 venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/licenses/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/top_level.txt delete mode 100755 venv/lib/python3.11/site-packages/certifi/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/certifi/__main__.py delete mode 100755 venv/lib/python3.11/site-packages/certifi/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/certifi/__pycache__/__main__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/certifi/__pycache__/core.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/certifi/cacert.pem delete mode 100755 venv/lib/python3.11/site-packages/certifi/core.py delete mode 100755 venv/lib/python3.11/site-packages/certifi/py.typed delete mode 100755 venv/lib/python3.11/site-packages/certifi/tests/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/certifi/tests/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/certifi/tests/__pycache__/test_certify.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/certifi/tests/test_certify.py delete mode 100755 venv/lib/python3.11/site-packages/distutils-precedence.pth delete mode 100755 venv/lib/python3.11/site-packages/dotenv/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/dotenv/__main__.py delete mode 100755 venv/lib/python3.11/site-packages/dotenv/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/dotenv/__pycache__/__main__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/dotenv/__pycache__/cli.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/dotenv/__pycache__/ipython.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/dotenv/__pycache__/main.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/dotenv/__pycache__/parser.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/dotenv/__pycache__/variables.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/dotenv/__pycache__/version.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/dotenv/cli.py delete mode 100755 venv/lib/python3.11/site-packages/dotenv/ipython.py delete mode 100755 venv/lib/python3.11/site-packages/dotenv/main.py delete mode 100755 venv/lib/python3.11/site-packages/dotenv/parser.py delete mode 100755 venv/lib/python3.11/site-packages/dotenv/py.typed delete mode 100755 venv/lib/python3.11/site-packages/dotenv/variables.py delete mode 100755 venv/lib/python3.11/site-packages/dotenv/version.py delete mode 100755 venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/INSTALLER delete mode 100755 venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/METADATA delete mode 100755 venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/RECORD delete mode 100755 venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/WHEEL delete mode 100755 venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/licenses/LICENSE.txt delete mode 100755 venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/top_level.txt delete mode 100755 venv/lib/python3.11/site-packages/h11/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/h11/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/h11/__pycache__/_abnf.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/h11/__pycache__/_connection.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/h11/__pycache__/_events.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/h11/__pycache__/_headers.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/h11/__pycache__/_readers.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/h11/__pycache__/_receivebuffer.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/h11/__pycache__/_state.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/h11/__pycache__/_util.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/h11/__pycache__/_version.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/h11/__pycache__/_writers.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/h11/_abnf.py delete mode 100755 venv/lib/python3.11/site-packages/h11/_connection.py delete mode 100755 venv/lib/python3.11/site-packages/h11/_events.py delete mode 100755 venv/lib/python3.11/site-packages/h11/_headers.py delete mode 100755 venv/lib/python3.11/site-packages/h11/_readers.py delete mode 100755 venv/lib/python3.11/site-packages/h11/_receivebuffer.py delete mode 100755 venv/lib/python3.11/site-packages/h11/_state.py delete mode 100755 venv/lib/python3.11/site-packages/h11/_util.py delete mode 100755 venv/lib/python3.11/site-packages/h11/_version.py delete mode 100755 venv/lib/python3.11/site-packages/h11/_writers.py delete mode 100755 venv/lib/python3.11/site-packages/h11/py.typed delete mode 100755 venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/INSTALLER delete mode 100755 venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/METADATA delete mode 100755 venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/RECORD delete mode 100755 venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/WHEEL delete mode 100755 venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md delete mode 100755 venv/lib/python3.11/site-packages/httpcore/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/__pycache__/_api.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/__pycache__/_exceptions.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/__pycache__/_models.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/__pycache__/_ssl.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/__pycache__/_synchronization.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/__pycache__/_trace.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/__pycache__/_utils.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_api.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/connection.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/http11.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/http2.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/interfaces.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/connection.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/connection_pool.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/http11.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/http2.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/http_proxy.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/interfaces.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_async/socks_proxy.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_backends/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/anyio.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/auto.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/base.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/mock.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/sync.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/trio.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_backends/anyio.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_backends/auto.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_backends/base.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_backends/mock.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_backends/sync.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_backends/trio.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_exceptions.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_models.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_ssl.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/connection.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/http11.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/http2.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/http_proxy.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/connection.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/http11.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/http2.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/http_proxy.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/interfaces.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_sync/socks_proxy.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_synchronization.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_trace.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/_utils.py delete mode 100755 venv/lib/python3.11/site-packages/httpcore/py.typed delete mode 100755 venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/INSTALLER delete mode 100755 venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/METADATA delete mode 100755 venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/RECORD delete mode 100755 venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/WHEEL delete mode 100755 venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/entry_points.txt delete mode 100755 venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md delete mode 100755 venv/lib/python3.11/site-packages/httpx/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/__version__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_api.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_auth.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_client.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_config.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_content.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_decoders.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_exceptions.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_main.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_models.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_multipart.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_status_codes.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_types.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_urlparse.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_urls.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__pycache__/_utils.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/__version__.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_api.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_auth.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_client.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_config.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_content.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_decoders.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_exceptions.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_main.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_models.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_multipart.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_status_codes.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_transports/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/asgi.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/base.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/default.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/mock.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/wsgi.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/httpx/_transports/asgi.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_transports/base.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_transports/default.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_transports/mock.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_transports/wsgi.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_types.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_urlparse.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_urls.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/_utils.py delete mode 100755 venv/lib/python3.11/site-packages/httpx/py.typed delete mode 100755 venv/lib/python3.11/site-packages/idna-3.19.dist-info/INSTALLER delete mode 100755 venv/lib/python3.11/site-packages/idna-3.19.dist-info/METADATA delete mode 100755 venv/lib/python3.11/site-packages/idna-3.19.dist-info/RECORD delete mode 100755 venv/lib/python3.11/site-packages/idna-3.19.dist-info/WHEEL delete mode 100755 venv/lib/python3.11/site-packages/idna-3.19.dist-info/entry_points.txt delete mode 100755 venv/lib/python3.11/site-packages/idna-3.19.dist-info/licenses/LICENSE.md delete mode 100755 venv/lib/python3.11/site-packages/idna/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/idna/__main__.py delete mode 100755 venv/lib/python3.11/site-packages/idna/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/idna/__pycache__/__main__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/idna/__pycache__/cli.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/idna/__pycache__/codec.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/idna/__pycache__/compat.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/idna/__pycache__/core.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/idna/__pycache__/idnadata.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/idna/__pycache__/intranges.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/idna/__pycache__/package_data.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/idna/__pycache__/uts46data.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/idna/cli.py delete mode 100755 venv/lib/python3.11/site-packages/idna/codec.py delete mode 100755 venv/lib/python3.11/site-packages/idna/compat.py delete mode 100755 venv/lib/python3.11/site-packages/idna/core.py delete mode 100755 venv/lib/python3.11/site-packages/idna/idnadata.py delete mode 100755 venv/lib/python3.11/site-packages/idna/intranges.py delete mode 100755 venv/lib/python3.11/site-packages/idna/package_data.py delete mode 100755 venv/lib/python3.11/site-packages/idna/py.typed delete mode 100755 venv/lib/python3.11/site-packages/idna/uts46data.py delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/INSTALLER delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/METADATA delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/RECORD delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/REQUESTED delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/WHEEL delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/entry_points.txt delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/AUTHORS.txt delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/LICENSE.txt delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/certifi/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/distro/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/msgpack/COPYING delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pygments/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/requests/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/rich/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/tomli/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/truststore/LICENSE delete mode 100755 venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt delete mode 100755 venv/lib/python3.11/site-packages/pip/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/__main__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/__pip-runner__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/__pycache__/__main__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/__pycache__/base.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/__pycache__/installer.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/__pycache__/noop.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/__pycache__/venv.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/__pycache__/virtual.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/base.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/installer.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/noop.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/venv.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/build_env/virtual.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cache.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/autocompletion.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/base_command.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/command_context.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/index_command.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/main.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/main_parser.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/parser.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/progress_bars.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/req_command.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/spinners.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/cli/status_codes.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__init__.py delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/lock.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc delete mode 100755 venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc diff --git a/__pycache__/main.cpython-311.pyc b/__pycache__/main.cpython-311.pyc deleted file mode 100755 index 6a1a66baa397bfc29ed736710a995a3351e8c605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11072 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⩝%voPSMqjB1Wi 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 o5=2S`bQ6>t?zXL+s_Z7XOM?0_+THC*BVK2W_tH /dev/null - fi + # Call hash to forget past locations. Without forgetting + # past locations the $PATH changes we made may not be respected. + # See "man bash" for more details. hash is usually a builtin of your shell + hash -r 2> /dev/null if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then PS1="${_OLD_VIRTUAL_PS1:-}" @@ -38,13 +36,27 @@ deactivate () { # unset irrelevant variables deactivate nondestructive -VIRTUAL_ENV=/home/marco/Jogo3/app/venv -export VIRTUAL_ENV +# on Windows, a path can contain colons and backslashes and has to be converted: +case "$(uname)" in + CYGWIN*|MSYS*|MINGW*) + # transform D:\path\to\venv to /d/path/to/venv on MSYS and MINGW + # and to /cygdrive/d/path/to/venv on Cygwin + VIRTUAL_ENV=$(cygpath /home/apps/apps/Jogo3/app/venv) + export VIRTUAL_ENV + ;; + *) + # use the path as-is + export VIRTUAL_ENV=/home/apps/apps/Jogo3/app/venv + ;; +esac _OLD_VIRTUAL_PATH="$PATH" PATH="$VIRTUAL_ENV/"bin":$PATH" export PATH +VIRTUAL_ENV_PROMPT=venv +export VIRTUAL_ENV_PROMPT + # unset PYTHONHOME if set # this will fail if PYTHONHOME is set to the empty string (which is bad anyway) # could use `if (set -u; : $PYTHONHOME) ;` in bash @@ -55,15 +67,10 @@ fi if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then _OLD_VIRTUAL_PS1="${PS1:-}" - PS1='(venv) '"${PS1:-}" + PS1="("venv") ${PS1:-}" export PS1 - VIRTUAL_ENV_PROMPT='(venv) ' - export VIRTUAL_ENV_PROMPT fi -# This should detect bash and zsh, which have a hash command that must -# be called to get it to forget past commands. Without forgetting +# Call hash to forget past commands. Without forgetting # past commands the $PATH changes we made may not be respected -if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r 2> /dev/null -fi +hash -r 2> /dev/null diff --git a/venv/bin/activate.csh b/venv/bin/activate.csh old mode 100755 new mode 100644 index 741eeba..5c522e7 --- a/venv/bin/activate.csh +++ b/venv/bin/activate.csh @@ -1,5 +1,6 @@ # This file must be used with "source bin/activate.csh" *from csh*. # You cannot run it directly. + # Created by Davide Di Blasi . # Ported to Python 3.3 venv by Andrew Svetlov @@ -8,17 +9,17 @@ alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PA # Unset irrelevant variables. deactivate nondestructive -setenv VIRTUAL_ENV /home/marco/Jogo3/app/venv +setenv VIRTUAL_ENV /home/apps/apps/Jogo3/app/venv set _OLD_VIRTUAL_PATH="$PATH" setenv PATH "$VIRTUAL_ENV/"bin":$PATH" +setenv VIRTUAL_ENV_PROMPT venv set _OLD_VIRTUAL_PROMPT="$prompt" if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - set prompt = '(venv) '"$prompt" - setenv VIRTUAL_ENV_PROMPT '(venv) ' + set prompt = "("venv") $prompt:q" endif alias pydoc python -m pydoc diff --git a/venv/bin/activate.fish b/venv/bin/activate.fish old mode 100755 new mode 100644 index 4f5f395..379e388 --- a/venv/bin/activate.fish +++ b/venv/bin/activate.fish @@ -1,5 +1,5 @@ # This file must be used with "source /bin/activate.fish" *from fish* -# (https://fishshell.com/); you cannot run it directly. +# (https://fishshell.com/). You cannot run it directly. function deactivate -d "Exit virtual environment and return to normal shell environment" # reset old environment variables @@ -33,10 +33,11 @@ end # Unset irrelevant variables. deactivate nondestructive -set -gx VIRTUAL_ENV /home/marco/Jogo3/app/venv +set -gx VIRTUAL_ENV /home/apps/apps/Jogo3/app/venv set -gx _OLD_VIRTUAL_PATH $PATH set -gx PATH "$VIRTUAL_ENV/"bin $PATH +set -gx VIRTUAL_ENV_PROMPT venv # Unset PYTHONHOME if set. if set -q PYTHONHOME @@ -56,7 +57,7 @@ if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" set -l old_status $status # Output the venv prompt; color taken from the blue of the Python logo. - printf "%s%s%s" (set_color 4B8BBE) '(venv) ' (set_color normal) + printf "%s(%s)%s " (set_color 4B8BBE) venv (set_color normal) # Restore the return status of the previous command. echo "exit $old_status" | . @@ -65,5 +66,4 @@ if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" end set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" - set -gx VIRTUAL_ENV_PROMPT '(venv) ' end diff --git a/venv/bin/dotenv b/venv/bin/dotenv index ed51ff4..a3ed592 100755 --- a/venv/bin/dotenv +++ b/venv/bin/dotenv @@ -1,4 +1,4 @@ -#!/home/marco/Jogo3/app/venv/bin/python3 +#!/home/apps/apps/Jogo3/app/venv/bin/python3 import sys from dotenv.__main__ import cli if __name__ == '__main__': diff --git a/venv/bin/httpx b/venv/bin/httpx index b60627d..0c4849b 100755 --- a/venv/bin/httpx +++ b/venv/bin/httpx @@ -1,4 +1,4 @@ -#!/home/marco/Jogo3/app/venv/bin/python3 +#!/home/apps/apps/Jogo3/app/venv/bin/python3 import sys from httpx import main if __name__ == '__main__': diff --git a/venv/bin/idna b/venv/bin/idna index a561dc5..e2ca059 100755 --- a/venv/bin/idna +++ b/venv/bin/idna @@ -1,4 +1,4 @@ -#!/home/marco/Jogo3/app/venv/bin/python3 +#!/home/apps/apps/Jogo3/app/venv/bin/python3 import sys from idna.cli import main if __name__ == '__main__': diff --git a/venv/bin/pip b/venv/bin/pip index 099158f..95949e6 100755 --- a/venv/bin/pip +++ b/venv/bin/pip @@ -1,4 +1,4 @@ -#!/home/marco/Jogo3/app/venv/bin/python3 +#!/home/apps/apps/Jogo3/app/venv/bin/python3 # -*- coding: utf-8 -*- import re import sys diff --git a/venv/bin/pip3 b/venv/bin/pip3 index 099158f..95949e6 100755 --- a/venv/bin/pip3 +++ b/venv/bin/pip3 @@ -1,4 +1,4 @@ -#!/home/marco/Jogo3/app/venv/bin/python3 +#!/home/apps/apps/Jogo3/app/venv/bin/python3 # -*- coding: utf-8 -*- import re import sys diff --git a/venv/bin/pip3.11 b/venv/bin/pip3.11 deleted file mode 100755 index 099158f..0000000 --- a/venv/bin/pip3.11 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/marco/Jogo3/app/venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/venv/bin/python3.11 b/venv/bin/python3.11 deleted file mode 120000 index b8a0adb..0000000 --- a/venv/bin/python3.11 +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/venv/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc b/venv/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc deleted file mode 100755 index af642d75b2890701f6130ed00f0b5ef4dd7b3a7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182675 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 diff --git a/venv/lib/python3.11/site-packages/_distutils_hack/__init__.py b/venv/lib/python3.11/site-packages/_distutils_hack/__init__.py deleted file mode 100755 index f987a53..0000000 --- a/venv/lib/python3.11/site-packages/_distutils_hack/__init__.py +++ /dev/null @@ -1,222 +0,0 @@ -# don't import any costly modules -import sys -import os - - -is_pypy = '__pypy__' in sys.builtin_module_names - - -def warn_distutils_present(): - if 'distutils' not in sys.modules: - return - if is_pypy and sys.version_info < (3, 7): - # PyPy for 3.6 unconditionally imports distutils, so bypass the warning - # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 - return - import warnings - - warnings.warn( - "Distutils was imported before Setuptools, but importing Setuptools " - "also replaces the `distutils` module in `sys.modules`. This may lead " - "to undesirable behaviors or errors. To avoid these issues, avoid " - "using distutils directly, ensure that setuptools is installed in the " - "traditional way (e.g. not an editable install), and/or make sure " - "that setuptools is always imported before distutils." - ) - - -def clear_distutils(): - if 'distutils' not in sys.modules: - return - import warnings - - warnings.warn("Setuptools is replacing distutils.") - mods = [ - name - for name in sys.modules - if name == "distutils" or name.startswith("distutils.") - ] - for name in mods: - del sys.modules[name] - - -def enabled(): - """ - Allow selection of distutils by environment variable. - """ - which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'local') - return which == 'local' - - -def ensure_local_distutils(): - import importlib - - clear_distutils() - - # With the DistutilsMetaFinder in place, - # perform an import to cause distutils to be - # loaded from setuptools._distutils. Ref #2906. - with shim(): - importlib.import_module('distutils') - - # check that submodules load as expected - core = importlib.import_module('distutils.core') - assert '_distutils' in core.__file__, core.__file__ - assert 'setuptools._distutils.log' not in sys.modules - - -def do_override(): - """ - Ensure that the local copy of distutils is preferred over stdlib. - - See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 - for more motivation. - """ - if enabled(): - warn_distutils_present() - ensure_local_distutils() - - -class _TrivialRe: - def __init__(self, *patterns): - self._patterns = patterns - - def match(self, string): - return all(pat in string for pat in self._patterns) - - -class DistutilsMetaFinder: - def find_spec(self, fullname, path, target=None): - # optimization: only consider top level modules and those - # found in the CPython test suite. - if path is not None and not fullname.startswith('test.'): - return - - method_name = 'spec_for_{fullname}'.format(**locals()) - method = getattr(self, method_name, lambda: None) - return method() - - def spec_for_distutils(self): - if self.is_cpython(): - return - - import importlib - import importlib.abc - import importlib.util - - try: - mod = importlib.import_module('setuptools._distutils') - except Exception: - # There are a couple of cases where setuptools._distutils - # may not be present: - # - An older Setuptools without a local distutils is - # taking precedence. Ref #2957. - # - Path manipulation during sitecustomize removes - # setuptools from the path but only after the hook - # has been loaded. Ref #2980. - # In either case, fall back to stdlib behavior. - return - - class DistutilsLoader(importlib.abc.Loader): - def create_module(self, spec): - mod.__name__ = 'distutils' - return mod - - def exec_module(self, module): - pass - - return importlib.util.spec_from_loader( - 'distutils', DistutilsLoader(), origin=mod.__file__ - ) - - @staticmethod - def is_cpython(): - """ - Suppress supplying distutils for CPython (build and tests). - Ref #2965 and #3007. - """ - return os.path.isfile('pybuilddir.txt') - - def spec_for_pip(self): - """ - Ensure stdlib distutils when running under pip. - See pypa/pip#8761 for rationale. - """ - if self.pip_imported_during_build(): - return - clear_distutils() - self.spec_for_distutils = lambda: None - - @classmethod - def pip_imported_during_build(cls): - """ - Detect if pip is being imported in a build script. Ref #2355. - """ - import traceback - - return any( - cls.frame_file_is_setup(frame) for frame, line in traceback.walk_stack(None) - ) - - @staticmethod - def frame_file_is_setup(frame): - """ - Return True if the indicated frame suggests a setup.py file. - """ - # some frames may not have __file__ (#2940) - return frame.f_globals.get('__file__', '').endswith('setup.py') - - def spec_for_sensitive_tests(self): - """ - Ensure stdlib distutils when running select tests under CPython. - - python/cpython#91169 - """ - clear_distutils() - self.spec_for_distutils = lambda: None - - sensitive_tests = ( - [ - 'test.test_distutils', - 'test.test_peg_generator', - 'test.test_importlib', - ] - if sys.version_info < (3, 10) - else [ - 'test.test_distutils', - ] - ) - - -for name in DistutilsMetaFinder.sensitive_tests: - setattr( - DistutilsMetaFinder, - f'spec_for_{name}', - DistutilsMetaFinder.spec_for_sensitive_tests, - ) - - -DISTUTILS_FINDER = DistutilsMetaFinder() - - -def add_shim(): - DISTUTILS_FINDER in sys.meta_path or insert_shim() - - -class shim: - def __enter__(self): - insert_shim() - - def __exit__(self, exc, value, tb): - remove_shim() - - -def insert_shim(): - sys.meta_path.insert(0, DISTUTILS_FINDER) - - -def remove_shim(): - try: - sys.meta_path.remove(DISTUTILS_FINDER) - except ValueError: - pass diff --git a/venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index ef1039cdf2dda8a82d1eb1ed15b75332e24c150c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11157 zcmbtaTWlLwdOkxAso_PUBucg%-zJjdSiX?H#g1dg&PBF!RZ`1I6L(XZ;*2EP6v>_$ zNfsmTDp{kE19js9No}-ApV^AunL$so#Hw zGrTEI+#U{po;lb5ob%rgf8E*|WJskC|Mo(8J!AhvFHZ7TGOPEHxz04ENf~y|{*}&2 znn!0BJWk_DcFwDLuds8nCIk93AE00J1GZ=_fQpBmW}0$^X@O7C>vOl~xqzq%q9)W( z6V!tjLe2~W?5*|Z!XBo#>On26hyRX!;z50zQ~#+KqvC5PiOu(*ZSYgPe(n^qa}li- zxU`EI+c0CKVa5)v9rc}B2Vhi_hFE{+x72&kQWA;$bbdOKNV%gSL-Wyh^?d;Bk!0f6 zNf#t1Hz{$C#)geJcLni@5kF>)%`^OSI@hXo>#|n+C)ZI(^>VrF>S=`SL1w4 zJv){*)bZrBn$eS*YUb35tfm`jo*YK=VSOw)na*)T&2d%d969vJsmaM)8jZ(v14A0d zgbu{)vI&FGawkTP>nSrcy<63@#st=4jwMaia2JH`K*}(anGDto^ayd2C$+Sh&SjGs z?8mgaLywKd)NIaFlUY?ql|Zi2tshfowKxzQPhQm3@0%otY(~_gh|Ujnz`w z8>=O42r9F}lR7tmO(LBg$yv%&l4r3NvF}-vM=)i8=KgblS+>&B`AOf$yNWH3;8{`H=KQx?+RDu9i+psT6zy9W zS&Hs1Mt7I}ED)LVugKBaSLpMV9DeWRcV8}he1Q{pye&TeT?SCD2dkKYr3g5Qh?u^s zHvxW_*)*_R#v@pVdNn1@+r&B$U3E<9vef{q7bKUZ83_U@a@n(X`x(!ZY`(q1ikvuC zFkYdz%2z~&Ht*DtZ!G0bieA(+itp-k0N2?lyHS6cW_vo{<(%*PJw|etG}2 zc}Dtc&%6rh;1L)Vf-V8X`Xws}j^L&-l{UxvJ(ef7*OIfzaowP4RF#vQ{VsSc1F4b9 zjpvUS`chzDUZs)Pu}m%niEtblr%^9D8OH%;S((XU9I*qw3b(I>BG-;Cg|-w!TNbwc zI{vHpt=)^gCrZ61P*C=}Y2g*U# z(OqVeZ;JqP^6hYB{>2+|F}xX1+3Qq@1*L$1n`Gn!Z4V-I{d=fzK^(c;r;^d2itE)F z(LB_MXpQ6c7ET1QA?nkaOl}H-Faz-j*`nq~YNY1yG{og(n&-0PV03jd$c(3Ed#ES(y& z1(l#6YC*$lTm|;K@HHL*m}P%dSZiedg%1YbA1rQs?AFv`_(UmuV)o=psQudMrO?Kr zys>%H$U+gD_7Hf61OgbIU1lbgRZ>0MO3bX$qV;u;F^RNnOq zWkY>zA2Z}B&n54hY)X>Yn;7*z<2Hz(%aSI~NEe70M4Dtq;c^U6Q+ta`zvDEZBB+-TXRYwmkx@C>_hn)+J@@LTFLhT~c-zmEFX4cCBb~ zhZ^5?dsO>2W7M@{AO)Ab?)3Ji9^2#hq?Q8`#Fs$ps% zk62I)Go=Fc_sUC}GTv=gjnElH`{yng*c(RP2o~O$6n9#)PD>B)35b4IUI^K{B&ov(I@5oV+rmO#!<#KNCRgAk{IL_TSn zI?uwS2m9%n5leAO>KF@LXxnmyXm!SzQ}`zs*C6Ey*4ps!oIKw)hmXCkS`8zkiJ(2& zv-hNW>YI~BB&<-GVO2M$(MqZpnq+tk)-9U`Cq7?Q0X~vmgrvMq7LGy|&Q;GOd!1c} z44n_q7VtP4@tpuTaoQ)#i?v&R!{lTd(^#rHYuhP-W21Ujzm(@NQ))I~JZYxJYU~uJ z(QD{yJPL5{8}Y82zL&%$;_Z=%j5z2j&BH3IPa4{=vzAxf$5}I!bG~ttm+l!%% z3(qZYJG`{*@b6m|w>?$b_7sX%!ku%czFN1xxNcX8;Bh>^d;Oo^`0X2ZelB#oqvuA~ zjkj;Ubn~Ufjw7XxBXDjb-E)&yFU?6Le&B3gS|69`AWc$St6#In^I^B?JU* zl96B<(yyoT>%A-mU>GjclCV2mqq+LNH`~$2Y7ND0jLT%45YOK*Z z@^+<;iitmhigJ|i9JAF^y#oI3#9HLx@{r~Ti7J7+?O)0zAv03WgtSh|3*K5+nOuX? zs_N~l9-;As)s2wNQ8a?)B0T}!4KA|0sSG>J_@wj_R0!1DyROLsXQ)H5tNa)$_>%qgjm%|MY_yP*@CfIx@8j$taNZTWLNJ(|w;hpZrCdMP^yXZt}FkBJQB zoo7YaTy&nY975~Pjmw?=OP&42olh@zK2z#^X71U!XYbvP^psg35Ul~7tTj4!YVK4y zigNPF*7*ZCgZqIS>5s=tTlU|fMt7?%+gbaD`JXOFVoQ$O6u^T9ZJLea!Uf^# z;IP!8i9Cf|4aAo7`OI`(gis}4=-F3ASXbRKJdw_56pmKOA~5=GuZYGtqmQV4`;Q!Y zOw{%r*t_>|wX)EbpB7yaEsvR(Oh~3pSOh-}VENMqIq?nV0e=H^g)M6lOO?d0ppCHs z0Paeel!we_GrUTa3g@k$6#w3tp+yjwE`-HrhV!kJgRwTkq%dlII0K$`x$F z6!g|?a>dWJoz|LA*wmPwRry4gLhj;jf~)y-zPfkh*a|NerG1YdKD1Aq2p3Li(g~T- z2@KXz%YCJ4<6b{Qd%b_Hy>=OxaH@&9+Lqgg=qGHwS$1>VtZj%PIJW_f6SknywS+c7 zE>l9Bzli1V^XT@OB;-eJv@TpbSwa0FbmlRNaRdP2-XP4Y%o6T$r&_jl7zu!zgjWzSXbg1dy;%uGXQzv3oucCCBF3Zf&N+(Z$K z1A7Wn3K~K<&OT9R$(eLkx4fy0VGt@HSX)za3Xc??TI;mGmyBvC(ebK3!6?QlfQnZQ znHnX*8V&we{E3?rx3sxum&1Ka;l72Fi{YK6@XoT=X;5ui%?Z)~DF<*>m(quEV+GZi zowkBg$;`zBE-z9SVVYzyAJ5UuL zeF*w{$iE@X47*e=47vn<23MmztDfZ(xLO?%*P-zA(kWP?nkq;IYG@Q!hNb~Z7nFoM zLX}9XhQ7B0J&P3-r=E^#Br%%F4dYUXZ=qU6&uaDslf*M9s1Y@s-1owxYaP)Vg#1hD zOztJl23n?j{%6aP-la(I!V@?7Vq||QvVS>pbSZN5_b)6)PM0F5i^}Qd?Ir>d+f8wh z`ry{5DES;;J5h*Ks1o-OG&1eIg}l3kKT4I@H!rrHuIQDD8m~l5NoUxWV!UE8_8r-` z@6ZugNx4pd?&Ai*Z9VjIp1>$T z&2d^i-#2Vw_k$qu84arf2y-IPbAQDFjQnW(EjgF{-tVF!Mna%^w@_GLEzIkq2@+P& z+&NyTY3*9%ynvBJ;ITi_=xV%3Rp$Y$FochpPT9c;VI^@=R#qsLNg76_m_(2ua(;<& zxpxbkOq0jk6x&q*}Ob5hMPC~9k=AzZM9g(IcV#v7wc zp+}0LN6H~NfFbKa8*A-_fNTqvBh1%D{|XRPC01$$T| zqijuljqnHER^;a<}Ct%?#tX7y79ZUuA)+$(0!gKPROqb5B2v->NPpx;i?O->9hrGX& z4te{#Z0yL}wz|k|FwyRq1sHfn5aX=0!+JPC+s8mlvxAMi)iX zZQU|Ulv32>08Oy5syKG^Wiq-UbBflJpe|&Wg_p3(SfS0_LIa8{SgS z-ePd?Y)jeSF5&+?F4!KH@TV6SZ1G8m3%Q`ZO?sltT+kbkaGC0Y9-o9;re<)5%I;Px z+BJ#hTpQjI<#%gq2feISErp?)eAEvBH}!I8_VkLfaYcFP+CWix2oK&$%E3D=GW`(^ z0IJFXZLI6jVs!grbVn(=qsZFJen~ov!*+n;lfdH5fG}T2m{)4sB`HSTDnOAXkW4cW G4E4XUZ2_JD diff --git a/venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc b/venv/lib/python3.11/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc deleted file mode 100755 index 7d465956ca0d3cd87ab9180de7d4710faea882cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314 zcmZ3^%ge<81Xrfa%F+SSk3k$5V1_b2I{+Ee8JHMS8B!RQF)}c$24V8bIO$Gb1D84F;|T it_$2U7a3%)FvwnK(7eQ;d67Z;3WN3q7%E}|Dh2=}zff-g diff --git a/venv/lib/python3.11/site-packages/_distutils_hack/override.py b/venv/lib/python3.11/site-packages/_distutils_hack/override.py deleted file mode 100755 index 2cc433a..0000000 --- a/venv/lib/python3.11/site-packages/_distutils_hack/override.py +++ /dev/null @@ -1 +0,0 @@ -__import__('_distutils_hack').do_override() diff --git a/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/INSTALLER deleted file mode 100755 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/METADATA b/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/METADATA deleted file mode 100755 index eadade9..0000000 --- a/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/METADATA +++ /dev/null @@ -1,108 +0,0 @@ -Metadata-Version: 2.4 -Name: anyio -Version: 4.15.0 -Summary: High-level concurrency and networking framework on top of asyncio or Trio -Author-email: Alex Grönholm -License-Expression: MIT -Project-URL: Documentation, https://anyio.readthedocs.io/en/latest/ -Project-URL: Changelog, https://anyio.readthedocs.io/en/stable/versionhistory.html -Project-URL: Source code, https://github.com/agronholm/anyio -Project-URL: Issue tracker, https://github.com/agronholm/anyio/issues -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Framework :: AnyIO -Classifier: Typing :: Typed -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Classifier: Programming Language :: Python :: 3.15 -Classifier: Programming Language :: Python :: Free Threading :: 2 - Beta -Requires-Python: >=3.10 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: exceptiongroup>=1.0.2; python_version < "3.11" -Requires-Dist: idna>=2.8 -Requires-Dist: typing_extensions>=4.16.0; python_version < "3.15" -Provides-Extra: trio -Requires-Dist: trio>=0.32.0; extra == "trio" -Dynamic: license-file - -.. image:: https://github.com/agronholm/anyio/actions/workflows/test.yml/badge.svg - :target: https://github.com/agronholm/anyio/actions/workflows/test.yml - :alt: Build Status -.. image:: https://coveralls.io/repos/github/agronholm/anyio/badge.svg?branch=master - :target: https://coveralls.io/github/agronholm/anyio?branch=master - :alt: Code Coverage -.. image:: https://readthedocs.org/projects/anyio/badge/?version=latest - :target: https://anyio.readthedocs.io/en/latest/?badge=latest - :alt: Documentation -.. image:: https://badges.gitter.im/gitterHQ/gitter.svg - :target: https://gitter.im/python-trio/AnyIO - :alt: Gitter chat -.. image:: https://tidelift.com/badges/package/pypi/anyio - :target: https://tidelift.com/subscription/pkg/pypi-anyio - :alt: Tidelift - -AnyIO is an asynchronous networking and concurrency library that works on top of either asyncio_ or -Trio_. It implements Trio-like `structured concurrency`_ (SC) on top of asyncio and works in harmony -with the native SC of Trio itself. - -Applications and libraries written against AnyIO's API will run unmodified on either asyncio_ or -Trio_. AnyIO can also be adopted into a library or application incrementally – bit by bit, no full -refactoring necessary. It will blend in with the native libraries of your chosen backend. - -To find out why you might want to use AnyIO's APIs instead of asyncio's, you can read about it -`here `_. - -Documentation -------------- - -View full documentation at: https://anyio.readthedocs.io/ - -Features --------- - -AnyIO offers the following functionality: - -* Task groups (nurseries_ in trio terminology) -* High-level networking (TCP, UDP and UNIX sockets) - - * `Happy eyeballs`_ algorithm for TCP connections (more robust than that of asyncio on Python - 3.8) - * async/await style UDP sockets (unlike asyncio where you still have to use Transports and - Protocols) - -* A versatile API for byte streams and object streams -* Inter-task synchronization and communication (locks, conditions, events, semaphores, object - streams and futures) -* Worker threads -* Subprocesses -* Subinterpreter support for code parallelization (on Python 3.13 and later) -* Asynchronous file I/O (using worker threads) -* Signal handling -* Asynchronous versions of the functools_ and itertools_ modules - -AnyIO also comes with its own pytest_ plugin which also supports asynchronous fixtures. -It even works with the popular Hypothesis_ library. - -.. _asyncio: https://docs.python.org/3/library/asyncio.html -.. _Trio: https://github.com/python-trio/trio -.. _structured concurrency: https://en.wikipedia.org/wiki/Structured_concurrency -.. _nurseries: https://trio.readthedocs.io/en/stable/reference-core.html#nurseries-and-spawning -.. _Happy eyeballs: https://en.wikipedia.org/wiki/Happy_Eyeballs -.. _pytest: https://docs.pytest.org/en/latest/ -.. _functools: https://docs.python.org/3/library/functools.html -.. _itertools: https://docs.python.org/3/library/itertools.html -.. _Hypothesis: https://hypothesis.works/ - -Security contact information ----------------------------- - -To report a security vulnerability, please use the `Tidelift security contact`_. -Tidelift will coordinate the fix and disclosure. - -.. _Tidelift security contact: https://tidelift.com/security diff --git a/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/RECORD b/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/RECORD deleted file mode 100755 index 83e25c3..0000000 --- a/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/RECORD +++ /dev/null @@ -1,100 +0,0 @@ -anyio-4.15.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -anyio-4.15.0.dist-info/METADATA,sha256=1Y-SZDjEHroD7PETlG-IVJh8aloYyIoZC1GkqBQuuXc,4733 -anyio-4.15.0.dist-info/RECORD,, -anyio-4.15.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91 -anyio-4.15.0.dist-info/entry_points.txt,sha256=_d6Yu6uiaZmNe0CydowirE9Cmg7zUL2g08tQpoS3Qvc,39 -anyio-4.15.0.dist-info/licenses/LICENSE,sha256=U2GsncWPLvX9LpsJxoKXwX8ElQkJu8gCO9uC6s8iwrA,1081 -anyio-4.15.0.dist-info/top_level.txt,sha256=QglSMiWX8_5dpoVAEIHdEYzvqFMdSYWmCj6tYw2ITkQ,6 -anyio/__init__.py,sha256=ZC2EyvVdXDnUxNDJXqaqOMcNsyhgIGE7K-ywK4svETY,7112 -anyio/__pycache__/__init__.cpython-311.pyc,, -anyio/__pycache__/_lazyimport.cpython-311.pyc,, -anyio/__pycache__/from_thread.cpython-311.pyc,, -anyio/__pycache__/functools.cpython-311.pyc,, -anyio/__pycache__/itertools.cpython-311.pyc,, -anyio/__pycache__/lowlevel.cpython-311.pyc,, -anyio/__pycache__/pytest_plugin.cpython-311.pyc,, -anyio/__pycache__/to_interpreter.cpython-311.pyc,, -anyio/__pycache__/to_process.cpython-311.pyc,, -anyio/__pycache__/to_thread.cpython-311.pyc,, -anyio/_backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -anyio/_backends/__pycache__/__init__.cpython-311.pyc,, -anyio/_backends/__pycache__/_asyncio.cpython-311.pyc,, -anyio/_backends/__pycache__/_trio.cpython-311.pyc,, -anyio/_backends/_asyncio.py,sha256=Vqy7O1ymmEpxTiPzehSuBCVTziGALNV-BbsIRaKXsg4,107767 -anyio/_backends/_trio.py,sha256=Gs8XzX0IeBvje8IEZtJmpNylKCUAChKv7I_YZi3wlmg,45715 -anyio/_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -anyio/_core/__pycache__/__init__.cpython-311.pyc,, -anyio/_core/__pycache__/_asyncio_selector_thread.cpython-311.pyc,, -anyio/_core/__pycache__/_concurrency_utils.cpython-311.pyc,, -anyio/_core/__pycache__/_contextmanagers.cpython-311.pyc,, -anyio/_core/__pycache__/_eventloop.cpython-311.pyc,, -anyio/_core/__pycache__/_exceptions.cpython-311.pyc,, -anyio/_core/__pycache__/_fileio.cpython-311.pyc,, -anyio/_core/__pycache__/_futures.cpython-311.pyc,, -anyio/_core/__pycache__/_resources.cpython-311.pyc,, -anyio/_core/__pycache__/_signals.cpython-311.pyc,, -anyio/_core/__pycache__/_sockets.cpython-311.pyc,, -anyio/_core/__pycache__/_streams.cpython-311.pyc,, -anyio/_core/__pycache__/_subprocesses.cpython-311.pyc,, -anyio/_core/__pycache__/_synchronization.cpython-311.pyc,, -anyio/_core/__pycache__/_tasks.cpython-311.pyc,, -anyio/_core/__pycache__/_tempfile.cpython-311.pyc,, -anyio/_core/__pycache__/_testing.cpython-311.pyc,, -anyio/_core/__pycache__/_typedattr.cpython-311.pyc,, -anyio/_core/_asyncio_selector_thread.py,sha256=2PdxFM3cs02Kp6BSppbvmRT7q7asreTW5FgBxEsflBo,5626 -anyio/_core/_concurrency_utils.py,sha256=kvRXMrnDqgQTBkZc-f279-lBnZM4YbSToXqhnAUCfSc,4522 -anyio/_core/_contextmanagers.py,sha256=YInBCabiEeS-UaP_Jdxa1CaFC71ETPW8HZTHIM8Rsc8,7215 -anyio/_core/_eventloop.py,sha256=ByZUeJD9alMfcyTseRo5IzTO0IltEul_Gyq9iqSjqDk,6658 -anyio/_core/_exceptions.py,sha256=B4ZhLkBQT4tI6vShv4-GJui492IJsoIDTw1FQJEkmAI,5618 -anyio/_core/_fileio.py,sha256=q--ft9h5Y_FRLzhAnoYrXf3tOuZ8ZyIN2A9mCfMbZRc,34163 -anyio/_core/_futures.py,sha256=YQq5uhnCnKQMQD62tOLfzEm7dUXY3GQorJdH6ghfgIQ,6177 -anyio/_core/_resources.py,sha256=Ld5duCe9NwgPfI7EIOh3CMIBYQ7rq6ZQEa7CFS0u9Ec,450 -anyio/_core/_signals.py,sha256=mjTBB2hTKNPRlU0IhnijeQedpWOGERDiMjSlJQsFrug,1016 -anyio/_core/_sockets.py,sha256=C8b-3w5H9n0Fo4g7X8WJvk0m6CGh6NVAAFtieBGHK3g,35289 -anyio/_core/_streams.py,sha256=FczFwIgDpnkK0bODWJXMpsUJYdvAD04kaUaGzJU8DK0,1806 -anyio/_core/_subprocesses.py,sha256=TMBuGNILz-47w5t9vayJ1GpCpDT6LxsMohJDFCewIRc,7938 -anyio/_core/_synchronization.py,sha256=ggsd74QPd846faA2HQeT07ONQ5HQ1S78gy8mvB3qCrw,21658 -anyio/_core/_tasks.py,sha256=J2dhM_Jq3Grsfg_enNWpRz2SxfM15uLt-pEfvoQq3uA,15391 -anyio/_core/_tempfile.py,sha256=IgoBCFaPhrFvsF9KHcCcrnCRn-UqMfw0WRdSDWgxAiI,19726 -anyio/_core/_testing.py,sha256=ZRucLh5kqhiFWAJMMbd8yZ6uIvz0rq3WwL72ldosxAU,2340 -anyio/_core/_typedattr.py,sha256=gt9Dzn-IL0QW14aHPDD8PAtq95FYKNNupHyf37xZGPQ,2607 -anyio/_lazyimport.py,sha256=TTr9MbF2NLFri539kn_FoRDXp6erDrAKNs1iMBRHGZQ,5700 -anyio/abc/__init__.py,sha256=XIVvCI2c6oyaOcqXe94k2rzU5_s7-ZNnlxGTk34H4T0,3050 -anyio/abc/__pycache__/__init__.cpython-311.pyc,, -anyio/abc/__pycache__/_eventloop.cpython-311.pyc,, -anyio/abc/__pycache__/_resources.cpython-311.pyc,, -anyio/abc/__pycache__/_sockets.cpython-311.pyc,, -anyio/abc/__pycache__/_streams.cpython-311.pyc,, -anyio/abc/__pycache__/_subprocesses.cpython-311.pyc,, -anyio/abc/__pycache__/_tasks.cpython-311.pyc,, -anyio/abc/__pycache__/_testing.cpython-311.pyc,, -anyio/abc/_eventloop.py,sha256=0-UwgB351rkocCt8m3fjTmcNx2Fxn52nUoujG5DzMvU,11127 -anyio/abc/_resources.py,sha256=hrb0LXUgHSp3i8G6W8JJchdzKXgg1m0T-L7udXmv2y0,900 -anyio/abc/_sockets.py,sha256=jQWnPX7iDIDyvyvVkbuFhjezw4oI2WggzbW6Vl2-eqs,13162 -anyio/abc/_streams.py,sha256=IMeOPPutFXRbyeAutxV1HJe7FUQZYp2qKrJJpP1DCv0,7620 -anyio/abc/_subprocesses.py,sha256=CDqU1p0HuBS0pXUzBW_hbfhihTJRM67n__7qZmoPU84,2123 -anyio/abc/_tasks.py,sha256=HBPpT72aOy0bwMAxBCKmnXsR328wCYRjYm3iaVw2fQo,7070 -anyio/abc/_testing.py,sha256=A9Y8RAClIPn1A0aNHBN8YoaRy_MKOpbFGEbTHAXgB6U,2145 -anyio/from_thread.py,sha256=iZZbfcNySi4wAcx1_cxAQE4J0YZC88qRMIYqQ6SF9sc,19415 -anyio/functools.py,sha256=T4JS8IXq-x1S0Lbo2owF8l9fza2KypO147QLeyz4cjs,11797 -anyio/itertools.py,sha256=TS7_UCa2Y3cggtaLlWHbjOyf6QhPfQUdPduNW-ddXTE,16255 -anyio/lowlevel.py,sha256=QyWkvfetbCH0mHkqv1yxGwOaiZ7fyxhpZkHWOXPV5JU,6280 -anyio/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -anyio/pytest_plugin.py,sha256=oLXyOstvRZW3VVbqIODhZsPt4jSz2UGh44YeG2nJXx0,14516 -anyio/streams/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -anyio/streams/__pycache__/__init__.cpython-311.pyc,, -anyio/streams/__pycache__/buffered.cpython-311.pyc,, -anyio/streams/__pycache__/file.cpython-311.pyc,, -anyio/streams/__pycache__/memory.cpython-311.pyc,, -anyio/streams/__pycache__/stapled.cpython-311.pyc,, -anyio/streams/__pycache__/text.cpython-311.pyc,, -anyio/streams/__pycache__/tls.cpython-311.pyc,, -anyio/streams/buffered.py,sha256=u7hCD8SNrYHcutG6K5wEiy1F88-pizgjvEFM22Kq2Cw,6746 -anyio/streams/file.py,sha256=6jujI2m-QJITqqKFamrupX_DNsU7y2Fz3omLZxOLuY0,4524 -anyio/streams/memory.py,sha256=rpxNzDMag9PCOynBqN64KyuAfAPB41vFyRP-Npo-lE0,10793 -anyio/streams/stapled.py,sha256=UJ2Rgt0NUmM1VovRNOoZoic960lcbDjb3vhfZg3b_Z0,4845 -anyio/streams/text.py,sha256=BcVAGJw1VRvtIqnv-o0Rb0pwH7p8vwlvl21xHq522ag,5765 -anyio/streams/tls.py,sha256=fqLmxvULFO9rvxGyJ33VPrOIN7E3eiU1q90BkmKigQ8,15818 -anyio/to_interpreter.py,sha256=ATnoT6kei9wDmQZtXTA3SsY4CK7XKr8Ta4_x5i6pbTw,7100 -anyio/to_process.py,sha256=p6n8j0nreJUl1DEkR_9PL6KRoKtNqFxORTn8qZBvn94,9850 -anyio/to_thread.py,sha256=8MPVrrQq8ttGvV21cSd68rMto5bhxJ0-i9CupXag5Gs,2750 diff --git a/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/WHEEL b/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/WHEEL deleted file mode 100755 index 13013d7..0000000 --- a/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (84.0.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/entry_points.txt b/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/entry_points.txt deleted file mode 100755 index 44dd9bd..0000000 --- a/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[pytest11] -anyio = anyio.pytest_plugin diff --git a/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/licenses/LICENSE b/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/licenses/LICENSE deleted file mode 100755 index 104eebf..0000000 --- a/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/licenses/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Alex Grönholm - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/top_level.txt deleted file mode 100755 index c77c069..0000000 --- a/venv/lib/python3.11/site-packages/anyio-4.15.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -anyio diff --git a/venv/lib/python3.11/site-packages/anyio/__init__.py b/venv/lib/python3.11/site-packages/anyio/__init__.py deleted file mode 100755 index 84fa2e5..0000000 --- a/venv/lib/python3.11/site-packages/anyio/__init__.py +++ /dev/null @@ -1,128 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING - -from ._lazyimport import ( - fix_package_names, - install_lazy_importer, - set_deprecated_aliases, -) - -if TYPE_CHECKING or not install_lazy_importer(): - from ._core._concurrency_utils import amap as amap - from ._core._concurrency_utils import as_completed as as_completed - from ._core._concurrency_utils import gather as gather - from ._core._contextmanagers import ( - AsyncContextManagerMixin as AsyncContextManagerMixin, - ) - from ._core._contextmanagers import ContextManagerMixin as ContextManagerMixin - from ._core._eventloop import current_time as current_time - from ._core._eventloop import get_all_backends as get_all_backends - from ._core._eventloop import get_available_backends as get_available_backends - from ._core._eventloop import get_cancelled_exc_class as get_cancelled_exc_class - from ._core._eventloop import run as run - from ._core._eventloop import sleep as sleep - from ._core._eventloop import sleep_forever as sleep_forever - from ._core._eventloop import sleep_until as sleep_until - from ._core._exceptions import BrokenResourceError as BrokenResourceError - from ._core._exceptions import BrokenWorkerInterpreter as BrokenWorkerInterpreter - from ._core._exceptions import BrokenWorkerProcess as BrokenWorkerProcess - from ._core._exceptions import BusyResourceError as BusyResourceError - from ._core._exceptions import ClosedResourceError as ClosedResourceError - from ._core._exceptions import ConnectionFailed as ConnectionFailed - from ._core._exceptions import DelimiterNotFound as DelimiterNotFound - from ._core._exceptions import EndOfStream as EndOfStream - from ._core._exceptions import FutureAlreadyFinished as FutureAlreadyFinished - from ._core._exceptions import FutureCancelled as FutureCancelled - from ._core._exceptions import FutureFailed as FutureFailed - from ._core._exceptions import FutureNotFinished as FutureNotFinished - from ._core._exceptions import IncompleteRead as IncompleteRead - from ._core._exceptions import NoEventLoopError as NoEventLoopError - from ._core._exceptions import RunFinishedError as RunFinishedError - from ._core._exceptions import TaskCancelled as TaskCancelled - from ._core._exceptions import TaskFailed as TaskFailed - from ._core._exceptions import TaskNotFinished as TaskNotFinished - from ._core._exceptions import ( - TypedAttributeLookupError as TypedAttributeLookupError, - ) - from ._core._exceptions import WouldBlock as WouldBlock - from ._core._fileio import AsyncFile as AsyncFile - from ._core._fileio import Path as Path - from ._core._fileio import open_file as open_file - from ._core._fileio import wrap_file as wrap_file - from ._core._futures import Future as Future - from ._core._resources import aclose_forcefully as aclose_forcefully - from ._core._signals import open_signal_receiver as open_signal_receiver - from ._core._sockets import TCPConnectable as TCPConnectable - from ._core._sockets import UNIXConnectable as UNIXConnectable - from ._core._sockets import as_connectable as as_connectable - from ._core._sockets import connect_tcp as connect_tcp - from ._core._sockets import connect_unix as connect_unix - from ._core._sockets import ( - create_connected_udp_socket as create_connected_udp_socket, - ) - from ._core._sockets import ( - create_connected_unix_datagram_socket as create_connected_unix_datagram_socket, - ) - from ._core._sockets import create_tcp_listener as create_tcp_listener - from ._core._sockets import create_udp_socket as create_udp_socket - from ._core._sockets import ( - create_unix_datagram_socket as create_unix_datagram_socket, - ) - from ._core._sockets import create_unix_listener as create_unix_listener - from ._core._sockets import getaddrinfo as getaddrinfo - from ._core._sockets import getnameinfo as getnameinfo - from ._core._sockets import notify_closing as notify_closing - from ._core._sockets import wait_readable as wait_readable - from ._core._sockets import wait_socket_readable as wait_socket_readable - from ._core._sockets import wait_socket_writable as wait_socket_writable - from ._core._sockets import wait_writable as wait_writable - from ._core._streams import ( - create_memory_object_stream as create_memory_object_stream, - ) - from ._core._subprocesses import open_process as open_process - from ._core._subprocesses import run_process as run_process - from ._core._synchronization import CapacityLimiter as CapacityLimiter - from ._core._synchronization import ( - CapacityLimiterStatistics as CapacityLimiterStatistics, - ) - from ._core._synchronization import Condition as Condition - from ._core._synchronization import ConditionStatistics as ConditionStatistics - from ._core._synchronization import Event as Event - from ._core._synchronization import EventStatistics as EventStatistics - from ._core._synchronization import Lock as Lock - from ._core._synchronization import LockStatistics as LockStatistics - from ._core._synchronization import ResourceGuard as ResourceGuard - from ._core._synchronization import Semaphore as Semaphore - from ._core._synchronization import SemaphoreStatistics as SemaphoreStatistics - from ._core._tasks import TASK_STATUS_IGNORED as TASK_STATUS_IGNORED - from ._core._tasks import CancelScope as CancelScope - from ._core._tasks import TaskHandle as TaskHandle - from ._core._tasks import create_task_group as create_task_group - from ._core._tasks import current_effective_deadline as current_effective_deadline - from ._core._tasks import fail_after as fail_after - from ._core._tasks import fail_at as fail_at - from ._core._tasks import move_on_after as move_on_after - from ._core._tasks import move_on_at as move_on_at - from ._core._tempfile import NamedTemporaryFile as NamedTemporaryFile - from ._core._tempfile import SpooledTemporaryFile as SpooledTemporaryFile - from ._core._tempfile import TemporaryDirectory as TemporaryDirectory - from ._core._tempfile import TemporaryFile as TemporaryFile - from ._core._tempfile import gettempdir as gettempdir - from ._core._tempfile import gettempdirb as gettempdirb - from ._core._tempfile import mkdtemp as mkdtemp - from ._core._tempfile import mkstemp as mkstemp - from ._core._testing import TaskInfo as TaskInfo - from ._core._testing import get_current_task as get_current_task - from ._core._testing import get_running_tasks as get_running_tasks - from ._core._testing import wait_all_tasks_blocked as wait_all_tasks_blocked - from ._core._typedattr import TypedAttributeProvider as TypedAttributeProvider - from ._core._typedattr import TypedAttributeSet as TypedAttributeSet - from ._core._typedattr import typed_attribute as typed_attribute - - fix_package_names() - set_deprecated_aliases( - { - "BrokenWorkerIntepreter": "anyio.BrokenWorkerInterpreter", - } - ) diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 46682def83ee1966f7bad7c640f64ca00ee94c94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6260 zcmb7{NlzR}7RRd~0YkBx)p*~H7s@u?cXqG=W2*4-+;%$2jDj?|R7YlE@L@C`VGbjW zG#{Wxqxm9p%$E9);$+R7`bMkg)Q8c$_p%BTRJE+Jp8x*Ei!~!&yeR*zt*s@6f8sy? z_2WMer&9l>LgkN^K>FAJBK;+0rL44*a?_Ab6W2L)Zavf^*ISySxed_ZHbSG@1WoCb zs1GuADbe@?4)Kr5c&R_t1#hr*gLA-bhGy>Bh};4#%uUD{$S@ypTHQ8iV{S%nhj!)` zr^D@pPUZ}97j!YVA|Hf<%x%cs(9PVA+ygz#9mu`V%iM|F2Yt+4$oZ*8Tx33jd+ig_0KHN0kiiu?xNFh4^E0OmR5xA2yE-ucdb2k)2{kl(|5=I6*d=*)}A zAK(M?3uFTf<|X76SYgf~n_x2Mku9*8myrbs=9f;vU4>QVSIBFy#{3%D2AlZ}@<;f{ z49M%S&ioeH0f+fJWEWiKcgP-i%Ftc+d46bww(kX4 zY|Fn{oYco>CdZ%6E=>PSU5Dzoy9)NEUNp>gV^!#$;fi3p*Y<+Ya2(w+K5yx^Tl8fp zmLfsNYDNG|2mTow<5eOPtGhCyH|F#-|ZsI050_(BdxN3xJLLv=}23wvv?t7uw z4Cf6GCzJE`rtM)}cWrm8S&~wCp&r_2M*7Q@2 zX?Uh^99*l|G6?Nl?iwovTlFlQP z^LRVECWK?VHqNo&hf{vZqdm?{de-woE|kJ>vDiCR3QJOqI#{;0rfkm+*0^&=QZZiH z5^UR=xW0~`lxgs<{n}@}%8@SNkl3wr!Jpi~gPHUFVr4Trmr7oxQ^nVoH-h!O^R`ffwu!)Bg3cM=Z3B$8w74-l=OoUi{wz?Yo z>6Q^1tI}}4Hta4p#94I54npB^^mUcp%Al1wX$duk>Z$ah>OEs+@ERGGC2gbkM$i4N}V>Bgl9YbtJJhrZuoS`kaUfja{{yG8fG1uYPXduemp6R*# zXnr}T&rUBqUz(i2)|up1sodlRDEy(W5LP`dLayn*@hR;lPmf@W~}}G zgS(Ci8}C?%$4OJ{dduBgFvdb0(y}R)QpA-@D_CrD*DWe0h#}8-fKth95~BP}RKAw> z0GoE3w6)#0 z|7A!XhR;V0Z_D>@hAF2cA8&5yC49dE*-UNde@-$(4g0<}q_@~j-r_*EQj0cf(OGVRub~$@ znB-+U)pd|`l5~+AB?au@IYcr@g8zd{$s;63Nsf^m zCpkfKlH?T0X_7M}XGzYHoF}OLC9oKFI@;ha`_k9+NyF z86_D**o4qkqBy2IWWF(bl+rw>Q+hCQ2w6!6*cwSY>1Ut%tNuvVC>FCA&l_3CUda}>!ZqI;8NPNc8{p5WE9IZRL6$FQR@d?8PpIp| z#jW2CJaB!h`w#PU)U3Cw<6VIZ7NbN*6u~B?bOvZH14E+Pa0DVxpbs0?X_5Y6scBg zBBcvvX^PcqGaYG)#cCHE zA=Vy7s>RxiNVQm-j8u!Y$B}BaMjnqe#bR|axVBoJ(MVG)*6v5DRj=pUVSu}?3=?ZN zBh_N z>dW!1DN+sdIEeDe)fcyxr~0l`-&AE-oTb*@?(g;O1&`r^_XS;bfGgXATlDQ=aSUZG zv6_iEtyE{d{qw}yjYzdvjV}zh>Qkzf=BksL5~n=Qok&xxR$iWnG{s`=Wu#iIUey<+ zIu%y$hLYnrVO6Kg>NeGyNd;NE`gpdL}wIxl>=)-11Ak*3kH$6bin}ikS8E>Lzcm`~$xA F{{yK!tVI9- diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/_lazyimport.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/_lazyimport.cpython-311.pyc deleted file mode 100755 index 41204cf8bd06eb4476f7454b2b3c630db5990c7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8651 zcmbVRYi!$AmcA58JuJzxY}s;crIsVdv7N+DoYZ+VX_MM<^K_?8&~4miG>RxEa%9OM z=`{ApJ8rkLkpnN_0n&|TnxaCt(|S-3U@Tf}ezd?0u)r?%7a4F+f(ro#76rEd)a?|= zJ zgM7Q-d50VK3lYH!_j+NQ&;a*<@U+kb_XeRu2*W)nM1?lEHwx?p(%bnBPOO(Pyoqc! zCnw}|E-Ur2MsOm1Gd`V2UQb+2#j}a2lw>rgvyz<1Wa62`+-y8OHJuaXlxVa_DLF2r zro~h;A*Y0RB9l%?DQOJ)^qZC9Q#oNKlY)Y}^E7vHb{e196WLkADW>EZF>7#Fa=A>> zeMn`eYj!9BqUe#krW4ro(<6uQnckPBdL zkuM={wj`lJARohQKDE}({BYgi*1AF?2t@PPH^@N49jDtKk3VAi4gbYUKROv7K6P^V z?CG%=MII`Q8XSs+!Ai0yqTGwfqol=rcyPhL2{-T`q4Zt;E?IPzplEA)oTWFJc}CnN zTblt(_T+&9A4AEfRw)A|C2Og*y$X!rurmTTY2GoqAO1}H`jX86(e#DTf2xD zW^5ZTu#2Ae90Hdo?>XLoY=Z^zw&P85lf6XVWNHNgw$Edq$vh|fH|Lt?^6X>pdE0vs z7{O^@cM18rB`wz3MNahQf!{Y6(FMHYv_QoNH-1 zla>wl+0^VwQOt=({fUjv=(C8+FkH|J4r0^+wurLyW?H@`0(g>MuNcG%?riE!Dv3rN zRDjwz3&UH@)28k!76}G_BaxX&8I4=v$Z%8Cno3L?_2w$$S2MXQiHu};tIt%N{nZD6 zGeAHI&vcZg1x%054P47jr3R)FVlp>yCU-Tre;_eEJ#ZtHy)lqUUm2L5m9OQp`}_Cp z8<5g+YEKnGrGZ3tHk})w&}q)Le|pyN#^crH$K!K-PlVV0qnTV1X8BxyP2EnImE?g# z^>Bgc;oh&pdme=MtO#m&zZTxFc=s0$RfxwEDf_xgudj98cdNb=n(u_-JE3>?f0Fw! zx0bxWPwhUYbstlGvBH_6x9F{Kyg#D%4Xzzn?N=LiF4q;$7SBE`H?>y?>yK=ba!Z#U zda-z23B3r{ec8N!%R0i1e?qd-V;Ic`(WpZLH3a+la}Py0h}%;;gyvT zpC~5bfq0hzOd@a!n6clW4&i@QVX9f3v?c8xoO6Z;PG zL>xfUhlE3dFmv%Y92Ib}5lbup?RA*>T~ONV0(6~~3=c}lgotSCnXtsRdRQeR5Wg~$ z&IqPjMgez9sF?+Woz6|eL3NrUZH`Z8(uG6rK+=t5Cz2i{{XitdaS-|AG*LECz^4Q! zE48EK(X>Fy&8>GXm-ea6J2boo7RL0(XsJzW+`VvC4|SAcYG}v8`Le%Z>Gfi}=HIa} zT8<5_4XLpsTI`6*MHfyf_0h7garuzyi@?4voUAyBC%pVK#l2H^wMyojnU<%ZF8No8AQrSw5z6ojTX}71#2BgPHWL zjHui`joYVi`)Y~@)7(5g#+SVV3NU&<+3T8=;5w|@?ySw4fyxh+c5KB zdDPl4ru{O{eg}<#ymFQ-YGM3G5}?8rQ;k=2dc+VaQTM zU|?j2!NkGp6`zK-@Zjj*YjD%3)6hnVM(Ig<t6=`dEj?3b#PQ01gL~pdZ?A&H|sr?qrwTgbr8A~Vf{or zfCRZgS!Ot?3YEldSb|G2cvF#cleu)(RL#7J8x%5PSOu|&s!yISSVFM_2&pdG>>Y;~ zfxq-`K%NL3q3xw3TBv`mNevxXI1i`)58)myyiait>cNh$g53{--DA2CeBl3; zzm!y4`?S`+WnPbUe{$$UP?#2Dcl1#fev2ib({?vPt_yQrjmx~&5PewjYz$AiY2qh^ zacZ$RP1__1XWdFD;q>gk0+}B^`(Rqa8P797*}MZN_r6O;##NKRuRdlBq6*>-O(8-6`k`$QIn+-LjN~7L3GN%@=9LMq;8}#;P|<#2ApJY zm@^tjs;(UvcYkBrcD<~*WL&K{3Pi%5tldW2T14_PzB&yAcAN9P13Nla_^IL^gR6Ma zyx)J-yaO$}+w`VT#l`W?ZwZh;B7r@tB__1GsxIcEdLf;pI(~PQDtb7dR>CP!j;}!G z7Wj`p%ys*@-t-y~3u+PfHk)T^U4&Y!6+8t}U?&`c%kV>SJ5^pB7)aCRSO!{@TO)eieMfS*+3P;d2z_xm6NrS(LBgZa1=BL5 z*3{gtC&xZEalFQ8|1oy+0T3_^D-Pb%sy9c97w=pyj21>8mIGn1u|2Juq}&+Q8-|O! zl!jrr?jJDkU}!hh0~9sYuQ!Fk(Dnn|Lo?IR_H>roSA?}u)%~pIepYcmtH*jjIribP zwWhU%8at%L4yo>Fp}y!Y2cItfts3mtg8c<&Inc6vqj*yd^k{(|#oa^A*S~Z7$WrGX z)-)RT!K{I8gK(?S87RM|ntcXx7%;%&7?1aICf~a8JvDkM2NA}80%oOYQPRdpF2P^Q z0C@;}`Los}>VrL6ct~*{tZ-hww?h6bX(NY*nV%28b9ULQaS@H%QJPY@0}8!N+@@QM zR?4G&^2~H5_4+29n9l$zCbC@K9o>9~P;+_9L8Mr-3X8;J_~iK1<6#aso*_7%HTVw4 z)5VZ9{3aYp$0a~^E2w}1SWS7b`8KgvXrTO>D`w_be%dIQbK<(-pg2hubL00z$%2as}!k4zSAfnM^u4S2ds|#0SlV)?3}A zwHvnHTA$pTXyj{JOd`V4B)F=4`VV-IkZYE@tqNq`Ya7>V8x1j=Ci~n?`IGUeR#V

u=!&-u7P!Og#7K$c#jwF&St)vp!WZDWjF2+jMT* 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 XWjfRKH#UB7H~oZ_e$k~4TfzSTnATf6 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_resources.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_resources.cpython-311.pyc deleted file mode 100755 index 218e337a0ab1e9b9d358397c5ce3c323254c96f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1112 zcmZ`&&ui2`6rRbC?YeDNE4H`Npm@l^hFZK75lTHN6tp08FJYQYcVm-Gm`S>>RuC#; zOQ8rt#Z&Q6k$UtWsDD8P4@*vh7kgW&Lg~pj+1+jz>|}VndEfVbRMW<}mXxejPn;512j zlxcG;qOMHnt^zn~2;rkI;M_+ThE2}kyAa*$a?vgH9IxV?Gx#Zl`k5H5qMeQiJ&yGH zd21ldGxZVLR$pl#0hZ4$dF&!0o6go1(>vrSjyASB@@S=|Q%IR6N_pm8=0{aCsrkZmWf1{B?Pb>eq{h<3tP?+x zL z6+ukIjcmBx&skz{d6v>3Xz)wWOwJ@efcXW_3-tFgDvhjR1UhG`&`1tr-EC<9ejQPf%G1PrS zn;9P1zkN{Gfj~`;UOO3WFFlILGi2sQwRu CCKCVv diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_signals.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_signals.cpython-311.pyc deleted file mode 100755 index 6519b80dbc43e56bc527519f18675fa201fcac7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1468 zcmZ`(L5m|r6s}G($xO1@MU*|L$isse*y&~&PmQ~<$Re}o>|un3EK8@-U6Zc0yQ+Cr z$rw=apjS`Af}ZlzX+mcs{TsnTOBkXwzkar?p4Smdew zNGmJ8u%B|pXTqKIPUTGT!n_Q;r`Kk}Cfr?5rab*zsBGOc-UPd3vhJd=b5z&if4h9T z6Z&c6{n@kBA>9n(hxHf>u0m2?uokl}dNY2a@2{H$d%ivSl6}u8=YW4lboPP9spV(^ zMJnV%su}3YCG0e_G**<*01x}Md0cVi+s$}$3RX8h1iUZ8SqPJfzZjk#e|&uM*<>>E z_kHFua0N9(IclZn22xKdl%7>M)A)*wY>ENrxlD6dN>OB{cIz_n@j%VXsX)ISBbP=P zIMELmLfKEWt{x(4j6t4((qQIQrO}FP7mIMlP>?l912|X8@gWu1Tx`Rob3|uma}+%D z?1Uklb9B~m3{RxW^tpjd69Ve2O|&g%ig;d#VhKirv@XnAFSN|Ik&tZa(l`KQ zML<&2#vE1!x5QHkys8SB`qpgiP|8Jhid$?daYX9?+q2{R`KRqg)%Pprzv*aZolbs z!i#%uqw8t$|Al^1x1OV{W~B!A3&UGvi8o1H?|)e8Y+i`_c$=1v7xNW~%XSb17wp~D j?);05R=e|p9jg|LHOV4 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 D*y+ox diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_subprocesses.cpython-311.pyc deleted file mode 100755 index 7529be8cf2fcd85bc949da7c30decc759c338d01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9634 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 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_synchronization.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_synchronization.cpython-311.pyc deleted file mode 100755 index 2df717b8ca3a8fc510161973cf91d0963c18508b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37135 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 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_tasks.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_tasks.cpython-311.pyc deleted file mode 100755 index f1d534b5be8edca59bd70d23cc5cc4d70a8c1a62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21851 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 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_tempfile.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_tempfile.cpython-311.pyc deleted file mode 100755 index 4bea766bd4bd62d6a36ec0ee26334f3ac8a133c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28785 zcmeHwYj7Obm0r&i17PqR42U{?6Jm8*z z_%Q56BGwvGnCP*zDS5duoNTn>O0`ken@UpIs>qepCO`HuU?$Pjq*%pD%9T~Bk{T}M zEfszw`OdlBJ=605KuUIYV>g;-Zg=0ux%b?2?>Xn5d-;0}4RsQ(?A0HhZG2ji{u@0Q zmsZj3ceH^rK#n`150E%;WWc%rQ_-?Wdzwb8bif7;LC zx@dcB)AS~U>lJUbBi1?HX_M3j&5LpyqFu4>>F!w1bWf~zx;NH0-Di{R(qTzyyeuhA zYO~tZY1B-5&ml=4;Gejr`#D}S;`)RtOF{3+wg zgwlW6^&U|Az(7oz9<;=GKp7~HQIx|DW$3c2kVbh>c}N*4OR>es6W@0#f%5M2S>laqM%98IZO=yX&K z*mE_HUredVqtE0Trqm0mqt862h34i|4Y3-gv`|<*9SWbDx;Uo>TzK)qv4g<_M-Co% z>geR*oMV6dV$Kb4BBkYO4y$ohi-dEY#4D;6O@x$B(Iu(y+EgN#n$^^hLJ#|s7vteW z5fp99Z3@q-;d66|NIVsc%ml-scvy`_RpnEgj`jh5b0VBT@y=Z1GjnSE@kl(RU3@yB zs5vh^6Vm+DcpN2AogSZ`nNhV|({oxRr50X43Pa?P|` z8B_W|#TsQhdW&<~qjZ9r<3yp@TtY+rsR2WO3htr?W~d^}7&83oEA&X&6987(o7nuv}z#W9VkP<*8YfLsa1T*+_U6r4;IczKNzAm!D8)Li5oST0bEV zoZohOKvY@J=`?pr)Kp|=KFV{6Xe4}59^Jk}j)4eBj=U9-muyB0STa-N;e=x5Wjx9A zNsthwD=I##azc~&6LkQA?zsF+9FzxtqfFuq)QB69I+36y5?YFitLLMUI2z#qsI4WU zNqIJLUY?Ifz~sqLRMx*IMFX8rXy=mhXrinX&fP4En$=pPB$_93L9~qs%QL{A5HIP> z@lec);hd(LNkw?WNtK8uibOySrxMylD~U^rE_7N;6RDb((2^n}4$HIX!f3TKauNev zOcjKo`WU2|U=mRbkyzxn+G6&@7saT0GFKmD&JHpo+_2@`B0yGzms2^}Y-8@9gZ zB3kOC)`k!3wSpEvByB5!Z2;B^YGd?%J3uvb_ELm#0uunM4h$ln{vTYEtG&fD9jI0^ z5xO-sHLt~UPNJp-Nt%M0RIea#O^)dI`C&MV- zyhtGcf7|X}LE!tgY6u|{lc2>JB5V>9VG|{UO+q4Uk`ZBp|0RTpWBB^e_8#7UV18pn zwQhV1)a5(|D{38hu~G8hu<;m@q~=>>mRa@eiH2gQmC&P?wp#cSY#dTa<_HGI_e2wr zYLbs4AmW}z`s99q&ljcdAIY?B%{I4PttHS%pn-swK)ne(*-hP7znyQX^*7#;06rtI zD46kvQ)@(KIgd6U50a>*HQ`a~0=QvkjC1yxxg@prDVfpE)fLdY)KLxbQ%I0h06zaq z=`YcHZ~1yMzM;ImwxKaES->4feOujU5$cM>_6|2dWM#dzq|MP-X&+o(~)iR zWt#fao__A!m;x?@gDD8~t6cIo}fnvn>`G*qjq5?I)Z>;p#|wI!s1#snZ=BPf^Vz+z`2FpiC`M<^oR)o5~5pALfwY?pFW=S@K>9jo8@tN#oGX z#-WwQkxb)A+EexBhQ3iVF0MeUz^M<}2{xdqSxk_dDKtP}kiZr*G-QT&(&Vo^b8?8L zPfihVTg#vsO_V|N)t6L8jrJgA_7K1%U8oRG@jJh?A~b4h?W+LbCJvJw0FwsO@d^6K z#5_bHqNqk4sVG$~P4*-j27|~`MMu3<;IgBp5SoD{-x41lciNLVr8caI}aIZKAZo3-tZb=@@ zcJ^fZ2eN&ev%NCiUA_61dRKkEP3qg6_ftqJ2X`EjyYce#c{_dTKsfJ_x_ZB0K7G=} z&TMCQwtq0&H<0ZGLYuQ)efbujtCz4D$onZIRRdcaU2{v%}Z4PGXu{7VKkh1 z>64D_?jPdS#x?L-N!bd$nzV4cvaOP4ZPmgNf6R=(UFlp;6G!}UrAO)I{3n#ntc{aR zhqUn>u*8ry-h+wm!CdPk`kP`IKtc=7Dk?ekKqzPbPZV>~JWBO(`FtcbtE^ zJ`3%OF%lWF;bC`?R?Zro#l!)vTNC!IUu*1EefZZJI~mAI%}f@JT~VWI3O0@BW>xfc zm>I}sLaz#4|NN{90~4FgSg=qm8GLCfziu58r3Vx7AQ!e<9u@X58S3tX+X8DL3Og95 z5%_5|Z?Z%*9Z`2DBX#c})o`K*9d4+W`y%ctIMnv^%Ma-0qYo zTLA3P^qmW?1vfNz&qA$YyIu>O9bd(jB5LVZL48#0=Xl1}ybE>3qPwt@lQ>TQ0?x@m zt>{29vZ!wVF{yaN{wc7NK4k%nI!(Zls|m98HJNi@0?K*G(g@WAwj4}kU!Z0G8FEiP z4*(-UpXBd^fdIw<7zUvK)9q^)fxNG76#5kaSqy&OE_s_W_1*8Bzga(=t{={h?_GN0 z%GcAKTUWf>(tPI~l6M53m|}nPjR!9&2iKicv~VcyrVWsn?4)T|0noJFYiZhRD=)t! z{aAYvRn@*um4;|4(J(2-NK$bw^;Bsp)`2sWa*_azL^nLTIy)X{7lZYS^od7o^rkPS zYw~b#l5*)GFi3y~1C8H3gOE{Zh~9FcUs%Civ(SL2MCqLZ23&5KFpvpsCNMyN5#C~k zczWb_m6Z22%PoxJ+A+%S8w8FM*h+xsgfR*+;}N)sf5}~#UajhA8>yoN#x|yoW;b=^ zeGSkv+o6$W<-vR>JxJxiR7&YnPZg!~{&E|rsG7nom-ltK9wp2MvhtRECp}2jz%Cal zs8-NeMK@)oRWvF!C6U&=c)FuuGK;qTUIi5ut`rW{r8xH>iR!j4=t7NrLUAc>EEOMA z{AEgK%^L9!DIMkU%W^*qC6#hN!bWHLaud|kqa5CR*$Wl*D66cs_#K4GTBp`4Pbyn3 zJKqDY1)JKmS9wbLI;R@B3`Y+?MA^gv=1aTV#w zy_G6uYRZ3wWQL~PRir6*R!UVtS6;U=8m&y~S&i5eWe4xuYzz4Paz^tLbAmEzRb|J@{?etW@DTH0> zPP|f;Yv37yocj{j-?`R=%>D?1r(%r0FunFT1S$Q15v) zg=p6A%cMq@UDh~N)@lPTO+(6@BRDgcbFtM@`whI%o&wO9(X~Z{S*MqEV$#P;6-VB2 zvF5vzNI8XAx<-%n?kfw>+G~ATZ}XKSZ%n>Ex#I1~cze>`o~*ZZ>Cn#_eXpIla^{Wr z>+zMwJ}m2|Jyq{D+WabttkB{E_uAr!Z;ln`m{uB`wogb4(id-Q?e7A~oHGTtTJ5_O z^cW&p!CoT_0y%e(y>Y8FwfOi5H8rWEVp%*}-*jb9Ub5Bt-r0G5*N^u8aPPbOuJ3za z`7nO7dr!K154ZO1#@07tug6|XTuG!oz18mWcBX#DeS0ekH5_kXkiu(miB?i^vkY0SpwqUE=;}v`9SeGj5?*-o&))yRWIrN}xv%J@&WpgYw5kdf1&`4KyS$W2a zk(GmxLlJ(3jI256BervLN+UiG7vf10A$H$3KP`sThQW`Q!M}qSg$|@MsxbIfk_*O- zPFL=ybCh}%c?@A3WQ@G|G(i74kJ zCvy#*1`bm!BIVq||IuP3{2snvsx0*wczyp!C9cm_r}@R&%V?C zqwXJezuSAgcMW$FD%$(HR}{R2!pqr+x+jJg2s#Kr%qe1^0;}j=dT2EsFWh3ut3Y8f zL}+hP%T*qVMT$vkH!|ffO1CizU%2uc7+M)8IIKdq(?|*p7tcaKO>p_g2vnTG##0nW zzpOpJgiDHy)s>~MQir<}Qgtb5V>uLKU^Jqb<+Ns?%+0C&eG1V;cf%nB_qXW9B0!R= zCL1#y#k*8dupXz5eViKi9O4+A(wOH)ZnXwhTDN6d_4Np`Dq+H`Z`0LX*Y>`>ce!oF zH=OYer@g~J^LM@V+|}onTrFBh*It z>J#6Vn?4ZA%2%KGhi>|Z*5j*HZ#0rj8Ls}71^fR`$yRHSEm?(bzfE-OtIAzO@#L9m zgxd&*ec~Is=^HBLuuuHMH~quwahUdPV5hYM{K}1q%x|ztCoB^hx5pyd!#bh;4&JQ6 ze3VU`XqZ5}(n)P&G$iI*{zf?!iT##C>(TL7j(W^?)a?4K_7BTQwoD|e&Uc)4z8cK} z8<^Py-+?y1(Ts02?H$$UHoDIGEgH%Ozm_FaXy%Rmuz-g^1!%ju@U z(%UmA=wfzi6iO_{0_DdDRAj5a^$HudE@7Kb7`vkdfy!n7-$UK2Ol(Hd*Q;^Twhd58 zNR`V|E55B6-`2Eut2s#W#HOtHw`Kg>(oJQzXB$&Y^8-Q4>;`NE*+>HyR!ega4ZD^Y z_E(z9g#@iD{a5g!ik`z(m$#^*r1R@G!Q;=Sk3TDhY6pBL?+pv>#=RE*TU2~~q4yV=A>X%hz+E~e$R?Hk}%U);+ZOAM9v^dCnkoA)UuvuIz`YWLnb`T`kKRQ{_144Id zpd60Q6#S@XvGX2BPskV56xQ?MQ!Q3ic?ExrqjA<)mZySJh){HpLGp2;43qxnYencFoEfJvk!kFfXQFGY&o5Z05m1g?&`1S|HIAn>^rx9#0YHp*2 z6K8GLIzyDd^Xl{0UVi)K<^3!E;f#NH=}@+{{o1y-x4pIf>h`p^zx>YnI+va{CLFS2 z>{#&+W&A_wrn1{JBnA%`>v*dj#!)3NTG{#Jy$vkJ@b*tp;o{*fSI2bcvM%*k)He$e zejiPCw*fimy8_)(vu`OWMw0q!lopy5#D9fIGJKFIv?21G7;H=QOE(T@kRRF?VR zmo(&2|1Tf%h4Fihn%gA5S-x-JWsgV~wmKfi|JbB@xzA1U3`sC*UI>6X16P6dEM3#S9IZ zp zC?{a!?aY`&xqsd;de{ZnI=L}D3ySGe~cf|psb+( zV|wIr`MaJMV-uhRI(jA1iqYd@{MKyr?@U$x{`=PNPGP_N(E7GGS7tO?|14^~;#~Rr zKev8&YW((JSl@PQC+Ni#foBPPlK`*eK1U%^9E3~IQxsw;hZbma9ypf5T_|;tR~^L~ z+7BoSS@gBvCP3yzZ5beEPb71m69*4I6+CfpN?1f#za~9RWAW)H6svBPCGlrz2fW?JH5p=@AA#w zKCkXtpWj3wsT`Po_4KKW{Oa8j^1)v5FPxh!b#`UPAF8nH+c)THWWW0SCJIUGgC}h+ zS3mjJR|btvS06-33-H#vHqrL>V!#!&+b9QL+%DQuz9wjNxdIer4S*weuzg;xfR(w;~E_!0X4;5q=MY@sNX0ltpW*EK*RdP>&$Y?^Pq3GtkDHDsMf(tMk5 zkK~=LuHn2?4UAH+v)f%h_$lbXBnrK7uk+p0;+mi{5H<|NghvcVgTHw>MaXvdaRdry z1JK!g`Z;`EibFpGpj&Ce9(^aaL$qL{g9|(NJMimP`mooZ_UuDn4)o^=CptZ09Q76Y z6DaJgc2z$*zR8>NvF;2Pm`xs? z+@lCi;WKWJ#=I}8V~h50qxcI7^Z+U)8-BF$}vV zA<$N$mWs4Y+_0Vv|4`HUsOhK|thY~D>`oS*igxW0q|p8i01laTi_PRL=IM)Id-3Jc zM8%F!{Y0_9qR!EQln@EYQxRK}AIAOBu=rin-4yF9)-XZ{oh88RNN0($=c4v+5h8zf z{U9@_7QOWCPXL6ON|#J&CcM-q(NU zc(K7=v3*$L>H8JQCKd0hDDW8iGv&`$!2_7qWEULoK_K}+7fPu3!hwF|b4!2LwO`?h zJ1FgdjpDrhg5w40yv-)PfU?CGJ}SX6IYqrQIU7-<3S8rg z(j|BY_g_;j)qnSw?MV_(QI4C)u(Y} z-up*BihSG&x^Ke91OU*zWj)|9vf}*iP|ly3*%u0`6#D%0&nvwydWUlshJbyt1y%at z=>8_hPn(?keKkLAw*gv)T?b-tH&GC%&`pMmyGdc?#?lEW55B4oY6WugStc0Xn2H4g z*67oInJev|BIiq86^N%Nuw%+i5=Rs~?U`_`-I>-c%TvF5GBdP$rS*|a>mzAz)te5c zpax?myWyat+q`0U`YCc20sx12isjJ9^r0XMaLAMg3~LI_a$;xtzd{I}*_CvBnr(|t zQ=Yd?RDDE4+!Hq&49{ z1Es(|_7d1v=R#k$f)2Y2+Zn0=F;WrAheR6=681DV@sYN)$>IVm|MW}^w%U}MpNpz5 z!aHS*79LNA%>e{oQD4zNY38iB99uS1{sm$hCQq5o6}g(&IXa+gPWzAeRzp3eXmP?T zZR&b6%vi5_#fDmO-0x~j5oY4Z;CsVOyIF<`W59s^BLXWLojvb3MB`BpTisMtI@$%& zXayY1VV=xIqJ1i#xtc0!)#AZiAGjey6gIe(t$Y42kU?mGmPJQh?3au5FR^e(Dv?+g zgmxr9b7Ff`eMOCmS#>gK`aLUlVuq~inAbTXdeEYu5Xcpm3C z^XXGxin7Ivj`yKmRZhq1)Dxz@2z{_{COXxK&!;yRIxA^V#3)5tkA65gZIl;VvuWG5 zxlLKuy^Ph^{W5nSnH1*`R#2f48EuX;ypmxpG6&y83oZCuJ6%B~3Dg{&g_uaZvu2O( zq#jM`kQj=8J}hAnZW;V1M>1P>el+thXFd-9hn*`e$1*L)()DGx^O)%RG-QU&83hmP zj{uGmNmBQ%EbzXiIk;VGnO4f2nVku3dLKu9ltfYqKr2}G= zsV`z@ONnlzewBnaG6UZ)H<_p3F!+dk@UJJD-&-jmCC zZ>8nQOv{t$`m)>kB=^cN5}Ow>Aa}$`1n#{fmI;EEE_msGRGLfl`GQ)Ah-tKz**1m$ z9KbqwCO6a(U3VQa{}_Qh&sEMQSUk^c7#l3_5~RwZSwu7FFaoOc_otr0j*&tHE!%R>d7C1S1C{R}_O%GD$tdVetj|l+d#df~+3V{BFdoiWbMbS`@P?G92?3q44JvU0)dH zq$6~|^~^l}!v`F2tvM*pzb3#YrbiIUHHGPv9R5FYlH;M%VU1+uoIR2#9J`Qn(b?}w zjpXc{8)2}vM)pCCjC#CHQzI`!UZ2eglLVGe>HpXm=l_cYnKe;bPc(6!rC{Fgh)v|F zQ1V=o?HDj?aUrv+B77FwC__Jib^>He6UUg*0ubwgLXF@_;WoYFezuiD69mQp@ZSN5 z)4d%E6KDQmsSV*-!Z_7HLORsn5-7nc}SQo7f z-#q-zp{vi_;jf<+$N8>3#K|hdcQ!4zU+=#o(bvxy<^??BIODKkMX)k_=i%jVX1d4j z@aNBpBTd!pwLu#%2S!Qw@>${YV|K}2ce}GUi@Uum+tLn8r>zT?&SHSoOncqsj=Y`T zHdBJ`{w(f}9z8)1B`5+#33{+3fTPlTupZybv3<60z_3sSjum5*uW{P2xNZSv&h)mi t7!`^QYFa>1>}DWt;E}Iswmk(Ts=(n|+rv1$!~!~MZM*4RMZj$Ke*qPiWx4|whXgR7qK<()IWe3+q7Us`A1H%`i30)z2m&;3ES$XPsWW>d#iMMX zZ(SZ|XZL1zXXiIFyZ6P&NQOXZ-TCX)!)Zdk#YVU2A)`I10kcIIVVXm#T3OSOk2$ew zyd1CUWnH!7PNJGDC#yr{A!zF?;iRhRa#|xXvPf9+Bf^I6#|U`{|FD!ZY>cHp(#u(v zV_B$&**F`4dW4N$AccwVQLLZ^S<`hr-}G(Im4#T4e&eQT`{s(ngY+VIxiEcCK!5xV zcP-E@Q~KX);lS}L+&4_Q=32&zXq*gmM!YzmZpK1jW1%4>H+_w(C=yEl|J0Y2CH2*Euv{sJ&`)LA_P=0!Q_YshI*K zjP9_#@}YoQY>wKipv77^99Hz#YMl1XaK45HHl2&0$)&zUq%WvzR(Yrz+SA zY!>LMo$e_wMghPe4vLE$a61_^<_2B%z&XZL2X3O%F@hb1p5t5uubHD=atWk*?uD-| zSqYHumN+o**Pi?ym@VRW`=P#-*hpMOzfDtTe5vA9d8uj&%PXDpu6V~vX02Ab z!QC4r$6hJb*8Ga+9xKkzm!$3US85P-<`phW;CQxIG5|qdGJGz<3$7GvYeC8|Y}fV; zV|~0EKE-a=eppwY0kTPc93?q=TW?Lzd^XmYIt|a4hnp{-3fbHG$C=iFgHR2%UMxa2 z+M|(y5?ef>um2ikH$4>Gp2UFn;y#YGm@3%z-C+4GmGHHTLr z#5pU(#B=!WCqN`lMyZ&ADo7dzzYg{r>$4wr97e$ckWKP+cIp#;?|0kTBhBoQHqp{A zwI&bTdF?O!v&y5%BaPuB-;K>SQnTU^NLzhdMH7T(co~=hGmu?pzYk*`_QqWx0@sFw ztXE7~QM-AdDeWZ+b@T@0@$~@mVHYkZF_J;|vB^))-dX(ft&eXtQZq`$AP&(S(G!iT z;QAFXTLeIWIxM?ds*vo1=WdKa*j>dvssio!y(EN}zPzp7zx|AGC5U9Z3>i32uCYhwSMVsoO<7&{Nom;P5bL+)?; z{(dmzkfzS>1qatso5tP4;jCe1ST|JC#9)0_IXAt0`8`qRmoH=b$Fl|V1O+owlUnF< zj-w7%T7%OOf^rT9yk$BPN2qAIX-nQYsBqS|9uP6O)oGZ{=!`e|CtZJ`=akP9c@<3o z_YN>cJ413)x9e)B%Y{^!k;dUwn6f62!)z`lkzn!?`+yX56%>ME#|udE*c%IZ9N*>V z`gkRi5xBgVMsg5HFk~3avjAZLTRNT(V2fFN`x26$BAG{W9LX^x7&9sm!_dX}#ofqH zfo%4E?N}<2Y7->;$oQ$vrM5ntIIFeE9y+5Z4z)>?3~Py52-^rrYKeDX{2rQ2B&OQr z86?zJN`4f-xi;wb)+xewterY>< zu9-d8(9bDs108Ri5kwK05AnkIJ}_?+Z2;9MM*mA>eF%yE5ApZOR{T%+)fFcF6TgKI zBKT_XZHJnU6DDpIW{~Cur}({u?!M{?D&Yd>SMd6^+;Qz-KfX6$U}zO%#qr={i49uk zG;Bd2c?bUTB#?i@Z9&K!S~Ili4a+02}5=+AtVt#EObtT7vPc?DUg z{}lF*;*EB-4!1PC!(spgV*_6mLWf>~krO20lLj^>lGuZ|!)WEO81`WltK6r;R$;BS z6bmMAtpQdPay5MrfDsbZ$zJO$g7Q~JuNcRc-r#~DKw%_J2|I8%HB)< jgMB~jzW6{(Yd>p~D49-cZ^JpThfc?|*V^P6L?Q5BBA(kl diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_typedattr.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_typedattr.cpython-311.pyc deleted file mode 100755 index 23b38146b67bcf3d41020fc2295650cf6b62a7a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4566 zcmb7HTWr+W89uh>;+ae`xse1YU>cTXxMa8pN@=?-<+hYdw_K|3AmnxIlf>Y$XOBHe zCJL(vp?0Wv$U`f-+pfeD-4!qU*0*XO`#3?7c4P@DQq@YlRD(jLh^PMlvBwjKXxlnx z{v4mnfBy4dzW?{1ySuXlp62g9yHkYT-|?mWB!Z5x`Y-4_CI&GCi24okr0?=BO93a@ z>M7?-d4Y(8%0}j?K*%%r1y8A$k7hTF_Q7c0=-M#aZwwec4-%yTkz61~{sA$1pNhZ@ zej&F(KGO#?{TpVs7~*wO7<`Ef3xeOJ*|y_pp6S@`)q?2DXEe*w#x3fnuV|HuX-^gs zzI58I`RNJFntl^=xXj8$rWp1-Nlv1|km>Vu!#1!RHzqpR=X$wwy_ ze$IyAJ*EUu06xO%9-zMgHBeF#3<6Folq4frCli8^c#tb4>SR_ZB|#M_zb|g0>(rb3 zbyk7rdbL8CZfUNoOgL<#G8EmhEKnIb$yk&!{e_Ha{S^`FrBy%0C{JcO)Cp2GaI zP#c8Y6TGNT$UKRM&RKGM?4CF;K8ZpF*hY^b##g(;^WwZPEwBME9W4S#m>2&j8i~)P z`0D$@qoSATtc$zilVoS6(~GY`fB`!tuljja?P$nVRbNo&vKT5nw3NABis>q4({&+0 z71IMl#FYxRPES&ZYX~mMFqxlqJ&k$pjOk55w83H?n10el!~1=zYTBl!wk@Tq81=g4 zGSsCnBOhBUQ$M4s+?1;7B7B19EU;ndFm%GX(YM@d>@CJSV4?dE$l3yVvG>pydgIvH zug916UR>ULvEKD!Wcwe^d@BD*ZjnT$pOgCg&4KOT4D5YAu=k0(G;m;f;6RH=-Thz5 zUw1VQUxM~xXjgOa@{^Iq;N_sblEmTu*91t5h<*KQ|CULn=VAI$`Wt!ob9wiYJi088 zHrkDcRzc(*$hL!IpgdVs@xGw=tg4nBqiSJ4r>Y-UH7lG+tE%DXs><)~cZZtMsbzus z1okdo6kYizfrhq0mm$GOb}s+{4YdDSVj_um29lGLds^iGAY6XVSqG-kgZ6<(Se*tM zM+cfPdI1{}aqlZ7Y0Bs`(r=BYVZ7hy+GJd&89*6KM#&Al(ncQBj6W22i4T}FZ5ou# zo%yNeQl*19yhlSonK9id1m;SxI)o!S>oKi^FYXw(*qe94JasF`B?pyu2D^3Z_CX~W zynQ804N%Xh zTXAdy0yJVetyxvtMo>KEV!%7RCsSsaRso2Fj66kI`}*u4XBp)PfN18F1L(yK5WtE% zC2MX)`KoH3btp11sS~#IkeO@N~+h z#iVK404}yp3t?`+o3SmRT1cS@ms%4%3=|#)elJ&KC*!$u?{4lQV;dJ90FEx=>jG&F zk>37#hI_uBi8RBoz|hx2`vyxRynZQM4TKZf5m?TSAzR!7LL-#E=4I;kTa`yQT#TT!tb zZco6=w@df~+#>@439sF3T)P>-1bRFh1QHVkv4RK0Z=v&;WFT+efnM;;3tQV=a!;}k zj1q61iuVw0?dBGOVY8pyz46VQwkh{s&gq+yHm=9 zW?EPt!$EL#C~L$O&k97IfeMc+xMPR8fzwgl0>BoCd$o{YN5NZs`4X-1QiNgE%dqN& zsVFeH>-#AvWjxB-CCC391MdMhR|f)!u``v~)!edmdCUGUzQ4TXc>R3+{Mw8BFqRm* zI;5E&`n=G{k3xGfRBRkRw={HqdFcG#&Ng~KSQ*~A*n@wq4D4B3TWjS=?@)dE;q0T? zdfv^!IrqDJ$>KXFrN0O#CHR^ON{V7|C&U>JP{Anw7D{pS2}Uu!* z*o}KIe!%f!jO&wQc}LN2 None: - self._thread = threading.Thread(target=self.run, name="AnyIO socket selector") - self._selector = DefaultSelector() - self._send, self._receive = socket.socketpair() - self._send.setblocking(False) - self._receive.setblocking(False) - # This somewhat reduces the amount of memory wasted queueing up data - # for wakeups. With these settings, maximum number of 1-byte sends - # before getting BlockingIOError: - # Linux 4.8: 6 - # macOS (darwin 15.5): 1 - # Windows 10: 525347 - # Windows you're weird. (And on Windows setting SNDBUF to 0 makes send - # blocking, even on non-blocking sockets, so don't do that.) - self._receive.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 1) - self._send.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1) - # On Windows this is a TCP socket so this might matter. On other - # platforms this fails b/c AF_UNIX sockets aren't actually TCP. - try: - self._send.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - except OSError: - pass - - self._selector.register(self._receive, EVENT_READ) - self._closed = False - - def start(self) -> None: - self._thread.start() - threading._register_atexit(self._stop) # type: ignore[attr-defined] - - def _stop(self) -> None: - global _selector - self._closed = True - self._notify_self() - self._send.close() - self._thread.join() - self._selector.unregister(self._receive) - self._receive.close() - self._selector.close() - _selector = None - assert not self._selector.get_map(), ( - "selector still has registered file descriptors after shutdown" - ) - - def _notify_self(self) -> None: - try: - self._send.send(b"\x00") - except BlockingIOError: - pass - - def add_reader(self, fd: FileDescriptorLike, callback: Callable[[], Any]) -> None: - loop = asyncio.get_running_loop() - try: - key = self._selector.get_key(fd) - except KeyError: - self._selector.register(fd, EVENT_READ, {EVENT_READ: (loop, callback)}) - else: - if EVENT_READ in key.data: - raise ValueError( - "this file descriptor is already registered for reading" - ) - - key.data[EVENT_READ] = loop, callback - self._selector.modify(fd, key.events | EVENT_READ, key.data) - - self._notify_self() - - def add_writer(self, fd: FileDescriptorLike, callback: Callable[[], Any]) -> None: - loop = asyncio.get_running_loop() - try: - key = self._selector.get_key(fd) - except KeyError: - self._selector.register(fd, EVENT_WRITE, {EVENT_WRITE: (loop, callback)}) - else: - if EVENT_WRITE in key.data: - raise ValueError( - "this file descriptor is already registered for writing" - ) - - key.data[EVENT_WRITE] = loop, callback - self._selector.modify(fd, key.events | EVENT_WRITE, key.data) - - self._notify_self() - - def remove_reader(self, fd: FileDescriptorLike) -> bool: - try: - key = self._selector.get_key(fd) - except KeyError: - return False - - if new_events := key.events ^ EVENT_READ: - del key.data[EVENT_READ] - self._selector.modify(fd, new_events, key.data) - else: - self._selector.unregister(fd) - - return True - - def remove_writer(self, fd: FileDescriptorLike) -> bool: - try: - key = self._selector.get_key(fd) - except KeyError: - return False - - if new_events := key.events ^ EVENT_WRITE: - del key.data[EVENT_WRITE] - self._selector.modify(fd, new_events, key.data) - else: - self._selector.unregister(fd) - - return True - - def run(self) -> None: - while not self._closed: - for key, events in self._selector.select(): - if key.fileobj is self._receive: - try: - while self._receive.recv(4096): - pass - except BlockingIOError: - pass - - continue - - if events & EVENT_READ: - loop, callback = key.data[EVENT_READ] - self.remove_reader(key.fd) - try: - loop.call_soon_threadsafe(callback) - except RuntimeError: - pass # the loop was already closed - - if events & EVENT_WRITE: - loop, callback = key.data[EVENT_WRITE] - self.remove_writer(key.fd) - try: - loop.call_soon_threadsafe(callback) - except RuntimeError: - pass # the loop was already closed - - -def get_selector() -> Selector: - global _selector - - with _selector_lock: - if _selector is None: - _selector = Selector() - _selector.start() - - return _selector diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_concurrency_utils.py b/venv/lib/python3.11/site-packages/anyio/_core/_concurrency_utils.py deleted file mode 100755 index f66229a..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_concurrency_utils.py +++ /dev/null @@ -1,156 +0,0 @@ -from __future__ import annotations - -from inspect import iscoroutine - -__all__ = ("amap", "as_completed", "gather") - -from collections.abc import AsyncGenerator, Awaitable, Callable, Coroutine, Iterable -from contextlib import asynccontextmanager -from typing import TYPE_CHECKING, Any, TypeVar, overload - -from ..abc._tasks import get_coro_name -from ._exceptions import BrokenResourceError -from ._streams import create_memory_object_stream -from ._tasks import TaskHandle, create_task_group - -if TYPE_CHECKING: - from anyio.streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream - -R = TypeVar("R") -S = TypeVar("S") -T = TypeVar("T") -U = TypeVar("U") -V = TypeVar("V") -W = TypeVar("W") - - -@overload -async def gather( - coro1: Coroutine[Any, Any, R], coro2: Coroutine[Any, Any, S], / -) -> tuple[R, S]: ... - - -@overload -async def gather( - coro1: Coroutine[Any, Any, R], - coro2: Coroutine[Any, Any, S], - coro3: Coroutine[Any, Any, T], - /, -) -> tuple[R, S, T]: ... - - -@overload -async def gather( - coro1: Coroutine[Any, Any, R], - coro2: Coroutine[Any, Any, S], - coro3: Coroutine[Any, Any, T], - coro4: Coroutine[Any, Any, U], - /, -) -> tuple[R, S, T, U]: ... - - -@overload -async def gather( - coro1: Coroutine[Any, Any, R], - coro2: Coroutine[Any, Any, S], - coro3: Coroutine[Any, Any, T], - coro4: Coroutine[Any, Any, U], - coro5: Coroutine[Any, Any, V], - /, -) -> tuple[R, S, T, U, V]: ... - - -@overload -async def gather( - coro1: Coroutine[Any, Any, R], - coro2: Coroutine[Any, Any, S], - coro3: Coroutine[Any, Any, T], - coro4: Coroutine[Any, Any, U], - coro5: Coroutine[Any, Any, V], - coro6: Coroutine[Any, Any, W], - /, -) -> tuple[R, S, T, U, V, W]: ... - - -# handle arbitrary length if awaitables are all of the same type -@overload -async def gather(*coros: Coroutine[Any, Any, R]) -> tuple[R, ...]: ... - - -async def gather(*coros: Coroutine[Any, Any, Any]) -> tuple[Any, ...]: - """ - Run coroutines concurrently in a task group. The order of result values corresponds - to the order of coroutines passed. - - :param coros: coroutine objects to run as tasks - :return: task results for each argument in the same order as they were passed - - """ - handles: list[TaskHandle[Any]] = [] - async with create_task_group() as tg: - handles.extend(tg.create_task(coro) for coro in coros) - - return tuple(h.return_value for h in handles) - - -@asynccontextmanager -async def as_completed( - *awaitables: Awaitable[R], -) -> AsyncGenerator[MemoryObjectReceiveStream[TaskHandle[R]]]: - """ - Run awaitable objects concurrently in a task group, returning an iterator which can - be used to get finished task handles in the order they complete. - - :param awaitables: awaitable objects to run as tasks - :return: MemoryObjectReceiveStream for iterating over task handles as tasks complete. - - """ - if not awaitables: - raise ValueError("as_completed() takes at least one awaitable") - - send, recv = create_memory_object_stream[TaskHandle[R]](len(awaitables)) - task_handles: list[TaskHandle[R]] = [] - - async def runner( - awaitable: Awaitable[R], - index: int, - _send: MemoryObjectSendStream[TaskHandle[R]], - ) -> R: - async with _send: - try: - return await awaitable - finally: - try: - _send.send_nowait(task_handles[index]) - except BrokenResourceError: - pass - - async with recv, create_task_group() as tg: - async with send: - for i, awaitable in enumerate(awaitables): - name = get_coro_name(awaitable) if iscoroutine(awaitable) else None - task_handles.append( - tg.start_soon(runner, awaitable, i, send.clone(), name=name) - ) - try: - yield recv - finally: - tg.cancel_scope.cancel() - - -async def amap( - func: Callable[[T], Coroutine[Any, Any, R]], args: Iterable[T] -) -> list[R]: - """ - Run the given coroutine function concurrently for multiple argument values. - - :param func: a coroutine function that takes a single argument - :param args: a sequence of argument values to pass to ``func`` - :return: task results for each argument in the same order as they were passed - - """ - handles: list[TaskHandle[R]] = [] - async with create_task_group() as tg: - handles.extend(tg.start_soon(func, arg) for arg in args) - - return [h.return_value for h in handles] diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_contextmanagers.py b/venv/lib/python3.11/site-packages/anyio/_core/_contextmanagers.py deleted file mode 100755 index 302f32b..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_contextmanagers.py +++ /dev/null @@ -1,200 +0,0 @@ -from __future__ import annotations - -from abc import abstractmethod -from contextlib import AbstractAsyncContextManager, AbstractContextManager -from inspect import isasyncgen, iscoroutine, isgenerator -from types import TracebackType -from typing import Protocol, TypeVar, cast, final - -_T_co = TypeVar("_T_co", covariant=True) -_ExitT_co = TypeVar("_ExitT_co", covariant=True, bound="bool | None") - - -class _SupportsCtxMgr(Protocol[_T_co, _ExitT_co]): - def __contextmanager__(self) -> AbstractContextManager[_T_co, _ExitT_co]: ... - - -class _SupportsAsyncCtxMgr(Protocol[_T_co, _ExitT_co]): - def __asynccontextmanager__( - self, - ) -> AbstractAsyncContextManager[_T_co, _ExitT_co]: ... - - -class ContextManagerMixin: - """ - Mixin class providing context manager functionality via a generator-based - implementation. - - This class allows you to implement a context manager via :meth:`__contextmanager__` - which should return a generator. The mechanics are meant to mirror those of - :func:`@contextmanager `. - - .. note:: Classes using this mix-in are not reentrant as context managers, meaning - that once you enter it, you can't re-enter before first exiting it. - - .. seealso:: :doc:`contextmanagers` - """ - - __cm: AbstractContextManager[object, bool | None] | None = None - - @final - def __enter__(self: _SupportsCtxMgr[_T_co, bool | None]) -> _T_co: - # Needed for mypy to assume self still has the __cm member - assert isinstance(self, ContextManagerMixin) - if self.__cm is not None: - raise RuntimeError( - f"this {self.__class__.__qualname__} has already been entered" - ) - - cm = self.__contextmanager__() - if not isinstance(cm, AbstractContextManager): - if isgenerator(cm): - raise TypeError( - "__contextmanager__() returned a generator object instead of " - "a context manager. Did you forget to add the @contextmanager " - "decorator?" - ) - - raise TypeError( - f"__contextmanager__() did not return a context manager object, " - f"but {cm.__class__!r}" - ) - - if cm is self: - raise TypeError( - f"{self.__class__.__qualname__}.__contextmanager__() returned " - f"self. Did you forget to add the @contextmanager decorator and a " - f"'yield' statement?" - ) - - value = cm.__enter__() - self.__cm = cm - return value - - @final - def __exit__( - self: _SupportsCtxMgr[object, _ExitT_co], - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> _ExitT_co: - # Needed for mypy to assume self still has the __cm member - assert isinstance(self, ContextManagerMixin) - if self.__cm is None: - raise RuntimeError( - f"this {self.__class__.__qualname__} has not been entered yet" - ) - - # Prevent circular references - cm = self.__cm - del self.__cm - - return cast(_ExitT_co, cm.__exit__(exc_type, exc_val, exc_tb)) - - @abstractmethod - def __contextmanager__(self) -> AbstractContextManager[object, bool | None]: - """ - Implement your context manager logic here. - - This method **must** be decorated with - :func:`@contextmanager `. - - .. note:: Remember that the ``yield`` will raise any exception raised in the - enclosed context block, so use a ``finally:`` block to clean up resources! - - :return: a context manager object - """ - - -class AsyncContextManagerMixin: - """ - Mixin class providing async context manager functionality via a generator-based - implementation. - - This class allows you to implement a context manager via - :meth:`__asynccontextmanager__`. The mechanics are meant to mirror those of - :func:`@asynccontextmanager `. - - .. note:: Classes using this mix-in are not reentrant as context managers, meaning - that once you enter it, you can't re-enter before first exiting it. - - .. seealso:: :doc:`contextmanagers` - """ - - __cm: AbstractAsyncContextManager[object, bool | None] | None = None - - @final - async def __aenter__(self: _SupportsAsyncCtxMgr[_T_co, bool | None]) -> _T_co: - # Needed for mypy to assume self still has the __cm member - assert isinstance(self, AsyncContextManagerMixin) - if self.__cm is not None: - raise RuntimeError( - f"this {self.__class__.__qualname__} has already been entered" - ) - - cm = self.__asynccontextmanager__() - if not isinstance(cm, AbstractAsyncContextManager): - if isasyncgen(cm): - raise TypeError( - "__asynccontextmanager__() returned an async generator instead of " - "an async context manager. Did you forget to add the " - "@asynccontextmanager decorator?" - ) - elif iscoroutine(cm): - cm.close() - raise TypeError( - "__asynccontextmanager__() returned a coroutine object instead of " - "an async context manager. Did you forget to add the " - "@asynccontextmanager decorator and a 'yield' statement?" - ) - - raise TypeError( - f"__asynccontextmanager__() did not return an async context manager, " - f"but {cm.__class__!r}" - ) - - if cm is self: - raise TypeError( - f"{self.__class__.__qualname__}.__asynccontextmanager__() returned " - f"self. Did you forget to add the @asynccontextmanager decorator and a " - f"'yield' statement?" - ) - - value = await cm.__aenter__() - self.__cm = cm - return value - - @final - async def __aexit__( - self: _SupportsAsyncCtxMgr[object, _ExitT_co], - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> _ExitT_co: - assert isinstance(self, AsyncContextManagerMixin) - if self.__cm is None: - raise RuntimeError( - f"this {self.__class__.__qualname__} has not been entered yet" - ) - - # Prevent circular references - cm = self.__cm - del self.__cm - - return cast(_ExitT_co, await cm.__aexit__(exc_type, exc_val, exc_tb)) - - @abstractmethod - def __asynccontextmanager__( - self, - ) -> AbstractAsyncContextManager[object, bool | None]: - """ - Implement your async context manager logic here. - - This method **must** be decorated with - :func:`@asynccontextmanager `. - - .. note:: Remember that the ``yield`` will raise any exception raised in the - enclosed context block, so use a ``finally:`` block to clean up resources! - - :return: an async context manager object - """ diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_eventloop.py b/venv/lib/python3.11/site-packages/anyio/_core/_eventloop.py deleted file mode 100755 index a3e2ab1..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_eventloop.py +++ /dev/null @@ -1,240 +0,0 @@ -from __future__ import annotations - -import math -import sys -import threading -from collections.abc import Awaitable, Callable, Generator -from contextlib import contextmanager -from contextvars import Token -from importlib import import_module -from typing import TYPE_CHECKING, Any, TypeVar - -from ._exceptions import NoEventLoopError - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -sniffio: Any -try: - import sniffio -except ModuleNotFoundError: - sniffio = None - -if TYPE_CHECKING: - from ..abc import AsyncBackend - -# This must be updated when new backends are introduced -BACKENDS = "asyncio", "trio" - -T_Retval = TypeVar("T_Retval") -PosArgsT = TypeVarTuple("PosArgsT") - -threadlocals = threading.local() -loaded_backends: dict[str, type[AsyncBackend]] = {} - - -def run( - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - *args: Unpack[PosArgsT], - backend: str = "asyncio", - backend_options: dict[str, Any] | None = None, -) -> T_Retval: - """ - Run the given coroutine function in an asynchronous event loop. - - The current thread must not be already running an event loop. - - :param func: a coroutine function - :param args: positional arguments to ``func`` - :param backend: name of the asynchronous event loop implementation – currently - either ``asyncio`` or ``trio`` - :param backend_options: keyword arguments to call the backend ``run()`` - implementation with (documented :ref:`here `) - :return: the return value of the coroutine function - :raises RuntimeError: if an asynchronous event loop is already running in this - thread - :raises LookupError: if the named backend is not found - - """ - if asynclib_name := current_async_library(): - raise RuntimeError(f"Already running {asynclib_name} in this thread") - - try: - async_backend = get_async_backend(backend) - except ImportError as exc: - if backend in BACKENDS: - raise LookupError( - f"Backend {backend!r} is not available. " - f"Install it with: pip install anyio[{backend}]" - ) from exc - - raise LookupError(f"No such backend: {backend}") from exc - - token = None - if asynclib_name is None: - # Since we're in control of the event loop, we can cache the name of the async - # library - token = set_current_async_library(backend) - - try: - backend_options = backend_options or {} - return async_backend.run(func, args, {}, backend_options) - finally: - reset_current_async_library(token) - - -async def sleep(delay: float) -> None: - """ - Pause the current task for the specified duration. - - :param delay: the duration, in seconds - - """ - return await get_async_backend().sleep(delay) - - -async def sleep_forever() -> None: - """ - Pause the current task until it's cancelled. - - This is a shortcut for ``sleep(math.inf)``. - - .. versionadded:: 3.1 - - """ - await sleep(math.inf) - - -async def sleep_until(deadline: float) -> None: - """ - Pause the current task until the given time. - - :param deadline: the absolute time to wake up at (according to the internal - monotonic clock of the event loop) - - .. versionadded:: 3.1 - - """ - now = current_time() - await sleep(max(deadline - now, 0)) - - -def current_time() -> float: - """ - Return the current value of the event loop's internal clock. - - :return: the clock value (seconds) - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - """ - return get_async_backend().current_time() - - -def get_all_backends() -> tuple[str, ...]: - """Return a tuple of the names of all built-in backends.""" - return BACKENDS - - -def get_available_backends() -> tuple[str, ...]: - """ - Test for the availability of built-in backends. - - :return a tuple of the built-in backend names that were successfully imported - - .. versionadded:: 4.12 - - """ - available_backends: list[str] = [] - for backend_name in get_all_backends(): - try: - get_async_backend(backend_name) - except ImportError: - continue - - available_backends.append(backend_name) - - return tuple(available_backends) - - -def get_cancelled_exc_class() -> type[BaseException]: - """ - Return the current async library's cancellation exception class. - - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - """ - return get_async_backend().cancelled_exception_class() - - -# -# Private API -# - - -@contextmanager -def claim_worker_thread( - backend_class: type[AsyncBackend], token: object -) -> Generator[Any, None, None]: - from ..lowlevel import EventLoopToken - - threadlocals.current_token = EventLoopToken(backend_class, token) - try: - yield - finally: - del threadlocals.current_token - - -def get_async_backend(asynclib_name: str | None = None) -> type[AsyncBackend]: - if asynclib_name is None: - asynclib_name = current_async_library() - if not asynclib_name: - raise NoEventLoopError( - f"Not currently running on any asynchronous event loop. " - f"Available async backends: {', '.join(get_all_backends())}" - ) - - # We use our own dict instead of sys.modules to get the already imported back-end - # class because the appropriate modules in sys.modules could potentially be only - # partially initialized - try: - return loaded_backends[asynclib_name] - except KeyError: - module = import_module(f"anyio._backends._{asynclib_name}") - loaded_backends[asynclib_name] = module.backend_class - return module.backend_class - - -def current_async_library() -> str | None: - if sniffio is None: - # If sniffio is not installed, we assume we're either running asyncio or nothing - import asyncio - - try: - asyncio.get_running_loop() - return "asyncio" - except RuntimeError: - pass - else: - try: - return sniffio.current_async_library() - except sniffio.AsyncLibraryNotFoundError: - pass - - return None - - -def set_current_async_library(asynclib_name: str | None) -> Token | None: - # no-op if sniffio is not installed - if sniffio is None: - return None - - return sniffio.current_async_library_cvar.set(asynclib_name) - - -def reset_current_async_library(token: Token | None) -> None: - if token is not None: - sniffio.current_async_library_cvar.reset(token) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_exceptions.py b/venv/lib/python3.11/site-packages/anyio/_core/_exceptions.py deleted file mode 100755 index 7d9165f..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_exceptions.py +++ /dev/null @@ -1,205 +0,0 @@ -from __future__ import annotations - -import sys -from collections.abc import Generator -from textwrap import dedent -from typing import Any - -if sys.version_info < (3, 11): - from exceptiongroup import BaseExceptionGroup - - -class BrokenResourceError(Exception): - """ - Raised when trying to use a resource that has been rendered unusable due to external - causes (e.g. a send stream whose peer has disconnected). - """ - - -class BrokenWorkerProcess(Exception): - """ - Raised by :meth:`~anyio.to_process.run_sync` if the worker process terminates abruptly or - otherwise misbehaves. - """ - - -class BrokenWorkerInterpreter(Exception): - """ - Raised by :meth:`~anyio.to_interpreter.run_sync` if an unexpected exception is - raised in the subinterpreter. - """ - - def __init__(self, excinfo: Any): - # This was adapted from concurrent.futures.interpreter.ExecutionFailed - msg = excinfo.formatted - if not msg: - if excinfo.type and excinfo.msg: - msg = f"{excinfo.type.__name__}: {excinfo.msg}" - else: - msg = excinfo.type.__name__ or excinfo.msg - - super().__init__(msg) - self.excinfo = excinfo - - def __str__(self) -> str: - try: - formatted = self.excinfo.errdisplay - except Exception: - return super().__str__() - else: - return dedent( - f""" - {super().__str__()} - - Uncaught in the interpreter: - - {formatted} - """.strip() - ) - - -class BusyResourceError(Exception): - """ - Raised when two tasks are trying to read from or write to the same resource - concurrently. - """ - - def __init__(self, action: str): - super().__init__(f"Another task is already {action} this resource") - - -class ClosedResourceError(Exception): - """Raised when trying to use a resource that has been closed.""" - - -class ConnectionFailed(OSError): - """ - Raised when a connection attempt fails. - - .. note:: This class inherits from :exc:`OSError` for backwards compatibility. - """ - - -def iterate_exceptions( - exception: BaseException, -) -> Generator[BaseException, None, None]: - if isinstance(exception, BaseExceptionGroup): - for exc in exception.exceptions: - yield from iterate_exceptions(exc) - else: - yield exception - - -class DelimiterNotFound(Exception): - """ - Raised during - :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_until` if the - maximum number of bytes has been read without the delimiter being found. - """ - - def __init__(self, max_bytes: int) -> None: - super().__init__( - f"The delimiter was not found among the first {max_bytes} bytes" - ) - - -class EndOfStream(Exception): - """ - Raised when trying to read from a stream that has been closed from the other end. - """ - - -class IncompleteRead(Exception): - """ - Raised during - :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_exactly` or - :meth:`~anyio.streams.buffered.BufferedByteReceiveStream.receive_until` if the - connection is closed before the requested amount of bytes has been read. - """ - - def __init__(self) -> None: - super().__init__( - "The stream was closed before the read operation could be completed" - ) - - -class TypedAttributeLookupError(LookupError): - """ - Raised by :meth:`~anyio.TypedAttributeProvider.extra` when the given typed attribute - is not found and no default value has been given. - """ - - -class WouldBlock(Exception): - """Raised by ``X_nowait`` functions if ``X()`` would block.""" - - -class NoEventLoopError(RuntimeError): - """ - Raised by several functions that require an event loop to be running in the current - thread when there is no running event loop. - - This is also raised by :func:`.from_thread.run` and :func:`.from_thread.run_sync` - if not calling from an AnyIO worker thread, and no ``token`` was passed. - """ - - -class RunFinishedError(RuntimeError): - """ - Raised by :func:`.from_thread.run` and :func:`.from_thread.run_sync` if the event - loop associated with the explicitly passed token has already finished. - """ - - def __init__(self) -> None: - super().__init__( - "The event loop associated with the given token has already finished" - ) - - -class TaskFailed(Exception): - """ - Raised when awaiting on, or attempting to access the return value of, a - :class:`.TaskHandle` that raised an exception. - """ - - -class TaskCancelled(TaskFailed): - """ - Raised when awaiting on, or attempting to access the return value of, a - :class:`.TaskHandle` that was cancelled. - """ - - -class TaskNotFinished(Exception): - """ - Raised when attempting to access the return value or exception of a - :class:`.TaskHandle` that is still pending completion. - """ - - -class FutureFailed(Exception): - """ - Raised when awaiting on, or attempting to access the return value of, a - :class:`.Future` that raised an exception. - """ - - -class FutureCancelled(FutureFailed): - """ - Raised when attempting to access the return value or exception of a - :class:`.Future` that was cancelled. - """ - - -class FutureNotFinished(Exception): - """ - Raised when attempting to access the return value or exception of a - :class:`.Future` that is still pending completion. - """ - - -class FutureAlreadyFinished(Exception): - """ - Raised when attempting set a result of or await a - :class:`.Future` that has already completed. - """ diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_fileio.py b/venv/lib/python3.11/site-packages/anyio/_core/_fileio.py deleted file mode 100755 index 498eef4..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_fileio.py +++ /dev/null @@ -1,1045 +0,0 @@ -from __future__ import annotations - -import os -import pathlib -import sys -from collections.abc import ( - AsyncIterator, - Callable, - Iterable, - Iterator, - Sequence, -) -from dataclasses import dataclass -from functools import partial -from os import PathLike -from typing import ( - IO, - TYPE_CHECKING, - Any, - AnyStr, - ClassVar, - Final, - Generic, - TypeVar, - overload, -) - -from .. import to_thread -from ..abc import AsyncResource -from ._synchronization import CapacityLimiter - -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing_extensions import Self - -if sys.version_info >= (3, 14): - from pathlib.types import PathInfo - -if TYPE_CHECKING: - from types import ModuleType - - from _typeshed import OpenBinaryMode, OpenTextMode, ReadableBuffer, WriteableBuffer -else: - ReadableBuffer = OpenBinaryMode = OpenTextMode = WriteableBuffer = object - - -T = TypeVar("T", bound="Path") - - -class AsyncFile(AsyncResource, Generic[AnyStr]): - """ - An asynchronous file object. - - This class wraps a standard file object and provides async friendly versions of the - following blocking methods (where available on the original file object): - - * read - * read1 - * readline - * readlines - * readinto - * readinto1 - * write - * writelines - * truncate - * seek - * tell - * flush - - All other methods are directly passed through. - - This class supports the asynchronous context manager protocol which closes the - underlying file at the end of the context block. - - This class also supports asynchronous iteration:: - - async with await open_file(...) as f: - async for line in f: - print(line) - """ - - def __init__( - self, fp: IO[AnyStr], *, limiter: CapacityLimiter | None = None - ) -> None: - if limiter is not None and not isinstance(limiter, CapacityLimiter): - raise TypeError( - f"limiter must be a CapacityLimiter or None, not " - f"{limiter.__class__.__name__}" - ) - - self._fp: Any = fp - self._limiter = limiter - - def __getattr__(self, name: str) -> object: - return getattr(self._fp, name) - - @property - def limiter(self) -> CapacityLimiter | None: - """The capacity limiter used by this file object, if not the global limiter.""" - return self._limiter - - @property - def wrapped(self) -> IO[AnyStr]: - """The wrapped file object.""" - return self._fp - - async def __aiter__(self) -> AsyncIterator[AnyStr]: - while True: - line = await self.readline() - if line: - yield line - else: - break - - async def aclose(self) -> None: - return await to_thread.run_sync(self._fp.close, limiter=self._limiter) - - async def read(self, size: int = -1) -> AnyStr: - return await to_thread.run_sync(self._fp.read, size, limiter=self._limiter) - - async def read1(self: AsyncFile[bytes], size: int = -1) -> bytes: - return await to_thread.run_sync(self._fp.read1, size, limiter=self._limiter) - - async def readline(self) -> AnyStr: - return await to_thread.run_sync(self._fp.readline, limiter=self._limiter) - - async def readlines(self) -> list[AnyStr]: - return await to_thread.run_sync(self._fp.readlines, limiter=self._limiter) - - async def readinto(self: AsyncFile[bytes], b: WriteableBuffer) -> int: - return await to_thread.run_sync(self._fp.readinto, b, limiter=self._limiter) - - async def readinto1(self: AsyncFile[bytes], b: WriteableBuffer) -> int: - return await to_thread.run_sync(self._fp.readinto1, b, limiter=self._limiter) - - @overload - async def write(self: AsyncFile[bytes], b: ReadableBuffer) -> int: ... - - @overload - async def write(self: AsyncFile[str], b: str) -> int: ... - - async def write(self, b: ReadableBuffer | str) -> int: - return await to_thread.run_sync(self._fp.write, b, limiter=self._limiter) - - @overload - async def writelines( - self: AsyncFile[bytes], lines: Iterable[ReadableBuffer] - ) -> None: ... - - @overload - async def writelines(self: AsyncFile[str], lines: Iterable[str]) -> None: ... - - async def writelines(self, lines: Iterable[ReadableBuffer] | Iterable[str]) -> None: - return await to_thread.run_sync( - self._fp.writelines, lines, limiter=self._limiter - ) - - async def truncate(self, size: int | None = None) -> int: - return await to_thread.run_sync(self._fp.truncate, size, limiter=self._limiter) - - async def seek(self, offset: int, whence: int | None = os.SEEK_SET) -> int: - return await to_thread.run_sync( - self._fp.seek, offset, whence, limiter=self._limiter - ) - - async def tell(self) -> int: - return await to_thread.run_sync(self._fp.tell, limiter=self._limiter) - - async def flush(self) -> None: - return await to_thread.run_sync(self._fp.flush, limiter=self._limiter) - - -@overload -async def open_file( - file: str | PathLike[str] | int, - mode: OpenBinaryMode, - buffering: int = ..., - encoding: str | None = ..., - errors: str | None = ..., - newline: str | None = ..., - closefd: bool = ..., - opener: Callable[[str, int], int] | None = ..., - *, - limiter: CapacityLimiter | None = ..., -) -> AsyncFile[bytes]: ... - - -@overload -async def open_file( - file: str | PathLike[str] | int, - mode: OpenTextMode = ..., - buffering: int = ..., - encoding: str | None = ..., - errors: str | None = ..., - newline: str | None = ..., - closefd: bool = ..., - opener: Callable[[str, int], int] | None = ..., - *, - limiter: CapacityLimiter | None = ..., -) -> AsyncFile[str]: ... - - -async def open_file( - file: str | PathLike[str] | int, - mode: str = "r", - buffering: int = -1, - encoding: str | None = None, - errors: str | None = None, - newline: str | None = None, - closefd: bool = True, - opener: Callable[[str, int], int] | None = None, - *, - limiter: CapacityLimiter | None = None, -) -> AsyncFile[Any]: - """ - Open a file asynchronously. - - Except for ``limiter``, the arguments are exactly the same as for the builtin :func:`open`. - - :param limiter: an optional capacity limiter to use with the file - instead of the default one - :return: an asynchronous file object - - .. versionchanged:: 4.14.0 - Added the ``limiter`` keyword argument. - - """ - fp = await to_thread.run_sync( - open, - file, - mode, - buffering, - encoding, - errors, - newline, - closefd, - opener, - limiter=limiter, - ) - return AsyncFile(fp, limiter=limiter) - - -def wrap_file( - file: IO[AnyStr], *, limiter: CapacityLimiter | None = None -) -> AsyncFile[AnyStr]: - """ - Wrap an existing file as an asynchronous file. - - :param file: an existing file-like object - :param limiter: an optional capacity limiter to use with the file - instead of the default one - :return: an asynchronous file object - - .. versionchanged:: 4.14.0 - Added the ``limiter`` keyword argument. - - """ - return AsyncFile(file, limiter=limiter) - - -@dataclass(eq=False) -class _PathIterator(AsyncIterator[T]): - iterator: Iterator[PathLike[str]] - limiter: CapacityLimiter | None - # This was added to ensure that iterating over a subclass of Path yields instances - # of that subclass rather than the base Path class. - path_cls: type[T] - - async def __anext__(self) -> T: - nextval = await to_thread.run_sync( - next, self.iterator, None, abandon_on_cancel=True, limiter=self.limiter - ) - if nextval is None: - raise StopAsyncIteration from None - - return self.path_cls(nextval, limiter=self.limiter) - - -class Path: - """ - An asynchronous version of :class:`pathlib.Path`. - - This class cannot be substituted for :class:`pathlib.Path` or - :class:`pathlib.PurePath`, but it is compatible with the :class:`os.PathLike` - interface. - - It implements the Python 3.10 version of :class:`pathlib.Path` interface, except for - the deprecated :meth:`~pathlib.Path.link_to` method. - - Some methods may be unavailable or have limited functionality, based on the Python - version: - - * :meth:`~pathlib.Path.copy` (available on Python 3.14 or later) - * :meth:`~pathlib.Path.copy_into` (available on Python 3.14 or later) - * :meth:`~pathlib.Path.from_uri` (available on Python 3.13 or later) - * :meth:`~pathlib.PurePath.full_match` (available on Python 3.13 or later) - * :attr:`~pathlib.Path.info` (available on Python 3.14 or later) - * :meth:`~pathlib.Path.is_junction` (available on Python 3.12 or later) - * :meth:`~pathlib.PurePath.match` (the ``case_sensitive`` parameter is only - available on Python 3.13 or later) - * :meth:`~pathlib.Path.move` (available on Python 3.14 or later) - * :meth:`~pathlib.Path.move_into` (available on Python 3.14 or later) - * :meth:`~pathlib.PurePath.relative_to` (the ``walk_up`` parameter is only available - on Python 3.12 or later) - * :meth:`~pathlib.Path.walk` (available on Python 3.12 or later) - - Any methods that do disk I/O need to be awaited on. These methods are: - - * :meth:`~pathlib.Path.absolute` - * :meth:`~pathlib.Path.chmod` - * :meth:`~pathlib.Path.cwd` - * :meth:`~pathlib.Path.exists` - * :meth:`~pathlib.Path.expanduser` - * :meth:`~pathlib.Path.group` - * :meth:`~pathlib.Path.hardlink_to` - * :meth:`~pathlib.Path.home` - * :meth:`~pathlib.Path.is_block_device` - * :meth:`~pathlib.Path.is_char_device` - * :meth:`~pathlib.Path.is_dir` - * :meth:`~pathlib.Path.is_fifo` - * :meth:`~pathlib.Path.is_file` - * :meth:`~pathlib.Path.is_junction` - * :meth:`~pathlib.Path.is_mount` - * :meth:`~pathlib.Path.is_socket` - * :meth:`~pathlib.Path.is_symlink` - * :meth:`~pathlib.Path.lchmod` - * :meth:`~pathlib.Path.lstat` - * :meth:`~pathlib.Path.mkdir` - * :meth:`~pathlib.Path.open` - * :meth:`~pathlib.Path.owner` - * :meth:`~pathlib.Path.read_bytes` - * :meth:`~pathlib.Path.read_text` - * :meth:`~pathlib.Path.readlink` - * :meth:`~pathlib.Path.rename` - * :meth:`~pathlib.Path.replace` - * :meth:`~pathlib.Path.resolve` - * :meth:`~pathlib.Path.rmdir` - * :meth:`~pathlib.Path.samefile` - * :meth:`~pathlib.Path.stat` - * :meth:`~pathlib.Path.symlink_to` - * :meth:`~pathlib.Path.touch` - * :meth:`~pathlib.Path.unlink` - * :meth:`~pathlib.Path.walk` - * :meth:`~pathlib.Path.write_bytes` - * :meth:`~pathlib.Path.write_text` - - Additionally, the following methods return an async iterator yielding - :class:`~.Path` objects: - - * :meth:`~pathlib.Path.glob` - * :meth:`~pathlib.Path.iterdir` - * :meth:`~pathlib.Path.rglob` - - .. versionchanged:: 4.14.0 - Added the ``limiter`` keyword argument. - """ - - __slots__ = "__weakref__", "_limiter", "_path" - - __weakref__: Any - - def __init__( - self, *args: str | PathLike[str], limiter: CapacityLimiter | None = None - ) -> None: - if limiter is not None and not isinstance(limiter, CapacityLimiter): - raise TypeError( - f"limiter must be a CapacityLimiter or None, not " - f"{limiter.__class__.__name__}" - ) - - self._path: Final[pathlib.Path] = pathlib.Path(*args) - self._limiter = limiter - - def __fspath__(self) -> str: - return self._path.__fspath__() - - if sys.version_info >= (3, 15): - - def __vfspath__(self) -> str: - return self._path.__vfspath__() - - def __str__(self) -> str: - return self._path.__str__() - - def __repr__(self) -> str: - return f"{self.__class__.__name__}({self.as_posix()!r})" - - def __bytes__(self) -> bytes: - return self._path.__bytes__() - - def __hash__(self) -> int: - return self._path.__hash__() - - def __eq__(self, other: object) -> bool: - target = other._path if isinstance(other, Path) else other - return self._path.__eq__(target) - - def __lt__(self, other: pathlib.PurePath | Path) -> bool: - target = other._path if isinstance(other, Path) else other - return self._path.__lt__(target) - - def __le__(self, other: pathlib.PurePath | Path) -> bool: - target = other._path if isinstance(other, Path) else other - return self._path.__le__(target) - - def __gt__(self, other: pathlib.PurePath | Path) -> bool: - target = other._path if isinstance(other, Path) else other - return self._path.__gt__(target) - - def __ge__(self, other: pathlib.PurePath | Path) -> bool: - target = other._path if isinstance(other, Path) else other - return self._path.__ge__(target) - - def __truediv__(self, other: str | PathLike[str]) -> Self: - return type(self)(self._path / other, limiter=self._limiter) - - def __rtruediv__(self, other: str | PathLike[str]) -> Self: - return type(self)(other, limiter=self._limiter) / self - - @property - def limiter(self) -> CapacityLimiter | None: - """The capacity limiter used by this path, if not the global limiter.""" - return self._limiter - - @property - def parts(self) -> tuple[str, ...]: - return self._path.parts - - @property - def drive(self) -> str: - return self._path.drive - - @property - def root(self) -> str: - return self._path.root - - @property - def anchor(self) -> str: - return self._path.anchor - - @property - def parents(self) -> Sequence[Self]: - return tuple(type(self)(p, limiter=self._limiter) for p in self._path.parents) - - @property - def parent(self) -> Self: - return type(self)(self._path.parent, limiter=self._limiter) - - @property - def name(self) -> str: - return self._path.name - - @property - def suffix(self) -> str: - return self._path.suffix - - @property - def suffixes(self) -> list[str]: - return self._path.suffixes - - @property - def stem(self) -> str: - return self._path.stem - - async def absolute(self) -> Self: - path = await to_thread.run_sync(self._path.absolute, limiter=self._limiter) - return type(self)(path, limiter=self._limiter) - - def as_posix(self) -> str: - return self._path.as_posix() - - def as_uri(self) -> str: - return self._path.as_uri() - - if sys.version_info >= (3, 13): - parser: ClassVar[ModuleType] = pathlib.Path.parser - - @classmethod - def from_uri(cls, uri: str, *, limiter: CapacityLimiter | None = None) -> Self: - return cls(pathlib.Path.from_uri(uri), limiter=limiter) - - def full_match( - self, path_pattern: str, *, case_sensitive: bool | None = None - ) -> bool: - return self._path.full_match(path_pattern, case_sensitive=case_sensitive) - - def match( - self, path_pattern: str, *, case_sensitive: bool | None = None - ) -> bool: - return self._path.match(path_pattern, case_sensitive=case_sensitive) - else: - - def match(self, path_pattern: str) -> bool: - return self._path.match(path_pattern) - - if sys.version_info >= (3, 14): - - @property - def info(self) -> PathInfo: - return self._path.info - - async def copy( - self, - target: str | os.PathLike[str], - *, - follow_symlinks: bool = True, - preserve_metadata: bool = False, - ) -> Self: - func = partial( - self._path.copy, - follow_symlinks=follow_symlinks, - preserve_metadata=preserve_metadata, - ) - return type(self)( - await to_thread.run_sync( - func, pathlib.Path(target), limiter=self._limiter - ), - limiter=self._limiter, - ) - - async def copy_into( - self, - target_dir: str | os.PathLike[str], - *, - follow_symlinks: bool = True, - preserve_metadata: bool = False, - ) -> Self: - func = partial( - self._path.copy_into, - follow_symlinks=follow_symlinks, - preserve_metadata=preserve_metadata, - ) - return type(self)( - await to_thread.run_sync( - func, pathlib.Path(target_dir), limiter=self._limiter - ), - limiter=self._limiter, - ) - - async def move(self, target: str | os.PathLike[str]) -> Self: - # Upstream does not handle anyio.Path properly as a PathLike - target = pathlib.Path(target) - return type(self)( - await to_thread.run_sync( - self._path.move, target, limiter=self._limiter - ), - limiter=self._limiter, - ) - - async def move_into( - self, - target_dir: str | os.PathLike[str], - ) -> Self: - return type(self)( - await to_thread.run_sync( - self._path.move_into, target_dir, limiter=self._limiter - ), - limiter=self._limiter, - ) - - def is_relative_to(self, other: str | PathLike[str]) -> bool: - try: - self.relative_to(other) - return True - except ValueError: - return False - - async def chmod(self, mode: int, *, follow_symlinks: bool = True) -> None: - func = partial(os.chmod, follow_symlinks=follow_symlinks) - return await to_thread.run_sync(func, self._path, mode, limiter=self._limiter) - - @classmethod - async def cwd(cls, *, limiter: CapacityLimiter | None = None) -> Self: - path = await to_thread.run_sync(pathlib.Path.cwd, limiter=limiter) - return cls(path, limiter=limiter) - - if sys.version_info >= (3, 12): - - async def exists(self, *, follow_symlinks: bool = True) -> bool: - return await to_thread.run_sync( - partial(self._path.exists, follow_symlinks=follow_symlinks), - abandon_on_cancel=True, - limiter=self._limiter, - ) - - else: - - async def exists(self) -> bool: - return await to_thread.run_sync( - self._path.exists, abandon_on_cancel=True, limiter=self._limiter - ) - - async def expanduser(self) -> Self: - return type(self)( - await to_thread.run_sync( - self._path.expanduser, abandon_on_cancel=True, limiter=self._limiter - ), - limiter=self._limiter, - ) - - if sys.version_info < (3, 12): - # Python 3.11 and earlier - def glob(self, pattern: str) -> AsyncIterator[Self]: - gen = self._path.glob(pattern) - return _PathIterator(gen, self._limiter, type(self)) - elif (3, 12) <= sys.version_info < (3, 13): - # changed in Python 3.12: - # - The case_sensitive parameter was added. - def glob( - self, - pattern: str, - *, - case_sensitive: bool | None = None, - ) -> AsyncIterator[Self]: - gen = self._path.glob(pattern, case_sensitive=case_sensitive) - return _PathIterator(gen, self._limiter, type(self)) - elif sys.version_info >= (3, 13): - # Changed in Python 3.13: - # - The recurse_symlinks parameter was added. - # - The pattern parameter accepts a path-like object. - def glob( # type: ignore[misc] # mypy doesn't allow for differing signatures in a conditional block - self, - pattern: str | PathLike[str], - *, - case_sensitive: bool | None = None, - recurse_symlinks: bool = False, - ) -> AsyncIterator[Self]: - gen = self._path.glob( - pattern, # type: ignore[arg-type] - case_sensitive=case_sensitive, - recurse_symlinks=recurse_symlinks, - ) - return _PathIterator(gen, self._limiter, type(self)) - - if sys.version_info >= (3, 13): - - async def group(self, *, follow_symlinks: bool = True) -> str: - return await to_thread.run_sync( - partial(self._path.group, follow_symlinks=follow_symlinks), - abandon_on_cancel=True, - limiter=self._limiter, - ) - - else: - - async def group(self) -> str: - return await to_thread.run_sync( - self._path.group, abandon_on_cancel=True, limiter=self._limiter - ) - - async def hardlink_to( - self, target: str | bytes | PathLike[str] | PathLike[bytes] - ) -> None: - if isinstance(target, Path): - target = target._path - - await to_thread.run_sync(os.link, target, self, limiter=self._limiter) - - @classmethod - async def home(cls, *, limiter: CapacityLimiter | None = None) -> Self: - home_path = await to_thread.run_sync(pathlib.Path.home, limiter=limiter) - return cls(home_path, limiter=limiter) - - def is_absolute(self) -> bool: - return self._path.is_absolute() - - async def is_block_device(self) -> bool: - return await to_thread.run_sync( - self._path.is_block_device, abandon_on_cancel=True, limiter=self._limiter - ) - - async def is_char_device(self) -> bool: - return await to_thread.run_sync( - self._path.is_char_device, abandon_on_cancel=True, limiter=self._limiter - ) - - if sys.version_info >= (3, 13): - - async def is_dir(self, *, follow_symlinks: bool = True) -> bool: - return await to_thread.run_sync( - partial(self._path.is_dir, follow_symlinks=follow_symlinks), - abandon_on_cancel=True, - limiter=self._limiter, - ) - - else: - - async def is_dir(self) -> bool: - return await to_thread.run_sync( - self._path.is_dir, abandon_on_cancel=True, limiter=self._limiter - ) - - async def is_fifo(self) -> bool: - return await to_thread.run_sync( - self._path.is_fifo, abandon_on_cancel=True, limiter=self._limiter - ) - - if sys.version_info >= (3, 13): - - async def is_file(self, *, follow_symlinks: bool = True) -> bool: - return await to_thread.run_sync( - partial(self._path.is_file, follow_symlinks=follow_symlinks), - abandon_on_cancel=True, - limiter=self._limiter, - ) - - else: - - async def is_file(self) -> bool: - return await to_thread.run_sync( - self._path.is_file, abandon_on_cancel=True, limiter=self._limiter - ) - - if sys.version_info >= (3, 12): - - async def is_junction(self) -> bool: - return await to_thread.run_sync( - self._path.is_junction, limiter=self._limiter - ) - - async def is_mount(self) -> bool: - return await to_thread.run_sync( - os.path.ismount, self._path, abandon_on_cancel=True, limiter=self._limiter - ) - - if sys.version_info < (3, 15): - - def is_reserved(self) -> bool: - return self._path.is_reserved() - - async def is_socket(self) -> bool: - return await to_thread.run_sync( - self._path.is_socket, abandon_on_cancel=True, limiter=self._limiter - ) - - async def is_symlink(self) -> bool: - return await to_thread.run_sync( - self._path.is_symlink, abandon_on_cancel=True, limiter=self._limiter - ) - - async def iterdir(self) -> AsyncIterator[Self]: - gen = ( - self._path.iterdir() - if sys.version_info < (3, 13) - else await to_thread.run_sync( - self._path.iterdir, abandon_on_cancel=True, limiter=self._limiter - ) - ) - async for path in _PathIterator(gen, self._limiter, type(self)): - yield path - - def joinpath(self, *args: str | PathLike[str]) -> Self: - return type(self)(self._path.joinpath(*args), limiter=self._limiter) - - async def lchmod(self, mode: int) -> None: - await to_thread.run_sync(self._path.lchmod, mode, limiter=self._limiter) - - async def lstat(self) -> os.stat_result: - return await to_thread.run_sync( - self._path.lstat, abandon_on_cancel=True, limiter=self._limiter - ) - - async def mkdir( - self, mode: int = 0o777, parents: bool = False, exist_ok: bool = False - ) -> None: - await to_thread.run_sync( - self._path.mkdir, mode, parents, exist_ok, limiter=self._limiter - ) - - @overload - async def open( - self, - mode: OpenBinaryMode, - buffering: int = ..., - encoding: str | None = ..., - errors: str | None = ..., - newline: str | None = ..., - ) -> AsyncFile[bytes]: ... - - @overload - async def open( - self, - mode: OpenTextMode = ..., - buffering: int = ..., - encoding: str | None = ..., - errors: str | None = ..., - newline: str | None = ..., - ) -> AsyncFile[str]: ... - - async def open( - self, - mode: str = "r", - buffering: int = -1, - encoding: str | None = None, - errors: str | None = None, - newline: str | None = None, - ) -> AsyncFile[Any]: - fp = await to_thread.run_sync( - self._path.open, - mode, - buffering, - encoding, - errors, - newline, - limiter=self._limiter, - ) - return AsyncFile(fp, limiter=self._limiter) - - if sys.version_info >= (3, 13): - - async def owner(self, *, follow_symlinks: bool = True) -> str: - return await to_thread.run_sync( - partial(self._path.owner, follow_symlinks=follow_symlinks), - abandon_on_cancel=True, - limiter=self._limiter, - ) - - else: - - async def owner(self) -> str: - return await to_thread.run_sync( - self._path.owner, abandon_on_cancel=True, limiter=self._limiter - ) - - async def read_bytes(self) -> bytes: - return await to_thread.run_sync(self._path.read_bytes, limiter=self._limiter) - - if sys.version_info >= (3, 13): - - async def read_text( - self, - encoding: str | None = None, - errors: str | None = None, - newline: str | None = None, - ) -> str: - return await to_thread.run_sync( - self._path.read_text, - encoding, - errors, - newline, - limiter=self._limiter, - ) - - else: - - async def read_text( - self, encoding: str | None = None, errors: str | None = None - ) -> str: - return await to_thread.run_sync( - self._path.read_text, encoding, errors, limiter=self._limiter - ) - - if sys.version_info >= (3, 12): - - def relative_to( - self, *other: str | PathLike[str], walk_up: bool = False - ) -> Self: - # relative_to() should work with any PathLike but it doesn't - others = [pathlib.Path(other) for other in other] - return type(self)( - self._path.relative_to(*others, walk_up=walk_up), limiter=self._limiter - ) - - else: - - def relative_to(self, *other: str | PathLike[str]) -> Self: - return type(self)(self._path.relative_to(*other), limiter=self._limiter) - - async def readlink(self) -> Self: - target = await to_thread.run_sync( - os.readlink, self._path, limiter=self._limiter - ) - return type(self)(target, limiter=self._limiter) - - async def rename(self, target: str | pathlib.PurePath | Path) -> Self: - if isinstance(target, Path): - target = target._path - - await to_thread.run_sync(self._path.rename, target, limiter=self._limiter) - return type(self)(target, limiter=self._limiter) - - async def replace(self, target: str | pathlib.PurePath | Path) -> Self: - if isinstance(target, Path): - target = target._path - - await to_thread.run_sync(self._path.replace, target, limiter=self._limiter) - return type(self)(target, limiter=self._limiter) - - async def resolve(self, strict: bool = False) -> Self: - func = partial(self._path.resolve, strict=strict) - return type(self)( - await to_thread.run_sync( - func, abandon_on_cancel=True, limiter=self._limiter - ), - limiter=self._limiter, - ) - - if sys.version_info < (3, 12): - # Pre Python 3.12 - def rglob(self, pattern: str) -> AsyncIterator[Self]: - gen = self._path.rglob(pattern) - return _PathIterator(gen, self._limiter, type(self)) - elif (3, 12) <= sys.version_info < (3, 13): - # Changed in Python 3.12: - # - The case_sensitive parameter was added. - def rglob( - self, pattern: str, *, case_sensitive: bool | None = None - ) -> AsyncIterator[Self]: - gen = self._path.rglob(pattern, case_sensitive=case_sensitive) - return _PathIterator(gen, self._limiter, type(self)) - elif sys.version_info >= (3, 13): - # Changed in Python 3.13: - # - The recurse_symlinks parameter was added. - # - The pattern parameter accepts a path-like object. - def rglob( # type: ignore[misc] # mypy doesn't allow for differing signatures in a conditional block - self, - pattern: str | PathLike[str], - *, - case_sensitive: bool | None = None, - recurse_symlinks: bool = False, - ) -> AsyncIterator[Self]: - gen = self._path.rglob( - pattern, # type: ignore[arg-type] - case_sensitive=case_sensitive, - recurse_symlinks=recurse_symlinks, - ) - return _PathIterator(gen, self._limiter, type(self)) - - async def rmdir(self) -> None: - await to_thread.run_sync(self._path.rmdir, limiter=self._limiter) - - async def samefile(self, other_path: str | PathLike[str]) -> bool: - if isinstance(other_path, Path): - other_path = other_path._path - - return await to_thread.run_sync( - self._path.samefile, - other_path, - abandon_on_cancel=True, - limiter=self._limiter, - ) - - async def stat(self, *, follow_symlinks: bool = True) -> os.stat_result: - func = partial(os.stat, follow_symlinks=follow_symlinks) - return await to_thread.run_sync( - func, self._path, abandon_on_cancel=True, limiter=self._limiter - ) - - async def symlink_to( - self, - target: str | bytes | PathLike[str] | PathLike[bytes], - target_is_directory: bool = False, - ) -> None: - if isinstance(target, Path): - target = target._path - - await to_thread.run_sync( - self._path.symlink_to, target, target_is_directory, limiter=self._limiter - ) - - async def touch(self, mode: int = 0o666, exist_ok: bool = True) -> None: - await to_thread.run_sync( - self._path.touch, mode, exist_ok, limiter=self._limiter - ) - - async def unlink(self, missing_ok: bool = False) -> None: - try: - await to_thread.run_sync(self._path.unlink, limiter=self._limiter) - except FileNotFoundError: - if not missing_ok: - raise - - if sys.version_info >= (3, 12): - - async def walk( - self, - top_down: bool = True, - on_error: Callable[[OSError], object] | None = None, - follow_symlinks: bool = False, - ) -> AsyncIterator[tuple[Self, list[str], list[str]]]: - def get_next_value() -> tuple[pathlib.Path, list[str], list[str]] | None: - try: - return next(gen) - except StopIteration: - return None - - gen = self._path.walk(top_down, on_error, follow_symlinks) - while True: - value = await to_thread.run_sync(get_next_value, limiter=self._limiter) - if value is None: - return - - root, dirs, paths = value - yield type(self)(root, limiter=self._limiter), dirs, paths - - def with_name(self, name: str) -> Self: - return type(self)(self._path.with_name(name), limiter=self._limiter) - - if sys.version_info < (3, 13): - # Backport pathlib's Python>=3.13 behavior for empty stems on paths with non-empty suffixes. - # See: https://github.com/python/cpython/pull/114612 - def with_stem(self, stem: str) -> Self: - suffix = self._path.suffix - if not suffix: - return self.with_name(stem) - elif not stem: - # If the suffix is non-empty, we can't make the stem empty. - raise ValueError(f"{self!r} has a non-empty suffix") - else: - return self.with_name(stem + suffix) - else: - - def with_stem(self, stem: str) -> Self: - return type(self)(self._path.with_stem(stem), limiter=self._limiter) - - def with_suffix(self, suffix: str) -> Self: - return type(self)(self._path.with_suffix(suffix), limiter=self._limiter) - - def with_segments(self, *pathsegments: str | PathLike[str]) -> Self: - return type(self)(*pathsegments, limiter=self._limiter) - - async def write_bytes(self, data: ReadableBuffer) -> int: - return await to_thread.run_sync( - self._path.write_bytes, data, limiter=self._limiter - ) - - async def write_text( - self, - data: str, - encoding: str | None = None, - errors: str | None = None, - newline: str | None = None, - ) -> int: - return await to_thread.run_sync( - self._path.write_text, - data, - encoding, - errors, - newline, - limiter=self._limiter, - ) - - -PathLike.register(Path) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_futures.py b/venv/lib/python3.11/site-packages/anyio/_core/_futures.py deleted file mode 100755 index 7730c53..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_futures.py +++ /dev/null @@ -1,191 +0,0 @@ -from __future__ import annotations - -from collections.abc import Generator -from enum import Enum, auto -from typing import Any, Generic, TypeVar - -from ._exceptions import ( - FutureAlreadyFinished, - FutureCancelled, - FutureFailed, - FutureNotFinished, -) -from ._synchronization import Event - -T = TypeVar("T") - - -class Future(Generic[T]): - """ - An awaitable object that works similar to a :class:`asyncio.Future` but - with similar characteristics to a :class:`.TaskHandle`. - """ - - class Status(Enum): - """ - The status of a future handle. - - .. attribute:: PENDING - - The future has not finished yet. - .. attribute:: FINISHED - - The future has finished with a return value. - .. attribute:: CANCELLED - - The future was cancelled and has finished since. - .. attribute:: FAILED - - The future raised an exception. - """ - - PENDING = auto() - FINISHED = auto() - CANCELLED = auto() - FAILED = auto() - - __slots__ = ( - "_cancelled", - "_exception", - "_finished_event", - "_name", - "_return_value", - ) - _return_value: T - - def __init__(self, *, name: str | None = None) -> None: - self._finished_event = Event() - self._exception: BaseException | None = None - self._cancelled: bool = False - self._name = name - - def _check_pending(self) -> None: - """Shortcut for checking if a Future is pending - - :raises FutureAlreadyFinished: if future was already given a result or exception. - :raises FutureCancelled: if future has been cancelled previously. - """ - match self.status: - case Future.Status.PENDING: - return - case Future.Status.FINISHED: - raise FutureAlreadyFinished("future has already finished") - case Future.Status.FAILED: - raise FutureAlreadyFinished("future already failed") - case Future.Status.CANCELLED: - raise FutureCancelled("future was cancelled") - - async def wait(self) -> None: - """ - Waits for the future to finish. - - This method will attempt to wait for a result or exception - """ - await self._finished_event.wait() - - def cancel(self) -> None: - """Cancels a pending `.Future` object - - Does nothing if the Future was already finished. - """ - if self.status is Future.Status.PENDING: - self._cancelled = True - self._finished_event.set() - - @property - def exception(self) -> BaseException | None: - """ - The exception value of a `.Future` - - :raises FutureNotFinished: if future is still pending - :raises FutureCancelled: if future was cancelled - :returns: None if future succeeds with a result sent instead - otherwise this will be an exception - """ - - match self.status: - case Future.Status.PENDING: - raise FutureNotFinished("the future has not finished yet") - case Future.Status.FINISHED: - return None - case Future.Status.CANCELLED: - raise FutureCancelled("the future was cancelled") - case Future.Status.FAILED: - return self._exception - - @exception.setter - def exception(self, exception: BaseException) -> None: - """Send exception for a `.Future` object - - :raises FutureAlreadyFinished: if future was already given a result or exception. - :raises FutureCancelled: if future has been cancelled previously. - """ - self._check_pending() - self._exception = exception - self._finished_event.set() - - @property - def return_value(self) -> T: - """ - The return value of the future. - - :raises FutureNotFinished: if the future has not finished yet - :raises FutureCancelled: if the future was cancelled - :raises FutureFailed: if the future raised an exception - - """ - match self.status: - case Future.Status.PENDING: - raise FutureNotFinished("the future has not finished yet") - case Future.Status.FINISHED: - return self._return_value - case Future.Status.CANCELLED: - raise FutureCancelled("the future was cancelled") - case Future.Status.FAILED: - raise FutureFailed( - "the future raised an exception" - ) from self._exception - - @return_value.setter - def return_value(self, value: T) -> None: - """ - Send pending result for a `.Future` object - - :raises FutureAlreadyFinished: if future was already given a result or exception. - :raises FutureCancelled: if future has been cancelled previously. - """ - self._check_pending() - self._return_value = value - self._finished_event.set() - - @property - def status(self) -> Future.Status: - """ - The current status of a future. - - Every future starts in the :attr:`~Future.Status.PENDING` state. - If a future is cancelled while in this state, it will transition to the - :attr:`Future.Status.CANCELLED` state. When the task finishes, it will - transition to one of the three final states ( - :attr:`Future.Status.FINISHED`, :attr:`Future.Status.FAILED`, or - :attr:`Future.Status.CANCELLED`) depending on the exception the task - raised, if any. No other status transitions will happen. - """ - if not self._finished_event.is_set(): - return Future.Status.PENDING - elif self._cancelled: - return Future.Status.CANCELLED - elif self._exception is not None: - return Future.Status.FAILED - else: - return Future.Status.FINISHED - - def __await__(self) -> Generator[Any, Any, T]: - yield from self.wait().__await__() - return self.return_value - - def __repr__(self) -> str: - return ( - f"<{self.__class__.__name__} {self.status.name.lower()} " - f"name={self._name!r}>" - ) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_resources.py b/venv/lib/python3.11/site-packages/anyio/_core/_resources.py deleted file mode 100755 index 6ca35d9..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_resources.py +++ /dev/null @@ -1,18 +0,0 @@ -from __future__ import annotations - -from ..abc import AsyncResource # noqa: TC001 -from ._tasks import CancelScope - - -async def aclose_forcefully(resource: AsyncResource) -> None: - """ - Close an asynchronous resource in a cancelled scope. - - Doing this closes the resource without waiting on anything. - - :param resource: the resource to close - - """ - with CancelScope() as scope: - scope.cancel() - await resource.aclose() diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_signals.py b/venv/lib/python3.11/site-packages/anyio/_core/_signals.py deleted file mode 100755 index e24c79e..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_signals.py +++ /dev/null @@ -1,29 +0,0 @@ -from __future__ import annotations - -from collections.abc import AsyncIterator -from contextlib import AbstractContextManager -from signal import Signals - -from ._eventloop import get_async_backend - - -def open_signal_receiver( - *signals: Signals, -) -> AbstractContextManager[AsyncIterator[Signals]]: - """ - Start receiving operating system signals. - - :param signals: signals to receive (e.g. ``signal.SIGINT``) - :return: an asynchronous context manager for an asynchronous iterator which yields - signal numbers - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - .. warning:: Windows does not support signals natively so it is best to avoid - relying on this in cross-platform applications. - - .. warning:: On asyncio, this permanently replaces any previous signal handler for - the given signals, as set via :meth:`~asyncio.loop.add_signal_handler`. - - """ - return get_async_backend().open_signal_receiver(*signals) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_sockets.py b/venv/lib/python3.11/site-packages/anyio/_core/_sockets.py deleted file mode 100755 index 14ee6e4..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_sockets.py +++ /dev/null @@ -1,1011 +0,0 @@ -from __future__ import annotations - -import errno -import os -import socket -import ssl -import stat -import sys -from collections.abc import Awaitable -from dataclasses import dataclass -from ipaddress import IPv4Address, IPv6Address, ip_address -from os import PathLike, chmod -from socket import AddressFamily, SocketKind -from typing import TYPE_CHECKING, Any, Literal, cast, overload - -from .. import ConnectionFailed, to_thread -from ..abc import ( - ByteStreamConnectable, - ConnectedUDPSocket, - ConnectedUNIXDatagramSocket, - IPAddressType, - IPSockAddrType, - SocketListener, - SocketStream, - UDPSocket, - UNIXDatagramSocket, - UNIXSocketStream, -) -from ..streams.stapled import MultiListener -from ..streams.tls import TLSConnectable, TLSStream -from ._eventloop import get_async_backend -from ._resources import aclose_forcefully -from ._synchronization import Event -from ._tasks import create_task_group, move_on_after - -if TYPE_CHECKING: - from _typeshed import FileDescriptorLike -else: - FileDescriptorLike = object - -if sys.version_info < (3, 11): - from exceptiongroup import ExceptionGroup - -if sys.version_info >= (3, 12): - from typing import override -else: - from typing_extensions import override - -if sys.version_info < (3, 13): - from typing_extensions import deprecated -else: - from warnings import deprecated - -IPPROTO_IPV6 = getattr(socket, "IPPROTO_IPV6", 41) # https://bugs.python.org/issue29515 - -AnyIPAddressFamily = Literal[ - AddressFamily.AF_UNSPEC, AddressFamily.AF_INET, AddressFamily.AF_INET6 -] -IPAddressFamily = Literal[AddressFamily.AF_INET, AddressFamily.AF_INET6] - - -def idna2008_resolve(host: str) -> bytes: - try: - return host.encode("ascii") - except UnicodeEncodeError: - import idna - - return idna.encode(host, uts46=True) - - -# tls_hostname given -@overload -async def connect_tcp( - remote_host: IPAddressType, - remote_port: int, - *, - local_host: IPAddressType | None = ..., - local_port: int | None = ..., - ssl_context: ssl.SSLContext | None = ..., - tls_standard_compatible: bool = ..., - tls_hostname: str, - happy_eyeballs_delay: float = ..., -) -> TLSStream: ... - - -# ssl_context given -@overload -async def connect_tcp( - remote_host: IPAddressType, - remote_port: int, - *, - local_host: IPAddressType | None = ..., - local_port: int | None = ..., - ssl_context: ssl.SSLContext, - tls_standard_compatible: bool = ..., - tls_hostname: str | None = ..., - happy_eyeballs_delay: float = ..., -) -> TLSStream: ... - - -# tls=True -@overload -async def connect_tcp( - remote_host: IPAddressType, - remote_port: int, - *, - local_host: IPAddressType | None = ..., - local_port: int | None = ..., - tls: Literal[True], - ssl_context: ssl.SSLContext | None = ..., - tls_standard_compatible: bool = ..., - tls_hostname: str | None = ..., - happy_eyeballs_delay: float = ..., -) -> TLSStream: ... - - -# tls=False -@overload -async def connect_tcp( - remote_host: IPAddressType, - remote_port: int, - *, - local_host: IPAddressType | None = ..., - local_port: int | None = ..., - tls: Literal[False], - ssl_context: ssl.SSLContext | None = ..., - tls_standard_compatible: bool = ..., - tls_hostname: str | None = ..., - happy_eyeballs_delay: float = ..., -) -> SocketStream: ... - - -# No TLS arguments -@overload -async def connect_tcp( - remote_host: IPAddressType, - remote_port: int, - *, - local_host: IPAddressType | None = ..., - local_port: int | None = ..., - happy_eyeballs_delay: float = ..., -) -> SocketStream: ... - - -async def connect_tcp( - remote_host: IPAddressType, - remote_port: int, - *, - local_host: IPAddressType | None = None, - local_port: int | None = None, - tls: bool = False, - ssl_context: ssl.SSLContext | None = None, - tls_standard_compatible: bool = True, - tls_hostname: str | None = None, - happy_eyeballs_delay: float = 0.25, -) -> SocketStream | TLSStream: - """ - Connect to a host using the TCP protocol. - - This function implements the stateless version of the Happy Eyeballs algorithm (RFC - 6555). If ``remote_host`` is a host name that resolves to multiple IP addresses, - each one is tried until one connection attempt succeeds. If the first attempt does - not connected within 250 milliseconds, a second attempt is started using the next - address in the list, and so on. On IPv6 enabled systems, an IPv6 address (if - available) is tried first. - - When the connection has been established, a TLS handshake will be done if either - ``ssl_context`` or ``tls_hostname`` is not ``None``, or if ``tls`` is ``True``. - - :param remote_host: the IP address or host name to connect to - :param remote_port: port on the target host to connect to - :param local_host: the interface address or name to bind the socket to before - connecting - :param local_port: the local port to bind to (requires ``local_host`` to also be - set) - :param tls: ``True`` to do a TLS handshake with the connected stream and return a - :class:`~anyio.streams.tls.TLSStream` instead - :param ssl_context: the SSL context object to use (if omitted, a default context is - created) - :param tls_standard_compatible: If ``True``, performs the TLS shutdown handshake - before closing the stream and requires that the server does this as well. - Otherwise, :exc:`~ssl.SSLEOFError` may be raised during reads from the stream. - Some protocols, such as HTTP, require this option to be ``False``. - See :meth:`~ssl.SSLContext.wrap_socket` for details. - :param tls_hostname: host name to check the server certificate against (defaults to - the value of ``remote_host``) - :param happy_eyeballs_delay: delay (in seconds) before starting the next connection - attempt - :return: a socket stream object if no TLS handshake was done, otherwise a TLS stream - :raises ConnectionFailed: if the connection fails - - """ - # Placed here due to https://github.com/python/mypy/issues/7057 - connected_stream: SocketStream | None = None - - async def try_connect(remote_host: str, event: Event) -> None: - nonlocal connected_stream - try: - stream = await asynclib.connect_tcp(remote_host, remote_port, local_address) - except OSError as exc: - oserrors.append(exc) - return - else: - if connected_stream is None: - connected_stream = stream - tg.cancel_scope.cancel() - else: - await stream.aclose() - finally: - event.set() - - asynclib = get_async_backend() - local_address: IPSockAddrType | None = None - family = socket.AF_UNSPEC - if local_host: - gai_res = await getaddrinfo(str(local_host), local_port) - family, *_, local_address = gai_res[0] - - target_host = str(remote_host) - try: - addr_obj = ip_address(remote_host) - except ValueError: - addr_obj = None - - if addr_obj is not None: - if isinstance(addr_obj, IPv6Address): - target_addrs = [(socket.AF_INET6, addr_obj.compressed)] - else: - target_addrs = [(socket.AF_INET, addr_obj.compressed)] - else: - # getaddrinfo() will raise an exception if name resolution fails - gai_res = await getaddrinfo( - target_host, remote_port, family=family, type=socket.SOCK_STREAM - ) - - # Organize the list so that the first address is an IPv6 address (if available) - # and the second one is an IPv4 addresses. The rest can be in whatever order. - v6_found = v4_found = False - target_addrs = [] - for af, *_, sa in gai_res: - if af == socket.AF_INET6 and not v6_found: - v6_found = True - target_addrs.insert(0, (af, sa[0])) - elif af == socket.AF_INET and not v4_found and v6_found: - v4_found = True - target_addrs.insert(1, (af, sa[0])) - else: - target_addrs.append((af, sa[0])) - - oserrors: list[OSError] = [] - try: - async with create_task_group() as tg: - for _af, addr in target_addrs: - event = Event() - tg.start_soon(try_connect, addr, event) - with move_on_after(happy_eyeballs_delay): - await event.wait() - - if connected_stream is None: - cause = ( - oserrors[0] - if len(oserrors) == 1 - else ExceptionGroup("multiple connection attempts failed", oserrors) - ) - raise OSError("All connection attempts failed") from cause - finally: - oserrors.clear() - - if tls or tls_hostname or ssl_context: - try: - return await TLSStream.wrap( - connected_stream, - server_side=False, - hostname=tls_hostname or str(remote_host), - ssl_context=ssl_context, - standard_compatible=tls_standard_compatible, - ) - except BaseException: - await aclose_forcefully(connected_stream) - raise - - return connected_stream - - -async def connect_unix(path: str | bytes | PathLike[Any]) -> UNIXSocketStream: - """ - Connect to the given UNIX socket. - - Not available on Windows. - - :param path: path to the socket - :return: a socket stream object - :raises ConnectionFailed: if the connection fails - - """ - path = os.fspath(path) - return await get_async_backend().connect_unix(path) - - -async def create_tcp_listener( - *, - local_host: IPAddressType | None = None, - local_port: int = 0, - family: AnyIPAddressFamily = socket.AddressFamily.AF_UNSPEC, - backlog: int = 65536, - reuse_port: bool = False, -) -> MultiListener[SocketStream]: - """ - Create a TCP socket listener. - - :param local_port: port number to listen on - :param local_host: IP address of the interface to listen on. If omitted, listen on - all IPv4 and IPv6 interfaces. To listen on all interfaces on a specific address - family, use ``0.0.0.0`` for IPv4 or ``::`` for IPv6. - :param family: address family (used if ``local_host`` was omitted) - :param backlog: maximum number of queued incoming connections (up to a maximum of - 2**16, or 65536) - :param reuse_port: ``True`` to allow multiple sockets to bind to the same - address/port (not supported on Windows) - :return: a multi-listener object containing one or more socket listeners - :raises OSError: if there's an error creating a socket, or binding to one or more - interfaces failed - - """ - asynclib = get_async_backend() - backlog = min(backlog, 65536) - local_host = str(local_host) if local_host is not None else None - - def setup_raw_socket( - fam: AddressFamily, - bind_addr: tuple[str, int] | tuple[str, int, int, int], - *, - v6only: bool = True, - ) -> socket.socket: - sock = socket.socket(fam) - try: - sock.setblocking(False) - - if fam == AddressFamily.AF_INET6: - sock.setsockopt(IPPROTO_IPV6, socket.IPV6_V6ONLY, v6only) - - # For Windows, enable exclusive address use. For others, enable address - # reuse. - if sys.platform == "win32": - sock.setsockopt(socket.SOL_SOCKET, socket.SO_EXCLUSIVEADDRUSE, 1) - else: - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - - if reuse_port: - sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) - - # Workaround for #554 - if fam == socket.AF_INET6 and "%" in bind_addr[0]: - addr, scope_id = bind_addr[0].split("%", 1) - bind_addr = (addr, bind_addr[1], 0, int(scope_id)) - - sock.bind(bind_addr) - sock.listen(backlog) - except BaseException: - sock.close() - raise - - return sock - - # We passing type=0 on non-Windows platforms as a workaround for a uvloop bug - # where we don't get the correct scope ID for IPv6 link-local addresses when passing - # type=socket.SOCK_STREAM to getaddrinfo(): - # https://github.com/MagicStack/uvloop/issues/539 - gai_res = await getaddrinfo( - local_host, - local_port, - family=family, - type=socket.SOCK_STREAM if sys.platform == "win32" else 0, - flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, - ) - - # The set comprehension is here to work around a glibc bug: - # https://sourceware.org/bugzilla/show_bug.cgi?id=14969 - sockaddrs = sorted({res for res in gai_res if res[1] == SocketKind.SOCK_STREAM}) - - # Special case for dual-stack binding on the "any" interface - if ( - local_host is None - and family == AddressFamily.AF_UNSPEC - and socket.has_dualstack_ipv6() - and any(fam == AddressFamily.AF_INET6 for fam, *_ in gai_res) - ): - raw_socket = setup_raw_socket( - AddressFamily.AF_INET6, ("::", local_port), v6only=False - ) - listener = asynclib.create_tcp_listener(raw_socket) - return MultiListener([listener]) - - errors: list[OSError] = [] - try: - for _ in range(len(sockaddrs)): - listeners: list[SocketListener] = [] - bound_ephemeral_port = local_port - try: - for fam, *_, sockaddr in sockaddrs: - sockaddr = sockaddr[0], bound_ephemeral_port, *sockaddr[2:] - raw_socket = setup_raw_socket(fam, sockaddr) - - # Store the assigned port if an ephemeral port was requested, so - # we'll bind to the same port on all interfaces - if local_port == 0 and len(gai_res) > 1: - bound_ephemeral_port = raw_socket.getsockname()[1] - - listeners.append(asynclib.create_tcp_listener(raw_socket)) - except BaseException as exc: - for listener in listeners: - await listener.aclose() - - # If an ephemeral port was requested but binding the assigned port - # failed for another interface, rotate the address list and try again - if ( - isinstance(exc, OSError) - and exc.errno == errno.EADDRINUSE - and local_port == 0 - and bound_ephemeral_port - ): - errors.append(exc) - sockaddrs.append(sockaddrs.pop(0)) - continue - - raise - - return MultiListener(listeners) - - raise OSError( - f"Could not create {len(sockaddrs)} listeners with a consistent port" - ) from ExceptionGroup("Several bind attempts failed", errors) - finally: - del errors # Prevent reference cycles - - -async def create_unix_listener( - path: str | bytes | PathLike[Any], - *, - mode: int | None = None, - backlog: int = 65536, -) -> SocketListener: - """ - Create a UNIX socket listener. - - Not available on Windows. - - :param path: path of the socket - :param mode: permissions to set on the socket - :param backlog: maximum number of queued incoming connections (up to a maximum of - 2**16, or 65536) - :return: a listener object - - .. versionchanged:: 3.0 - If a socket already exists on the file system in the given path, it will be - removed first. - - """ - backlog = min(backlog, 65536) - raw_socket = await setup_unix_local_socket(path, mode, socket.SOCK_STREAM) - try: - raw_socket.listen(backlog) - return get_async_backend().create_unix_listener(raw_socket) - except BaseException: - raw_socket.close() - raise - - -async def create_udp_socket( - family: AnyIPAddressFamily = AddressFamily.AF_UNSPEC, - *, - local_host: IPAddressType | None = None, - local_port: int = 0, - reuse_port: bool = False, -) -> UDPSocket: - """ - Create a UDP socket. - - If ``port`` has been given, the socket will be bound to this port on the local - machine, making this socket suitable for providing UDP based services. - - :param family: address family (``AF_INET`` or ``AF_INET6``) – automatically - determined from ``local_host`` if omitted - :param local_host: IP address or host name of the local interface to bind to - :param local_port: local port to bind to - :param reuse_port: ``True`` to allow multiple sockets to bind to the same - address/port (not supported on Windows) - :return: a UDP socket - - """ - if family is AddressFamily.AF_UNSPEC and not local_host: - raise ValueError('Either "family" or "local_host" must be given') - - if local_host: - gai_res = await getaddrinfo( - str(local_host), - local_port, - family=family, - type=socket.SOCK_DGRAM, - flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, - ) - family = cast(AnyIPAddressFamily, gai_res[0][0]) - local_address = gai_res[0][-1] - elif family is AddressFamily.AF_INET6: - local_address = ("::", 0) - else: - local_address = ("0.0.0.0", 0) - - sock = await get_async_backend().create_udp_socket( - family, local_address, None, reuse_port - ) - return cast(UDPSocket, sock) - - -async def create_connected_udp_socket( - remote_host: IPAddressType, - remote_port: int, - *, - family: AnyIPAddressFamily = AddressFamily.AF_UNSPEC, - local_host: IPAddressType | None = None, - local_port: int = 0, - reuse_port: bool = False, -) -> ConnectedUDPSocket: - """ - Create a connected UDP socket. - - Connected UDP sockets can only communicate with the specified remote host/port, an - any packets sent from other sources are dropped. - - :param remote_host: remote host to set as the default target - :param remote_port: port on the remote host to set as the default target - :param family: address family (``AF_INET`` or ``AF_INET6``) – automatically - determined from ``local_host`` or ``remote_host`` if omitted - :param local_host: IP address or host name of the local interface to bind to - :param local_port: local port to bind to - :param reuse_port: ``True`` to allow multiple sockets to bind to the same - address/port (not supported on Windows) - :return: a connected UDP socket - - """ - local_address = None - if local_host: - gai_res = await getaddrinfo( - str(local_host), - local_port, - family=family, - type=socket.SOCK_DGRAM, - flags=socket.AI_PASSIVE | socket.AI_ADDRCONFIG, - ) - family = cast(AnyIPAddressFamily, gai_res[0][0]) - local_address = gai_res[0][-1] - - gai_res = await getaddrinfo( - str(remote_host), remote_port, family=family, type=socket.SOCK_DGRAM - ) - family = cast(AnyIPAddressFamily, gai_res[0][0]) - remote_address = gai_res[0][-1] - - sock = await get_async_backend().create_udp_socket( - family, local_address, remote_address, reuse_port - ) - return cast(ConnectedUDPSocket, sock) - - -async def create_unix_datagram_socket( - *, - local_path: None | str | bytes | PathLike[Any] = None, - local_mode: int | None = None, -) -> UNIXDatagramSocket: - """ - Create a UNIX datagram socket. - - Not available on Windows. - - If ``local_path`` has been given, the socket will be bound to this path, making this - socket suitable for receiving datagrams from other processes. Other processes can - send datagrams to this socket only if ``local_path`` is set. - - If a socket already exists on the file system in the ``local_path``, it will be - removed first. - - :param local_path: the path on which to bind to - :param local_mode: permissions to set on the local socket - :return: a UNIX datagram socket - - """ - raw_socket = await setup_unix_local_socket( - local_path, local_mode, socket.SOCK_DGRAM - ) - return await get_async_backend().create_unix_datagram_socket(raw_socket, None) - - -async def create_connected_unix_datagram_socket( - remote_path: str | bytes | PathLike[Any], - *, - local_path: None | str | bytes | PathLike[Any] = None, - local_mode: int | None = None, -) -> ConnectedUNIXDatagramSocket: - """ - Create a connected UNIX datagram socket. - - Connected datagram sockets can only communicate with the specified remote path. - - If ``local_path`` has been given, the socket will be bound to this path, making - this socket suitable for receiving datagrams from other processes. Other processes - can send datagrams to this socket only if ``local_path`` is set. - - If a socket already exists on the file system in the ``local_path``, it will be - removed first. - - :param remote_path: the path to set as the default target - :param local_path: the path on which to bind to - :param local_mode: permissions to set on the local socket - :return: a connected UNIX datagram socket - - """ - remote_path = os.fspath(remote_path) - raw_socket = await setup_unix_local_socket( - local_path, local_mode, socket.SOCK_DGRAM - ) - return await get_async_backend().create_unix_datagram_socket( - raw_socket, remote_path - ) - - -async def getaddrinfo( - host: bytes | str | None, - port: str | int | None, - *, - family: int | AddressFamily = 0, - type: int | SocketKind = 0, - proto: int = 0, - flags: int = 0, -) -> list[tuple[AddressFamily, SocketKind, int, str, tuple[str, int]]]: - """ - Look up a numeric IP address given a host name. - - Internationalized domain names are translated according to the (non-transitional) - IDNA 2008 standard. - - .. note:: 4-tuple IPv6 socket addresses are automatically converted to 2-tuples of - (host, port), unlike what :func:`socket.getaddrinfo` does. - - :param host: host name - :param port: port number - :param family: socket family (`'AF_INET``, ...) - :param type: socket type (``SOCK_STREAM``, ...) - :param proto: protocol number - :param flags: flags to pass to upstream ``getaddrinfo()`` - :return: list of tuples containing (family, type, proto, canonname, sockaddr) - - .. seealso:: :func:`socket.getaddrinfo` - - """ - # Handle unicode hostnames - encoded_host = idna2008_resolve(host) if isinstance(host, str) else host - gai_res = await get_async_backend().getaddrinfo( - encoded_host, port, family=family, type=type, proto=proto, flags=flags - ) - return [ - (family, type, proto, canonname, convert_ipv6_sockaddr(sockaddr)) - for family, type, proto, canonname, sockaddr in gai_res - # filter out IPv6 results when IPv6 is disabled - if not isinstance(sockaddr[0], int) - ] - - -def getnameinfo(sockaddr: IPSockAddrType, flags: int = 0) -> Awaitable[tuple[str, str]]: - """ - Look up the host name of an IP address. - - :param sockaddr: socket address (e.g. (ipaddress, port) for IPv4) - :param flags: flags to pass to upstream ``getnameinfo()`` - :return: a tuple of (host name, service name) - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - .. seealso:: :func:`socket.getnameinfo` - - """ - return get_async_backend().getnameinfo(sockaddr, flags) - - -@deprecated("This function is deprecated; use `wait_readable` instead") -def wait_socket_readable(sock: socket.socket) -> Awaitable[None]: - """ - .. deprecated:: 4.7.0 - Use :func:`wait_readable` instead. - - Wait until the given socket has data to be read. - - .. warning:: Only use this on raw sockets that have not been wrapped by any higher - level constructs like socket streams! - - :param sock: a socket object - :raises ~anyio.ClosedResourceError: if the socket was closed while waiting for the - socket to become readable - :raises ~anyio.BusyResourceError: if another task is already waiting for the socket - to become readable - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - """ - return get_async_backend().wait_readable(sock.fileno()) - - -@deprecated("This function is deprecated; use `wait_writable` instead") -def wait_socket_writable(sock: socket.socket) -> Awaitable[None]: - """ - .. deprecated:: 4.7.0 - Use :func:`wait_writable` instead. - - Wait until the given socket can be written to. - - This does **NOT** work on Windows when using the asyncio backend with a proactor - event loop (default on py3.8+). - - .. warning:: Only use this on raw sockets that have not been wrapped by any higher - level constructs like socket streams! - - :param sock: a socket object - :raises ~anyio.ClosedResourceError: if the socket was closed while waiting for the - socket to become writable - :raises ~anyio.BusyResourceError: if another task is already waiting for the socket - to become writable - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - """ - return get_async_backend().wait_writable(sock.fileno()) - - -def wait_readable(obj: FileDescriptorLike) -> Awaitable[None]: - """ - Wait until the given object has data to be read. - - On Unix systems, ``obj`` must either be an integer file descriptor, or else an - object with a ``.fileno()`` method which returns an integer file descriptor. Any - kind of file descriptor can be passed, though the exact semantics will depend on - your kernel. For example, this probably won't do anything useful for on-disk files. - - On Windows systems, ``obj`` must either be an integer ``SOCKET`` handle, or else an - object with a ``.fileno()`` method which returns an integer ``SOCKET`` handle. File - descriptors aren't supported, and neither are handles that refer to anything besides - a ``SOCKET``. - - On backends where this functionality is not natively provided (asyncio - ``ProactorEventLoop`` on Windows), it is provided using a separate selector thread - which is set to shut down when the interpreter shuts down. - - .. warning:: Don't use this on raw sockets that have been wrapped by any higher - level constructs like socket streams! - - :param obj: an object with a ``.fileno()`` method or an integer handle - :raises ~anyio.ClosedResourceError: if the object was closed while waiting for the - object to become readable - :raises ~anyio.BusyResourceError: if another task is already waiting for the object - to become readable - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - """ - return get_async_backend().wait_readable(obj) - - -def wait_writable(obj: FileDescriptorLike) -> Awaitable[None]: - """ - Wait until the given object can be written to. - - :param obj: an object with a ``.fileno()`` method or an integer handle - :raises ~anyio.ClosedResourceError: if the object was closed while waiting for the - object to become writable - :raises ~anyio.BusyResourceError: if another task is already waiting for the object - to become writable - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - .. seealso:: See the documentation of :func:`wait_readable` for the definition of - ``obj`` and notes on backend compatibility. - - .. warning:: Don't use this on raw sockets that have been wrapped by any higher - level constructs like socket streams! - - """ - return get_async_backend().wait_writable(obj) - - -def notify_closing(obj: FileDescriptorLike) -> None: - """ - Call this before closing a file descriptor (on Unix) or socket (on - Windows). This will cause any `wait_readable` or `wait_writable` - calls on the given object to immediately wake up and raise - `~anyio.ClosedResourceError`. - - This doesn't actually close the object – you still have to do that - yourself afterwards. Also, you want to be careful to make sure no - new tasks start waiting on the object in between when you call this - and when it's actually closed. So to close something properly, you - usually want to do these steps in order: - - 1. Explicitly mark the object as closed, so that any new attempts - to use it will abort before they start. - 2. Call `notify_closing` to wake up any already-existing users. - 3. Actually close the object. - - It's also possible to do them in a different order if that's more - convenient, *but only if* you make sure not to have any checkpoints in - between the steps. This way they all happen in a single atomic - step, so other tasks won't be able to tell what order they happened - in anyway. - - :param obj: an object with a ``.fileno()`` method or an integer handle - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - """ - get_async_backend().notify_closing(obj) - - -# -# Private API -# - - -def convert_ipv6_sockaddr( - sockaddr: tuple[str, int, int, int] | tuple[str, int], -) -> tuple[str, int]: - """ - Convert a 4-tuple IPv6 socket address to a 2-tuple (address, port) format. - - If the scope ID is nonzero, it is added to the address, separated with ``%``. - Otherwise the flow id and scope id are simply cut off from the tuple. - Any other kinds of socket addresses are returned as-is. - - :param sockaddr: the result of :meth:`~socket.socket.getsockname` - :return: the converted socket address - - """ - # This is more complicated than it should be because of MyPy - if isinstance(sockaddr, tuple) and len(sockaddr) == 4: - host, port, _flowinfo, scope_id = sockaddr - if scope_id: - # PyPy (as of v7.3.11) leaves the interface name in the result, so - # we discard it and only get the scope ID from the end - # (https://foss.heptapod.net/pypy/pypy/-/issues/3938) - host = host.split("%")[0] - - # Add scope_id to the address - return f"{host}%{scope_id}", port - else: - return host, port - else: - return sockaddr - - -async def setup_unix_local_socket( - path: None | str | bytes | PathLike[Any], - mode: int | None, - socktype: int, -) -> socket.socket: - """ - Create a UNIX local socket object, deleting the socket at the given path if it - exists. - - Not available on Windows. - - :param path: path of the socket - :param mode: permissions to set on the socket - :param socktype: socket.SOCK_STREAM or socket.SOCK_DGRAM - - """ - path_str: str | None - if path is not None: - path_str = os.fsdecode(path) - - # Linux abstract namespace sockets aren't backed by a concrete file so skip stat call - if not path_str.startswith("\0"): - # Copied from pathlib... - try: - stat_result = os.stat(path) - except OSError as e: - if e.errno not in ( - errno.ENOENT, - errno.ENOTDIR, - errno.EBADF, - errno.ELOOP, - ): - raise - else: - if stat.S_ISSOCK(stat_result.st_mode): - os.unlink(path) - else: - path_str = None - - raw_socket = socket.socket(socket.AF_UNIX, socktype) - raw_socket.setblocking(False) - - if path_str is not None: - try: - await to_thread.run_sync(raw_socket.bind, path_str, abandon_on_cancel=True) - if mode is not None: - await to_thread.run_sync(chmod, path_str, mode, abandon_on_cancel=True) - except BaseException: - raw_socket.close() - raise - - return raw_socket - - -@dataclass -class TCPConnectable(ByteStreamConnectable): - """ - Connects to a TCP server at the given host and port. - - :param host: host name or IP address of the server - :param port: TCP port number of the server - """ - - host: str | IPv4Address | IPv6Address - port: int - - def __post_init__(self) -> None: - if self.port < 1 or self.port > 65535: - raise ValueError("TCP port number out of range") - - @override - async def connect(self) -> SocketStream: - try: - return await connect_tcp(self.host, self.port) - except OSError as exc: - raise ConnectionFailed( - f"error connecting to {self.host}:{self.port}: {exc}" - ) from exc - - -@dataclass -class UNIXConnectable(ByteStreamConnectable): - """ - Connects to a UNIX domain socket at the given path. - - :param path: the file system path of the socket - """ - - path: str | bytes | PathLike[str] | PathLike[bytes] - - @override - async def connect(self) -> UNIXSocketStream: - try: - return await connect_unix(self.path) - except OSError as exc: - raise ConnectionFailed(f"error connecting to {self.path!r}: {exc}") from exc - - -def as_connectable( - remote: ByteStreamConnectable - | tuple[str | IPv4Address | IPv6Address, int] - | str - | bytes - | PathLike[str], - /, - *, - tls: bool = False, - ssl_context: ssl.SSLContext | None = None, - tls_hostname: str | None = None, - tls_standard_compatible: bool = True, -) -> ByteStreamConnectable: - """ - Return a byte stream connectable from the given object. - - If a bytestream connectable is given, it is returned unchanged. - If a tuple of (host, port) is given, a TCP connectable is returned. - If a string or bytes path is given, a UNIX connectable is returned. - - If ``tls=True``, the connectable will be wrapped in a - :class:`~.streams.tls.TLSConnectable`. - - :param remote: a connectable, a tuple of (host, port) or a path to a UNIX socket - :param tls: if ``True``, wrap the plaintext connectable in a - :class:`~.streams.tls.TLSConnectable`, using the provided TLS settings) - :param ssl_context: if ``tls=True``, the SSLContext object to use (if not provided, - a secure default will be created) - :param tls_hostname: if ``tls=True``, host name of the server to use for checking - the server certificate (defaults to the host portion of the address for TCP - connectables) - :param tls_standard_compatible: if ``False`` and ``tls=True``, makes the TLS stream - skip the closing handshake when closing the connection, so it won't raise an - exception if the server does the same - - """ - connectable: TCPConnectable | UNIXConnectable | TLSConnectable - if isinstance(remote, ByteStreamConnectable): - return remote - elif isinstance(remote, tuple) and len(remote) == 2: - connectable = TCPConnectable(*remote) - elif isinstance(remote, (str, bytes, PathLike)): - connectable = UNIXConnectable(remote) - else: - raise TypeError(f"cannot convert {remote!r} to a connectable") - - if tls: - if not tls_hostname and isinstance(connectable, TCPConnectable): - tls_hostname = str(connectable.host) - - connectable = TLSConnectable( - connectable, - ssl_context=ssl_context, - hostname=tls_hostname, - standard_compatible=tls_standard_compatible, - ) - - return connectable diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_streams.py b/venv/lib/python3.11/site-packages/anyio/_core/_streams.py deleted file mode 100755 index 2b9c7df..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_streams.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import annotations - -import math -from typing import TypeVar -from warnings import warn - -from ..streams.memory import ( - MemoryObjectReceiveStream, - MemoryObjectSendStream, - _MemoryObjectStreamState, -) - -T_Item = TypeVar("T_Item") - - -class create_memory_object_stream( - tuple[MemoryObjectSendStream[T_Item], MemoryObjectReceiveStream[T_Item]], -): - """ - Create a memory object stream. - - The stream's item type can be annotated like - :func:`create_memory_object_stream[T_Item]`. - - :param max_buffer_size: number of items held in the buffer until ``send()`` starts - blocking - :param item_type: old way of marking the streams with the right generic type for - static typing (does nothing on AnyIO 4) - - .. deprecated:: 4.0 - Use ``create_memory_object_stream[YourItemType](...)`` instead. - :return: a tuple of (send stream, receive stream) - - """ - - def __new__( # type: ignore[misc] - cls, max_buffer_size: float = 0, item_type: object = None - ) -> tuple[MemoryObjectSendStream[T_Item], MemoryObjectReceiveStream[T_Item]]: - if max_buffer_size != math.inf and not isinstance(max_buffer_size, int): - raise ValueError("max_buffer_size must be either an integer or math.inf") - if max_buffer_size < 0: - raise ValueError("max_buffer_size cannot be negative") - if item_type is not None: - warn( - "The item_type argument has been deprecated in AnyIO 4.0. " - "Use create_memory_object_stream[YourItemType](...) instead.", - DeprecationWarning, - stacklevel=2, - ) - - state = _MemoryObjectStreamState[T_Item](max_buffer_size) - return (MemoryObjectSendStream(state), MemoryObjectReceiveStream(state)) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_subprocesses.py b/venv/lib/python3.11/site-packages/anyio/_core/_subprocesses.py deleted file mode 100755 index 53184a2..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_subprocesses.py +++ /dev/null @@ -1,196 +0,0 @@ -from __future__ import annotations - -from collections.abc import AsyncIterable, Iterable, Mapping, Sequence -from io import BytesIO -from os import PathLike -from subprocess import PIPE, CalledProcessError, CompletedProcess -from typing import IO, Any, TypeAlias, cast - -from ..abc import Process # noqa: TC001 -from ._eventloop import get_async_backend -from ._tasks import create_task_group - -StrOrBytesPath: TypeAlias = str | bytes | PathLike[str] | PathLike[bytes] - - -async def run_process( - command: StrOrBytesPath | Sequence[StrOrBytesPath], - *, - input: bytes | None = None, - stdin: int | IO[Any] | None = None, - stdout: int | IO[Any] | None = PIPE, - stderr: int | IO[Any] | None = PIPE, - check: bool = True, - cwd: StrOrBytesPath | None = None, - env: Mapping[str, str] | None = None, - startupinfo: Any = None, - creationflags: int = 0, - start_new_session: bool = False, - pass_fds: Sequence[int] = (), - user: str | int | None = None, - group: str | int | None = None, - extra_groups: Iterable[str | int] | None = None, - umask: int = -1, -) -> CompletedProcess[bytes]: - """ - Run an external command in a subprocess and wait until it completes. - - .. seealso:: :func:`subprocess.run` - - :param command: either a string to pass to the shell, or an iterable of strings - containing the executable name or path and its arguments - :param input: bytes passed to the standard input of the subprocess - :param stdin: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, - a file-like object, or `None`; ``input`` overrides this - :param stdout: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, - a file-like object, or `None` - :param stderr: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, - :data:`subprocess.STDOUT`, a file-like object, or `None` - :param check: if ``True``, raise :exc:`~subprocess.CalledProcessError` if the - process terminates with a return code other than 0 - :param cwd: If not ``None``, change the working directory to this before running the - command - :param env: if not ``None``, this mapping replaces the inherited environment - variables from the parent process - :param startupinfo: an instance of :class:`subprocess.STARTUPINFO` that can be used - to specify process startup parameters (Windows only) - :param creationflags: flags that can be used to control the creation of the - subprocess (see :class:`subprocess.Popen` for the specifics) - :param start_new_session: if ``true`` the setsid() system call will be made in the - child process prior to the execution of the subprocess. (POSIX only) - :param pass_fds: sequence of file descriptors to keep open between the parent and - child processes. (POSIX only) - :param user: effective user to run the process as (Python >= 3.9, POSIX only) - :param group: effective group to run the process as (Python >= 3.9, POSIX only) - :param extra_groups: supplementary groups to set in the subprocess (Python >= 3.9, - POSIX only) - :param umask: if not negative, this umask is applied in the child process before - running the given command (Python >= 3.9, POSIX only) - :return: an object representing the completed process - :raises ~subprocess.CalledProcessError: if ``check`` is ``True`` and the process - exits with a nonzero return code - - """ - - async def drain_stream(stream: AsyncIterable[bytes], index: int) -> None: - buffer = BytesIO() - async for chunk in stream: - buffer.write(chunk) - - stream_contents[index] = buffer.getvalue() - - if stdin is not None and input is not None: - raise ValueError("only one of stdin and input is allowed") - - async with await open_process( - command, - stdin=PIPE if input else stdin, - stdout=stdout, - stderr=stderr, - cwd=cwd, - env=env, - startupinfo=startupinfo, - creationflags=creationflags, - start_new_session=start_new_session, - pass_fds=pass_fds, - user=user, - group=group, - extra_groups=extra_groups, - umask=umask, - ) as process: - stream_contents: list[bytes | None] = [None, None] - async with create_task_group() as tg: - if process.stdout: - tg.start_soon(drain_stream, process.stdout, 0) - - if process.stderr: - tg.start_soon(drain_stream, process.stderr, 1) - - if process.stdin and input: - await process.stdin.send(input) - await process.stdin.aclose() - - await process.wait() - - output, errors = stream_contents - if check and process.returncode != 0: - raise CalledProcessError(cast(int, process.returncode), command, output, errors) - - return CompletedProcess(command, cast(int, process.returncode), output, errors) - - -async def open_process( - command: StrOrBytesPath | Sequence[StrOrBytesPath], - *, - stdin: int | IO[Any] | None = PIPE, - stdout: int | IO[Any] | None = PIPE, - stderr: int | IO[Any] | None = PIPE, - cwd: StrOrBytesPath | None = None, - env: Mapping[str, str] | None = None, - startupinfo: Any = None, - creationflags: int = 0, - start_new_session: bool = False, - pass_fds: Sequence[int] = (), - user: str | int | None = None, - group: str | int | None = None, - extra_groups: Iterable[str | int] | None = None, - umask: int = -1, -) -> Process: - """ - Start an external command in a subprocess. - - .. seealso:: :class:`subprocess.Popen` - - :param command: either a string to pass to the shell, or an iterable of strings - containing the executable name or path and its arguments - :param stdin: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, a - file-like object, or ``None`` - :param stdout: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, - a file-like object, or ``None`` - :param stderr: one of :data:`subprocess.PIPE`, :data:`subprocess.DEVNULL`, - :data:`subprocess.STDOUT`, a file-like object, or ``None`` - :param cwd: If not ``None``, the working directory is changed before executing - :param env: If env is not ``None``, it must be a mapping that defines the - environment variables for the new process - :param creationflags: flags that can be used to control the creation of the - subprocess (see :class:`subprocess.Popen` for the specifics) - :param startupinfo: an instance of :class:`subprocess.STARTUPINFO` that can be used - to specify process startup parameters (Windows only) - :param start_new_session: if ``true`` the setsid() system call will be made in the - child process prior to the execution of the subprocess. (POSIX only) - :param pass_fds: sequence of file descriptors to keep open between the parent and - child processes. (POSIX only) - :param user: effective user to run the process as (POSIX only) - :param group: effective group to run the process as (POSIX only) - :param extra_groups: supplementary groups to set in the subprocess (POSIX only) - :param umask: if not negative, this umask is applied in the child process before - running the given command (POSIX only) - :return: an asynchronous process object - - """ - kwargs: dict[str, Any] = {} - if user is not None: - kwargs["user"] = user - - if group is not None: - kwargs["group"] = group - - if extra_groups is not None: - kwargs["extra_groups"] = extra_groups - - if umask >= 0: - kwargs["umask"] = umask - - return await get_async_backend().open_process( - command, - stdin=stdin, - stdout=stdout, - stderr=stderr, - cwd=cwd, - env=env, - startupinfo=startupinfo, - creationflags=creationflags, - start_new_session=start_new_session, - pass_fds=pass_fds, - **kwargs, - ) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_synchronization.py b/venv/lib/python3.11/site-packages/anyio/_core/_synchronization.py deleted file mode 100755 index cb988c6..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_synchronization.py +++ /dev/null @@ -1,778 +0,0 @@ -from __future__ import annotations - -import math -import sys -from collections import deque -from collections.abc import Callable -from dataclasses import dataclass -from types import TracebackType -from typing import TypeVar - -from ..lowlevel import checkpoint_if_cancelled -from ._eventloop import get_async_backend -from ._exceptions import BusyResourceError, NoEventLoopError -from ._tasks import CancelScope -from ._testing import TaskInfo, get_current_task - -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing_extensions import Self - -T = TypeVar("T") - - -@dataclass(frozen=True) -class EventStatistics: - """ - :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Event.wait` - """ - - tasks_waiting: int - - -@dataclass(frozen=True) -class CapacityLimiterStatistics: - """ - :ivar int borrowed_tokens: number of tokens currently borrowed by tasks - :ivar float total_tokens: total number of available tokens - :ivar tuple borrowers: tasks or other objects currently holding tokens borrowed from - this limiter - :ivar int tasks_waiting: number of tasks waiting on - :meth:`~.CapacityLimiter.acquire` or - :meth:`~.CapacityLimiter.acquire_on_behalf_of` - """ - - borrowed_tokens: int - total_tokens: float - borrowers: tuple[object, ...] - tasks_waiting: int - - -@dataclass(frozen=True) -class LockStatistics: - """ - :ivar bool locked: flag indicating if this lock is locked or not - :ivar ~anyio.TaskInfo owner: task currently holding the lock (or ``None`` if the - lock is not held by any task) - :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Lock.acquire` - """ - - locked: bool - owner: TaskInfo | None - tasks_waiting: int - - -@dataclass(frozen=True) -class ConditionStatistics: - """ - :ivar int tasks_waiting: number of tasks blocked on :meth:`~.Condition.wait` - :ivar ~anyio.LockStatistics lock_statistics: statistics of the underlying - :class:`~.Lock` - """ - - tasks_waiting: int - lock_statistics: LockStatistics - - -@dataclass(frozen=True) -class SemaphoreStatistics: - """ - :ivar int tasks_waiting: number of tasks waiting on :meth:`~.Semaphore.acquire` - - """ - - tasks_waiting: int - - -class Event: - __slots__ = ("__weakref__",) - - def __new__(cls) -> Event: - try: - return get_async_backend().create_event() - except NoEventLoopError: - return EventAdapter() - - def set(self) -> None: - """Set the flag, notifying all listeners.""" - raise NotImplementedError - - def is_set(self) -> bool: - """Return ``True`` if the flag is set, ``False`` if not.""" - raise NotImplementedError - - async def wait(self) -> None: - """ - Wait until the flag has been set. - - If the flag has already been set when this method is called, it returns - immediately. - - """ - raise NotImplementedError - - def statistics(self) -> EventStatistics: - """Return statistics about the current state of this event.""" - raise NotImplementedError - - -class EventAdapter(Event): - __slots__ = "_internal_event", "_is_set" - - def __new__(cls) -> Self: - return object.__new__(cls) - - def __init__(self) -> None: - self._internal_event: Event | None = None - self._is_set = False - - @property - def _event(self) -> Event: - if self._internal_event is None: - self._internal_event = get_async_backend().create_event() - if self._is_set: - self._internal_event.set() - - return self._internal_event - - def set(self) -> None: - if self._internal_event is None: - self._is_set = True - else: - self._event.set() - - def is_set(self) -> bool: - if self._internal_event is None: - return self._is_set - - return self._internal_event.is_set() - - async def wait(self) -> None: - await self._event.wait() - - def statistics(self) -> EventStatistics: - if self._internal_event is None: - return EventStatistics(tasks_waiting=0) - - return self._internal_event.statistics() - - -class Lock: - __slots__ = ("__weakref__",) - - def __new__(cls, *, fast_acquire: bool = False) -> Lock: - try: - return get_async_backend().create_lock(fast_acquire=fast_acquire) - except NoEventLoopError: - return LockAdapter(fast_acquire=fast_acquire) - - async def __aenter__(self) -> None: - await self.acquire() - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self.release() - - async def acquire(self) -> None: - """Acquire the lock.""" - raise NotImplementedError - - def acquire_nowait(self) -> None: - """ - Acquire the lock, without blocking. - - :raises ~anyio.WouldBlock: if the operation would block - - """ - raise NotImplementedError - - def release(self) -> None: - """Release the lock.""" - raise NotImplementedError - - def locked(self) -> bool: - """Return True if the lock is currently held.""" - raise NotImplementedError - - def statistics(self) -> LockStatistics: - """ - Return statistics about the current state of this lock. - - .. versionadded:: 3.0 - """ - raise NotImplementedError - - -class LockAdapter(Lock): - __slots__ = "_fast_acquire", "_internal_lock" - - def __new__(cls, *, fast_acquire: bool = False) -> Self: - return object.__new__(cls) - - def __init__(self, *, fast_acquire: bool = False): - self._internal_lock: Lock | None = None - self._fast_acquire = fast_acquire - - @property - def _lock(self) -> Lock: - if self._internal_lock is None: - self._internal_lock = get_async_backend().create_lock( - fast_acquire=self._fast_acquire - ) - - return self._internal_lock - - async def __aenter__(self) -> None: - await self._lock.acquire() - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - if self._internal_lock is not None: - self._internal_lock.release() - - async def acquire(self) -> None: - """Acquire the lock.""" - await self._lock.acquire() - - def acquire_nowait(self) -> None: - """ - Acquire the lock, without blocking. - - :raises ~anyio.WouldBlock: if the operation would block - - """ - self._lock.acquire_nowait() - - def release(self) -> None: - """Release the lock.""" - self._lock.release() - - def locked(self) -> bool: - """Return True if the lock is currently held.""" - return self._lock.locked() - - def statistics(self) -> LockStatistics: - """ - Return statistics about the current state of this lock. - - .. versionadded:: 3.0 - - """ - if self._internal_lock is None: - return LockStatistics(False, None, 0) - - return self._internal_lock.statistics() - - -class Condition: - __slots__ = "__weakref__", "_lock", "_owner_task", "_waiters" - - def __init__(self, lock: Lock | None = None): - self._owner_task: TaskInfo | None = None - self._lock = lock or Lock() - self._waiters: deque[Event] = deque() - - async def __aenter__(self) -> None: - await self.acquire() - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self.release() - - def _check_acquired(self) -> None: - if self._owner_task != get_current_task(): - raise RuntimeError("The current task is not holding the underlying lock") - - async def acquire(self) -> None: - """Acquire the underlying lock.""" - await self._lock.acquire() - self._owner_task = get_current_task() - - def acquire_nowait(self) -> None: - """ - Acquire the underlying lock, without blocking. - - :raises ~anyio.WouldBlock: if the operation would block - - """ - self._lock.acquire_nowait() - self._owner_task = get_current_task() - - def release(self) -> None: - """Release the underlying lock.""" - self._lock.release() - - def locked(self) -> bool: - """Return True if the lock is set.""" - return self._lock.locked() - - def notify(self, n: int = 1) -> None: - """Notify exactly n listeners.""" - self._check_acquired() - for _ in range(n): - try: - event = self._waiters.popleft() - except IndexError: - break - - event.set() - - def notify_all(self) -> None: - """Notify all the listeners.""" - self._check_acquired() - for event in self._waiters: - event.set() - - self._waiters.clear() - - async def wait(self) -> None: - """Wait for a notification.""" - await checkpoint_if_cancelled() - self._check_acquired() - event = Event() - self._waiters.append(event) - self.release() - try: - await event.wait() - except BaseException: - if not event.is_set(): - self._waiters.remove(event) - elif self._waiters: - # This task was notified by could not act on it, so pass - # it on to the next task - self._waiters.popleft().set() - - raise - finally: - with CancelScope(shield=True): - await self.acquire() - - async def wait_for(self, predicate: Callable[[], T]) -> T: - """ - Wait until a predicate becomes true. - - :param predicate: a callable that returns a truthy value when the condition is - met - :return: the result of the predicate - - .. versionadded:: 4.11.0 - - """ - while not (result := predicate()): - await self.wait() - - return result - - def statistics(self) -> ConditionStatistics: - """ - Return statistics about the current state of this condition. - - .. versionadded:: 3.0 - """ - return ConditionStatistics(len(self._waiters), self._lock.statistics()) - - -class Semaphore: - __slots__ = "__weakref__", "_fast_acquire" - - def __new__( - cls, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> Semaphore: - try: - return get_async_backend().create_semaphore( - initial_value, max_value=max_value, fast_acquire=fast_acquire - ) - except NoEventLoopError: - return SemaphoreAdapter(initial_value, max_value=max_value) - - def __init__( - self, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ): - if not isinstance(initial_value, int): - raise TypeError("initial_value must be an integer") - if initial_value < 0: - raise ValueError("initial_value must be >= 0") - if max_value is not None: - if not isinstance(max_value, int): - raise TypeError("max_value must be an integer or None") - if max_value < initial_value: - raise ValueError( - "max_value must be equal to or higher than initial_value" - ) - - self._fast_acquire = fast_acquire - - async def __aenter__(self) -> Self: - await self.acquire() - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self.release() - - async def acquire(self) -> None: - """Decrement the semaphore value, blocking if necessary.""" - raise NotImplementedError - - def acquire_nowait(self) -> None: - """ - Acquire the underlying lock, without blocking. - - :raises ~anyio.WouldBlock: if the operation would block - - """ - raise NotImplementedError - - def release(self) -> None: - """Increment the semaphore value.""" - raise NotImplementedError - - @property - def value(self) -> int: - """The current value of the semaphore.""" - raise NotImplementedError - - @property - def max_value(self) -> int | None: - """The maximum value of the semaphore.""" - raise NotImplementedError - - def statistics(self) -> SemaphoreStatistics: - """ - Return statistics about the current state of this semaphore. - - .. versionadded:: 3.0 - """ - raise NotImplementedError - - -class SemaphoreAdapter(Semaphore): - __slots__ = "_initial_value", "_internal_semaphore", "_max_value" - - def __new__( - cls, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> Self: - return object.__new__(cls) - - def __init__( - self, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> None: - super().__init__(initial_value, max_value=max_value, fast_acquire=fast_acquire) - self._internal_semaphore: Semaphore | None = None - self._initial_value = initial_value - self._max_value = max_value - - @property - def _semaphore(self) -> Semaphore: - if self._internal_semaphore is None: - self._internal_semaphore = get_async_backend().create_semaphore( - self._initial_value, max_value=self._max_value - ) - - return self._internal_semaphore - - async def acquire(self) -> None: - await self._semaphore.acquire() - - def acquire_nowait(self) -> None: - self._semaphore.acquire_nowait() - - def release(self) -> None: - self._semaphore.release() - - @property - def value(self) -> int: - if self._internal_semaphore is None: - return self._initial_value - - return self._semaphore.value - - @property - def max_value(self) -> int | None: - return self._max_value - - def statistics(self) -> SemaphoreStatistics: - if self._internal_semaphore is None: - return SemaphoreStatistics(tasks_waiting=0) - - return self._semaphore.statistics() - - -class CapacityLimiter: - __slots__ = ("__weakref__",) - - def __new__(cls, total_tokens: float) -> CapacityLimiter: - try: - return get_async_backend().create_capacity_limiter(total_tokens) - except NoEventLoopError: - return CapacityLimiterAdapter(total_tokens) - - async def __aenter__(self) -> None: - raise NotImplementedError - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - raise NotImplementedError - - @property - def total_tokens(self) -> float: - """ - The total number of tokens available for borrowing. - - This is a read-write property. If the total number of tokens is increased, the - proportionate number of tasks waiting on this limiter will be granted their - tokens. - - .. versionchanged:: 3.0 - The property is now writable. - .. versionchanged:: 4.12 - The value can now be set to 0. - - """ - raise NotImplementedError - - @total_tokens.setter - def total_tokens(self, value: float) -> None: - raise NotImplementedError - - @property - def borrowed_tokens(self) -> int: - """The number of tokens that have currently been borrowed.""" - raise NotImplementedError - - @property - def available_tokens(self) -> float: - """The number of tokens currently available to be borrowed""" - raise NotImplementedError - - def acquire_nowait(self) -> None: - """ - Acquire a token for the current task without waiting for one to become - available. - - :raises ~anyio.WouldBlock: if there are no tokens available for borrowing - - """ - raise NotImplementedError - - def acquire_on_behalf_of_nowait(self, borrower: object) -> None: - """ - Acquire a token without waiting for one to become available. - - :param borrower: the entity borrowing a token - :raises ~anyio.WouldBlock: if there are no tokens available for borrowing - - """ - raise NotImplementedError - - async def acquire(self) -> None: - """ - Acquire a token for the current task, waiting if necessary for one to become - available. - - """ - raise NotImplementedError - - async def acquire_on_behalf_of(self, borrower: object) -> None: - """ - Acquire a token, waiting if necessary for one to become available. - - :param borrower: the entity borrowing a token - - """ - raise NotImplementedError - - def release(self) -> None: - """ - Release the token held by the current task. - - :raises RuntimeError: if the current task has not borrowed a token from this - limiter. - - """ - raise NotImplementedError - - def release_on_behalf_of(self, borrower: object) -> None: - """ - Release the token held by the given borrower. - - :raises RuntimeError: if the borrower has not borrowed a token from this - limiter. - - """ - raise NotImplementedError - - def statistics(self) -> CapacityLimiterStatistics: - """ - Return statistics about the current state of this limiter. - - .. versionadded:: 3.0 - - """ - raise NotImplementedError - - -class CapacityLimiterAdapter(CapacityLimiter): - __slots__ = "_internal_limiter", "_total_tokens" - - def __new__(cls, total_tokens: float) -> Self: - return object.__new__(cls) - - def __init__(self, total_tokens: float) -> None: - self._internal_limiter: CapacityLimiter | None = None - self.total_tokens = total_tokens - - @property - def _limiter(self) -> CapacityLimiter: - if self._internal_limiter is None: - self._internal_limiter = get_async_backend().create_capacity_limiter( - self._total_tokens - ) - - return self._internal_limiter - - async def __aenter__(self) -> None: - await self._limiter.__aenter__() - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - return await self._limiter.__aexit__(exc_type, exc_val, exc_tb) - - @property - def total_tokens(self) -> float: - if self._internal_limiter is None: - return self._total_tokens - - return self._internal_limiter.total_tokens - - @total_tokens.setter - def total_tokens(self, value: float) -> None: - if not isinstance(value, int) and not math.isinf(value): - raise TypeError("total_tokens must be an int or math.inf") - elif value < 0: - raise ValueError("total_tokens must be >= 0") - - if self._internal_limiter is None: - self._total_tokens = value - return - - self._limiter.total_tokens = value - - @property - def borrowed_tokens(self) -> int: - if self._internal_limiter is None: - return 0 - - return self._internal_limiter.borrowed_tokens - - @property - def available_tokens(self) -> float: - if self._internal_limiter is None: - return self._total_tokens - - return self._internal_limiter.available_tokens - - def acquire_nowait(self) -> None: - self._limiter.acquire_nowait() - - def acquire_on_behalf_of_nowait(self, borrower: object) -> None: - self._limiter.acquire_on_behalf_of_nowait(borrower) - - async def acquire(self) -> None: - await self._limiter.acquire() - - async def acquire_on_behalf_of(self, borrower: object) -> None: - await self._limiter.acquire_on_behalf_of(borrower) - - def release(self) -> None: - self._limiter.release() - - def release_on_behalf_of(self, borrower: object) -> None: - self._limiter.release_on_behalf_of(borrower) - - def statistics(self) -> CapacityLimiterStatistics: - if self._internal_limiter is None: - return CapacityLimiterStatistics( - borrowed_tokens=0, - total_tokens=self.total_tokens, - borrowers=(), - tasks_waiting=0, - ) - - return self._internal_limiter.statistics() - - -class ResourceGuard: - """ - A context manager for ensuring that a resource is only used by a single task at a - time. - - Entering this context manager while the previous has not exited it yet will trigger - :exc:`BusyResourceError`. - - :param action: the action to guard against (visible in the :exc:`BusyResourceError` - when triggered, e.g. "Another task is already {action} this resource") - - .. versionadded:: 4.1 - """ - - __slots__ = "__weakref__", "_guarded", "action" - - def __init__(self, action: str = "using"): - self.action: str = action - self._guarded = False - - def __enter__(self) -> None: - if self._guarded: - raise BusyResourceError(self.action) - - self._guarded = True - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self._guarded = False diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_tasks.py b/venv/lib/python3.11/site-packages/anyio/_core/_tasks.py deleted file mode 100755 index 044eda6..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_tasks.py +++ /dev/null @@ -1,464 +0,0 @@ -from __future__ import annotations - -import math -import sys -from collections.abc import ( - Coroutine, - Generator, -) -from contextlib import contextmanager -from enum import Enum, auto -from inspect import iscoroutine -from types import TracebackType -from typing import Any, Generic, final - -from ..abc import TaskGroup, TaskStatus -from ._eventloop import get_async_backend, get_cancelled_exc_class -from ._exceptions import TaskCancelled, TaskFailed, TaskNotFinished - -if sys.version_info >= (3, 13): - from typing import TypeVar -else: - from typing_extensions import TypeVar - -if sys.version_info >= (3, 11): - from typing import Never, Self, TypeVarTuple -else: - from typing_extensions import Never, Self, TypeVarTuple - -T = TypeVar("T") -T_co = TypeVar("T_co", covariant=True) -T_startval_co = TypeVar("T_startval_co", covariant=True, default=Never) -PosArgsT = TypeVarTuple("PosArgsT") - - -class _IgnoredTaskStatus(TaskStatus[object]): - def started(self, value: object = None) -> None: - pass - - -TASK_STATUS_IGNORED = _IgnoredTaskStatus() - - -class CancelScope: - """ - Wraps a unit of work that can be made separately cancellable. - - :param deadline: The time (clock value) when this scope is cancelled automatically - :param shield: ``True`` to shield the cancel scope from external cancellation - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - """ - - __slots__ = ("__weakref__",) - - def __new__( - cls, *, deadline: float = math.inf, shield: bool = False - ) -> CancelScope: - return get_async_backend().create_cancel_scope(shield=shield, deadline=deadline) - - def cancel(self, reason: str | None = None) -> None: - """ - Cancel this scope immediately. - - :param reason: a message describing the reason for the cancellation - - """ - raise NotImplementedError - - @property - def deadline(self) -> float: - """ - The time (clock value) when this scope is cancelled automatically. - - Will be ``float('inf')`` if no timeout has been set. - - """ - raise NotImplementedError - - @deadline.setter - def deadline(self, value: float) -> None: - raise NotImplementedError - - @property - def cancel_called(self) -> bool: - """``True`` if :meth:`cancel` has been called.""" - raise NotImplementedError - - @property - def cancelled_caught(self) -> bool: - """ - ``True`` if this scope suppressed a cancellation exception it itself raised. - - This is typically used to check if any work was interrupted, or to see if the - scope was cancelled due to its deadline being reached. The value will, however, - only be ``True`` if the cancellation was triggered by the scope itself (and not - an outer scope). - - """ - raise NotImplementedError - - @property - def shield(self) -> bool: - """ - ``True`` if this scope is shielded from external cancellation. - - While a scope is shielded, it will not receive cancellations from outside. - - """ - raise NotImplementedError - - @shield.setter - def shield(self, value: bool) -> None: - raise NotImplementedError - - def __enter__(self) -> Self: - raise NotImplementedError - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool: - raise NotImplementedError - - -@contextmanager -def fail_at( - deadline: float | None, shield: bool = False, reason: str | None = None -) -> Generator[CancelScope, None, None]: - """ - Create a context manager which raises a :class:`TimeoutError` if the code in the - enclosing context does not finish by the given deadline. - - :param deadline: the deadline before raising the exception, or - ``None`` to disable the timeout - :param shield: ``True`` to shield the cancel scope from external cancellation - :param reason: explanation for timeout to add to the message of a raised `TimeoutError` - :return: a context manager that yields a cancel scope - :rtype: :class:`~typing.ContextManager`\\[:class:`~anyio.CancelScope`\\] - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - .. versionadded:: 4.15.0 - - """ - current_time = get_async_backend().current_time - effective_deadline = math.inf if deadline is None else deadline - with get_async_backend().create_cancel_scope( - deadline=effective_deadline, shield=shield - ) as cancel_scope: - yield cancel_scope - - if cancel_scope.cancelled_caught and current_time() >= cancel_scope.deadline: - raise TimeoutError(reason) if reason else TimeoutError - - -@contextmanager -def fail_after( - delay: float | None, shield: bool = False, reason: str | None = None -) -> Generator[CancelScope, None, None]: - """ - Create a context manager which raises a :class:`TimeoutError` if the code in the - enclosing context block does not finish in time. - - :param delay: maximum allowed time (in seconds) before raising the exception, or - ``None`` to disable the timeout - :param shield: ``True`` to shield the cancel scope from external cancellation - :param reason: explanation for timeout to add to the message of a raised `TimeoutError` - :return: a context manager that yields a cancel scope - :rtype: :class:`~typing.ContextManager`\\[:class:`~anyio.CancelScope`\\] - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - """ - current_time = get_async_backend().current_time - deadline = (current_time() + delay) if delay is not None else math.inf - with fail_at(deadline, shield=shield, reason=reason) as scope: - yield scope - - -def move_on_at(deadline: float | None, shield: bool = False) -> CancelScope: - """ - Create a cancel scope with a deadline that expires after the given delay. - - :param deadline: the deadline before exiting the context block, or - ``None`` to disable the timeout - :param shield: ``True`` to shield the cancel scope from external cancellation - :return: a cancel scope - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - .. versionadded:: 4.15.0 - - """ - return get_async_backend().create_cancel_scope( - deadline=deadline if deadline is not None else math.inf, shield=shield - ) - - -def move_on_after(delay: float | None, shield: bool = False) -> CancelScope: - """ - Create a cancel scope with a deadline that expires after the given delay. - - :param delay: maximum allowed time (in seconds) before exiting the context block, or - ``None`` to disable the timeout - :param shield: ``True`` to shield the cancel scope from external cancellation - :return: a cancel scope - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - .. note:: Unlike with :func:`fail_after`, the timer starts when this function is - called, not when the context manager is entered. This will be changed in v5.0. - - """ - deadline = ( - (get_async_backend().current_time() + delay) if delay is not None else math.inf - ) - return get_async_backend().create_cancel_scope(deadline=deadline, shield=shield) - - -def current_effective_deadline() -> float: - """ - Return the nearest deadline among all the cancel scopes effective for the current - task. - - :return: a clock value from the event loop's internal clock (or ``float('inf')`` if - there is no deadline in effect, or ``float('-inf')`` if the current scope has - been cancelled) - :rtype: float - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - """ - return get_async_backend().current_effective_deadline() - - -def create_task_group() -> TaskGroup: - """ - Create a task group. - - :return: a task group - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - """ - return get_async_backend().create_task_group() - - -@final -class TaskHandle(Generic[T_co, T_startval_co]): - """ - Returned from the task-spawning methods of :class:`TaskGroup`. Can be awaited on to - get the return value of the task (or the raised exception). If the task was - terminated by a :exc:`BaseException`, :exc:`TaskFailed` will be raised (or its - subclass :exc:`TaskCancelled` if the task was cancelled). - - .. versionadded:: 4.14.0 - """ - - class Status(Enum): - """ - The status of a task handle. - - .. attribute:: PENDING - - The task has not finished yet. - .. attribute:: FINISHED - - The task has finished with a return value. - .. attribute:: CANCELLING - - The task has been cancelled but has not finished yet. - .. attribute:: CANCELLED - - The task was cancelled and has finished since. - .. attribute:: FAILED - - The task raised an exception. - """ - - PENDING = auto() - FINISHED = auto() - CANCELLING = auto() - CANCELLED = auto() - FAILED = auto() - - __slots__ = ( - "__weakref__", - "_cancel_scope", - "_coro", - "_exception", - "_finished_event", - "_name", - "_return_value", - "_start_value", - ) - - _return_value: T_co - _start_value: T_startval_co - - def __init__( - self, - coro: Coroutine[Any, Any, T_co], - name: object, - cancel_scope: CancelScope | None = None, - ) -> None: - from ._synchronization import Event - - self._coro = coro - self._cancel_scope = cancel_scope if cancel_scope is not None else CancelScope() - self._finished_event = Event() - self._exception: BaseException | None = None - - if name is not None: - self._name = str(name) - elif iscoroutine(coro): - self._name = coro.__qualname__ - else: - self._name = str(coro) # coroutine-like object (e.g. asend() objects) - - async def _run_coro(self) -> None: - __tracebackhide__ = True - - with self._cancel_scope: - try: - retval = await self._coro - except BaseException as exc: - self._exception = exc - raise - else: - self._return_value = retval - finally: - self._finished_event.set() - del self # Break the reference cycle - - def cancel(self) -> None: - """ - Set the task to a cancelled state. - - This will interrupt any interruptible asynchronous operation, and will cause - any further awaits on this task to get immediately cancelled, unless done in - a shielded cancel scope. - - If the task has already finished, this method has no effect. - """ - if not self._finished_event.is_set(): - self._cancel_scope.cancel() - - @property - def coro(self) -> Coroutine[Any, Any, T_co]: - """ - The coroutine object that was passed to one of the task-spawning methods in - :class:`TaskGroup`. - """ - return self._coro - - @property - def status(self) -> TaskHandle.Status: - """ - The current status of the task. - - Every task starts in the :attr:`~TaskHandle.Status.PENDING` state. - If a task is cancelled while in this state, it will transition to the - :attr:`~TaskHandle.Status.CANCELLING` state. When the task finishes, it will - transition to one of the three final states ( - :attr:`~TaskHandle.Status.FINISHED`, :attr:`~TaskHandle.Status.FAILED`, or - :attr:`~TaskHandle.Status.CANCELLING`) depending on the exception the task - raised, if any. No other status transitions will happen. - """ - if not self._finished_event.is_set(): - if self._cancel_scope.cancel_called: - return TaskHandle.Status.CANCELLING - else: - return TaskHandle.Status.PENDING - elif self._exception is not None: - if isinstance(self._exception, get_cancelled_exc_class()): - return TaskHandle.Status.CANCELLED - else: - return TaskHandle.Status.FAILED - else: - return TaskHandle.Status.FINISHED - - @property - def name(self) -> str: - """The name of the task.""" - return self._name - - @property - def exception(self) -> BaseException | None: - """ - The exception raised by the task, or ``None`` if it finished without raising. - - :raises TaskNotFinished: if the task has not finished yet - :raises TaskCancelled: if the task was cancelled - - """ - match self.status: - case TaskHandle.Status.PENDING: - raise TaskNotFinished("the task has not finished yet") - case TaskHandle.Status.FINISHED: - return None - case TaskHandle.Status.CANCELLING: - raise TaskCancelled("the task was cancelled") - case TaskHandle.Status.CANCELLED: - raise TaskCancelled("the task was cancelled") from self._exception - case TaskHandle.Status.FAILED: - return self._exception - - @property - def return_value(self) -> T_co: - """ - The return value of the task. - - :raises TaskNotFinished: if the task has not finished yet - :raises TaskCancelled: if the task was cancelled - :raises TaskFailed: if the task raised an exception - - """ - match self.status: - case TaskHandle.Status.PENDING: - raise TaskNotFinished("the task has not finished yet") - case TaskHandle.Status.FINISHED: - return self._return_value - case TaskHandle.Status.CANCELLING: - raise TaskCancelled("the task was cancelled") - case TaskHandle.Status.CANCELLED: - raise TaskCancelled("the task was cancelled") from self._exception - case TaskHandle.Status.FAILED: - raise TaskFailed("the task raised an exception") from self._exception - - @property - def start_value(self) -> T_startval_co: - """ - The value passed to :meth:`task_status.started() <.abc.TaskStatus.started>`, - - :raises RuntimeError: if the task was not started with :meth:`TaskGroup.start() - <.abc.TaskGroup.start>` - """ - try: - return self._start_value - except AttributeError: - raise RuntimeError( - "the task was not started with TaskGroup.start()" - ) from None - - async def wait(self) -> None: - """ - Wait for the task to finish. - - This method will return as soon as the task has finished, no matter how it - happened. - """ - await self._finished_event.wait() - - def __await__(self) -> Generator[Any, Any, T_co]: - yield from self._finished_event.wait().__await__() - return self.return_value - - def __repr__(self) -> str: - return ( - f"<{self.__class__.__name__} {self.status.name.lower()} " - f"name={self._name!r} coro={self._coro!r}>" - ) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_tempfile.py b/venv/lib/python3.11/site-packages/anyio/_core/_tempfile.py deleted file mode 100755 index 9603086..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_tempfile.py +++ /dev/null @@ -1,615 +0,0 @@ -from __future__ import annotations - -import os -import sys -import tempfile -from collections.abc import Iterable -from io import BytesIO, TextIOWrapper -from types import TracebackType -from typing import ( - TYPE_CHECKING, - Any, - AnyStr, - Generic, - overload, -) - -from .. import to_thread -from .._core._fileio import AsyncFile -from ..lowlevel import checkpoint_if_cancelled -from ._tasks import CancelScope - -if TYPE_CHECKING: - from _typeshed import OpenBinaryMode, OpenTextMode, ReadableBuffer, WriteableBuffer - - -class TemporaryFile(Generic[AnyStr]): - """ - An asynchronous temporary file that is automatically created and cleaned up. - - This class provides an asynchronous context manager interface to a temporary file. - The file is created using Python's standard `tempfile.TemporaryFile` function in a - background thread, and is wrapped as an asynchronous file using `AsyncFile`. - - :param mode: The mode in which the file is opened. Defaults to "w+b". - :param buffering: The buffering policy (-1 means the default buffering). - :param encoding: The encoding used to decode or encode the file. Only applicable in - text mode. - :param newline: Controls how universal newlines mode works (only applicable in text - mode). - :param suffix: The suffix for the temporary file name. - :param prefix: The prefix for the temporary file name. - :param dir: The directory in which the temporary file is created. - :param errors: The error handling scheme used for encoding/decoding errors. - """ - - _async_file: AsyncFile[AnyStr] - - @overload - def __init__( - self: TemporaryFile[bytes], - mode: OpenBinaryMode = ..., - buffering: int = ..., - encoding: str | None = ..., - newline: str | None = ..., - suffix: str | None = ..., - prefix: str | None = ..., - dir: str | None = ..., - *, - errors: str | None = ..., - ): ... - @overload - def __init__( - self: TemporaryFile[str], - mode: OpenTextMode, - buffering: int = ..., - encoding: str | None = ..., - newline: str | None = ..., - suffix: str | None = ..., - prefix: str | None = ..., - dir: str | None = ..., - *, - errors: str | None = ..., - ): ... - - def __init__( - self, - mode: OpenTextMode | OpenBinaryMode = "w+b", - buffering: int = -1, - encoding: str | None = None, - newline: str | None = None, - suffix: str | None = None, - prefix: str | None = None, - dir: str | None = None, - *, - errors: str | None = None, - ) -> None: - self.mode = mode - self.buffering = buffering - self.encoding = encoding - self.newline = newline - self.suffix: str | None = suffix - self.prefix: str | None = prefix - self.dir: str | None = dir - self.errors = errors - - async def __aenter__(self) -> AsyncFile[AnyStr]: - fp = await to_thread.run_sync( - lambda: tempfile.TemporaryFile( - self.mode, - self.buffering, - self.encoding, - self.newline, - self.suffix, - self.prefix, - self.dir, - errors=self.errors, - ) - ) - self._async_file = AsyncFile(fp) - return self._async_file - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - traceback: TracebackType | None, - ) -> None: - await self._async_file.aclose() - - -class NamedTemporaryFile(Generic[AnyStr]): - """ - An asynchronous named temporary file that is automatically created and cleaned up. - - This class provides an asynchronous context manager for a temporary file with a - visible name in the file system. It uses Python's standard - :func:`~tempfile.NamedTemporaryFile` function and wraps the file object with - :class:`AsyncFile` for asynchronous operations. - - :param mode: The mode in which the file is opened. Defaults to "w+b". - :param buffering: The buffering policy (-1 means the default buffering). - :param encoding: The encoding used to decode or encode the file. Only applicable in - text mode. - :param newline: Controls how universal newlines mode works (only applicable in text - mode). - :param suffix: The suffix for the temporary file name. - :param prefix: The prefix for the temporary file name. - :param dir: The directory in which the temporary file is created. - :param delete: Whether to delete the file when it is closed. - :param errors: The error handling scheme used for encoding/decoding errors. - :param delete_on_close: (Python 3.12+) Whether to delete the file on close. - """ - - _async_file: AsyncFile[AnyStr] - - @overload - def __init__( - self: NamedTemporaryFile[bytes], - mode: OpenBinaryMode = ..., - buffering: int = ..., - encoding: str | None = ..., - newline: str | None = ..., - suffix: str | None = ..., - prefix: str | None = ..., - dir: str | None = ..., - delete: bool = ..., - *, - errors: str | None = ..., - delete_on_close: bool = ..., - ): ... - @overload - def __init__( - self: NamedTemporaryFile[str], - mode: OpenTextMode, - buffering: int = ..., - encoding: str | None = ..., - newline: str | None = ..., - suffix: str | None = ..., - prefix: str | None = ..., - dir: str | None = ..., - delete: bool = ..., - *, - errors: str | None = ..., - delete_on_close: bool = ..., - ): ... - - def __init__( - self, - mode: OpenBinaryMode | OpenTextMode = "w+b", - buffering: int = -1, - encoding: str | None = None, - newline: str | None = None, - suffix: str | None = None, - prefix: str | None = None, - dir: str | None = None, - delete: bool = True, - *, - errors: str | None = None, - delete_on_close: bool = True, - ) -> None: - self._params: dict[str, Any] = { - "mode": mode, - "buffering": buffering, - "encoding": encoding, - "newline": newline, - "suffix": suffix, - "prefix": prefix, - "dir": dir, - "delete": delete, - "errors": errors, - } - if sys.version_info >= (3, 12): - self._params["delete_on_close"] = delete_on_close - - async def __aenter__(self) -> AsyncFile[AnyStr]: - fp = await to_thread.run_sync( - lambda: tempfile.NamedTemporaryFile(**self._params) - ) - self._async_file = AsyncFile(fp) - return self._async_file - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - traceback: TracebackType | None, - ) -> None: - await self._async_file.aclose() - - -class SpooledTemporaryFile(AsyncFile[AnyStr]): - """ - An asynchronous spooled temporary file that starts in memory and is spooled to disk. - - This class provides an asynchronous interface to a spooled temporary file, much like - Python's standard :class:`~tempfile.SpooledTemporaryFile`. It supports asynchronous - write operations and provides a method to force a rollover to disk. - - :param max_size: Maximum size in bytes before the file is rolled over to disk. - :param mode: The mode in which the file is opened. Defaults to "w+b". - :param buffering: The buffering policy (-1 means the default buffering). - :param encoding: The encoding used to decode or encode the file (text mode only). - :param newline: Controls how universal newlines mode works (text mode only). - :param suffix: The suffix for the temporary file name. - :param prefix: The prefix for the temporary file name. - :param dir: The directory in which the temporary file is created. - :param errors: The error handling scheme used for encoding/decoding errors. - """ - - _rolled: bool = False - - @overload - def __init__( - self: SpooledTemporaryFile[bytes], - max_size: int = ..., - mode: OpenBinaryMode = ..., - buffering: int = ..., - encoding: str | None = ..., - newline: str | None = ..., - suffix: str | None = ..., - prefix: str | None = ..., - dir: str | None = ..., - *, - errors: str | None = ..., - ): ... - @overload - def __init__( - self: SpooledTemporaryFile[str], - max_size: int = ..., - mode: OpenTextMode = ..., - buffering: int = ..., - encoding: str | None = ..., - newline: str | None = ..., - suffix: str | None = ..., - prefix: str | None = ..., - dir: str | None = ..., - *, - errors: str | None = ..., - ): ... - - def __init__( - self, - max_size: int = 0, - mode: OpenBinaryMode | OpenTextMode = "w+b", - buffering: int = -1, - encoding: str | None = None, - newline: str | None = None, - suffix: str | None = None, - prefix: str | None = None, - dir: str | None = None, - *, - errors: str | None = None, - ) -> None: - self._tempfile_params: dict[str, Any] = { - "mode": mode, - "buffering": buffering, - "encoding": encoding, - "newline": newline, - "suffix": suffix, - "prefix": prefix, - "dir": dir, - "errors": errors, - } - self._max_size = max_size - if "b" in mode: - super().__init__(BytesIO()) # type: ignore[arg-type] - else: - super().__init__( - TextIOWrapper( # type: ignore[arg-type] - BytesIO(), - encoding=encoding, - errors=errors, - newline=newline, - write_through=True, - ) - ) - - async def aclose(self) -> None: - if not self._rolled: - self._fp.close() - return - - await super().aclose() - - async def _check(self) -> None: - if self._rolled or self._fp.tell() <= self._max_size: - return - - await self.rollover() - - async def rollover(self) -> None: - if self._rolled: - return - - self._rolled = True - buffer = self._fp - buffer.seek(0) - self._fp = await to_thread.run_sync( - lambda: tempfile.TemporaryFile(**self._tempfile_params) - ) - await self.write(buffer.read()) - buffer.close() - - @property - def closed(self) -> bool: - return self._fp.closed - - async def read(self, size: int = -1) -> AnyStr: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.read(size) - - return await super().read(size) # type: ignore[return-value] - - async def read1(self: SpooledTemporaryFile[bytes], size: int = -1) -> bytes: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.read1(size) - - return await super().read1(size) - - async def readline(self) -> AnyStr: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.readline() - - return await super().readline() # type: ignore[return-value] - - async def readlines(self) -> list[AnyStr]: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.readlines() - - return await super().readlines() # type: ignore[return-value] - - async def readinto(self: SpooledTemporaryFile[bytes], b: WriteableBuffer) -> int: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.readinto(b) - - return await super().readinto(b) - - async def readinto1(self: SpooledTemporaryFile[bytes], b: WriteableBuffer) -> int: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.readinto1(b) - - return await super().readinto1(b) - - async def seek(self, offset: int, whence: int | None = os.SEEK_SET) -> int: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.seek(offset, whence) - - return await super().seek(offset, whence) - - async def tell(self) -> int: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.tell() - - return await super().tell() - - async def truncate(self, size: int | None = None) -> int: - if not self._rolled: - await checkpoint_if_cancelled() - return self._fp.truncate(size) - - return await super().truncate(size) - - @overload - async def write(self: SpooledTemporaryFile[bytes], b: ReadableBuffer) -> int: ... - @overload - async def write(self: SpooledTemporaryFile[str], b: str) -> int: ... - - async def write(self, b: ReadableBuffer | str) -> int: - """ - Asynchronously write data to the spooled temporary file. - - If the file has not yet been rolled over, the data is written synchronously, - and a rollover is triggered if the size exceeds the maximum size. - - :param s: The data to write. - :return: The number of bytes written. - :raises RuntimeError: If the underlying file is not initialized. - - """ - if not self._rolled: - await checkpoint_if_cancelled() - result = self._fp.write(b) - await self._check() - return result - - return await super().write(b) # type: ignore[misc] - - @overload - async def writelines( - self: SpooledTemporaryFile[bytes], lines: Iterable[ReadableBuffer] - ) -> None: ... - @overload - async def writelines( - self: SpooledTemporaryFile[str], lines: Iterable[str] - ) -> None: ... - - async def writelines(self, lines: Iterable[str] | Iterable[ReadableBuffer]) -> None: - """ - Asynchronously write a list of lines to the spooled temporary file. - - If the file has not yet been rolled over, the lines are written synchronously, - and a rollover is triggered if the size exceeds the maximum size. - - :param lines: An iterable of lines to write. - :raises RuntimeError: If the underlying file is not initialized. - - """ - if not self._rolled: - await checkpoint_if_cancelled() - result = self._fp.writelines(lines) - await self._check() - return result - - return await super().writelines(lines) # type: ignore[misc] - - -class TemporaryDirectory(Generic[AnyStr]): - """ - An asynchronous temporary directory that is created and cleaned up automatically. - - This class provides an asynchronous context manager for creating a temporary - directory. It wraps Python's standard :class:`~tempfile.TemporaryDirectory` to - perform directory creation and cleanup operations in a background thread. - - :param suffix: Suffix to be added to the temporary directory name. - :param prefix: Prefix to be added to the temporary directory name. - :param dir: The parent directory where the temporary directory is created. - :param ignore_cleanup_errors: Whether to ignore errors during cleanup - :param delete: Whether to delete the directory upon closing (Python 3.12+). - """ - - def __init__( - self, - suffix: AnyStr | None = None, - prefix: AnyStr | None = None, - dir: AnyStr | None = None, - *, - ignore_cleanup_errors: bool = False, - delete: bool = True, - ) -> None: - self.suffix: AnyStr | None = suffix - self.prefix: AnyStr | None = prefix - self.dir: AnyStr | None = dir - self.ignore_cleanup_errors = ignore_cleanup_errors - self.delete = delete - - self._tempdir: tempfile.TemporaryDirectory | None = None - - async def __aenter__(self) -> str: - params: dict[str, Any] = { - "suffix": self.suffix, - "prefix": self.prefix, - "dir": self.dir, - "ignore_cleanup_errors": self.ignore_cleanup_errors, - } - if sys.version_info >= (3, 12): - params["delete"] = self.delete - - self._tempdir = await to_thread.run_sync( - lambda: tempfile.TemporaryDirectory(**params) - ) - return await to_thread.run_sync(self._tempdir.__enter__) - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - traceback: TracebackType | None, - ) -> None: - if self._tempdir is not None: - with CancelScope(shield=True): - await to_thread.run_sync( - self._tempdir.__exit__, exc_type, exc_value, traceback - ) - - async def cleanup(self) -> None: - if self._tempdir is not None: - await to_thread.run_sync(self._tempdir.cleanup) - - -@overload -async def mkstemp( - suffix: str | None = None, - prefix: str | None = None, - dir: str | None = None, - text: bool = False, -) -> tuple[int, str]: ... - - -@overload -async def mkstemp( - suffix: bytes | None = None, - prefix: bytes | None = None, - dir: bytes | None = None, - text: bool = False, -) -> tuple[int, bytes]: ... - - -async def mkstemp( - suffix: AnyStr | None = None, - prefix: AnyStr | None = None, - dir: AnyStr | None = None, - text: bool = False, -) -> tuple[int, str | bytes]: - """ - Asynchronously create a temporary file and return an OS-level handle and the file - name. - - This function wraps `tempfile.mkstemp` and executes it in a background thread. - - :param suffix: Suffix to be added to the file name. - :param prefix: Prefix to be added to the file name. - :param dir: Directory in which the temporary file is created. - :param text: Whether the file is opened in text mode. - :return: A tuple containing the file descriptor and the file name. - - """ - return await to_thread.run_sync(tempfile.mkstemp, suffix, prefix, dir, text) - - -@overload -async def mkdtemp( - suffix: str | None = None, - prefix: str | None = None, - dir: str | None = None, -) -> str: ... - - -@overload -async def mkdtemp( - suffix: bytes | None = None, - prefix: bytes | None = None, - dir: bytes | None = None, -) -> bytes: ... - - -async def mkdtemp( - suffix: AnyStr | None = None, - prefix: AnyStr | None = None, - dir: AnyStr | None = None, -) -> str | bytes: - """ - Asynchronously create a temporary directory and return its path. - - This function wraps `tempfile.mkdtemp` and executes it in a background thread. - - :param suffix: Suffix to be added to the directory name. - :param prefix: Prefix to be added to the directory name. - :param dir: Parent directory where the temporary directory is created. - :return: The path of the created temporary directory. - - """ - return await to_thread.run_sync(tempfile.mkdtemp, suffix, prefix, dir) - - -async def gettempdir() -> str: - """ - Asynchronously return the name of the directory used for temporary files. - - This function wraps `tempfile.gettempdir` and executes it in a background thread. - - :return: The path of the temporary directory as a string. - - """ - return await to_thread.run_sync(tempfile.gettempdir) - - -async def gettempdirb() -> bytes: - """ - Asynchronously return the name of the directory used for temporary files in bytes. - - This function wraps `tempfile.gettempdirb` and executes it in a background thread. - - :return: The path of the temporary directory as bytes. - - """ - return await to_thread.run_sync(tempfile.gettempdirb) diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_testing.py b/venv/lib/python3.11/site-packages/anyio/_core/_testing.py deleted file mode 100755 index fa2c391..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_testing.py +++ /dev/null @@ -1,82 +0,0 @@ -from __future__ import annotations - -from collections.abc import Awaitable, Generator -from typing import Any, cast - -from ._eventloop import get_async_backend - - -class TaskInfo: - """ - Represents an asynchronous task. - - :ivar int id: the unique identifier of the task - :ivar parent_id: the identifier of the parent task, if any - :vartype parent_id: Optional[int] - :ivar str name: the description of the task (if any) - :ivar ~collections.abc.Coroutine coro: the coroutine object of the task - """ - - __slots__ = "_name", "coro", "id", "name", "parent_id" - - def __init__( - self, - id: int, - parent_id: int | None, - name: str | None, - coro: Generator[Any, Any, Any] | Awaitable[Any], - ): - func = get_current_task - self._name = f"{func.__module__}.{func.__qualname__}" - self.id: int = id - self.parent_id: int | None = parent_id - self.name: str | None = name - self.coro: Generator[Any, Any, Any] | Awaitable[Any] = coro - - def __eq__(self, other: object) -> bool: - if isinstance(other, TaskInfo): - return self.id == other.id - - return NotImplemented - - def __hash__(self) -> int: - return hash(self.id) - - def __repr__(self) -> str: - return f"{self.__class__.__name__}(id={self.id!r}, name={self.name!r})" - - def has_pending_cancellation(self) -> bool: - """ - Return ``True`` if the task has a cancellation pending, ``False`` otherwise. - - """ - return False - - -def get_current_task() -> TaskInfo: - """ - Return the current task. - - :return: a representation of the current task - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - """ - return get_async_backend().get_current_task() - - -def get_running_tasks() -> list[TaskInfo]: - """ - Return a list of running tasks in the current event loop. - - :return: a list of task info objects - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - """ - return cast("list[TaskInfo]", get_async_backend().get_running_tasks()) - - -async def wait_all_tasks_blocked() -> None: - """Wait until all other tasks are waiting for something.""" - await get_async_backend().wait_all_tasks_blocked() diff --git a/venv/lib/python3.11/site-packages/anyio/_core/_typedattr.py b/venv/lib/python3.11/site-packages/anyio/_core/_typedattr.py deleted file mode 100755 index 59d3da9..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_core/_typedattr.py +++ /dev/null @@ -1,85 +0,0 @@ -from __future__ import annotations - -import sys -from collections.abc import Callable, Mapping -from typing import Any, TypeVar, final, overload - -from ._exceptions import TypedAttributeLookupError - -if sys.version_info < (3, 15): - from typing_extensions import sentinel - -T_Attr = TypeVar("T_Attr") -T_Default = TypeVar("T_Default") -undefined = sentinel("undefined") - - -def typed_attribute() -> Any: - """Return a unique object, used to mark typed attributes.""" - return object() - - -class TypedAttributeSet: - """ - Superclass for typed attribute collections. - - Checks that every public attribute of every subclass has a type annotation. - """ - - def __init_subclass__(cls) -> None: - annotations: dict[str, Any] = getattr(cls, "__annotations__", {}) - for attrname in dir(cls): - if not attrname.startswith("_") and attrname not in annotations: - raise TypeError( - f"Attribute {attrname!r} is missing its type annotation" - ) - - super().__init_subclass__() - - -class TypedAttributeProvider: - """Base class for classes that wish to provide typed extra attributes.""" - - @property - def extra_attributes(self) -> Mapping[T_Attr, Callable[[], T_Attr]]: - """ - A mapping of the extra attributes to callables that return the corresponding - values. - - If the provider wraps another provider, the attributes from that wrapper should - also be included in the returned mapping (but the wrapper may override the - callables from the wrapped instance). - - """ - return {} - - @overload - def extra(self, attribute: T_Attr) -> T_Attr: ... - - @overload - def extra(self, attribute: T_Attr, default: T_Default) -> T_Attr | T_Default: ... - - @final - def extra(self, attribute: Any, default: object = undefined) -> object: - """ - extra(attribute, default=undefined) - - Return the value of the given typed extra attribute. - - :param attribute: the attribute (member of a :class:`~TypedAttributeSet`) to - look for - :param default: the value that should be returned if no value is found for the - attribute - :raises ~anyio.TypedAttributeLookupError: if the search failed and no default - value was given - - """ - try: - getter = self.extra_attributes[attribute] - except KeyError: - if default is undefined: - raise TypedAttributeLookupError("Attribute not found") from None - else: - return default - - return getter() diff --git a/venv/lib/python3.11/site-packages/anyio/_lazyimport.py b/venv/lib/python3.11/site-packages/anyio/_lazyimport.py deleted file mode 100755 index 0b6c4bb..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_lazyimport.py +++ /dev/null @@ -1,170 +0,0 @@ -from __future__ import annotations - -__all__ = ( - "fix_package_names", - "install_lazy_importer", - "set_deprecated_aliases", -) - -import ast -import inspect -import sys -import warnings -from importlib import import_module -from types import ModuleType -from typing import Any - - -def install_lazy_importer() -> bool: - module_globals = sys._getframe(1).f_globals - module_name = module_globals["__name__"] - module_prefix = module_name + "." - module = sys.modules[module_name] - lazy_map, deprecated_aliases = _build_lazy_map(module) - names = sorted(lazy_map) - - # Delete symbols that are not part of the API - del module_globals["TYPE_CHECKING"] - del module_globals["install_lazy_importer"] - - if not lazy_map and not deprecated_aliases: - return False - - def __getattr__(name: str) -> Any: - if new_name := deprecated_aliases.get(name): - emit_deprecation_warning(module_name, name, new_name) - target_mod, target_attr = new_name.rsplit(".", 1) - else: - try: - target_mod, target_attr = lazy_map[name] - except KeyError: - raise AttributeError( - f"module {module_name!r} has no attribute {name!r}" - ) from None - - imported = import_module(target_mod, module_name) - value = getattr(imported, target_attr) - - # patch the module name to match - if ( - getattr(value, "__module__", "").startswith(module_prefix) - and name not in deprecated_aliases - ): - value.__module__ = module_name - - module_globals[name] = value - return value - - def __dir__() -> list[str]: - return names - - module_globals["__dir__"] = __dir__ - module_globals["__getattr__"] = __getattr__ - module_globals.pop("fix_package_names", None) - module_globals.pop("set_deprecated_aliases", None) - return True - - -def fix_package_names() -> None: - module_globals = sys._getframe(1).f_globals - module_prefix = module_globals["__name__"] + "." - del module_globals[fix_package_names.__name__] - for value in module_globals.values(): - if modname := getattr(value, "__module__", ""): - if modname.startswith(module_prefix): - parts = modname.split(".") - value.__module__ = ".".join( - part for part in parts if not part.startswith("_") - ) - - -def emit_deprecation_warning(module_name: str, name: str, target: str) -> None: - warnings.warn( - f"The {module_name}.{name} alias is deprecated, use {target} instead.", - DeprecationWarning, - stacklevel=3, - ) - - -def set_deprecated_aliases(aliases: dict[str, str]) -> None: - module_globals = sys._getframe(1).f_globals - module_name = module_globals["__name__"] - del module_globals[set_deprecated_aliases.__name__] - - def __getattr__(name: str) -> Any: - try: - target = aliases[name] - except KeyError: - raise AttributeError( - f"module {module_name!r} has no attribute {name!r}" - ) from None - - emit_deprecation_warning(module_name, name, target) - target_modname, attrname = target.rsplit(".", 1) - module = import_module(target_modname) - return getattr(module, attrname) - - sys.modules[module_name].__dict__["__getattr__"] = __getattr__ - - -def _build_lazy_map( - module: ModuleType, -) -> tuple[dict[str, tuple[str, str]], dict[str, str]]: - try: - source = inspect.getsource(module) - except OSError: - return {}, {} - - tree = compile(source, module.__file__ or "", "exec", ast.PyCF_ONLY_AST) - assert isinstance(tree, ast.Module) - out: dict[str, tuple[str, str]] = {} - deprecated_aliases: dict[str, str] = {} - - for node in tree.body: - if not isinstance(node, ast.If) or not _is_type_checking_block(node.test): - continue - - for stmt in node.body: - match stmt: - case ast.ImportFrom(): - base = "." * stmt.level + (stmt.module or "") - for alias in stmt.names: - if alias.name == "*": - raise RuntimeError("star imports not supported") - - exported = alias.asname or alias.name - out[exported] = (base, alias.name) - case ast.Expr() if isinstance(stmt.value, ast.Call): - call = stmt.value - if ( - isinstance(call.func, ast.Name) - and call.func.id == "set_deprecated_aliases" - ): - arg0 = call.args[0] - assert isinstance(arg0, ast.Dict) - for key, value in zip(arg0.keys, arg0.values, strict=True): - assert isinstance(key, ast.Constant) - assert isinstance(key.value, str) - assert isinstance(value, ast.Constant) - assert isinstance(value.value, str) - deprecated_aliases[key.value] = value.value - - return out, deprecated_aliases - - -def _is_type_checking_block(test: ast.AST) -> bool: - if not isinstance(test, ast.BoolOp): - return False - - subtest = test.values[0] - match subtest: - case ast.Name(): - return subtest.id == "TYPE_CHECKING" - case ast.Attribute(): - return ( - isinstance(subtest.value, ast.Name) - and subtest.value.id == "typing" - and subtest.attr == "TYPE_CHECKING" - ) - case _: - return False diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__init__.py b/venv/lib/python3.11/site-packages/anyio/abc/__init__.py deleted file mode 100755 index ba738f8..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/__init__.py +++ /dev/null @@ -1,63 +0,0 @@ -from __future__ import annotations - -from typing import TYPE_CHECKING - -from .._lazyimport import ( - fix_package_names, - install_lazy_importer, - set_deprecated_aliases, -) - -if TYPE_CHECKING or not install_lazy_importer(): - from ._eventloop import AsyncBackend as AsyncBackend - from ._resources import AsyncResource as AsyncResource - from ._sockets import ConnectedUDPSocket as ConnectedUDPSocket - from ._sockets import ConnectedUNIXDatagramSocket as ConnectedUNIXDatagramSocket - from ._sockets import IPAddressType as IPAddressType - from ._sockets import IPSockAddrType as IPSockAddrType - from ._sockets import SocketAttribute as SocketAttribute - from ._sockets import SocketListener as SocketListener - from ._sockets import SocketStream as SocketStream - from ._sockets import UDPPacketType as UDPPacketType - from ._sockets import UDPSocket as UDPSocket - from ._sockets import UNIXDatagramPacketType as UNIXDatagramPacketType - from ._sockets import UNIXDatagramSocket as UNIXDatagramSocket - from ._sockets import UNIXSocketStream as UNIXSocketStream - from ._streams import AnyByteReceiveStream as AnyByteReceiveStream - from ._streams import AnyByteSendStream as AnyByteSendStream - from ._streams import AnyByteStream as AnyByteStream - from ._streams import AnyByteStreamConnectable as AnyByteStreamConnectable - from ._streams import ( - AnyUnreliableByteReceiveStream as AnyUnreliableByteReceiveStream, - ) - from ._streams import AnyUnreliableByteSendStream as AnyUnreliableByteSendStream - from ._streams import AnyUnreliableByteStream as AnyUnreliableByteStream - from ._streams import ByteReceiveStream as ByteReceiveStream - from ._streams import ByteSendStream as ByteSendStream - from ._streams import ByteStream as ByteStream - from ._streams import ByteStreamConnectable as ByteStreamConnectable - from ._streams import Listener as Listener - from ._streams import ObjectReceiveStream as ObjectReceiveStream - from ._streams import ObjectSendStream as ObjectSendStream - from ._streams import ObjectStream as ObjectStream - from ._streams import ObjectStreamConnectable as ObjectStreamConnectable - from ._streams import UnreliableObjectReceiveStream as UnreliableObjectReceiveStream - from ._streams import UnreliableObjectSendStream as UnreliableObjectSendStream - from ._streams import UnreliableObjectStream as UnreliableObjectStream - from ._subprocesses import Process as Process - from ._tasks import TaskGroup as TaskGroup - from ._tasks import TaskStatus as TaskStatus - from ._testing import TestRunner as TestRunner - - fix_package_names() - set_deprecated_aliases( - { - "CapacityLimiter": "anyio.CapacityLimiter", - "Condition": "anyio.Condition", - "Event": "anyio.Event", - "Lock": "anyio.Lock", - "Semaphore": "anyio.Semaphore", - "CancelScope": "anyio.CancelScope", - "BlockingPortal": "anyio.from_thread.BlockingPortal", - } - ) diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 16745c29cb8f2f7443d37a98bb66cf09bbb03452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3053 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 diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_sockets.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_sockets.cpython-311.pyc deleted file mode 100755 index d5499239fed1b2749d7de366750079e77ceed933..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20108 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 diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_subprocesses.cpython-311.pyc deleted file mode 100755 index 2ed8a1f94082b10ae1156feba7eb7436ee0028c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3739 zcmcInOK;mo5MD~u!+IrtBu&yH*uEn)p^yeG0yS-#riSAjPg}B`X=DOkwz77v zkpn(sWUahC(U_13%kez4b5_AFHi~wsQIbfC%n>8MLyQSF@hDBm6ZnQtqihsbNVWJB zn^nm#YL4T2nrFI>fM!Ko6CT%e&t~4HYk(xTVs1E^g`MTqZo;bvFU&8_J(a={ z%GX54(U+NU+gxYWlt1}J$79P(XXX}L@i^0Lzk;F_<``jH4{Zsl9R5iAbr|p=VWc4$ zq>(bDMw-dSj3MvHj{x!{)@fuwe!|F($g_bwHzLo0{G?GBk>}Y&FhlWh&!PDW0q!-U zd<3o-;7%FGj=+@y+-YO-2wZu9n>qqlF{WWj&-l3|?&?g4?nl=gs^O|^a@TR&f^IP` zV1=o>PV2g*2~lr~_F5~1D@$&RIZegSa^|(U({Xj92l*cfk@hj67l?!zE5Veh z?!5vXJa;tHqix4CE$VGDIvAU>2c{>KLJX^ibJPP6c2eCn7#fz)iqVUY$z#cv1+&%# z8bO~g*EU_7)ohLHZtbSK;a;j~tyXP|Ia@W$T&uM@khjhy<>JMfFg{Vepy zf!U9JSY_Nc9nE7R>Ee010o#nNw=Jtf&2`#xg)rAFmI&2thu$$A!`&9=LDLje*DOoW zW-}gfVDY(Xv#G@Mf!fmTmHE3=bcDz3NLj${L*vdYkN-&x(iWj-njAvft7&bl$BwQ^%jUk(eq20+S#!TVtOk-?J@b bdK*H-Pb0x#`B@PZXpTpUo&pj*xM4;U z^S3y1SdXbjL-i;d4)#VOj$6bW;-)4t3gL z9*sAeF(@M2kU{alYYZv^nv*ObFLACAT7c!cI~DnOAp3OK)f2-f{`g*BL}%d+0@nt* z?($$~3r}+ljT_W-T5WI4#mETHFr98WGBs$<4qJI@j^Q!7-Hd9r~P5A3b&I0lC zEe=;3?sYgtSx`9NL#~SC10=zTg>^KjB)o(i5_CyCfD#&>OGtO+t3CPZUS_(V%4AA? z5|L+VlAYPP7fLI@_fvW7k4W5)f|;@UbEqGYSRVybBwN`<6Qsn{?%@=8p1%_2+h_b^fZ!o2eh1P|OOmup-s%m%d*p0y_}wLEdc*H7p}paEkG$I( le)rPH!EfoxuKY>wMQ=YlD@hokm;d}^KMQ;Reg!B9>p#Rul}P{q diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_tasks.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_tasks.cpython-311.pyc deleted file mode 100755 index 419c98ec8764b41a58adaae35d42921d280e52fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10522 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 diff --git a/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_testing.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/abc/__pycache__/_testing.cpython-311.pyc deleted file mode 100755 index 4a5978a401cb2f7c24a47c997655446b7d7af2eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3543 zcmd5<&2JM&6rZ)%-%j|5ff68DpoO{(b}6lpq6!J36j6yBz-pz9(#?8zk}TN|cV?Z$ z5eHYwfm=~kiK@pQs1W@d`Zq+V2Wu~l)Dt(O^icWK_hxrZ99zJ#>-F>O@6EiOdB68& zo_`w~%M-XdKmGDR&l2)CKEzilY)JcmK;sE9i7DB{kyJ^-cEV1m3Gtg$lkl6gWhbSk zoV1!2dfCo6SvBkA)SQ!7^G-o62s~vMoiTOH8CS<8LK6>;#IG~c>*9?p1J*Lo>!^BE zB5qnd9SfflgpQlprxGF0;TvA+@dUX|%-jw!^ECB);b{`I@Qt(+X5v067hmFISqcie z>w3QKTb|1o%84Lz^VZy5>g&O{Ugtj34d0>unrD{fVEiU;xyEhkQl|SJ3$k;%ZR>TL z2Dv$pc}?GPX^_3+gBn1vmAvV;f=sQ|pkM2(oOp?ocv%SFE8nN~N|4ZM22LctqG?L| zKLYZEP@+mE0k=xv(sQP~Bdan^nNwzQM}7)Dp2y>eng)E@JU)bH09VWtLwFYO^XBOx zJO}s%^UM&QH_w9GE(ZA;<^H{<3r^T(c?GU{*U%fhY3n}aimouwS?;PrH>m3?w&yh} z%KQdpEyVzLDUNPZ#a{z=t**hZ#TBpqfEvECX@R!MQAveet~>Og6#)imM*Svp**GlS z=yMJa*ar7W`)O!AArHxY@=RKI1|pC-_?lw}rFXZw<~g+L=*;k{UwNzEwW{7|RAI6k zRokjp8!cely;iw;waP7@UTNsYy1q(zRd-vKSJmrARfB~B*Q=FAE68aYER!-#+b+HK zOr?*Wf|v3Ph&JgQnRry#hb9TKbj#3uh>PAN%Eencr}J9|ZD1HKDG!we4?-z}y*6~a zR~pdA>a;LY4^8k&4PuqnVYV1=QJ-F+?s<0fV95CH=sM&r6THPrpkpUMlx2qVW@k{G zLop44<9H;Ty$6jT3v1l6d|3Fz;KBtsi34&V+N4_~rzRg8456U7Vr>C`R9k7fM(1wp zpTH@4mq(-`*{I z222d5PUy;V6zRe@!;zjvx1y1OZ7c?F3_4WC?etBjPPor(|IlB{+!{636)PlN%oR+- z*{Q(6hb=rt4(v2>vM(>!Sd%U<$0LonzQA!tlQGyu?3PlexCwxr8D)9-OWo!;#Dkb) zn--^){w$)PI*CCgj=?a?^A^{lNo=2}fe-G9xm8}ncLvrE^$|Oc2p+!WY?V?_Y?q+OOQ}+q42m>Km%52mYO+gW@hS<}&bJ{tF7$;|u}fmn*CR0b zPWmj4k41kx0;TBvpif~Z5Pf|N2sB(SE)Xi@92CI1Ve6ciOX$*-rZ~Vgh9^dlk6u{GGkZ_G5Bji7?uY?8iqm;GyL1Zur>~gP%Ls7 zqgn2XCqgYa7IuPy!>2ClxHv9CE(ZDOWxohHzrp6g8b&++7eqHHNm7Sg*d4t0NWLvT z9a3zIPlsII9d&oeo!z(H9WuQ;>fTGH|4dFi-h7dq+D%S%(>EkwY*_q!U7)W}_0I^spz=SxW2#&L diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_eventloop.py b/venv/lib/python3.11/site-packages/anyio/abc/_eventloop.py deleted file mode 100755 index a3cbed2..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/_eventloop.py +++ /dev/null @@ -1,428 +0,0 @@ -from __future__ import annotations - -import math -import sys -from abc import ABCMeta, abstractmethod -from collections.abc import ( - AsyncIterator, - Awaitable, - Callable, - Coroutine, - Iterable, - Mapping, - Sequence, -) -from contextlib import AbstractContextManager -from os import PathLike -from signal import Signals -from socket import AddressFamily, SocketKind, socket -from typing import ( - IO, - TYPE_CHECKING, - Any, - TypeAlias, - TypeVar, - overload, -) - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -if TYPE_CHECKING: - from _typeshed import FileDescriptorLike - - from .._core._synchronization import CapacityLimiter, Event, Lock, Semaphore - from .._core._tasks import CancelScope - from .._core._testing import TaskInfo - from ._sockets import ( - ConnectedUDPSocket, - ConnectedUNIXDatagramSocket, - IPSockAddrType, - SocketListener, - SocketStream, - UDPSocket, - UNIXDatagramSocket, - UNIXSocketStream, - ) - from ._subprocesses import Process - from ._tasks import TaskGroup - from ._testing import TestRunner - -T_Retval = TypeVar("T_Retval") -T_co = TypeVar("T_co", covariant=True) -PosArgsT = TypeVarTuple("PosArgsT") -StrOrBytesPath: TypeAlias = str | bytes | PathLike[str] | PathLike[bytes] - - -class AsyncBackend(metaclass=ABCMeta): - @classmethod - @abstractmethod - def run( - cls, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - args: tuple[Unpack[PosArgsT]], - kwargs: dict[str, Any], - options: dict[str, Any], - ) -> T_Retval: - """ - Run the given coroutine function in an asynchronous event loop. - - The current thread must not be already running an event loop. - - :param func: a coroutine function - :param args: positional arguments to ``func`` - :param kwargs: positional arguments to ``func`` - :param options: keyword arguments to call the backend ``run()`` implementation - with - :return: the return value of the coroutine function - """ - - @classmethod - @abstractmethod - def current_token(cls) -> object: - """ - Return an object that allows other threads to run code inside the event loop. - - :return: a token object, specific to the event loop running in the current - thread - """ - - @classmethod - @abstractmethod - def current_time(cls) -> float: - """ - Return the current value of the event loop's internal clock. - - :return: the clock value (seconds) - """ - - @classmethod - @abstractmethod - def cancelled_exception_class(cls) -> type[BaseException]: - """Return the exception class that is raised in a task if it's cancelled.""" - - @classmethod - @abstractmethod - async def checkpoint(cls) -> None: - """ - Check if the task has been cancelled, and allow rescheduling of other tasks. - - This is effectively the same as running :meth:`checkpoint_if_cancelled` and then - :meth:`cancel_shielded_checkpoint`. - """ - - @classmethod - async def checkpoint_if_cancelled(cls) -> None: - """ - Check if the current task group has been cancelled. - - This will check if the task has been cancelled, but will not allow other tasks - to be scheduled if not. - - """ - if cls.current_effective_deadline() == -math.inf: - await cls.checkpoint() - - @classmethod - async def cancel_shielded_checkpoint(cls) -> None: - """ - Allow the rescheduling of other tasks. - - This will give other tasks the opportunity to run, but without checking if the - current task group has been cancelled, unlike with :meth:`checkpoint`. - - """ - with cls.create_cancel_scope(shield=True): - await cls.sleep(0) - - @classmethod - @abstractmethod - async def sleep(cls, delay: float) -> None: - """ - Pause the current task for the specified duration. - - :param delay: the duration, in seconds - """ - - @classmethod - @abstractmethod - def create_cancel_scope( - cls, *, deadline: float = math.inf, shield: bool = False - ) -> CancelScope: - pass - - @classmethod - @abstractmethod - def current_effective_deadline(cls) -> float: - """ - Return the nearest deadline among all the cancel scopes effective for the - current task. - - :return: - - a clock value from the event loop's internal clock - - ``inf`` if there is no deadline in effect - - ``-inf`` if the current scope has been cancelled - :rtype: float - """ - - @classmethod - @abstractmethod - def create_task_group(cls) -> TaskGroup: - pass - - @classmethod - @abstractmethod - def create_event(cls) -> Event: - pass - - @classmethod - @abstractmethod - def create_lock(cls, *, fast_acquire: bool) -> Lock: - pass - - @classmethod - @abstractmethod - def create_semaphore( - cls, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> Semaphore: - pass - - @classmethod - @abstractmethod - def create_capacity_limiter(cls, total_tokens: float) -> CapacityLimiter: - pass - - @classmethod - @abstractmethod - async def run_sync_in_worker_thread( - cls, - func: Callable[[Unpack[PosArgsT]], T_Retval], - args: tuple[Unpack[PosArgsT]], - abandon_on_cancel: bool = False, - limiter: CapacityLimiter | None = None, - ) -> T_Retval: - pass - - @classmethod - @abstractmethod - def check_cancelled(cls) -> None: - pass - - @classmethod - @abstractmethod - def run_async_from_thread( - cls, - func: Callable[[Unpack[PosArgsT]], Coroutine[Any, Any, T_co]], - args: tuple[Unpack[PosArgsT]], - token: object, - ) -> T_co: - pass - - @classmethod - @abstractmethod - def run_sync_from_thread( - cls, - func: Callable[[Unpack[PosArgsT]], T_Retval], - args: tuple[Unpack[PosArgsT]], - token: object, - ) -> T_Retval: - pass - - @classmethod - @abstractmethod - async def open_process( - cls, - command: StrOrBytesPath | Sequence[StrOrBytesPath], - *, - stdin: int | IO[Any] | None, - stdout: int | IO[Any] | None, - stderr: int | IO[Any] | None, - cwd: StrOrBytesPath | None = None, - env: Mapping[str, str] | None = None, - startupinfo: Any = None, - creationflags: int = 0, - start_new_session: bool = False, - pass_fds: Sequence[int] = (), - user: str | int | None = None, - group: str | int | None = None, - extra_groups: Iterable[str | int] | None = None, - umask: int = -1, - **kwargs: Any, - ) -> Process: - pass - - @classmethod - @abstractmethod - def setup_process_pool_exit_at_shutdown(cls, workers: set[Process]) -> None: - pass - - @classmethod - @abstractmethod - async def connect_tcp( - cls, host: str, port: int, local_address: IPSockAddrType | None = None - ) -> SocketStream: - pass - - @classmethod - @abstractmethod - async def connect_unix(cls, path: str | bytes) -> UNIXSocketStream: - pass - - @classmethod - @abstractmethod - def create_tcp_listener(cls, sock: socket) -> SocketListener: - pass - - @classmethod - @abstractmethod - def create_unix_listener(cls, sock: socket) -> SocketListener: - pass - - @classmethod - @abstractmethod - async def create_udp_socket( - cls, - family: AddressFamily, - local_address: IPSockAddrType | None, - remote_address: IPSockAddrType | None, - reuse_port: bool, - ) -> UDPSocket | ConnectedUDPSocket: - pass - - @classmethod - @overload - async def create_unix_datagram_socket( - cls, raw_socket: socket, remote_path: None - ) -> UNIXDatagramSocket: ... - - @classmethod - @overload - async def create_unix_datagram_socket( - cls, raw_socket: socket, remote_path: str | bytes - ) -> ConnectedUNIXDatagramSocket: ... - - @classmethod - @abstractmethod - async def create_unix_datagram_socket( - cls, raw_socket: socket, remote_path: str | bytes | None - ) -> UNIXDatagramSocket | ConnectedUNIXDatagramSocket: - pass - - @classmethod - @abstractmethod - async def getaddrinfo( - cls, - host: bytes | str | None, - port: str | int | None, - *, - family: int | AddressFamily = 0, - type: int | SocketKind = 0, - proto: int = 0, - flags: int = 0, - ) -> Sequence[ - tuple[ - AddressFamily, - SocketKind, - int, - str, - tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], - ] - ]: - pass - - @classmethod - @abstractmethod - async def getnameinfo( - cls, sockaddr: IPSockAddrType, flags: int = 0 - ) -> tuple[str, str]: - pass - - @classmethod - @abstractmethod - async def wait_readable(cls, obj: FileDescriptorLike) -> None: - pass - - @classmethod - @abstractmethod - async def wait_writable(cls, obj: FileDescriptorLike) -> None: - pass - - @classmethod - @abstractmethod - def notify_closing(cls, obj: FileDescriptorLike) -> None: - pass - - @classmethod - @abstractmethod - async def wrap_listener_socket(cls, sock: socket) -> SocketListener: - pass - - @classmethod - @abstractmethod - async def wrap_stream_socket(cls, sock: socket) -> SocketStream: - pass - - @classmethod - @abstractmethod - async def wrap_unix_stream_socket(cls, sock: socket) -> UNIXSocketStream: - pass - - @classmethod - @abstractmethod - async def wrap_udp_socket(cls, sock: socket) -> UDPSocket: - pass - - @classmethod - @abstractmethod - async def wrap_connected_udp_socket(cls, sock: socket) -> ConnectedUDPSocket: - pass - - @classmethod - @abstractmethod - async def wrap_unix_datagram_socket(cls, sock: socket) -> UNIXDatagramSocket: - pass - - @classmethod - @abstractmethod - async def wrap_connected_unix_datagram_socket( - cls, sock: socket - ) -> ConnectedUNIXDatagramSocket: - pass - - @classmethod - @abstractmethod - def current_default_thread_limiter(cls) -> CapacityLimiter: - pass - - @classmethod - @abstractmethod - def open_signal_receiver( - cls, *signals: Signals - ) -> AbstractContextManager[AsyncIterator[Signals]]: - pass - - @classmethod - @abstractmethod - def get_current_task(cls) -> TaskInfo: - pass - - @classmethod - @abstractmethod - def get_running_tasks(cls) -> Sequence[TaskInfo]: - pass - - @classmethod - @abstractmethod - async def wait_all_tasks_blocked(cls) -> None: - pass - - @classmethod - @abstractmethod - def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: - pass diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_resources.py b/venv/lib/python3.11/site-packages/anyio/abc/_resources.py deleted file mode 100755 index 9373f71..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/_resources.py +++ /dev/null @@ -1,39 +0,0 @@ -from __future__ import annotations - -import sys -from abc import ABCMeta, abstractmethod -from types import TracebackType -from typing import TypeVar - -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing_extensions import Self - -T = TypeVar("T") - - -class AsyncResource(metaclass=ABCMeta): - """ - Abstract base class for all closeable asynchronous resources. - - Works as an asynchronous context manager which returns the instance itself on enter, - and calls :meth:`aclose` on exit. - """ - - __slots__ = () - - async def __aenter__(self) -> Self: - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - await self.aclose() - - @abstractmethod - async def aclose(self) -> None: - """Close the resource.""" diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_sockets.py b/venv/lib/python3.11/site-packages/anyio/abc/_sockets.py deleted file mode 100755 index d6a1139..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/_sockets.py +++ /dev/null @@ -1,401 +0,0 @@ -from __future__ import annotations - -import errno -import socket -from abc import abstractmethod -from collections.abc import Callable, Collection, Mapping -from contextlib import AsyncExitStack -from io import IOBase -from ipaddress import IPv4Address, IPv6Address -from socket import AddressFamily -from typing import TYPE_CHECKING, Any, TypeAlias, TypeVar - -from .._core._eventloop import get_async_backend -from .._core._typedattr import ( - TypedAttributeProvider, - TypedAttributeSet, - typed_attribute, -) -from ._streams import ByteStream, Listener, UnreliableObjectStream - -if TYPE_CHECKING: - from ._tasks import TaskGroup - -IPAddressType: TypeAlias = str | IPv4Address | IPv6Address -IPSockAddrType: TypeAlias = tuple[str, int] -SockAddrType: TypeAlias = IPSockAddrType | str -UDPPacketType: TypeAlias = tuple[bytes, IPSockAddrType] -UNIXDatagramPacketType: TypeAlias = tuple[bytes, str] -T_Retval = TypeVar("T_Retval") - - -def _validate_socket( - sock_or_fd: socket.socket | int, - sock_type: socket.SocketKind, - addr_family: socket.AddressFamily = socket.AF_UNSPEC, - *, - require_connected: bool = False, - require_bound: bool = False, -) -> socket.socket: - if isinstance(sock_or_fd, int): - try: - sock = socket.socket(fileno=sock_or_fd) - except OSError as exc: - if exc.errno == errno.ENOTSOCK: - raise ValueError( - "the file descriptor does not refer to a socket" - ) from exc - elif require_connected: - raise ValueError("the socket must be connected") from exc - elif require_bound: - raise ValueError("the socket must be bound to a local address") from exc - else: - raise - elif isinstance(sock_or_fd, socket.socket): - sock = sock_or_fd - else: - raise TypeError( - f"expected an int or socket, got {type(sock_or_fd).__qualname__} instead" - ) - - try: - if require_connected: - try: - sock.getpeername() - except OSError as exc: - raise ValueError("the socket must be connected") from exc - - if require_bound: - try: - if sock.family in (socket.AF_INET, socket.AF_INET6): - bound_addr = sock.getsockname()[1] - else: - bound_addr = sock.getsockname() - except OSError: - bound_addr = None - - if not bound_addr: - raise ValueError("the socket must be bound to a local address") - - if addr_family != socket.AF_UNSPEC and sock.family != addr_family: - raise ValueError( - f"address family mismatch: expected {addr_family.name}, got " - f"{sock.family.name}" - ) - - if sock.type != sock_type: - raise ValueError( - f"socket type mismatch: expected {sock_type.name}, got {sock.type.name}" - ) - except BaseException: - # Avoid ResourceWarning from the locally constructed socket object - if isinstance(sock_or_fd, int): - sock.detach() - - raise - - sock.setblocking(False) - return sock - - -class SocketAttribute(TypedAttributeSet): - """ - .. attribute:: family - :type: socket.AddressFamily - - the address family of the underlying socket - - .. attribute:: local_address - :type: tuple[str, int] | str - - the local address the underlying socket is connected to - - .. attribute:: local_port - :type: int - - for IP based sockets, the local port the underlying socket is bound to - - .. attribute:: raw_socket - :type: socket.socket - - the underlying stdlib socket object - - .. attribute:: remote_address - :type: tuple[str, int] | str - - the remote address the underlying socket is connected to - - .. attribute:: remote_port - :type: int - - for IP based sockets, the remote port the underlying socket is connected to - """ - - family: AddressFamily = typed_attribute() - local_address: SockAddrType = typed_attribute() - local_port: int = typed_attribute() - raw_socket: socket.socket = typed_attribute() - remote_address: SockAddrType = typed_attribute() - remote_port: int = typed_attribute() - - -class _SocketProvider(TypedAttributeProvider): - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - from .._core._sockets import convert_ipv6_sockaddr as convert - - attributes: dict[Any, Callable[[], Any]] = { - SocketAttribute.family: lambda: self._raw_socket.family, - SocketAttribute.local_address: lambda: convert( - self._raw_socket.getsockname() - ), - SocketAttribute.raw_socket: lambda: self._raw_socket, - } - try: - peername: tuple[str, int] | None = convert(self._raw_socket.getpeername()) - except OSError: - peername = None - - # Provide the remote address for connected sockets - if peername is not None: - attributes[SocketAttribute.remote_address] = lambda: peername - - # Provide local and remote ports for IP based sockets - if self._raw_socket.family in (AddressFamily.AF_INET, AddressFamily.AF_INET6): - attributes[SocketAttribute.local_port] = lambda: ( - self._raw_socket.getsockname()[1] - ) - if peername is not None: - remote_port = peername[1] - attributes[SocketAttribute.remote_port] = lambda: remote_port - - return attributes - - @property - @abstractmethod - def _raw_socket(self) -> socket.socket: - pass - - -class SocketStream(ByteStream, _SocketProvider): - """ - Transports bytes over a socket. - - Supports all relevant extra attributes from :class:`~SocketAttribute`. - """ - - @classmethod - async def from_socket(cls, sock_or_fd: socket.socket | int) -> SocketStream: - """ - Wrap an existing socket object or file descriptor as a socket stream. - - The newly created socket wrapper takes ownership of the socket being passed in. - The existing socket must already be connected. - - :param sock_or_fd: a socket object or file descriptor - :return: a socket stream - - """ - sock = _validate_socket(sock_or_fd, socket.SOCK_STREAM, require_connected=True) - return await get_async_backend().wrap_stream_socket(sock) - - -class UNIXSocketStream(SocketStream): - @classmethod - async def from_socket(cls, sock_or_fd: socket.socket | int) -> UNIXSocketStream: - """ - Wrap an existing socket object or file descriptor as a UNIX socket stream. - - The newly created socket wrapper takes ownership of the socket being passed in. - The existing socket must already be connected. - - :param sock_or_fd: a socket object or file descriptor - :return: a UNIX socket stream - - """ - sock = _validate_socket( - sock_or_fd, socket.SOCK_STREAM, socket.AF_UNIX, require_connected=True - ) - return await get_async_backend().wrap_unix_stream_socket(sock) - - @abstractmethod - async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: - """ - Send file descriptors along with a message to the peer. - - :param message: a non-empty bytestring - :param fds: a collection of files (either numeric file descriptors or open file - or socket objects) - """ - - @abstractmethod - async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: - """ - Receive file descriptors along with a message from the peer. - - :param msglen: length of the message to expect from the peer - :param maxfds: maximum number of file descriptors to expect from the peer - :return: a tuple of (message, file descriptors) - """ - - -class SocketListener(Listener[SocketStream], _SocketProvider): - """ - Listens to incoming socket connections. - - Supports all relevant extra attributes from :class:`~SocketAttribute`. - """ - - @classmethod - async def from_socket( - cls, - sock_or_fd: socket.socket | int, - ) -> SocketListener: - """ - Wrap an existing socket object or file descriptor as a socket listener. - - The newly created listener takes ownership of the socket being passed in. - - :param sock_or_fd: a socket object or file descriptor - :return: a socket listener - - """ - sock = _validate_socket(sock_or_fd, socket.SOCK_STREAM, require_bound=True) - return await get_async_backend().wrap_listener_socket(sock) - - @abstractmethod - async def accept(self) -> SocketStream: - """Accept an incoming connection.""" - - async def serve( - self, - handler: Callable[[SocketStream], Any], - task_group: TaskGroup | None = None, - ) -> None: - from .. import create_task_group - - async with AsyncExitStack() as stack: - if task_group is None: - task_group = await stack.enter_async_context(create_task_group()) - - while True: - stream = await self.accept() - task_group.start_soon(handler, stream) - - -class UDPSocket(UnreliableObjectStream[UDPPacketType], _SocketProvider): - """ - Represents an unconnected UDP socket. - - Supports all relevant extra attributes from :class:`~SocketAttribute`. - """ - - @classmethod - async def from_socket(cls, sock_or_fd: socket.socket | int) -> UDPSocket: - """ - Wrap an existing socket object or file descriptor as a UDP socket. - - The newly created socket wrapper takes ownership of the socket being passed in. - The existing socket must be bound to a local address. - - :param sock_or_fd: a socket object or file descriptor - :return: a UDP socket - - """ - sock = _validate_socket(sock_or_fd, socket.SOCK_DGRAM, require_bound=True) - return await get_async_backend().wrap_udp_socket(sock) - - async def sendto(self, data: bytes, host: str, port: int) -> None: - """ - Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, (host, port))). - - """ - return await self.send((data, (host, port))) - - -class ConnectedUDPSocket(UnreliableObjectStream[bytes], _SocketProvider): - """ - Represents an connected UDP socket. - - Supports all relevant extra attributes from :class:`~SocketAttribute`. - """ - - @classmethod - async def from_socket(cls, sock_or_fd: socket.socket | int) -> ConnectedUDPSocket: - """ - Wrap an existing socket object or file descriptor as a connected UDP socket. - - The newly created socket wrapper takes ownership of the socket being passed in. - The existing socket must already be connected. - - :param sock_or_fd: a socket object or file descriptor - :return: a connected UDP socket - - """ - sock = _validate_socket( - sock_or_fd, - socket.SOCK_DGRAM, - require_connected=True, - ) - return await get_async_backend().wrap_connected_udp_socket(sock) - - -class UNIXDatagramSocket( - UnreliableObjectStream[UNIXDatagramPacketType], _SocketProvider -): - """ - Represents an unconnected Unix datagram socket. - - Supports all relevant extra attributes from :class:`~SocketAttribute`. - """ - - @classmethod - async def from_socket( - cls, - sock_or_fd: socket.socket | int, - ) -> UNIXDatagramSocket: - """ - Wrap an existing socket object or file descriptor as a UNIX datagram - socket. - - The newly created socket wrapper takes ownership of the socket being passed in. - - :param sock_or_fd: a socket object or file descriptor - :return: a UNIX datagram socket - - """ - sock = _validate_socket(sock_or_fd, socket.SOCK_DGRAM, socket.AF_UNIX) - return await get_async_backend().wrap_unix_datagram_socket(sock) - - async def sendto(self, data: bytes, path: str) -> None: - """Alias for :meth:`~.UnreliableObjectSendStream.send` ((data, path)).""" - return await self.send((data, path)) - - -class ConnectedUNIXDatagramSocket(UnreliableObjectStream[bytes], _SocketProvider): - """ - Represents a connected Unix datagram socket. - - Supports all relevant extra attributes from :class:`~SocketAttribute`. - """ - - @classmethod - async def from_socket( - cls, - sock_or_fd: socket.socket | int, - ) -> ConnectedUNIXDatagramSocket: - """ - Wrap an existing socket object or file descriptor as a connected UNIX datagram - socket. - - The newly created socket wrapper takes ownership of the socket being passed in. - The existing socket must already be connected. - - :param sock_or_fd: a socket object or file descriptor - :return: a connected UNIX datagram socket - - """ - sock = _validate_socket( - sock_or_fd, socket.SOCK_DGRAM, socket.AF_UNIX, require_connected=True - ) - return await get_async_backend().wrap_connected_unix_datagram_socket(sock) diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_streams.py b/venv/lib/python3.11/site-packages/anyio/abc/_streams.py deleted file mode 100755 index daf335d..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/_streams.py +++ /dev/null @@ -1,237 +0,0 @@ -from __future__ import annotations - -from abc import ABCMeta, abstractmethod -from collections.abc import Callable -from typing import TYPE_CHECKING, Any, Generic, TypeAlias, TypeVar - -from .._core._exceptions import EndOfStream -from .._core._typedattr import TypedAttributeProvider -from ._resources import AsyncResource - -if TYPE_CHECKING: - from ._tasks import TaskGroup - -T_Item = TypeVar("T_Item") -T_co = TypeVar("T_co", covariant=True) -T_contra = TypeVar("T_contra", contravariant=True) - - -class UnreliableObjectReceiveStream( - AsyncResource, TypedAttributeProvider, Generic[T_co] -): - """ - An interface for receiving objects. - - This interface makes no guarantees that the received messages arrive in the order in - which they were sent, or that no messages are missed. - - Asynchronously iterating over objects of this type will yield objects matching the - given type parameter. - """ - - def __aiter__(self) -> UnreliableObjectReceiveStream[T_co]: - return self - - async def __anext__(self) -> T_co: - try: - return await self.receive() - except EndOfStream: - raise StopAsyncIteration from None - - @abstractmethod - async def receive(self) -> T_co: - """ - Receive the next item. - - :raises ~anyio.ClosedResourceError: if the receive stream has been explicitly - closed - :raises ~anyio.EndOfStream: if this stream has been closed from the other end - :raises ~anyio.BrokenResourceError: if this stream has been rendered unusable - due to external causes - """ - - -class UnreliableObjectSendStream( - AsyncResource, TypedAttributeProvider, Generic[T_contra] -): - """ - An interface for sending objects. - - This interface makes no guarantees that the messages sent will reach the - recipient(s) in the same order in which they were sent, or at all. - """ - - @abstractmethod - async def send(self, item: T_contra) -> None: - """ - Send an item to the peer(s). - - :param item: the item to send - :raises ~anyio.ClosedResourceError: if the send stream has been explicitly - closed - :raises ~anyio.BrokenResourceError: if this stream has been rendered unusable - due to external causes - """ - - -class UnreliableObjectStream( - UnreliableObjectReceiveStream[T_Item], UnreliableObjectSendStream[T_Item] -): - """ - A bidirectional message stream which does not guarantee the order or reliability of - message delivery. - """ - - -class ObjectReceiveStream(UnreliableObjectReceiveStream[T_co]): - """ - A receive message stream which guarantees that messages are received in the same - order in which they were sent, and that no messages are missed. - """ - - -class ObjectSendStream(UnreliableObjectSendStream[T_contra]): - """ - A send message stream which guarantees that messages are delivered in the same order - in which they were sent, without missing any messages in the middle. - """ - - -class ObjectStream( - ObjectReceiveStream[T_Item], - ObjectSendStream[T_Item], - UnreliableObjectStream[T_Item], -): - """ - A bidirectional message stream which guarantees the order and reliability of message - delivery. - """ - - @abstractmethod - async def send_eof(self) -> None: - """ - Send an end-of-file indication to the peer. - - You should not try to send any further data to this stream after calling this - method. This method is idempotent (does nothing on successive calls). - """ - - -class ByteReceiveStream(AsyncResource, TypedAttributeProvider): - """ - An interface for receiving bytes from a single peer. - - Iterating this byte stream will yield a byte string of arbitrary length, but no more - than 65536 bytes. - """ - - def __aiter__(self) -> ByteReceiveStream: - return self - - async def __anext__(self) -> bytes: - try: - return await self.receive() - except EndOfStream: - raise StopAsyncIteration from None - - @abstractmethod - async def receive(self, max_bytes: int = 65536) -> bytes: - """ - Receive at most ``max_bytes`` bytes from the peer. - - .. note:: Implementers of this interface should not return an empty - :class:`bytes` object, and users should ignore them. - - :param max_bytes: maximum number of bytes to receive (must be a positive - integer) - :return: the received bytes - :raises ValueError: if ``max_bytes`` is less than 1 - :raises ~anyio.EndOfStream: if this stream has been closed from the other end - """ - - -class ByteSendStream(AsyncResource, TypedAttributeProvider): - """An interface for sending bytes to a single peer.""" - - @abstractmethod - async def send(self, item: bytes) -> None: - """ - Send the given bytes to the peer. - - :param item: the bytes to send - """ - - -class ByteStream(ByteReceiveStream, ByteSendStream): - """A bidirectional byte stream.""" - - @abstractmethod - async def send_eof(self) -> None: - """ - Send an end-of-file indication to the peer. - - You should not try to send any further data to this stream after calling this - method. This method is idempotent (does nothing on successive calls). - """ - - -#: Type alias for all unreliable bytes-oriented receive streams. -AnyUnreliableByteReceiveStream: TypeAlias = ( - UnreliableObjectReceiveStream[bytes] | ByteReceiveStream -) -#: Type alias for all unreliable bytes-oriented send streams. -AnyUnreliableByteSendStream: TypeAlias = ( - UnreliableObjectSendStream[bytes] | ByteSendStream -) -#: Type alias for all unreliable bytes-oriented streams. -AnyUnreliableByteStream: TypeAlias = UnreliableObjectStream[bytes] | ByteStream -#: Type alias for all bytes-oriented receive streams. -AnyByteReceiveStream: TypeAlias = ObjectReceiveStream[bytes] | ByteReceiveStream -#: Type alias for all bytes-oriented send streams. -AnyByteSendStream: TypeAlias = ObjectSendStream[bytes] | ByteSendStream -#: Type alias for all bytes-oriented streams. -AnyByteStream: TypeAlias = ObjectStream[bytes] | ByteStream - - -class Listener(AsyncResource, TypedAttributeProvider, Generic[T_co]): - """An interface for objects that let you accept incoming connections.""" - - @abstractmethod - async def serve( - self, handler: Callable[[T_co], Any], task_group: TaskGroup | None = None - ) -> None: - """ - Accept incoming connections as they come in and start tasks to handle them. - - :param handler: a callable that will be used to handle each accepted connection - :param task_group: the task group that will be used to start tasks for handling - each accepted connection (if omitted, an ad-hoc task group will be created) - """ - - -class ObjectStreamConnectable(Generic[T_co], metaclass=ABCMeta): - @abstractmethod - async def connect(self) -> ObjectStream[T_co]: - """ - Connect to the remote endpoint. - - :return: an object stream connected to the remote end - :raises ConnectionFailed: if the connection fails - """ - - -class ByteStreamConnectable(metaclass=ABCMeta): - @abstractmethod - async def connect(self) -> ByteStream: - """ - Connect to the remote endpoint. - - :return: a bytestream connected to the remote end - :raises ConnectionFailed: if the connection fails - """ - - -#: Type alias for all connectables returning bytestreams or bytes-oriented object streams -AnyByteStreamConnectable: TypeAlias = ( - ObjectStreamConnectable[bytes] | ByteStreamConnectable -) diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_subprocesses.py b/venv/lib/python3.11/site-packages/anyio/abc/_subprocesses.py deleted file mode 100755 index 555f15f..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/_subprocesses.py +++ /dev/null @@ -1,82 +0,0 @@ -from __future__ import annotations - -from abc import abstractmethod -from signal import Signals -from typing import TYPE_CHECKING - -from ._resources import AsyncResource - -if TYPE_CHECKING: - from ._streams import ByteReceiveStream, ByteSendStream - - -class Process(AsyncResource): - """An asynchronous version of :class:`subprocess.Popen`.""" - - @abstractmethod - async def wait(self) -> int: - """ - Wait until the process exits. - - :return: the exit code of the process - """ - - @abstractmethod - def terminate(self) -> None: - """ - Terminates the process, gracefully if possible. - - On Windows, this calls ``TerminateProcess()``. - On POSIX systems, this sends ``SIGTERM`` to the process. - - .. seealso:: :meth:`subprocess.Popen.terminate` - """ - - @abstractmethod - def kill(self) -> None: - """ - Kills the process. - - On Windows, this calls ``TerminateProcess()``. - On POSIX systems, this sends ``SIGKILL`` to the process. - - .. seealso:: :meth:`subprocess.Popen.kill` - """ - - @abstractmethod - def send_signal(self, signal: Signals) -> None: - """ - Send a signal to the subprocess. - - .. seealso:: :meth:`subprocess.Popen.send_signal` - - :param signal: the signal number (e.g. :data:`signal.SIGHUP`) - """ - - @property - @abstractmethod - def pid(self) -> int: - """The process ID of the process.""" - - @property - @abstractmethod - def returncode(self) -> int | None: - """ - The return code of the process. If the process has not yet terminated, this will - be ``None``. - """ - - @property - @abstractmethod - def stdin(self) -> ByteSendStream | None: - """The stream for the standard input of the process.""" - - @property - @abstractmethod - def stdout(self) -> ByteReceiveStream | None: - """The stream for the standard output of the process.""" - - @property - @abstractmethod - def stderr(self) -> ByteReceiveStream | None: - """The stream for the standard error output of the process.""" diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_tasks.py b/venv/lib/python3.11/site-packages/anyio/abc/_tasks.py deleted file mode 100755 index 0a019e2..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/_tasks.py +++ /dev/null @@ -1,223 +0,0 @@ -from __future__ import annotations - -import sys -from abc import ABCMeta, abstractmethod -from collections.abc import Callable, Coroutine -from contextvars import Context -from types import TracebackType -from typing import TYPE_CHECKING, Any, Literal, Protocol, final, overload - -if sys.version_info >= (3, 13): - from typing import TypeVar -else: - from typing_extensions import TypeVar - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -if TYPE_CHECKING: - from .._core._tasks import CancelScope, TaskHandle - -T_co = TypeVar("T_co", covariant=True) -T_contra = TypeVar("T_contra", contravariant=True, default=None) -PosArgsT = TypeVarTuple("PosArgsT") - - -def get_coro_name(coro: Coroutine[Any, Any, object], override: object = None) -> str: - if override is not None: - return str(override) - - try: - cr_frame = coro.cr_frame # type: ignore[attr-defined] - module = cr_frame.f_globals["__name__"] - except (AttributeError, KeyError): - module = None - - qualname = getattr(coro, "__qualname__", None) - return ".".join([x for x in (module, qualname) if x]) - - -def get_callable_name(func: Callable, override: object = None) -> str: - if override is not None: - return str(override) - - module = getattr(func, "__module__", None) - qualname = getattr(func, "__qualname__", None) - return ".".join([x for x in (module, qualname) if x]) - - -def call_for_coroutine( - func: Callable[[Unpack[PosArgsT]], Coroutine[Any, Any, T_co]], - args: tuple[Unpack[PosArgsT]], - **kwargs: Any, -) -> Coroutine[Any, Any, T_co]: - """ - Call the given function with the given positional and keyword arguments. - - :return: the resulting coroutine - :raises TypeError: if the return value was not a coroutine object - - """ - coro = func(*args, **kwargs) - if not isinstance(coro, Coroutine): - prefix = f"{func.__module__}." if hasattr(func, "__module__") else "" - raise TypeError( - f"Expected {prefix}{func.__qualname__}() to return a coroutine, but " - f"the return value ({coro!r}) is not a coroutine object" - ) - - return coro - - -class TaskStatus(Protocol[T_contra]): - @overload - def started(self: TaskStatus[None]) -> None: ... - - @overload - def started(self, value: T_contra) -> None: ... - - def started(self, value: T_contra | None = None) -> None: - """ - Signal that the task has started. - - :param value: object passed back to the starter of the task - """ - - -class TaskGroup(metaclass=ABCMeta): - """ - Groups several asynchronous tasks together. - - :ivar cancel_scope: the cancel scope inherited by all child tasks - :vartype cancel_scope: CancelScope - - .. note:: On asyncio, support for eager task factories is considered to be - **experimental**. In particular, they don't follow the usual semantics of new - tasks being scheduled on the next iteration of the event loop, and may thus - cause unexpected behavior in code that wasn't written with such semantics in - mind. - """ - - cancel_scope: CancelScope - - def cancel(self, reason: str | None = None) -> None: - """ - Cancel this task group's cancel scope immediately. - - This is a shortcut for calling ``.cancel_scope.cancel()`` on the task group. - - :param reason: a message describing the reason for the cancellation - - .. versionadded:: 4.14.0 - - """ - self.cancel_scope.cancel(reason) - - @abstractmethod - def create_task( - self, - coro: Coroutine[Any, Any, T_co], - *, - name: object = None, - context: Context | None = None, - ) -> TaskHandle[T_co]: - """ - Create a new task from a coroutine object and schedule it to run. - - :param coro: a coroutine object - :param name: optional name to give the task - :param context: optional context to run the task in - :return: a task handle - - .. versionadded:: 4.14.0 - """ - - @final - def start_soon( - self, - func: Callable[[Unpack[PosArgsT]], Coroutine[Any, Any, T_co]], - *args: Unpack[PosArgsT], - name: object = None, - ) -> TaskHandle[T_co]: - """ - Start a new task in this task group. - - :param func: a coroutine function - :param args: positional arguments to call the function with - :param name: name of the task, for the purposes of introspection and debugging - :return: a task handle - - .. versionadded:: 3.0 - .. versionchanged:: 4.14.0 - This method now returns a task handle. - - """ - final_name = get_callable_name(func, name) - return self.create_task(call_for_coroutine(func, args), name=final_name) - - @overload - async def start( - self, - func: Callable[..., Coroutine[Any, Any, T_co]], - *args: object, - name: object = None, - return_handle: Literal[False] = ..., - ) -> Any: ... - - @overload - async def start( - self, - func: Callable[..., Coroutine[Any, Any, T_co]], - *args: object, - name: object = None, - return_handle: Literal[True], - ) -> TaskHandle[T_co, Any]: ... - - @abstractmethod - async def start( - self, - func: Callable[..., Coroutine[Any, Any, T_co]], - *args: object, - name: object = None, - return_handle: Literal[False, True] = False, - ) -> Any: - """ - Start a new task and wait until it signals for readiness. - - The target callable must accept a keyword argument ``task_status`` (of type - :class:`TaskStatus`). Awaiting on this method will return whatever was passed to - ``task_status.started()`` (``None`` by default). - - .. note:: The :class:`TaskStatus` class is generic, and the type argument should - indicate the type of the value that will be passed to - ``task_status.started()``. - - :param func: a coroutine function that accepts the ``task_status`` keyword - argument - :param args: positional arguments to call the function with - :param name: an optional name for the task, for introspection and debugging - :param return_handle: if ``True``, return a :class:`TaskHandle` which also - contains the start value in ``start_value`` - :return: the value passed to ``task_status.started()`` - :raises RuntimeError: if the task finishes without calling - ``task_status.started()`` - - .. seealso:: :ref:`start_initialize` - - .. versionadded:: 3.0 - """ - - @abstractmethod - async def __aenter__(self) -> TaskGroup: - """Enter the task group context and allow starting new tasks.""" - - @abstractmethod - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool: - """Exit the task group context waiting for all tasks to finish.""" diff --git a/venv/lib/python3.11/site-packages/anyio/abc/_testing.py b/venv/lib/python3.11/site-packages/anyio/abc/_testing.py deleted file mode 100755 index b18d835..0000000 --- a/venv/lib/python3.11/site-packages/anyio/abc/_testing.py +++ /dev/null @@ -1,79 +0,0 @@ -from __future__ import annotations - -import sys -import types -from abc import ABCMeta, abstractmethod -from collections.abc import AsyncGenerator, Callable, Coroutine, Iterable -from typing import Any, TypeVar - -if sys.version_info >= (3, 11): - from typing import Self -else: - from typing_extensions import Self - -_T = TypeVar("_T") - - -class TestRunner(metaclass=ABCMeta): - """ - Encapsulates a running event loop. Every call made through this object will use the - same event loop. - """ - - def __enter__(self) -> Self: - return self - - @abstractmethod - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: types.TracebackType | None, - ) -> bool | None: ... - - @abstractmethod - def run_asyncgen_fixture( - self, - fixture_func: Callable[..., AsyncGenerator[_T, Any]], - kwargs: dict[str, Any], - ) -> Iterable[_T]: - """ - Run an async generator fixture. - - :param fixture_func: the fixture function - :param kwargs: keyword arguments to call the fixture function with - :return: an iterator yielding the value yielded from the async generator - """ - - @abstractmethod - def run_fixture( - self, - fixture_func: Callable[..., Coroutine[Any, Any, _T]], - kwargs: dict[str, Any], - ) -> _T: - """ - Run an async fixture. - - :param fixture_func: the fixture function - :param kwargs: keyword arguments to call the fixture function with - :return: the return value of the fixture function - """ - - @abstractmethod - def run_test( - self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] - ) -> None: - """ - Run an async test function. - - :param test_func: the test function - :param kwargs: keyword arguments to call the test function with - """ - - @abstractmethod - def is_running(self) -> bool: - """ - Check if the test runner is running. - - :return: ``True`` if the coroutine is currently being run, ``False`` otherwise. - """ diff --git a/venv/lib/python3.11/site-packages/anyio/from_thread.py b/venv/lib/python3.11/site-packages/anyio/from_thread.py deleted file mode 100755 index f163d81..0000000 --- a/venv/lib/python3.11/site-packages/anyio/from_thread.py +++ /dev/null @@ -1,588 +0,0 @@ -from __future__ import annotations - -__all__ = ( - "BlockingPortal", - "BlockingPortalProvider", - "check_cancelled", - "run", - "run_sync", - "start_blocking_portal", -) - -import sys -from collections.abc import Awaitable, Callable, Coroutine, Generator -from concurrent.futures import Future -from contextlib import ( - AbstractAsyncContextManager, - AbstractContextManager, - contextmanager, -) -from contextvars import Context -from dataclasses import dataclass, field -from functools import partial -from inspect import isawaitable -from threading import Lock, Thread, current_thread, get_ident -from types import TracebackType -from typing import ( - Any, - Generic, - TypeVar, - cast, - overload, -) - -from ._core._eventloop import ( - get_cancelled_exc_class, - threadlocals, -) -from ._core._eventloop import run as run_eventloop -from ._core._exceptions import NoEventLoopError -from ._core._synchronization import Event -from ._core._tasks import CancelScope, create_task_group -from .abc._tasks import TaskStatus -from .lowlevel import EventLoopToken, current_token - -if sys.version_info >= (3, 11): - from typing import Self, TypeVarTuple, Unpack -else: - from typing_extensions import Self, TypeVarTuple, Unpack - -T_Retval = TypeVar("T_Retval") -T_co = TypeVar("T_co", covariant=True) -PosArgsT = TypeVarTuple("PosArgsT") - - -def _token_or_error(token: EventLoopToken | None) -> EventLoopToken: - if token is not None: - return token - - try: - return threadlocals.current_token - except AttributeError: - raise NoEventLoopError( - "Not running inside an AnyIO worker thread, and no event loop token was " - "provided" - ) from None - - -def run( - func: Callable[[Unpack[PosArgsT]], Coroutine[Any, Any, T_co]], - *args: Unpack[PosArgsT], - token: EventLoopToken | None = None, -) -> T_co: - """ - Call a coroutine function from a worker thread. - - :param func: a coroutine function - :param args: positional arguments for the callable - :param token: an event loop token to use to get back to the event loop thread - (required if calling this function from outside an AnyIO worker thread) - :return: the return value of the coroutine function - :raises MissingTokenError: if no token was provided and called from outside an - AnyIO worker thread - :raises RunFinishedError: if the event loop tied to ``token`` is no longer running - - .. versionchanged:: 4.11.0 - Added the ``token`` parameter. - - """ - explicit_token = token is not None - token = _token_or_error(token) - return token.backend_class.run_async_from_thread( - func, args, token=token.native_token if explicit_token else None - ) - - -def run_sync( - func: Callable[[Unpack[PosArgsT]], T_Retval], - *args: Unpack[PosArgsT], - token: EventLoopToken | None = None, -) -> T_Retval: - """ - Call a function in the event loop thread from a worker thread. - - :param func: a callable - :param args: positional arguments for the callable - :param token: an event loop token to use to get back to the event loop thread - (required if calling this function from outside an AnyIO worker thread) - :return: the return value of the callable - :raises MissingTokenError: if no token was provided and called from outside an - AnyIO worker thread - :raises RunFinishedError: if the event loop tied to ``token`` is no longer running - - .. versionchanged:: 4.11.0 - Added the ``token`` parameter. - - """ - explicit_token = token is not None - token = _token_or_error(token) - return token.backend_class.run_sync_from_thread( - func, args, token=token.native_token if explicit_token else None - ) - - -class _BlockingAsyncContextManager(AbstractContextManager, Generic[T_co]): - _enter_future: Future[T_co] - _exit_future: Future[bool | None] - _exit_event: Event - _exit_exc_info: tuple[ - type[BaseException] | None, BaseException | None, TracebackType | None - ] = (None, None, None) - - def __init__( - self, async_cm: AbstractAsyncContextManager[T_co], portal: BlockingPortal - ): - self._async_cm = async_cm - self._portal = portal - - async def run_async_cm(self) -> bool | None: - try: - self._exit_event = Event() - value = await self._async_cm.__aenter__() - except BaseException as exc: - self._enter_future.set_exception(exc) - raise - else: - self._enter_future.set_result(value) - - try: - # Wait for the sync context manager to exit. - # This next statement can raise `get_cancelled_exc_class()` if - # something went wrong in a task group in this async context - # manager. - await self._exit_event.wait() - finally: - # In case of cancellation, it could be that we end up here before - # `_BlockingAsyncContextManager.__exit__` is called, and an - # `_exit_exc_info` has been set. - result = await self._async_cm.__aexit__(*self._exit_exc_info) - - return result - - def __enter__(self) -> T_co: - self._enter_future = Future() - self._exit_future = self._portal.start_task_soon(self.run_async_cm) - return self._enter_future.result() - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_value: BaseException | None, - traceback: TracebackType | None, - /, - ) -> bool | None: - self._exit_exc_info = exc_type, exc_value, traceback - self._portal.call(self._exit_event.set) - return self._exit_future.result() - - -class _BlockingPortalTaskStatus(TaskStatus): - def __init__(self, future: Future): - self._future = future - - def started(self, value: object = None) -> None: - self._future.set_result(value) - - -class BlockingPortal: - """ - An object that lets external threads run code in an asynchronous event loop. - - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - """ - - def __init__(self) -> None: - self._token = current_token() - self._event_loop_thread_id: int | None = get_ident() - self._stop_event = Event() - self._task_group = create_task_group() - - async def __aenter__(self) -> Self: - await self._task_group.__aenter__() - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool: - await self.stop() - return await self._task_group.__aexit__(exc_type, exc_val, exc_tb) - - def _check_running(self) -> None: - if self._event_loop_thread_id is None: - raise RuntimeError("This portal is not running") - if self._event_loop_thread_id == get_ident(): - raise RuntimeError( - "This method cannot be called from the event loop thread" - ) - - async def sleep_until_stopped(self) -> None: - """Sleep until :meth:`stop` is called.""" - await self._stop_event.wait() - - async def stop(self, cancel_remaining: bool = False) -> None: - """ - Signal the portal to shut down. - - This marks the portal as no longer accepting new calls and exits from - :meth:`sleep_until_stopped`. - - :param cancel_remaining: ``True`` to cancel all the remaining tasks, ``False`` - to let them finish before returning - - """ - self._event_loop_thread_id = None - self._stop_event.set() - if cancel_remaining: - self._task_group.cancel_scope.cancel("the blocking portal is shutting down") - - async def _call_func( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], - args: tuple[Unpack[PosArgsT]], - kwargs: dict[str, Any], - future: Future[T_Retval], - ) -> None: - event_loop_thread_id = self._event_loop_thread_id - - def callback(f: Future[T_Retval]) -> None: - if f.cancelled(): - if event_loop_thread_id == get_ident(): - scope.cancel("the future was cancelled") - elif event_loop_thread_id is not None: - run_sync( - scope.cancel, "the future was cancelled", token=self._token - ) - - try: - retval_or_awaitable = func(*args, **kwargs) - if isawaitable(retval_or_awaitable): - with CancelScope() as scope: - future.add_done_callback(callback) - retval = await retval_or_awaitable - else: - retval = retval_or_awaitable - except get_cancelled_exc_class(): - future.cancel() - future.set_running_or_notify_cancel() - except BaseException as exc: - if not future.cancelled(): - future.set_exception(exc) - - # Let base exceptions fall through - if not isinstance(exc, Exception): - raise - else: - if not future.cancelled(): - future.set_result(retval) - finally: - scope = None # type: ignore[assignment] - - def _spawn_task_from_thread( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], - args: tuple[Unpack[PosArgsT]], - kwargs: dict[str, Any], - name: object, - future: Future[T_Retval], - ) -> None: - """ - Spawn a new task using the given callable. - - :param func: a callable - :param args: positional arguments to be passed to the callable - :param kwargs: keyword arguments to be passed to the callable - :param name: name of the task (will be coerced to a string if not ``None``) - :param future: a future that will resolve to the return value of the callable, - or the exception raised during its execution - - """ - run_sync( - partial(self._task_group.start_soon, name=name), - self._call_func, - func, - args, - kwargs, - future, - token=self._token, - ) - - @overload - def call( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - *args: Unpack[PosArgsT], - ) -> T_Retval: ... - - @overload - def call( - self, func: Callable[[Unpack[PosArgsT]], T_Retval], *args: Unpack[PosArgsT] - ) -> T_Retval: ... - - def call( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], - *args: Unpack[PosArgsT], - ) -> T_Retval: - """ - Call the given function in the event loop thread. - - If the callable returns a coroutine object, it is awaited on. - - :param func: any callable - :raises RuntimeError: if the portal is not running or if this method is called - from within the event loop thread - - """ - return cast(T_Retval, self.start_task_soon(func, *args).result()) - - @overload - def start_task_soon( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - *args: Unpack[PosArgsT], - name: object = None, - ) -> Future[T_Retval]: ... - - @overload - def start_task_soon( - self, - func: Callable[[Unpack[PosArgsT]], T_Retval], - *args: Unpack[PosArgsT], - name: object = None, - ) -> Future[T_Retval]: ... - - def start_task_soon( - self, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval] | T_Retval], - *args: Unpack[PosArgsT], - name: object = None, - ) -> Future[T_Retval]: - """ - Start a task in the portal's task group. - - The task will be run inside a cancel scope which can be cancelled by cancelling - the returned future. - - :param func: the target function - :param args: positional arguments passed to ``func`` - :param name: name of the task (will be coerced to a string if not ``None``) - :return: a future that resolves with the return value of the callable if the - task completes successfully, or with the exception raised in the task - :raises RuntimeError: if the portal is not running or if this method is called - from within the event loop thread - :rtype: concurrent.futures.Future[T_Retval] - - .. versionadded:: 3.0 - - """ - self._check_running() - f: Future[T_Retval] = Future() - self._spawn_task_from_thread(func, args, {}, name, f) - return f - - def start_task( - self, - func: Callable[..., Awaitable[T_Retval]], - *args: object, - name: object = None, - ) -> tuple[Future[T_Retval], Any]: - """ - Start a task in the portal's task group and wait until it signals for readiness. - - This method works the same way as :meth:`.abc.TaskGroup.start`. - - :param func: the target function - :param args: positional arguments passed to ``func`` - :param name: name of the task (will be coerced to a string if not ``None``) - :return: a tuple of (future, task_status_value) where the ``task_status_value`` - is the value passed to ``task_status.started()`` from within the target - function - :rtype: tuple[concurrent.futures.Future[T_Retval], Any] - - .. versionadded:: 3.0 - - """ - - def task_done(future: Future[T_Retval]) -> None: - if not task_status_future.done(): - if future.cancelled(): - task_status_future.cancel() - elif future.exception(): - task_status_future.set_exception(future.exception()) - else: - exc = RuntimeError( - "Task exited without calling task_status.started()" - ) - task_status_future.set_exception(exc) - - self._check_running() - task_status_future: Future = Future() - task_status = _BlockingPortalTaskStatus(task_status_future) - f: Future = Future() - f.add_done_callback(task_done) - self._spawn_task_from_thread(func, args, {"task_status": task_status}, name, f) - return f, task_status_future.result() - - def wrap_async_context_manager( - self, cm: AbstractAsyncContextManager[T_co] - ) -> AbstractContextManager[T_co]: - """ - Wrap an async context manager as a synchronous context manager via this portal. - - Spawns a task that will call both ``__aenter__()`` and ``__aexit__()``, stopping - in the middle until the synchronous context manager exits. - - :param cm: an asynchronous context manager - :return: a synchronous context manager - - .. versionadded:: 2.1 - - """ - return _BlockingAsyncContextManager(cm, self) - - -@dataclass -class BlockingPortalProvider: - """ - A manager for a blocking portal. Used as a context manager. The first thread to - enter this context manager causes a blocking portal to be started with the specific - parameters, and the last thread to exit causes the portal to be shut down. Thus, - there will be exactly one blocking portal running in this context as long as at - least one thread has entered this context manager. - - The parameters are the same as for :func:`~anyio.run`. - - :param backend: name of the backend - :param backend_options: backend options - - .. versionadded:: 4.4 - """ - - backend: str = "asyncio" - backend_options: dict[str, Any] | None = None - _lock: Lock = field(init=False, default_factory=Lock) - _leases: int = field(init=False, default=0) - _portal: BlockingPortal = field(init=False) - _portal_cm: AbstractContextManager[BlockingPortal] | None = field( - init=False, default=None - ) - - def __enter__(self) -> BlockingPortal: - with self._lock: - if self._portal_cm is None: - self._portal_cm = start_blocking_portal( - self.backend, self.backend_options - ) - self._portal = self._portal_cm.__enter__() - - self._leases += 1 - return self._portal - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - portal_cm: AbstractContextManager[BlockingPortal] | None = None - with self._lock: - assert self._portal_cm - assert self._leases > 0 - self._leases -= 1 - if not self._leases: - portal_cm = self._portal_cm - self._portal_cm = None - del self._portal - - if portal_cm: - portal_cm.__exit__(None, None, None) - - -@contextmanager -def start_blocking_portal( - backend: str = "asyncio", - backend_options: dict[str, Any] | None = None, - *, - name: str | None = None, -) -> Generator[BlockingPortal, Any, None]: - """ - Start a new event loop in a new thread and run a blocking portal in its main task. - - The parameters are the same as for :func:`~anyio.run`. - - :param backend: name of the backend - :param backend_options: backend options - :param name: name of the thread - :return: a context manager that yields a blocking portal - - .. versionchanged:: 3.0 - Usage as a context manager is now required. - - """ - - async def run_portal() -> None: - async with BlockingPortal() as portal_: - if name is None: - current_thread().name = f"{backend}-portal-{id(portal_):x}" - - future.set_result(portal_) - await portal_.sleep_until_stopped() - - def run_blocking_portal() -> None: - if future.set_running_or_notify_cancel(): - try: - run_eventloop( - run_portal, backend=backend, backend_options=backend_options - ) - except BaseException as exc: - if not future.done(): - future.set_exception(exc) - - future: Future[BlockingPortal] = Future() - kwargs: dict[str, Any] = {} - if sys.version_info >= (3, 14): - kwargs["context"] = Context() - - thread = Thread(target=run_blocking_portal, daemon=True, name=name, **kwargs) - thread.start() - try: - cancel_remaining_tasks = False - portal = future.result() - try: - yield portal - except BaseException: - cancel_remaining_tasks = True - raise - finally: - try: - portal.call(portal.stop, cancel_remaining_tasks) - except RuntimeError: - pass - finally: - thread.join() - - -def check_cancelled() -> None: - """ - Check if the cancel scope of the host task's running the current worker thread has - been cancelled. - - If the host task's current cancel scope has indeed been cancelled, the - backend-specific cancellation exception will be raised. - - :raises RuntimeError: if the current thread was not spawned by - :func:`.to_thread.run_sync` - - """ - try: - token: EventLoopToken = threadlocals.current_token - except AttributeError: - raise NoEventLoopError( - "This function can only be called inside an AnyIO worker thread" - ) from None - - token.backend_class.check_cancelled() diff --git a/venv/lib/python3.11/site-packages/anyio/functools.py b/venv/lib/python3.11/site-packages/anyio/functools.py deleted file mode 100755 index b0bdfb4..0000000 --- a/venv/lib/python3.11/site-packages/anyio/functools.py +++ /dev/null @@ -1,400 +0,0 @@ -from __future__ import annotations - -__all__ = ( - "AsyncCacheInfo", - "AsyncCacheParameters", - "AsyncLRUCacheWrapper", - "cache", - "lru_cache", - "reduce", -) - -import functools -from collections import OrderedDict -from collections.abc import ( - AsyncIterable, - Awaitable, - Callable, - Coroutine, - Hashable, - Iterable, -) -from functools import update_wrapper -from inspect import iscoroutinefunction -from typing import ( - Any, - Generic, - NamedTuple, - ParamSpec, - TypedDict, - TypeVar, - cast, - final, - overload, -) -from weakref import WeakKeyDictionary - -from ._core._eventloop import current_time -from ._core._synchronization import Lock -from .lowlevel import RunVar, checkpoint - -T = TypeVar("T") -S = TypeVar("S") -P = ParamSpec("P") -lru_cache_items: RunVar[ - WeakKeyDictionary[ - AsyncLRUCacheWrapper[Any, Any], - OrderedDict[ - Hashable, - tuple[_InitialMissingType, Lock, float | None] - | tuple[Any, None, float | None], - ], - ] -] = RunVar("lru_cache_items") - - -class _InitialMissingType: - pass - - -initial_missing: _InitialMissingType = _InitialMissingType() - - -class AsyncCacheInfo(NamedTuple): - hits: int - misses: int - maxsize: int | None - currsize: int - ttl: int | None - - -class AsyncCacheParameters(TypedDict): - maxsize: int | None - typed: bool - always_checkpoint: bool - ttl: int | None - - -class _LRUMethodWrapper(Generic[T]): - def __init__(self, wrapper: AsyncLRUCacheWrapper[..., T], instance: object): - self.__wrapper = wrapper - self.__instance = instance - - def cache_info(self) -> AsyncCacheInfo: - return self.__wrapper.cache_info() - - def cache_parameters(self) -> AsyncCacheParameters: - return self.__wrapper.cache_parameters() - - def cache_clear(self) -> None: - self.__wrapper.cache_clear() - - async def __call__(self, *args: Any, **kwargs: Any) -> T: - if self.__instance is None: - return await self.__wrapper(*args, **kwargs) - - return await self.__wrapper(self.__instance, *args, **kwargs) - - -@final -class AsyncLRUCacheWrapper(Generic[P, T]): - def __init__( - self, - func: Callable[P, Awaitable[T]], - maxsize: int | None, - typed: bool, - always_checkpoint: bool, - ttl: int | None, - ): - self.__wrapped__ = func - self._hits: int = 0 - self._misses: int = 0 - self._maxsize = max(maxsize, 0) if maxsize is not None else None - self._currsize: int = 0 - self._typed = typed - self._always_checkpoint = always_checkpoint - self._ttl = ttl - update_wrapper(self, func) - - def cache_info(self) -> AsyncCacheInfo: - return AsyncCacheInfo( - self._hits, self._misses, self._maxsize, self._currsize, self._ttl - ) - - def cache_parameters(self) -> AsyncCacheParameters: - return { - "maxsize": self._maxsize, - "typed": self._typed, - "always_checkpoint": self._always_checkpoint, - "ttl": self._ttl, - } - - def cache_clear(self) -> None: - if cache := lru_cache_items.get(None): - cache.pop(self, None) - self._hits = self._misses = self._currsize = 0 - - async def __call__(self, *args: P.args, **kwargs: P.kwargs) -> T: - # Easy case first: if maxsize == 0, no caching is done - if self._maxsize == 0: - value = await self.__wrapped__(*args, **kwargs) - self._misses += 1 - return value - - # The key is constructed as a flat tuple to avoid memory overhead - key: tuple[Any, ...] = args - if kwargs: - # initial_missing is used as a separator - key += (initial_missing,) + sum(kwargs.items(), ()) - - if self._typed: - key += tuple(type(arg) for arg in args) - if kwargs: - key += (initial_missing,) + tuple(type(val) for val in kwargs.values()) - - try: - cache = lru_cache_items.get() - except LookupError: - cache = WeakKeyDictionary() - lru_cache_items.set(cache) - - try: - cache_entry = cache[self] - except KeyError: - cache_entry = cache[self] = OrderedDict() - - cached_value: T | _InitialMissingType - try: - cached_value, lock, expires_at = cache_entry[key] - except KeyError: - # We're the first task to call this function - cached_value, lock, expires_at = ( - initial_missing, - Lock(fast_acquire=not self._always_checkpoint), - None, - ) - cache_entry[key] = cached_value, lock, expires_at - - if lock is None: - if expires_at is not None and current_time() >= expires_at: - self._currsize -= 1 - cached_value, lock, expires_at = ( - initial_missing, - Lock(fast_acquire=not self._always_checkpoint), - None, - ) - cache_entry[key] = cached_value, lock, expires_at - else: - # The value was already cached - self._hits += 1 - cache_entry.move_to_end(key) - if self._always_checkpoint: - await checkpoint() - - return cast(T, cached_value) - - async with lock: - # Check if another task filled the cache while we acquired the lock - if (cached_value := cache_entry[key][0]) is initial_missing: - self._misses += 1 - if self._maxsize is not None and self._currsize >= self._maxsize: - cache_entry.popitem(last=False) - else: - self._currsize += 1 - - value = await self.__wrapped__(*args, **kwargs) - expires_at = ( - current_time() + self._ttl if self._ttl is not None else None - ) - cache_entry[key] = value, None, expires_at - else: - # Another task filled the cache while we were waiting for the lock - self._hits += 1 - cache_entry.move_to_end(key) - value = cast(T, cached_value) - - return value - - def __get__( - self, instance: object, owner: type | None = None - ) -> _LRUMethodWrapper[T]: - wrapper = _LRUMethodWrapper(self, instance) - update_wrapper(wrapper, self.__wrapped__) - return wrapper - - -class _LRUCacheWrapper: - def __init__( - self, maxsize: int | None, typed: bool, always_checkpoint: bool, ttl: int | None - ): - self._maxsize = maxsize - self._typed = typed - self._always_checkpoint = always_checkpoint - self._ttl = ttl - - @overload - def __call__( # type: ignore[overload-overlap] - self, func: Callable[P, Coroutine[Any, Any, T]], / - ) -> AsyncLRUCacheWrapper[P, T]: ... - - @overload - def __call__( - self, func: Callable[..., T], / - ) -> functools._lru_cache_wrapper[T]: ... - - def __call__( - self, f: Callable[P, Coroutine[Any, Any, T]] | Callable[..., T], / - ) -> AsyncLRUCacheWrapper[P, T] | functools._lru_cache_wrapper[T]: - if iscoroutinefunction(f): - return AsyncLRUCacheWrapper( - f, self._maxsize, self._typed, self._always_checkpoint, self._ttl - ) - - return functools.lru_cache(maxsize=self._maxsize, typed=self._typed)(f) # type: ignore[arg-type] - - -@overload -def cache( # type: ignore[overload-overlap] - func: Callable[P, Coroutine[Any, Any, T]], / -) -> AsyncLRUCacheWrapper[P, T]: ... - - -@overload -def cache(func: Callable[..., T], /) -> functools._lru_cache_wrapper[T]: ... - - -def cache(func: Callable[..., Any] | Callable[P, Coroutine[Any, Any, Any]], /) -> Any: - """ - A convenient shortcut for :func:`lru_cache` with ``maxsize=None``. - - This is the asynchronous equivalent to :func:`functools.cache`. - - """ - return lru_cache(maxsize=None)(func) - - -@overload -def lru_cache( - *, - maxsize: int | None = ..., - typed: bool = ..., - always_checkpoint: bool = ..., - ttl: int | None = ..., -) -> _LRUCacheWrapper: ... - - -@overload -def lru_cache( # type: ignore[overload-overlap] - func: Callable[P, Coroutine[Any, Any, T]], / -) -> AsyncLRUCacheWrapper[P, T]: ... - - -@overload -def lru_cache(func: Callable[..., T], /) -> functools._lru_cache_wrapper[T]: ... - - -def lru_cache( - func: Callable[..., Coroutine[Any, Any, Any]] | Callable[..., Any] | None = None, - /, - *, - maxsize: int | None = 128, - typed: bool = False, - always_checkpoint: bool = False, - ttl: int | None = None, -) -> Any: - """ - An asynchronous version of :func:`functools.lru_cache`. - - If a synchronous function is passed, the standard library - :func:`functools.lru_cache` is applied instead. - - :param always_checkpoint: if ``True``, every call to the cached function will be - guaranteed to yield control to the event loop at least once - :param ttl: time in seconds after which to invalidate cache entries - - .. note:: Caches and locks are managed on a per-event loop basis. - - """ - if func is None: - return _LRUCacheWrapper(maxsize, typed, always_checkpoint, ttl) - - if not callable(func): - raise TypeError("the first argument must be callable") - - return _LRUCacheWrapper(maxsize, typed, always_checkpoint, ttl)(func) - - -@overload -async def reduce( - function: Callable[[T, S], Awaitable[T]], - iterable: Iterable[S] | AsyncIterable[S], - /, - initial: T, -) -> T: ... - - -@overload -async def reduce( - function: Callable[[T, T], Awaitable[T]], - iterable: Iterable[T] | AsyncIterable[T], - /, -) -> T: ... - - -async def reduce( # type: ignore[misc] - function: Callable[[T, T], Awaitable[T]] | Callable[[T, S], Awaitable[T]], - iterable: Iterable[T] | Iterable[S] | AsyncIterable[T] | AsyncIterable[S], - /, - initial: T | _InitialMissingType = initial_missing, -) -> T: - """ - Asynchronous version of :func:`functools.reduce`. - - :param function: a coroutine function that takes two arguments: the accumulated - value and the next element from the iterable - :param iterable: an iterable or async iterable - :param initial: the initial value (if missing, the first element of the iterable is - used as the initial value) - - """ - element: Any - function_called = False - if isinstance(iterable, AsyncIterable): - async_it = iterable.__aiter__() - if initial is initial_missing: - try: - value = cast(T, await async_it.__anext__()) - except StopAsyncIteration: - raise TypeError( - "reduce() of empty sequence with no initial value" - ) from None - else: - value = cast(T, initial) - - async for element in async_it: - value = await function(value, element) - function_called = True - elif isinstance(iterable, Iterable): - it = iter(iterable) - if initial is initial_missing: - try: - value = cast(T, next(it)) - except StopIteration: - raise TypeError( - "reduce() of empty sequence with no initial value" - ) from None - else: - value = cast(T, initial) - - for element in it: - value = await function(value, element) - function_called = True - else: - raise TypeError("reduce() argument 2 must be an iterable or async iterable") - - # Make sure there is at least one checkpoint, even if an empty iterable and an - # initial value were given - if not function_called: - await checkpoint() - - return value diff --git a/venv/lib/python3.11/site-packages/anyio/itertools.py b/venv/lib/python3.11/site-packages/anyio/itertools.py deleted file mode 100755 index 2a10cfd..0000000 --- a/venv/lib/python3.11/site-packages/anyio/itertools.py +++ /dev/null @@ -1,629 +0,0 @@ -from __future__ import annotations - -__all__ = ( - "Chain", - "accumulate", - "batched", - "combinations", - "combinations_with_replacement", - "compress", - "count", - "cycle", - "dropwhile", - "filterfalse", - "groupby", - "islice", - "pairwise", - "permutations", - "product", - "repeat", - "starmap", - "takewhile", - "tee", - "zip_longest", -) - -import itertools -import operator -import sys -from collections.abc import ( - AsyncGenerator, - AsyncIterable, - AsyncIterator, - Awaitable, - Callable, - Iterable, - Iterator, -) -from dataclasses import dataclass, field -from typing import Any, Generic, TypeVar, cast, overload - -from ._core._synchronization import Lock -from ._core._tasks import CancelScope -from .lowlevel import cancel_shielded_checkpoint, checkpoint, checkpoint_if_cancelled - -if sys.version_info < (3, 15): - from typing_extensions import sentinel - -T = TypeVar("T") -R = TypeVar("R") -_tee_end = sentinel("_tee_end") - - -@dataclass(eq=False) -class _IterableAsyncIterator(AsyncIterator[T]): - iterator: Iterator[T] - - async def __anext__(self) -> T: - await checkpoint_if_cancelled() - try: - result = next(self.iterator) - except StopIteration: - await cancel_shielded_checkpoint() - raise StopAsyncIteration from None - - await cancel_shielded_checkpoint() - return result - - -def _iterate(iterable: Iterable[T] | AsyncIterable[T]) -> AsyncIterator[T]: - if isinstance(iterable, AsyncIterator): - return iterable - - if isinstance(iterable, AsyncIterable): - return iterable.__aiter__() - - return _IterableAsyncIterator(iter(iterable)) - - -@dataclass(eq=False) -class _TeeLink(Generic[T]): - value: object | None = None - next: _TeeLink[T] | None = None - filled: bool = False - - -@dataclass(eq=False) -class _TeeState(Generic[T]): - iterator: AsyncIterator[T] - lock: Lock = field(default_factory=Lock) - - async def fill(self, link: _TeeLink[T]) -> bool: - if link.filled: - return False - - async with self.lock: - if link.filled: - return True - - link.value = await anext(self.iterator, _tee_end) - if link.value is not _tee_end: - link.next = _TeeLink() - - link.filled = True - return True - - -class _TeeAsyncIterator(AsyncIterator[T]): - _state: _TeeState[T] - _link: _TeeLink[T] - _element_yielded: bool - - def __init__( - self, iterable: Iterable[T] | AsyncIterable[T] | _TeeAsyncIterator[T] - ) -> None: - if isinstance(iterable, _TeeAsyncIterator): - self._state = iterable._state - self._link = iterable._link - else: - self._state = _TeeState(_iterate(iterable)) - self._link = _TeeLink() - - self._element_yielded = False - - async def __anext__(self) -> T: - had_yieldpoint = await self._state.fill(self._link) - if self._link.value is _tee_end: - if not self._element_yielded: - await checkpoint() - - raise StopAsyncIteration - - if not had_yieldpoint: - await checkpoint_if_cancelled() - - self._element_yielded = True - value = cast(T, self._link.value) - next_link = self._link.next - assert next_link is not None - self._link = next_link - if not had_yieldpoint: - await cancel_shielded_checkpoint() - - return value - - -async def _operator_add(x: T, y: T) -> T: - return operator.add(x, y) - - -async def accumulate( - iterable: Iterable[T] | AsyncIterable[T], - function: Callable[[T, T], Awaitable[T]] = _operator_add, - *, - initial: T | None = None, -) -> AsyncGenerator[T, None]: - iterator = _iterate(iterable) - if initial is None: - try: - total = await anext(iterator) - except StopAsyncIteration: - await checkpoint() - return - else: - await checkpoint_if_cancelled() - total = initial - await cancel_shielded_checkpoint() - - yield total - - async for element in iterator: - total = await function(total, element) - yield total - - -async def batched( - iterable: Iterable[T] | AsyncIterable[T], n: int, *, strict: bool = False -) -> AsyncGenerator[tuple[T, ...], None]: - if n < 1: - raise ValueError("n must be at least one") - - iterator = _iterate(iterable) - - while True: - batch: list[T] = [] - for _ in range(n): - try: - batch.append(await anext(iterator)) - except StopAsyncIteration: - if not batch: - await checkpoint() - return - if strict: - raise ValueError("batched(): incomplete batch") from None - - yield tuple(batch) - return - - yield tuple(batch) - - -class Chain: - def __call__( - self, *iterables: Iterable[T] | AsyncIterable[T] - ) -> AsyncGenerator[T, None]: - return self.from_iterable(iterables) - - async def from_iterable( - self, - iterables: ( - Iterable[Iterable[T] | AsyncIterable[T]] - | AsyncIterable[Iterable[T] | AsyncIterable[T]] - ), - ) -> AsyncGenerator[T, None]: - element_yielded = False - outer_iter = _iterate(iterables) - - try: - async for iterable in outer_iter: - async for element in _iterate(iterable): - element_yielded = True - yield element - finally: - aclose = getattr(outer_iter, "aclose", None) - if aclose is not None: - with CancelScope(shield=True): - await aclose() - - if not element_yielded: - await checkpoint() - - -chain: Chain = Chain() - - -async def combinations( - iterable: Iterable[T] | AsyncIterable[T], r: int -) -> AsyncGenerator[tuple[T, ...], None]: - pool: list[T] = [element async for element in _iterate(iterable)] - async for combination in _iterate(itertools.combinations(pool, r)): - yield combination - - -async def combinations_with_replacement( - iterable: Iterable[T] | AsyncIterable[T], r: int -) -> AsyncGenerator[tuple[T, ...], None]: - pool: list[T] = [element async for element in _iterate(iterable)] - async for combination in _iterate(itertools.combinations_with_replacement(pool, r)): - yield combination - - -async def compress( - data: Iterable[T] | AsyncIterable[T], - selectors: Iterable[object] | AsyncIterable[object], -) -> AsyncGenerator[T, None]: - data_iterator = _iterate(data) - selector_iterator = _iterate(selectors) - element_yielded = False - - while True: - try: - datum = await anext(data_iterator) - selector = await anext(selector_iterator) - except StopAsyncIteration: - if not element_yielded: - await checkpoint() - - return - - if selector: - element_yielded = True - yield datum - - -async def count(start: int = 0, step: int = 1) -> AsyncGenerator[int, None]: - n = start - while True: - await checkpoint_if_cancelled() - value = n - n += step - await cancel_shielded_checkpoint() - yield value - - -async def cycle( - iterable: Iterable[T] | AsyncIterable[T], -) -> AsyncGenerator[T, None]: - saved: list[T] = [] - async for element in _iterate(iterable): - saved.append(element) - yield element - - if not saved: - await checkpoint() - return - - while True: - for element in saved: - await checkpoint() - yield element - - -async def dropwhile( - predicate: Callable[[T], Awaitable[object]], - iterable: Iterable[T] | AsyncIterable[T], -) -> AsyncGenerator[T, None]: - element_yielded = False - dropping = True - - async for element in _iterate(iterable): - if dropping and await predicate(element): - continue - - dropping = False - element_yielded = True - yield element - - if not element_yielded: - await checkpoint() - - -async def filterfalse( - predicate: Callable[[T], Awaitable[object]], - iterable: Iterable[T] | AsyncIterable[T], -) -> AsyncGenerator[T, None]: - element_yielded = False - - async for element in _iterate(iterable): - if not await predicate(element): - element_yielded = True - yield element - - if not element_yielded: - await checkpoint() - - -@overload -def groupby( - iterable: Iterable[T] | AsyncIterable[T], -) -> AsyncGenerator[tuple[T, list[T]], None]: ... - - -@overload -def groupby( - iterable: Iterable[T] | AsyncIterable[T], - key: Callable[[T], Awaitable[R]], -) -> AsyncGenerator[tuple[R, list[T]], None]: ... - - -async def groupby( - iterable: Iterable[T] | AsyncIterable[T], - key: Callable[[T], Awaitable[object]] | None = None, -) -> AsyncGenerator[tuple[object, list[T]], None]: - iterator = _iterate(iterable) - try: - element = await anext(iterator) - except StopAsyncIteration: - await checkpoint() - return - - group_key = element if key is None else await key(element) - values = [element] - - async for element in iterator: - next_key = element if key is None else await key(element) - if next_key != group_key: - completed_group = group_key, values - group_key = next_key - values = [element] - yield completed_group - else: - values.append(element) - - yield group_key, values - - -@overload -def islice( - iterable: Iterable[T] | AsyncIterable[T], - stop: int | None, - /, -) -> AsyncGenerator[T, None]: ... - - -@overload -def islice( - iterable: Iterable[T] | AsyncIterable[T], - start: int | None, - stop: int | None, - step: int | None = 1, - /, -) -> AsyncGenerator[T, None]: ... - - -async def islice( - iterable: Iterable[T] | AsyncIterable[T], - *args: int | None, -) -> AsyncGenerator[T, None]: - if not args: - raise TypeError("islice expected at least 2 arguments, got 1") - if len(args) > 3: - raise TypeError(f"islice expected at most 4 arguments, got {len(args) + 1}") - - slice_args = slice(*args) - - start_message = ( - "Indices for islice() must be None or an integer: 0 <= x <= sys.maxsize." - ) - stop_message = ( - "Stop argument for islice() must be None or an integer: 0 <= x <= sys.maxsize." - ) - step_message = "Step for islice() must be a positive integer or None." - - def normalize_index(value: object, message: str) -> int: - try: - index = operator.index(cast(Any, value)) - except TypeError: - raise ValueError(message) from None - - if index < 0 or index > sys.maxsize: - raise ValueError(message) - - return index - - start = ( - 0 - if slice_args.start is None - else normalize_index(slice_args.start, start_message) - ) - stop = ( - None - if slice_args.stop is None - else normalize_index(slice_args.stop, stop_message) - ) - step = ( - 1 if slice_args.step is None else normalize_index(slice_args.step, step_message) - ) - - if step <= 0: - raise ValueError(step_message) - - if stop == 0 or start == stop: - await checkpoint() - return - - iterator = _iterate(iterable) - index = 0 - element_yielded = False - - while stop is None or index < stop: - try: - element = await anext(iterator) - except StopAsyncIteration: - if not element_yielded: - await checkpoint() - - return - - if index >= start and (index - start) % step == 0: - index += 1 - element_yielded = True - yield element - else: - index += 1 - - if not element_yielded: - await checkpoint() - - -async def pairwise( - iterable: Iterable[T] | AsyncIterable[T], -) -> AsyncGenerator[tuple[T, T], None]: - iterator = _iterate(iterable) - try: - previous = await anext(iterator) - except StopAsyncIteration: - await checkpoint() - return - - element_yielded = False - async for element in iterator: - element_yielded = True - pair = (previous, element) - previous = element - yield pair - - if not element_yielded: - await checkpoint() - - -async def permutations( - iterable: Iterable[T] | AsyncIterable[T], r: int | None = None -) -> AsyncGenerator[tuple[T, ...], None]: - pool: list[T] = [element async for element in _iterate(iterable)] - n = len(pool) - if r is None: - r = n - elif not isinstance(r, int): - raise TypeError("Expected int as r") - elif r < 0: - raise ValueError("r must be non-negative") - - async for permutation in _iterate(itertools.permutations(pool, r)): - yield permutation - - -async def product( - *iterables: Iterable[T] | AsyncIterable[T], repeat: int = 1 -) -> AsyncGenerator[tuple[T, ...], None]: - repeat = operator.index(repeat) - if repeat < 0: - raise ValueError("repeat argument cannot be negative") - - pools: list[tuple[T, ...]] = [] - for iterable in iterables: - pool: list[T] = [element async for element in _iterate(iterable)] - pools.append(tuple(pool)) - - async for value in _iterate(itertools.product(*pools, repeat=repeat)): - yield value - - -async def repeat(element: T, times: int | None = None) -> AsyncGenerator[T, None]: - if times is None: - while True: - await checkpoint() - yield element - - remaining = operator.index(cast(Any, times)) - if remaining <= 0: - await checkpoint() - return - - while remaining > 0: - await checkpoint_if_cancelled() - remaining -= 1 - await cancel_shielded_checkpoint() - yield element - - -async def starmap( - function: Callable[..., Awaitable[R]], - iterable: ( - Iterable[Iterable[object] | AsyncIterable[object]] - | AsyncIterable[Iterable[object] | AsyncIterable[object]] - ), -) -> AsyncGenerator[R, None]: - result_yielded = False - - async for args_iterable in _iterate(iterable): - args = [element async for element in _iterate(args_iterable)] - result_yielded = True - yield await function(*args) - - if not result_yielded: - await checkpoint() - - -def tee( - iterable: Iterable[T] | AsyncIterable[T], n: int = 2 -) -> tuple[AsyncIterator[T], ...]: - n = operator.index(cast(Any, n)) - if n < 0: - raise ValueError("n must be >= 0") - if n == 0: - return () - - iterator = _TeeAsyncIterator(iterable) - iterators: list[AsyncIterator[T]] = [iterator] - iterators.extend(_TeeAsyncIterator(iterator) for _ in range(n - 1)) - return tuple(iterators) - - -async def takewhile( - predicate: Callable[[T], Awaitable[object]], - iterable: Iterable[T] | AsyncIterable[T], -) -> AsyncGenerator[T, None]: - element_yielded = False - - async for element in _iterate(iterable): - if not await predicate(element): - if not element_yielded: - await checkpoint() - - return - - element_yielded = True - yield element - - if not element_yielded: - await checkpoint() - - -async def zip_longest( - *iterables: Iterable[object] | AsyncIterable[object], - fillvalue: object = None, -) -> AsyncGenerator[tuple[object, ...], None]: - iterators = [_iterate(iterable) for iterable in iterables] - num_active = len(iterators) - if not num_active: - await checkpoint() - return - - active = [True] * num_active - tuple_yielded = False - - while True: - values: list[object] = [] - for index, iterator in enumerate(iterators): - if not active[index]: - values.append(fillvalue) - continue - - try: - value = await anext(iterator) - except StopAsyncIteration: - active[index] = False - num_active -= 1 - if not num_active: - if not tuple_yielded: - await checkpoint() - - return - - value = fillvalue - - values.append(value) - - tuple_yielded = True - yield tuple(values) diff --git a/venv/lib/python3.11/site-packages/anyio/lowlevel.py b/venv/lib/python3.11/site-packages/anyio/lowlevel.py deleted file mode 100755 index 361b2eb..0000000 --- a/venv/lib/python3.11/site-packages/anyio/lowlevel.py +++ /dev/null @@ -1,228 +0,0 @@ -from __future__ import annotations - -__all__ = ( - "EventLoopToken", - "RunVar", - "RunvarToken", - "cancel_shielded_checkpoint", - "checkpoint", - "checkpoint_if_cancelled", - "current_token", -) - -import enum -from dataclasses import dataclass -from types import TracebackType -from typing import TYPE_CHECKING, Any, Generic, Literal, TypeVar, final, overload -from weakref import WeakKeyDictionary - -from ._core._eventloop import get_async_backend - -if TYPE_CHECKING: - from .abc import AsyncBackend - -T = TypeVar("T") -D = TypeVar("D") - - -async def checkpoint() -> None: - """ - Check for cancellation and allow the scheduler to switch to another task. - - Equivalent to (but more efficient than):: - - await checkpoint_if_cancelled() - await cancel_shielded_checkpoint() - - .. versionadded:: 3.0 - - """ - await get_async_backend().checkpoint() - - -async def checkpoint_if_cancelled() -> None: - """ - Enter a checkpoint if the enclosing cancel scope has been cancelled. - - This does not allow the scheduler to switch to a different task. - - .. versionadded:: 3.0 - - """ - await get_async_backend().checkpoint_if_cancelled() - - -async def cancel_shielded_checkpoint() -> None: - """ - Allow the scheduler to switch to another task but without checking for cancellation. - - Equivalent to (but potentially more efficient than):: - - with CancelScope(shield=True): - await checkpoint() - - .. versionadded:: 3.0 - - """ - await get_async_backend().cancel_shielded_checkpoint() - - -@final -@dataclass(frozen=True, repr=False) -class EventLoopToken: - """ - An opaque object that holds a reference to an event loop. - - .. versionadded:: 4.11.0 - """ - - backend_class: type[AsyncBackend] - native_token: object - - -def current_token() -> EventLoopToken: - """ - Return a token object that can be used to call code in the current event loop from - another thread. - - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - .. versionadded:: 4.11.0 - - """ - backend_class = get_async_backend() - raw_token = backend_class.current_token() - return EventLoopToken(backend_class, raw_token) - - -_run_vars: WeakKeyDictionary[object, dict[RunVar[Any], Any]] = WeakKeyDictionary() - - -class _NoValueSet(enum.Enum): - NO_VALUE_SET = enum.auto() - - -class RunvarToken(Generic[T]): - """ - A token that can be used to restore a :class:`RunVar` to its previous value. - - Returned by :meth:`RunVar.set`. Can be used as a context manager to automatically - reset the variable on exit, or passed directly to :meth:`RunVar.reset`. - """ - - __slots__ = "_redeemed", "_value", "_var" - - def __init__(self, var: RunVar[T], value: T | Literal[_NoValueSet.NO_VALUE_SET]): - self._var = var - self._value: T | Literal[_NoValueSet.NO_VALUE_SET] = value - self._redeemed = False - - def __enter__(self) -> RunvarToken[T]: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self._var.reset(self) - - -class RunVar(Generic[T]): - """ - Like a :class:`~contextvars.ContextVar`, except scoped to the running event loop. - - Can be used as a context manager, Just like :class:`~contextvars.ContextVar`, that - will reset the variable to its previous value when the context block is exited. - """ - - __slots__ = "_default", "_name" - - NO_VALUE_SET: Literal[_NoValueSet.NO_VALUE_SET] = _NoValueSet.NO_VALUE_SET - - def __init__( - self, name: str, default: T | Literal[_NoValueSet.NO_VALUE_SET] = NO_VALUE_SET - ): - self._name = name - self._default = default - - @property - def _current_vars(self) -> dict[RunVar[T], T]: - native_token = current_token().native_token - try: - return _run_vars[native_token] - except KeyError: - run_vars = _run_vars[native_token] = {} - return run_vars - - @overload - def get(self, default: D) -> T | D: ... - - @overload - def get(self) -> T: ... - - def get( - self, default: D | Literal[_NoValueSet.NO_VALUE_SET] = NO_VALUE_SET - ) -> T | D: - """ - Return the current value of this run variable. - - :param default: a fallback value to return if no value has been set - :return: the current value, the provided default, or the variable's own default - :raises LookupError: if no value is set and no default is available - - """ - try: - return self._current_vars[self] - except KeyError: - if default is not RunVar.NO_VALUE_SET: - return default - elif self._default is not RunVar.NO_VALUE_SET: - return self._default - - raise LookupError( - f'Run variable "{self._name}" has no value and no default set' - ) - - def set(self, value: T) -> RunvarToken[T]: - """ - Set the value of this run variable for the current event loop. - - :param value: the new value - :return: a token that can be used to restore the previous value - - """ - current_vars = self._current_vars - token = RunvarToken(self, current_vars.get(self, RunVar.NO_VALUE_SET)) - current_vars[self] = value - return token - - def reset(self, token: RunvarToken[T]) -> None: - """ - Restore this run variable to the value it held before the matching :meth:`set`. - - :param token: the token returned by :meth:`set` - :raises ValueError: if the token belongs to a different :class:`RunVar` or the token - has already been used - - """ - if token._var is not self: - raise ValueError("This token does not belong to this RunVar") - - if token._redeemed: - raise ValueError("This token has already been used") - - if token._value is _NoValueSet.NO_VALUE_SET: - try: - del self._current_vars[self] - except KeyError: - pass - else: - self._current_vars[self] = token._value - - token._redeemed = True - - def __repr__(self) -> str: - return f"" diff --git a/venv/lib/python3.11/site-packages/anyio/py.typed b/venv/lib/python3.11/site-packages/anyio/py.typed deleted file mode 100755 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/anyio/pytest_plugin.py b/venv/lib/python3.11/site-packages/anyio/pytest_plugin.py deleted file mode 100755 index d6238cd..0000000 --- a/venv/lib/python3.11/site-packages/anyio/pytest_plugin.py +++ /dev/null @@ -1,404 +0,0 @@ -from __future__ import annotations - -import dataclasses -import socket -import sys -from collections.abc import Callable, Generator, Iterator -from contextlib import ExitStack, contextmanager -from inspect import isasyncgenfunction, iscoroutinefunction, ismethod -from typing import TYPE_CHECKING, Any, cast - -import pytest -from _pytest.fixtures import FuncFixtureInfo, SubRequest -from _pytest.outcomes import Exit -from _pytest.scope import Scope - -from . import get_available_backends -from ._core._eventloop import ( - current_async_library, - get_async_backend, - reset_current_async_library, - set_current_async_library, -) -from ._core._exceptions import iterate_exceptions - -if TYPE_CHECKING: - from .abc import TestRunner - -if sys.version_info < (3, 11): - from exceptiongroup import ExceptionGroup - -if TYPE_CHECKING: - # pytest >= 9.2 keeps CallSpec2 as a TYPE_CHECKING-only alias of CallSpec - from _pytest.python import CallSpec2 as CallSpec -else: - try: - # c.f. https://github.com/pytest-dev/pytest/pull/14742 - # pytest >= 9.2 - from _pytest.python import CallSpec - except ImportError: - from _pytest.python import CallSpec2 as CallSpec - -_current_runner: TestRunner | None = None -_runner_stack: ExitStack | None = None -_runner_leases = 0 - - -def extract_backend_and_options(backend: object) -> tuple[str, dict[str, Any]]: - if isinstance(backend, str): - return backend, {} - elif isinstance(backend, tuple) and len(backend) == 2: - if isinstance(backend[0], str) and isinstance(backend[1], dict): - return cast(tuple[str, dict[str, Any]], backend) - - raise TypeError("anyio_backend must be either a string or tuple of (string, dict)") - - -@contextmanager -def get_runner( - backend_name: str, backend_options: dict[str, Any] -) -> Iterator[TestRunner]: - global _current_runner, _runner_leases, _runner_stack - if _current_runner is None: - asynclib = get_async_backend(backend_name) - _runner_stack = ExitStack() - if current_async_library() is None: - # Since we're in control of the event loop, we can cache the name of the - # async library - token = set_current_async_library(backend_name) - _runner_stack.callback(reset_current_async_library, token) - - backend_options = backend_options or {} - _current_runner = _runner_stack.enter_context( - asynclib.create_test_runner(backend_options) - ) - - _runner_leases += 1 - try: - yield _current_runner - finally: - _runner_leases -= 1 - if not _runner_leases: - assert _runner_stack is not None - _runner_stack.close() - _runner_stack = _current_runner = None - - -def pytest_addoption(parser: pytest.Parser) -> None: - group = parser.getgroup("anyio") - parser.addini( - "anyio_mode", - default="strict", - help='AnyIO plugin mode (either "strict" or "auto")', - ) - group.addoption( - "--anyio-mode", - default=None, - dest="anyio_mode", - help=""" - 'auto' - All async test functions will be handled by AnyIO pytest plugin - 'strict' - Disabling autoprocessing(useful when anyio tests - need to coexist with other async test plugins) - """, - ) - - -def _is_auto_mode(config: pytest.Config, mode: str) -> bool: - return ( - config.getoption(mode, default=None) == "auto" or config.getini(mode) == "auto" - ) - - -def pytest_configure(config: pytest.Config) -> None: - config.addinivalue_line( - "markers", - "anyio: mark the (coroutine function) test to be run asynchronously via anyio.", - ) - if ( - _is_auto_mode(config, "anyio_mode") - and config.pluginmanager.has_plugin("asyncio") - and _is_auto_mode(config, "asyncio_mode") - ): - config.issue_config_time_warning( - pytest.PytestConfigWarning( - "AnyIO auto mode has been enabled together with pytest-asyncio auto " - "mode. This may cause unexpected behavior." - ), - 1, - ) - - -@pytest.hookimpl(hookwrapper=True) -def pytest_fixture_setup(fixturedef: Any, request: Any) -> Generator[Any]: - def wrapper(anyio_backend: Any, request: SubRequest, **kwargs: Any) -> Any: - # Rebind any fixture methods to the request instance - if ( - request.instance - and ismethod(func) - and type(func.__self__) is type(request.instance) - ): - local_func = func.__func__.__get__(request.instance) - else: - local_func = func - - backend_name, backend_options = extract_backend_and_options(anyio_backend) - if has_backend_arg: - kwargs["anyio_backend"] = anyio_backend - - if has_request_arg: - kwargs["request"] = request - - with get_runner(backend_name, backend_options) as runner: - # re-entrant call into the test runner detected. this happens when an async fixture - # is dynamically requested via request.getfixturevalue() from inside a running async - # test or fixture. on asyncio this raises RuntimeError: This event loop is already - # running, on trio the runner deadlocks - the host loop blocks waiting for the - # coroutine to return, but the coroutine is waiting for the host loop. raising here - # prevents the hang and gives a consistent error across backends. - if runner.is_running(): - raise RuntimeError( - "Cannot schedule a coroutine in the test runner while another is already running; " - "likely caused by request.getfixturevalue() on an async fixture." - ) - - if isasyncgenfunction(local_func): - yield from runner.run_asyncgen_fixture(local_func, kwargs) - else: - yield runner.run_fixture(local_func, kwargs) - - # Only apply this to coroutine functions and async generator functions in requests - # that involve the anyio_backend fixture - func = fixturedef.func - if isasyncgenfunction(func) or iscoroutinefunction(func): - if "anyio_backend" in request.fixturenames: - fixturedef.func = wrapper - original_argname = fixturedef.argnames - - if not (has_backend_arg := "anyio_backend" in fixturedef.argnames): - fixturedef.argnames += ("anyio_backend",) - - if not (has_request_arg := "request" in fixturedef.argnames): - fixturedef.argnames += ("request",) - - try: - return (yield) - finally: - fixturedef.func = func - fixturedef.argnames = original_argname - - return (yield) - - -@pytest.hookimpl(tryfirst=True) -def pytest_pycollect_makeitem( - collector: pytest.Module | pytest.Class, name: str, obj: object -) -> None: - if collector.istestfunction(obj, name): - inner_func = obj.hypothesis.inner_test if hasattr(obj, "hypothesis") else obj - if iscoroutinefunction(inner_func): - anyio_auto_mode = _is_auto_mode(collector.config, "anyio_mode") - marker = collector.get_closest_marker("anyio") - own_markers = getattr(obj, "pytestmark", ()) - if ( - anyio_auto_mode - or marker - or any(marker.name == "anyio" for marker in own_markers) - ): - pytest.mark.usefixtures("anyio_backend")(obj) - - -def pytest_collection_finish(session: pytest.Session) -> None: - for i, item in reversed(list(enumerate(session.items))): - if ( - isinstance(item, pytest.Function) - and iscoroutinefunction(item.function) - and item.get_closest_marker("anyio") is not None - and "anyio_backend" not in item.fixturenames - ): - new_items = [] - try: - cs_fields = {f.name for f in dataclasses.fields(CallSpec)} - except TypeError: - cs_fields = set() - - for param_index, backend in enumerate(get_available_backends()): - if "_arg2scope" in cs_fields: # pytest >= 8 - callspec = CallSpec( - params={"anyio_backend": backend}, - indices={"anyio_backend": param_index}, - _arg2scope={"anyio_backend": Scope.Module}, - _idlist=[backend], - marks=[], - ) - else: # pytest 7.x - callspec = CallSpec( # type: ignore[call-arg] - funcargs={}, - params={"anyio_backend": backend}, - indices={"anyio_backend": param_index}, - arg2scope={"anyio_backend": Scope.Module}, - idlist=[backend], - marks=[], - ) - - fi = item._fixtureinfo - new_names_closure = list(fi.names_closure) - if "anyio_backend" not in new_names_closure: - new_names_closure.append("anyio_backend") - - new_fixtureinfo = FuncFixtureInfo( - argnames=fi.argnames, - initialnames=fi.initialnames, - names_closure=new_names_closure, - name2fixturedefs=fi.name2fixturedefs, - ) - new_item = pytest.Function.from_parent( - item.parent, - name=f"{item.originalname}[{backend}]", - callspec=callspec, - callobj=item.obj, - fixtureinfo=new_fixtureinfo, - keywords=item.keywords, - originalname=item.originalname, - ) - new_items.append(new_item) - - session.items[i : i + 1] = new_items - - -@pytest.hookimpl(tryfirst=True) -def pytest_pyfunc_call(pyfuncitem: Any) -> bool | None: - def run_with_hypothesis(**kwargs: Any) -> None: - with get_runner(backend_name, backend_options) as runner: - runner.run_test(original_func, kwargs) - - backend = pyfuncitem.funcargs.get("anyio_backend") - if backend: - backend_name, backend_options = extract_backend_and_options(backend) - - if hasattr(pyfuncitem.obj, "hypothesis"): - # Wrap the inner test function unless it's already wrapped - original_func = pyfuncitem.obj.hypothesis.inner_test - if original_func.__qualname__ != run_with_hypothesis.__qualname__: - if iscoroutinefunction(original_func): - pyfuncitem.obj.hypothesis.inner_test = run_with_hypothesis - - return None - - if iscoroutinefunction(pyfuncitem.obj): - funcargs = pyfuncitem.funcargs - testargs = {arg: funcargs[arg] for arg in pyfuncitem._fixtureinfo.argnames} - with get_runner(backend_name, backend_options) as runner: - try: - runner.run_test(pyfuncitem.obj, testargs) - except ExceptionGroup as excgrp: - for exc in iterate_exceptions(excgrp): - if isinstance(exc, (Exit, KeyboardInterrupt, SystemExit)): - raise exc from excgrp - - raise - - return True - - return None - - -@pytest.fixture(scope="module", params=get_available_backends()) -def anyio_backend(request: Any) -> Any: - return request.param - - -@pytest.fixture -def anyio_backend_name(anyio_backend: Any) -> str: - if isinstance(anyio_backend, str): - return anyio_backend - else: - return anyio_backend[0] - - -@pytest.fixture -def anyio_backend_options(anyio_backend: Any) -> dict[str, Any]: - if isinstance(anyio_backend, str): - return {} - else: - return anyio_backend[1] - - -class FreePortFactory: - """ - Manages port generation based on specified socket kind, ensuring no duplicate - ports are generated. - - This class provides functionality for generating available free ports on the - system. It is initialized with a specific socket kind and can generate ports - for given address families while avoiding reuse of previously generated ports. - - Users should not instantiate this class directly, but use the - ``free_tcp_port_factory`` and ``free_udp_port_factory`` fixtures instead. For simple - uses cases, ``free_tcp_port`` and ``free_udp_port`` can be used instead. - """ - - def __init__(self, kind: socket.SocketKind) -> None: - self._kind = kind - self._generated = set[int]() - - @property - def kind(self) -> socket.SocketKind: - """ - The type of socket connection (e.g., :data:`~socket.SOCK_STREAM` or - :data:`~socket.SOCK_DGRAM`) used to bind for checking port availability - - """ - return self._kind - - def __call__(self, family: socket.AddressFamily | None = None) -> int: - """ - Return an unbound port for the given address family. - - :param family: if omitted, both IPv4 and IPv6 addresses will be tried - :return: a port number - - """ - if family is not None: - families = [family] - else: - families = [socket.AF_INET] - if socket.has_ipv6: - families.append(socket.AF_INET6) - - while True: - port = 0 - with ExitStack() as stack: - for fam in families: - sock = stack.enter_context(socket.socket(fam, self._kind)) - addr = "::1" if fam == socket.AF_INET6 else "127.0.0.1" - try: - sock.bind((addr, port)) - except OSError: - break - - if not port: - port = sock.getsockname()[1] - else: - if port not in self._generated: - self._generated.add(port) - return port - - -@pytest.fixture(scope="session") -def free_tcp_port_factory() -> FreePortFactory: - return FreePortFactory(socket.SOCK_STREAM) - - -@pytest.fixture(scope="session") -def free_udp_port_factory() -> FreePortFactory: - return FreePortFactory(socket.SOCK_DGRAM) - - -@pytest.fixture -def free_tcp_port(free_tcp_port_factory: Callable[[], int]) -> int: - return free_tcp_port_factory() - - -@pytest.fixture -def free_udp_port(free_udp_port_factory: Callable[[], int]) -> int: - return free_udp_port_factory() diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__init__.py b/venv/lib/python3.11/site-packages/anyio/streams/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 13556f509627d24213b6b27b46ff9295c3efcd95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmZ3^%ge<81UIJ4$^y}kK?DpiLK&agfQ;!3DGb33nv8xc8H$*I{LdiCUxE4=`MIh3 zxrs%|`TAb@>G{U`i3J7vWvO{(`Z<|N`URCG8Tom}dWMGj#hE3kx&?{J*@@|?#rlbP zm6`ea#U(|liMhr4@$s2?nI-Y@dIgogIBatBQ%ZAE?TT1|Hh|nv%nu|!Ff%eTeqewR IMa)1k0Ov?BEC2ui diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/buffered.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/buffered.cpython-311.pyc deleted file mode 100755 index 3becbd3de6365604c7ae377ee3f0f02c51a138da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10401 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 aOAnfV+M?|~_LxDor<7J&uC7Y8`Tqh29&Qu> diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/stapled.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/stapled.cpython-311.pyc deleted file mode 100755 index e69aaa4c43257946e7513eded4be8f823e3a7069..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9031 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 A7ytkO diff --git a/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/text.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/streams/__pycache__/text.cpython-311.pyc deleted file mode 100755 index ad471f704199c255a595827b89905db3e8e69518..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10217 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 LKV2t|QLX<6^+@y( diff --git a/venv/lib/python3.11/site-packages/anyio/streams/buffered.py b/venv/lib/python3.11/site-packages/anyio/streams/buffered.py deleted file mode 100755 index a3b07f7..0000000 --- a/venv/lib/python3.11/site-packages/anyio/streams/buffered.py +++ /dev/null @@ -1,201 +0,0 @@ -from __future__ import annotations - -__all__ = ( - "BufferedByteReceiveStream", - "BufferedByteStream", - "BufferedConnectable", -) - -import sys -from collections.abc import Callable, Iterable, Mapping -from dataclasses import dataclass, field -from typing import Any, SupportsIndex - -from .. import ClosedResourceError, DelimiterNotFound, EndOfStream, IncompleteRead -from ..abc import ( - AnyByteReceiveStream, - AnyByteStream, - AnyByteStreamConnectable, - ByteReceiveStream, - ByteStream, - ByteStreamConnectable, -) - -if sys.version_info >= (3, 12): - from typing import override -else: - from typing_extensions import override - - -@dataclass(eq=False) -class BufferedByteReceiveStream(ByteReceiveStream): - """ - Wraps any bytes-based receive stream and uses a buffer to provide sophisticated - receiving capabilities in the form of a byte stream. - """ - - receive_stream: AnyByteReceiveStream - _buffer: bytearray = field(init=False, default_factory=bytearray) - _closed: bool = field(init=False, default=False) - - async def aclose(self) -> None: - await self.receive_stream.aclose() - self._closed = True - - @property - def buffer(self) -> bytes: - """The bytes currently in the buffer.""" - return bytes(self._buffer) - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return self.receive_stream.extra_attributes - - def feed_data(self, data: Iterable[SupportsIndex], /) -> None: - """ - Append data directly into the buffer. - - Any data in the buffer will be consumed by receive operations before receiving - anything from the wrapped stream. - - :param data: the data to append to the buffer (can be bytes or anything else - that supports ``__index__()``) - - """ - self._buffer.extend(data) - - async def receive(self, max_bytes: int = 65536) -> bytes: - if max_bytes < 1: - raise ValueError("max_bytes must be a positive integer") - - if self._closed: - raise ClosedResourceError - - if self._buffer: - chunk = bytes(self._buffer[:max_bytes]) - del self._buffer[:max_bytes] - return chunk - elif isinstance(self.receive_stream, ByteReceiveStream): - return await self.receive_stream.receive(max_bytes) - else: - # With a bytes-oriented object stream, we need to handle any surplus bytes - # we get from the receive() call - chunk = await self.receive_stream.receive() - if len(chunk) > max_bytes: - # Save the surplus bytes in the buffer - self._buffer.extend(chunk[max_bytes:]) - return chunk[:max_bytes] - else: - return chunk - - async def receive_exactly(self, nbytes: int) -> bytes: - """ - Read exactly the given amount of bytes from the stream. - - :param nbytes: the number of bytes to read - :return: the bytes read - :raises ~anyio.IncompleteRead: if the stream was closed before the requested - amount of bytes could be read from the stream - - """ - while True: - remaining = nbytes - len(self._buffer) - if remaining <= 0: - retval = self._buffer[:nbytes] - del self._buffer[:nbytes] - return bytes(retval) - - try: - if isinstance(self.receive_stream, ByteReceiveStream): - chunk = await self.receive_stream.receive(remaining) - else: - chunk = await self.receive_stream.receive() - except EndOfStream as exc: - raise IncompleteRead from exc - - self._buffer.extend(chunk) - - async def receive_until(self, delimiter: bytes, max_bytes: int) -> bytes: - """ - Read from the stream until the delimiter is found or max_bytes have been read. - - :param delimiter: the marker to look for in the stream - :param max_bytes: maximum number of bytes that will be read before raising - :exc:`~anyio.DelimiterNotFound` - :return: the bytes read (not including the delimiter) - :raises ~anyio.IncompleteRead: if the stream was closed before the delimiter - was found - :raises ~anyio.DelimiterNotFound: if the delimiter is not found within the - bytes read up to the maximum allowed - - """ - delimiter_size = len(delimiter) - offset = 0 - while True: - # Check if the delimiter can be found in the current buffer - index = self._buffer.find(delimiter, offset) - if index >= 0: - found = self._buffer[:index] - del self._buffer[: index + len(delimiter) :] - return bytes(found) - - # Check if the buffer is already at or over the limit - if len(self._buffer) >= max_bytes: - raise DelimiterNotFound(max_bytes) - - # Read more data into the buffer from the socket - try: - data = await self.receive_stream.receive() - except EndOfStream as exc: - raise IncompleteRead from exc - - # Move the offset forward and add the new data to the buffer - offset = max(len(self._buffer) - delimiter_size + 1, 0) - self._buffer.extend(data) - - -class BufferedByteStream(BufferedByteReceiveStream, ByteStream): - """ - A full-duplex variant of :class:`BufferedByteReceiveStream`. All writes are passed - through to the wrapped stream as-is. - """ - - def __init__(self, stream: AnyByteStream): - """ - :param stream: the stream to be wrapped - - """ - super().__init__(stream) - self._stream = stream - - @override - async def send_eof(self) -> None: - await self._stream.send_eof() - - @override - async def send(self, item: bytes) -> None: - await self._stream.send(item) - - -class BufferedConnectable(ByteStreamConnectable): - """ - Wraps a byte stream connectable to produce :class:`BufferedByteStream` connections. - - Use this when you want the streams returned by :meth:`connect` to have the buffered - receive API (e.g. :meth:`~BufferedByteReceiveStream.receive_exactly` and - :meth:`~BufferedByteReceiveStream.receive_until`). - - :param connectable: the byte stream connectable to wrap - """ - - def __init__(self, connectable: AnyByteStreamConnectable): - """ - :param connectable: the connectable to wrap - - """ - self.connectable = connectable - - @override - async def connect(self) -> BufferedByteStream: - stream = await self.connectable.connect() - return BufferedByteStream(stream) diff --git a/venv/lib/python3.11/site-packages/anyio/streams/file.py b/venv/lib/python3.11/site-packages/anyio/streams/file.py deleted file mode 100755 index b9d7ca4..0000000 --- a/venv/lib/python3.11/site-packages/anyio/streams/file.py +++ /dev/null @@ -1,157 +0,0 @@ -from __future__ import annotations - -__all__ = ( - "FileReadStream", - "FileStreamAttribute", - "FileWriteStream", -) - -from collections.abc import Callable, Mapping -from io import SEEK_SET, UnsupportedOperation -from os import PathLike -from pathlib import Path -from typing import IO, Any - -from .. import ( - BrokenResourceError, - ClosedResourceError, - EndOfStream, - TypedAttributeSet, - to_thread, - typed_attribute, -) -from ..abc import ByteReceiveStream, ByteSendStream - - -class FileStreamAttribute(TypedAttributeSet): - #: the open file descriptor - file: IO[bytes] = typed_attribute() - #: the path of the file on the file system, if available (file must be a real file) - path: Path = typed_attribute() - #: the file number, if available (file must be a real file or a TTY) - fileno: int = typed_attribute() - - -class _BaseFileStream: - def __init__(self, file: IO[bytes]): - self._file = file - - async def aclose(self) -> None: - await to_thread.run_sync(self._file.close) - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - attributes: dict[Any, Callable[[], Any]] = { - FileStreamAttribute.file: lambda: self._file, - } - - if hasattr(self._file, "name"): - attributes[FileStreamAttribute.path] = lambda: Path(self._file.name) - - try: - self._file.fileno() - except UnsupportedOperation: - pass - else: - attributes[FileStreamAttribute.fileno] = lambda: self._file.fileno() - - return attributes - - -class FileReadStream(_BaseFileStream, ByteReceiveStream): - """ - A byte stream that reads from a file in the file system. - - :param file: a file that has been opened for reading in binary mode - - .. versionadded:: 3.0 - """ - - @classmethod - async def from_path(cls, path: str | PathLike[str]) -> FileReadStream: - """ - Create a file read stream by opening the given file. - - :param path: path of the file to read from - - """ - file = await to_thread.run_sync(Path(path).open, "rb") - return cls(file) - - async def receive(self, max_bytes: int = 65536) -> bytes: - if max_bytes < 1: - raise ValueError("max_bytes must be a positive integer") - - try: - data = await to_thread.run_sync(self._file.read, max_bytes) - except ValueError: - raise ClosedResourceError from None - except OSError as exc: - raise BrokenResourceError from exc - - if data: - return data - else: - raise EndOfStream - - async def seek(self, position: int, whence: int = SEEK_SET) -> int: - """ - Seek the file to the given position. - - .. seealso:: :meth:`io.IOBase.seek` - - .. note:: Not all file descriptors are seekable. - - :param position: position to seek the file to - :param whence: controls how ``position`` is interpreted - :return: the new absolute position - :raises OSError: if the file is not seekable - - """ - return await to_thread.run_sync(self._file.seek, position, whence) - - async def tell(self) -> int: - """ - Return the current stream position. - - .. note:: Not all file descriptors are seekable. - - :return: the current absolute position - :raises OSError: if the file is not seekable - - """ - return await to_thread.run_sync(self._file.tell) - - -class FileWriteStream(_BaseFileStream, ByteSendStream): - """ - A byte stream that writes to a file in the file system. - - :param file: a file that has been opened for writing in binary mode - - .. versionadded:: 3.0 - """ - - @classmethod - async def from_path( - cls, path: str | PathLike[str], append: bool = False - ) -> FileWriteStream: - """ - Create a file write stream by opening the given file for writing. - - :param path: path of the file to write to - :param append: if ``True``, open the file for appending; if ``False``, any - existing file at the given path will be truncated - - """ - mode = "ab" if append else "wb" - file = await to_thread.run_sync(Path(path).open, mode) - return cls(file) - - async def send(self, item: bytes) -> None: - try: - await to_thread.run_sync(self._file.write, item) - except ValueError: - raise ClosedResourceError from None - except OSError as exc: - raise BrokenResourceError from exc diff --git a/venv/lib/python3.11/site-packages/anyio/streams/memory.py b/venv/lib/python3.11/site-packages/anyio/streams/memory.py deleted file mode 100755 index 329a75e..0000000 --- a/venv/lib/python3.11/site-packages/anyio/streams/memory.py +++ /dev/null @@ -1,326 +0,0 @@ -from __future__ import annotations - -__all__ = ( - "MemoryObjectReceiveStream", - "MemoryObjectSendStream", - "MemoryObjectStreamStatistics", -) - -import warnings -from collections import OrderedDict, deque -from dataclasses import dataclass, field -from types import TracebackType -from typing import Generic, NamedTuple, TypeVar - -from .._core._exceptions import ( - BrokenResourceError, - ClosedResourceError, - EndOfStream, - WouldBlock, -) -from .._core._synchronization import Event -from .._core._testing import TaskInfo, get_current_task -from ..abc import ObjectReceiveStream, ObjectSendStream -from ..lowlevel import checkpoint - -T_Item = TypeVar("T_Item") -T_co = TypeVar("T_co", covariant=True) -T_contra = TypeVar("T_contra", contravariant=True) - - -class MemoryObjectStreamStatistics(NamedTuple): - current_buffer_used: int #: number of items stored in the buffer - #: maximum number of items that can be stored on this stream (or :data:`math.inf`) - max_buffer_size: float - open_send_streams: int #: number of unclosed clones of the send stream - open_receive_streams: int #: number of unclosed clones of the receive stream - #: number of tasks blocked on :meth:`MemoryObjectSendStream.send` - tasks_waiting_send: int - #: number of tasks blocked on :meth:`MemoryObjectReceiveStream.receive` - tasks_waiting_receive: int - - -@dataclass(eq=False) -class _MemoryObjectItemReceiver(Generic[T_Item]): - task_info: TaskInfo = field(init=False, default_factory=get_current_task) - item: T_Item = field(init=False) - - def __repr__(self) -> str: - # When item is not defined, we get following error with default __repr__: - # AttributeError: 'MemoryObjectItemReceiver' object has no attribute 'item' - item = getattr(self, "item", None) - return f"{self.__class__.__name__}(task_info={self.task_info}, item={item!r})" - - -@dataclass(eq=False) -class _MemoryObjectStreamState(Generic[T_Item]): - max_buffer_size: float = field() - buffer: deque[T_Item] = field(init=False, default_factory=deque) - open_send_channels: int = field(init=False, default=0) - open_receive_channels: int = field(init=False, default=0) - waiting_receivers: OrderedDict[Event, _MemoryObjectItemReceiver[T_Item]] = field( - init=False, default_factory=OrderedDict - ) - waiting_senders: OrderedDict[Event, T_Item] = field( - init=False, default_factory=OrderedDict - ) - - def statistics(self) -> MemoryObjectStreamStatistics: - return MemoryObjectStreamStatistics( - len(self.buffer), - self.max_buffer_size, - self.open_send_channels, - self.open_receive_channels, - len(self.waiting_senders), - len(self.waiting_receivers), - ) - - -@dataclass(eq=False) -class MemoryObjectReceiveStream(ObjectReceiveStream[T_co], Generic[T_co]): - _state: _MemoryObjectStreamState[T_co] - _closed: bool = field(init=False, default=False) - - def __post_init__(self) -> None: - self._state.open_receive_channels += 1 - - def receive_nowait(self) -> T_co: - """ - Receive the next item if it can be done without waiting. - - :return: the received item - :raises ~anyio.ClosedResourceError: if this send stream has been closed - :raises ~anyio.EndOfStream: if the buffer is empty and this stream has been - closed from the sending end - :raises ~anyio.WouldBlock: if there are no items in the buffer and no tasks - waiting to send - - """ - if self._closed: - raise ClosedResourceError - - if self._state.waiting_senders: - # Get the item from the next sender - send_event, item = self._state.waiting_senders.popitem(last=False) - self._state.buffer.append(item) - send_event.set() - - if self._state.buffer: - return self._state.buffer.popleft() - elif not self._state.open_send_channels: - raise EndOfStream - - raise WouldBlock - - async def receive(self) -> T_co: - await checkpoint() - try: - return self.receive_nowait() - except WouldBlock: - # Add ourselves in the queue - receive_event = Event() - receiver = _MemoryObjectItemReceiver[T_co]() - self._state.waiting_receivers[receive_event] = receiver - - try: - await receive_event.wait() - finally: - self._state.waiting_receivers.pop(receive_event, None) - - try: - return receiver.item - except AttributeError: - raise EndOfStream from None - - def clone(self) -> MemoryObjectReceiveStream[T_co]: - """ - Create a clone of this receive stream. - - Each clone can be closed separately. Only when all clones have been closed will - the receiving end of the memory stream be considered closed by the sending ends. - - :return: the cloned stream - - """ - if self._closed: - raise ClosedResourceError - - return MemoryObjectReceiveStream(_state=self._state) - - def close(self) -> None: - """ - Close the stream. - - This works the exact same way as :meth:`aclose`, but is provided as a special - case for the benefit of synchronous callbacks. - - """ - if not self._closed: - self._closed = True - self._state.open_receive_channels -= 1 - if self._state.open_receive_channels == 0: - send_events = list(self._state.waiting_senders.keys()) - for event in send_events: - event.set() - - async def aclose(self) -> None: - self.close() - - def statistics(self) -> MemoryObjectStreamStatistics: - """ - Return statistics about the current state of this stream. - - .. versionadded:: 3.0 - """ - return self._state.statistics() - - def __enter__(self) -> MemoryObjectReceiveStream[T_co]: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self.close() - - def __del__(self) -> None: - if not self._closed: - warnings.warn( - f"Unclosed <{self.__class__.__name__} at {id(self):x}>", - ResourceWarning, - stacklevel=1, - source=self, - ) - - -@dataclass(eq=False) -class MemoryObjectSendStream(ObjectSendStream[T_contra], Generic[T_contra]): - _state: _MemoryObjectStreamState[T_contra] - _closed: bool = field(init=False, default=False) - - def __post_init__(self) -> None: - self._state.open_send_channels += 1 - - def send_nowait(self, item: T_contra) -> None: - """ - Send an item immediately if it can be done without waiting. - - :param item: the item to send - :raises ~anyio.ClosedResourceError: if this send stream has been closed - :raises ~anyio.BrokenResourceError: if the stream has been closed from the - receiving end - :raises ~anyio.WouldBlock: if the buffer is full and there are no tasks waiting - to receive - - """ - if self._closed: - raise ClosedResourceError - if not self._state.open_receive_channels: - raise BrokenResourceError - - while self._state.waiting_receivers: - receive_event, receiver = self._state.waiting_receivers.popitem(last=False) - if not receiver.task_info.has_pending_cancellation(): - receiver.item = item - receive_event.set() - return - - if len(self._state.buffer) < self._state.max_buffer_size: - self._state.buffer.append(item) - else: - raise WouldBlock - - async def send(self, item: T_contra) -> None: - """ - Send an item to the stream. - - If the buffer is full, this method blocks until there is again room in the - buffer or the item can be sent directly to a receiver. - - :param item: the item to send - :raises ~anyio.ClosedResourceError: if this send stream has been closed - :raises ~anyio.BrokenResourceError: if the stream has been closed from the - receiving end - - """ - await checkpoint() - try: - self.send_nowait(item) - except WouldBlock: - # Wait until there's someone on the receiving end - send_event = Event() - self._state.waiting_senders[send_event] = item - try: - await send_event.wait() - except BaseException: - self._state.waiting_senders.pop(send_event, None) - raise - - if send_event in self._state.waiting_senders: - del self._state.waiting_senders[send_event] - raise BrokenResourceError from None - - def clone(self) -> MemoryObjectSendStream[T_contra]: - """ - Create a clone of this send stream. - - Each clone can be closed separately. Only when all clones have been closed will - the sending end of the memory stream be considered closed by the receiving ends. - - :return: the cloned stream - - """ - if self._closed: - raise ClosedResourceError - - return MemoryObjectSendStream(_state=self._state) - - def close(self) -> None: - """ - Close the stream. - - This works the exact same way as :meth:`aclose`, but is provided as a special - case for the benefit of synchronous callbacks. - - """ - if not self._closed: - self._closed = True - self._state.open_send_channels -= 1 - if self._state.open_send_channels == 0: - receive_events = list(self._state.waiting_receivers.keys()) - self._state.waiting_receivers.clear() - for event in receive_events: - event.set() - - async def aclose(self) -> None: - self.close() - - def statistics(self) -> MemoryObjectStreamStatistics: - """ - Return statistics about the current state of this stream. - - .. versionadded:: 3.0 - """ - return self._state.statistics() - - def __enter__(self) -> MemoryObjectSendStream[T_contra]: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self.close() - - def __del__(self) -> None: - if not self._closed: - warnings.warn( - f"Unclosed <{self.__class__.__name__} at {id(self):x}>", - ResourceWarning, - stacklevel=1, - source=self, - ) diff --git a/venv/lib/python3.11/site-packages/anyio/streams/stapled.py b/venv/lib/python3.11/site-packages/anyio/streams/stapled.py deleted file mode 100755 index 9a75345..0000000 --- a/venv/lib/python3.11/site-packages/anyio/streams/stapled.py +++ /dev/null @@ -1,160 +0,0 @@ -from __future__ import annotations - -__all__ = ( - "MultiListener", - "StapledByteStream", - "StapledObjectStream", -) - -from collections.abc import Callable, Mapping, Sequence -from dataclasses import dataclass -from typing import Any, Generic, TypeVar - -from ..abc import ( - ByteReceiveStream, - ByteSendStream, - ByteStream, - Listener, - ObjectReceiveStream, - ObjectSendStream, - ObjectStream, - TaskGroup, -) - -T_Item = TypeVar("T_Item") -T_Stream = TypeVar("T_Stream") - - -@dataclass(eq=False) -class StapledByteStream(ByteStream): - """ - Combines two byte streams into a single, bidirectional byte stream. - - Extra attributes will be provided from both streams, with the receive stream - providing the values in case of a conflict. - - :param ByteSendStream send_stream: the sending byte stream - :param ByteReceiveStream receive_stream: the receiving byte stream - """ - - send_stream: ByteSendStream - receive_stream: ByteReceiveStream - - async def receive(self, max_bytes: int = 65536) -> bytes: - if max_bytes < 1: - raise ValueError("max_bytes must be a positive integer") - - return await self.receive_stream.receive(max_bytes) - - async def send(self, item: bytes) -> None: - await self.send_stream.send(item) - - async def send_eof(self) -> None: - await self.send_stream.aclose() - - async def aclose(self) -> None: - await self.send_stream.aclose() - await self.receive_stream.aclose() - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return { - **self.send_stream.extra_attributes, - **self.receive_stream.extra_attributes, - } - - -@dataclass(eq=False) -class StapledObjectStream(ObjectStream[T_Item], Generic[T_Item]): - """ - Combines two object streams into a single, bidirectional object stream. - - Extra attributes will be provided from both streams, with the receive stream - providing the values in case of a conflict. - - :param ObjectSendStream send_stream: the sending object stream - :param ObjectReceiveStream receive_stream: the receiving object stream - """ - - send_stream: ObjectSendStream[T_Item] - receive_stream: ObjectReceiveStream[T_Item] - - async def receive(self) -> T_Item: - return await self.receive_stream.receive() - - async def send(self, item: T_Item) -> None: - await self.send_stream.send(item) - - def send_nowait(self, item: T_Item) -> None: - try: - send_nowait = self.send_stream.send_nowait # type: ignore[attr-defined] - except AttributeError as exc: - raise NotImplementedError( - f"'send_nowait' method not implemented in {type(self.send_stream)}" - ) from exc - - send_nowait(item) - - async def send_eof(self) -> None: - await self.send_stream.aclose() - - async def aclose(self) -> None: - await self.send_stream.aclose() - await self.receive_stream.aclose() - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return { - **self.send_stream.extra_attributes, - **self.receive_stream.extra_attributes, - } - - -@dataclass(eq=False) -class MultiListener(Listener[T_Stream], Generic[T_Stream]): - """ - Combines multiple listeners into one, serving connections from all of them at once. - - Any MultiListeners in the given collection of listeners will have their listeners - moved into this one. - - Extra attributes are provided from each listener, with each successive listener - overriding any conflicting attributes from the previous one. - - :param listeners: listeners to serve - :type listeners: Sequence[Listener[T_Stream]] - """ - - listeners: Sequence[Listener[T_Stream]] - - def __post_init__(self) -> None: - listeners: list[Listener[T_Stream]] = [] - for listener in self.listeners: - if isinstance(listener, MultiListener): - listeners.extend(listener.listeners) - del listener.listeners[:] # type: ignore[attr-defined] - else: - listeners.append(listener) - - self.listeners = listeners - - async def serve( - self, handler: Callable[[T_Stream], Any], task_group: TaskGroup | None = None - ) -> None: - from .. import create_task_group - - async with create_task_group() as tg: - for listener in self.listeners: - tg.start_soon(listener.serve, handler, task_group) - - async def aclose(self) -> None: - for listener in self.listeners: - await listener.aclose() - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - attributes: dict = {} - for listener in self.listeners: - attributes.update(listener.extra_attributes) - - return attributes diff --git a/venv/lib/python3.11/site-packages/anyio/streams/text.py b/venv/lib/python3.11/site-packages/anyio/streams/text.py deleted file mode 100755 index 296cd25..0000000 --- a/venv/lib/python3.11/site-packages/anyio/streams/text.py +++ /dev/null @@ -1,176 +0,0 @@ -from __future__ import annotations - -__all__ = ( - "TextConnectable", - "TextReceiveStream", - "TextSendStream", - "TextStream", -) - -import codecs -import sys -from collections.abc import Callable, Mapping -from dataclasses import InitVar, dataclass, field -from typing import Any - -from ..abc import ( - AnyByteReceiveStream, - AnyByteSendStream, - AnyByteStream, - AnyByteStreamConnectable, - ObjectReceiveStream, - ObjectSendStream, - ObjectStream, - ObjectStreamConnectable, -) - -if sys.version_info >= (3, 12): - from typing import override -else: - from typing_extensions import override - - -@dataclass(eq=False) -class TextReceiveStream(ObjectReceiveStream[str]): - """ - Stream wrapper that decodes bytes to strings using the given encoding. - - Decoding is done using :class:`~codecs.IncrementalDecoder` which returns any - completely received unicode characters as soon as they come in. - - :param transport_stream: any bytes-based receive stream - :param encoding: character encoding to use for decoding bytes to strings (defaults - to ``utf-8``) - :param errors: handling scheme for decoding errors (defaults to ``strict``; see the - `codecs module documentation`_ for a comprehensive list of options) - - .. _codecs module documentation: - https://docs.python.org/3/library/codecs.html#codec-objects - """ - - transport_stream: AnyByteReceiveStream - encoding: InitVar[str] = "utf-8" - errors: InitVar[str] = "strict" - _decoder: codecs.IncrementalDecoder = field(init=False) - - def __post_init__(self, encoding: str, errors: str) -> None: - decoder_class = codecs.getincrementaldecoder(encoding) - self._decoder = decoder_class(errors=errors) - - async def receive(self) -> str: - while True: - chunk = await self.transport_stream.receive() - decoded = self._decoder.decode(chunk) - if decoded: - return decoded - - async def aclose(self) -> None: - await self.transport_stream.aclose() - self._decoder.reset() - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return self.transport_stream.extra_attributes - - -@dataclass(eq=False) -class TextSendStream(ObjectSendStream[str]): - """ - Sends strings to the wrapped stream as bytes using the given encoding. - - :param AnyByteSendStream transport_stream: any bytes-based send stream - :param str encoding: character encoding to use for encoding strings to bytes - (defaults to ``utf-8``) - :param str errors: handling scheme for encoding errors (defaults to ``strict``; see - the `codecs module documentation`_ for a comprehensive list of options) - - .. _codecs module documentation: - https://docs.python.org/3/library/codecs.html#codec-objects - """ - - transport_stream: AnyByteSendStream - encoding: InitVar[str] = "utf-8" - errors: str = "strict" - _encoder: Callable[..., tuple[bytes, int]] = field(init=False) - - def __post_init__(self, encoding: str) -> None: - self._encoder = codecs.getencoder(encoding) - - async def send(self, item: str) -> None: - encoded = self._encoder(item, self.errors)[0] - await self.transport_stream.send(encoded) - - async def aclose(self) -> None: - await self.transport_stream.aclose() - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return self.transport_stream.extra_attributes - - -@dataclass(eq=False) -class TextStream(ObjectStream[str]): - """ - A bidirectional stream that decodes bytes to strings on receive and encodes strings - to bytes on send. - - Extra attributes will be provided from both streams, with the receive stream - providing the values in case of a conflict. - - :param AnyByteStream transport_stream: any bytes-based stream - :param str encoding: character encoding to use for encoding/decoding strings to/from - bytes (defaults to ``utf-8``) - :param str errors: handling scheme for encoding errors (defaults to ``strict``; see - the `codecs module documentation`_ for a comprehensive list of options) - - .. _codecs module documentation: - https://docs.python.org/3/library/codecs.html#codec-objects - """ - - transport_stream: AnyByteStream - encoding: InitVar[str] = "utf-8" - errors: InitVar[str] = "strict" - _receive_stream: TextReceiveStream = field(init=False) - _send_stream: TextSendStream = field(init=False) - - def __post_init__(self, encoding: str, errors: str) -> None: - self._receive_stream = TextReceiveStream( - self.transport_stream, encoding=encoding, errors=errors - ) - self._send_stream = TextSendStream( - self.transport_stream, encoding=encoding, errors=errors - ) - - async def receive(self) -> str: - return await self._receive_stream.receive() - - async def send(self, item: str) -> None: - await self._send_stream.send(item) - - async def send_eof(self) -> None: - await self.transport_stream.send_eof() - - async def aclose(self) -> None: - await self._send_stream.aclose() - await self._receive_stream.aclose() - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return { - **self._send_stream.extra_attributes, - **self._receive_stream.extra_attributes, - } - - -class TextConnectable(ObjectStreamConnectable[str]): - def __init__(self, connectable: AnyByteStreamConnectable): - """ - :param connectable: the bytestream endpoint to wrap - - """ - self.connectable = connectable - - @override - async def connect(self) -> TextStream: - stream = await self.connectable.connect() - return TextStream(stream) diff --git a/venv/lib/python3.11/site-packages/anyio/streams/tls.py b/venv/lib/python3.11/site-packages/anyio/streams/tls.py deleted file mode 100755 index b9ddf1d..0000000 --- a/venv/lib/python3.11/site-packages/anyio/streams/tls.py +++ /dev/null @@ -1,436 +0,0 @@ -from __future__ import annotations - -__all__ = ( - "TLSAttribute", - "TLSConnectable", - "TLSListener", - "TLSStream", -) - -import logging -import re -import ssl -import sys -from collections.abc import Callable, Mapping -from dataclasses import dataclass -from functools import wraps -from ssl import SSLContext -from typing import Any, TypeAlias, TypeVar - -from .. import ( - BrokenResourceError, - EndOfStream, - aclose_forcefully, - get_cancelled_exc_class, - to_thread, -) -from .._core._typedattr import TypedAttributeSet, typed_attribute -from ..abc import ( - AnyByteStream, - AnyByteStreamConnectable, - ByteStream, - ByteStreamConnectable, - Listener, - TaskGroup, -) - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -if sys.version_info >= (3, 12): - from typing import override -else: - from typing_extensions import override - -T_Retval = TypeVar("T_Retval") -PosArgsT = TypeVarTuple("PosArgsT") -_PCTRTT: TypeAlias = tuple[tuple[str, str], ...] -_PCTRTTT: TypeAlias = tuple[_PCTRTT, ...] - - -class TLSAttribute(TypedAttributeSet): - """Contains Transport Layer Security related attributes.""" - - #: the selected ALPN protocol - alpn_protocol: str | None = typed_attribute() - #: the channel binding for type ``tls-unique`` - channel_binding_tls_unique: bytes = typed_attribute() - #: the selected cipher - cipher: tuple[str, str, int] = typed_attribute() - #: the peer certificate in dictionary form (see :meth:`ssl.SSLSocket.getpeercert` - # for more information) - peer_certificate: None | (dict[str, str | _PCTRTTT | _PCTRTT]) = typed_attribute() - #: the peer certificate in binary form - peer_certificate_binary: bytes | None = typed_attribute() - #: ``True`` if this is the server side of the connection - server_side: bool = typed_attribute() - #: ciphers shared by the client during the TLS handshake (``None`` if this is the - #: client side) - shared_ciphers: list[tuple[str, str, int]] | None = typed_attribute() - #: the :class:`~ssl.SSLObject` used for encryption - ssl_object: ssl.SSLObject = typed_attribute() - #: ``True`` if this stream does (and expects) a closing TLS handshake when the - #: stream is being closed - standard_compatible: bool = typed_attribute() - #: the TLS protocol version (e.g. ``TLSv1.2``) - tls_version: str = typed_attribute() - - -@dataclass(eq=False) -class TLSStream(ByteStream): - """ - A stream wrapper that encrypts all sent data and decrypts received data. - - This class has no public initializer; use :meth:`wrap` instead. - All extra attributes from :class:`~TLSAttribute` are supported. - - :var AnyByteStream transport_stream: the wrapped stream - - """ - - transport_stream: AnyByteStream - standard_compatible: bool - _ssl_object: ssl.SSLObject - _read_bio: ssl.MemoryBIO - _write_bio: ssl.MemoryBIO - - @classmethod - async def wrap( - cls, - transport_stream: AnyByteStream, - *, - server_side: bool | None = None, - hostname: str | None = None, - ssl_context: ssl.SSLContext | None = None, - standard_compatible: bool = True, - ) -> TLSStream: - """ - Wrap an existing stream with Transport Layer Security. - - This performs a TLS handshake with the peer. - - :param transport_stream: a bytes-transporting stream to wrap - :param server_side: ``True`` if this is the server side of the connection, - ``False`` if this is the client side (if omitted, will be set to ``False`` - if ``hostname`` has been provided, ``False`` otherwise). Used only to create - a default context when an explicit context has not been provided. - :param hostname: host name of the peer (if host name checking is desired) - :param ssl_context: the SSLContext object to use (if not provided, a secure - default will be created) - :param standard_compatible: if ``False``, skip the closing handshake when - closing the connection, and don't raise an exception if the peer does the - same - :raises ~ssl.SSLError: if the TLS handshake fails - - """ - if server_side is None: - server_side = not hostname - - if not ssl_context: - purpose = ( - ssl.Purpose.CLIENT_AUTH if server_side else ssl.Purpose.SERVER_AUTH - ) - ssl_context = ssl.create_default_context(purpose) - - # Re-enable detection of unexpected EOFs if it was disabled by Python - if hasattr(ssl, "OP_IGNORE_UNEXPECTED_EOF"): - ssl_context.options &= ~ssl.OP_IGNORE_UNEXPECTED_EOF - - bio_in = ssl.MemoryBIO() - bio_out = ssl.MemoryBIO() - - # Resolve international host names using IDNA 2008. - # Otherwise wrap_bio() would resolve them with IDNA 2003. - if hostname is not None: - from .._core._sockets import idna2008_resolve - - server_hostname: bytes | None = idna2008_resolve(hostname) - else: - server_hostname = None - - # External SSLContext implementations may do blocking I/O in wrap_bio(), - # but the standard library implementation won't - if type(ssl_context) is ssl.SSLContext: - ssl_object = ssl_context.wrap_bio( - bio_in, - bio_out, - server_side=server_side, - server_hostname=server_hostname, - ) - else: - ssl_object = await to_thread.run_sync( - ssl_context.wrap_bio, - bio_in, - bio_out, - server_side, - server_hostname, - None, - ) - - wrapper = cls( - transport_stream=transport_stream, - standard_compatible=standard_compatible, - _ssl_object=ssl_object, - _read_bio=bio_in, - _write_bio=bio_out, - ) - await wrapper._call_sslobject_method(ssl_object.do_handshake) - return wrapper - - async def _call_sslobject_method( - self, func: Callable[[Unpack[PosArgsT]], T_Retval], *args: Unpack[PosArgsT] - ) -> T_Retval: - while True: - try: - result = func(*args) - except ssl.SSLWantReadError: - try: - # Flush any pending writes first - if self._write_bio.pending: - await self.transport_stream.send(self._write_bio.read()) - - data = await self.transport_stream.receive() - except EndOfStream: - self._read_bio.write_eof() - except OSError as exc: - self._read_bio.write_eof() - self._write_bio.write_eof() - raise BrokenResourceError from exc - else: - self._read_bio.write(data) - except ssl.SSLWantWriteError: - await self.transport_stream.send(self._write_bio.read()) - except ssl.SSLSyscallError as exc: - self._read_bio.write_eof() - self._write_bio.write_eof() - raise BrokenResourceError from exc - except ssl.SSLError as exc: - self._read_bio.write_eof() - self._write_bio.write_eof() - if isinstance(exc, ssl.SSLEOFError) or ( - exc.strerror and "UNEXPECTED_EOF_WHILE_READING" in exc.strerror - ): - if self.standard_compatible: - raise BrokenResourceError from exc - else: - raise EndOfStream from None - - raise - else: - # Flush any pending writes first - if self._write_bio.pending: - await self.transport_stream.send(self._write_bio.read()) - - return result - - async def unwrap(self) -> tuple[AnyByteStream, bytes]: - """ - Does the TLS closing handshake. - - :return: a tuple of (wrapped byte stream, bytes left in the read buffer) - - """ - await self._call_sslobject_method(self._ssl_object.unwrap) - self._read_bio.write_eof() - self._write_bio.write_eof() - return self.transport_stream, self._read_bio.read() - - async def aclose(self) -> None: - if self.standard_compatible: - try: - await self.unwrap() - except BaseException: - await aclose_forcefully(self.transport_stream) - raise - - await self.transport_stream.aclose() - - async def receive(self, max_bytes: int = 65536) -> bytes: - if max_bytes < 1: - raise ValueError("max_bytes must be a positive integer") - - data = await self._call_sslobject_method(self._ssl_object.read, max_bytes) - if not data: - raise EndOfStream - - return data - - async def send(self, item: bytes) -> None: - await self._call_sslobject_method(self._ssl_object.write, item) - - async def send_eof(self) -> None: - tls_version = self.extra(TLSAttribute.tls_version) - match = re.match(r"TLSv(\d+)(?:\.(\d+))?", tls_version) - if match: - major, minor = int(match.group(1)), int(match.group(2) or 0) - if (major, minor) < (1, 3): - raise NotImplementedError( - f"send_eof() requires at least TLSv1.3; current " - f"session uses {tls_version}" - ) - - raise NotImplementedError( - "send_eof() has not yet been implemented for TLS streams" - ) - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return { - **self.transport_stream.extra_attributes, - TLSAttribute.alpn_protocol: self._ssl_object.selected_alpn_protocol, - TLSAttribute.channel_binding_tls_unique: ( - self._ssl_object.get_channel_binding - ), - TLSAttribute.cipher: self._ssl_object.cipher, - TLSAttribute.peer_certificate: lambda: self._ssl_object.getpeercert(False), - TLSAttribute.peer_certificate_binary: lambda: self._ssl_object.getpeercert( - True - ), - TLSAttribute.server_side: lambda: self._ssl_object.server_side, - TLSAttribute.shared_ciphers: lambda: ( - self._ssl_object.shared_ciphers() - if self._ssl_object.server_side - else None - ), - TLSAttribute.standard_compatible: lambda: self.standard_compatible, - TLSAttribute.ssl_object: lambda: self._ssl_object, - TLSAttribute.tls_version: self._ssl_object.version, - } - - -@dataclass(eq=False) -class TLSListener(Listener[TLSStream]): - """ - A convenience listener that wraps another listener and auto-negotiates a TLS session - on every accepted connection. - - If the TLS handshake times out or raises an exception, - :meth:`handle_handshake_error` is called to do whatever post-mortem processing is - deemed necessary. - - Supports only the :attr:`~TLSAttribute.standard_compatible` extra attribute. - - :param Listener listener: the listener to wrap - :param ssl_context: the SSL context object - :param standard_compatible: a flag passed through to :meth:`TLSStream.wrap` - :param handshake_timeout: time limit for the TLS handshake - (passed to :func:`~anyio.fail_after`) - """ - - listener: Listener[Any] - ssl_context: ssl.SSLContext - standard_compatible: bool = True - handshake_timeout: float = 30 - - @staticmethod - async def handle_handshake_error(exc: BaseException, stream: AnyByteStream) -> None: - """ - Handle an exception raised during the TLS handshake. - - This method does 3 things: - - #. Forcefully closes the original stream - #. Logs the exception (unless it was a cancellation exception) using the - ``anyio.streams.tls`` logger - #. Reraises the exception if it was a base exception or a cancellation exception - - :param exc: the exception - :param stream: the original stream - - """ - await aclose_forcefully(stream) - - # Log all except cancellation exceptions - if not isinstance(exc, get_cancelled_exc_class()): - # CPython (as of 3.11.5) returns incorrect `sys.exc_info()` here when using - # any asyncio implementation, so we explicitly pass the exception to log - # (https://github.com/python/cpython/issues/108668). Trio does not have this - # issue because it works around the CPython bug. - logging.getLogger(__name__).exception( - "Error during TLS handshake", exc_info=exc - ) - - # Only reraise base exceptions and cancellation exceptions - if not isinstance(exc, Exception) or isinstance(exc, get_cancelled_exc_class()): - raise # noqa: PLE0704 - - async def serve( - self, - handler: Callable[[TLSStream], Any], - task_group: TaskGroup | None = None, - ) -> None: - @wraps(handler) - async def handler_wrapper(stream: AnyByteStream) -> None: - from .. import fail_after - - try: - with fail_after(self.handshake_timeout): - wrapped_stream = await TLSStream.wrap( - stream, - ssl_context=self.ssl_context, - standard_compatible=self.standard_compatible, - ) - except BaseException as exc: - await self.handle_handshake_error(exc, stream) - else: - await handler(wrapped_stream) - - await self.listener.serve(handler_wrapper, task_group) - - async def aclose(self) -> None: - await self.listener.aclose() - - @property - def extra_attributes(self) -> Mapping[Any, Callable[[], Any]]: - return { - TLSAttribute.standard_compatible: lambda: self.standard_compatible, - } - - -class TLSConnectable(ByteStreamConnectable): - """ - Wraps another connectable and does TLS negotiation after a successful connection. - - :param connectable: the connectable to wrap - :param hostname: host name of the server (if host name checking is desired) - :param ssl_context: the SSLContext object to use (if not provided, a secure default - will be created) - :param standard_compatible: if ``False``, skip the closing handshake when closing - the connection, and don't raise an exception if the server does the same - """ - - def __init__( - self, - connectable: AnyByteStreamConnectable, - *, - hostname: str | None = None, - ssl_context: ssl.SSLContext | None = None, - standard_compatible: bool = True, - ) -> None: - self.connectable = connectable - self.ssl_context: SSLContext = ssl_context or ssl.create_default_context( - ssl.Purpose.SERVER_AUTH - ) - if not isinstance(self.ssl_context, ssl.SSLContext): - raise TypeError( - "ssl_context must be an instance of ssl.SSLContext, not " - f"{type(self.ssl_context).__name__}" - ) - self.hostname = hostname - self.standard_compatible = standard_compatible - - @override - async def connect(self) -> TLSStream: - stream = await self.connectable.connect() - try: - return await TLSStream.wrap( - stream, - hostname=self.hostname, - ssl_context=self.ssl_context, - standard_compatible=self.standard_compatible, - ) - except BaseException: - await aclose_forcefully(stream) - raise diff --git a/venv/lib/python3.11/site-packages/anyio/to_interpreter.py b/venv/lib/python3.11/site-packages/anyio/to_interpreter.py deleted file mode 100755 index 54ef4a8..0000000 --- a/venv/lib/python3.11/site-packages/anyio/to_interpreter.py +++ /dev/null @@ -1,246 +0,0 @@ -from __future__ import annotations - -__all__ = ( - "current_default_interpreter_limiter", - "run_sync", -) - -import atexit -import os -import sys -from collections import deque -from collections.abc import Callable -from typing import Any, Final, TypeVar - -from . import current_time, to_thread -from ._core._exceptions import BrokenWorkerInterpreter -from ._core._synchronization import CapacityLimiter -from .lowlevel import RunVar - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -if sys.version_info >= (3, 14): - from concurrent.interpreters import ExecutionFailed, create - - def _interp_call( - func: Callable[..., Any], args: tuple[Any, ...] - ) -> tuple[Any, bool]: - try: - retval = func(*args) - except BaseException as exc: - return exc, True - else: - return retval, False - - class _Worker: - last_used: float = 0 - - def __init__(self) -> None: - self._interpreter = create() - - def destroy(self) -> None: - self._interpreter.close() - - def call( - self, - func: Callable[..., T_Retval], - args: tuple[Any, ...], - ) -> T_Retval: - try: - res, is_exception = self._interpreter.call(_interp_call, func, args) - except ExecutionFailed as exc: - raise BrokenWorkerInterpreter(exc.excinfo) from exc - - if is_exception: - raise res - - return res -elif sys.version_info >= (3, 13): - import _interpqueues - import _interpreters - - UNBOUND: Final = 2 # I have no clue how this works, but it was used in the stdlib - FMT_UNPICKLED: Final = 0 - FMT_PICKLED: Final = 1 - QUEUE_PICKLE_ARGS: Final = (FMT_PICKLED, UNBOUND) - QUEUE_UNPICKLE_ARGS: Final = (FMT_UNPICKLED, UNBOUND) - - _run_func = compile( - """ -import _interpqueues -from _interpreters import NotShareableError -from pickle import loads, dumps, HIGHEST_PROTOCOL - -QUEUE_PICKLE_ARGS = (1, 2) -QUEUE_UNPICKLE_ARGS = (0, 2) - -item = _interpqueues.get(queue_id)[0] -try: - func, args = loads(item) - retval = func(*args) -except BaseException as exc: - is_exception = True - retval = exc -else: - is_exception = False - -try: - _interpqueues.put(queue_id, (retval, is_exception), *QUEUE_UNPICKLE_ARGS) -except NotShareableError: - retval = dumps(retval, HIGHEST_PROTOCOL) - _interpqueues.put(queue_id, (retval, is_exception), *QUEUE_PICKLE_ARGS) - """, - "", - "exec", - ) - - class _Worker: - last_used: float = 0 - - def __init__(self) -> None: - self._interpreter_id = _interpreters.create() - self._queue_id = _interpqueues.create(1, *QUEUE_UNPICKLE_ARGS) - _interpreters.set___main___attrs( - self._interpreter_id, {"queue_id": self._queue_id} - ) - - def destroy(self) -> None: - _interpqueues.destroy(self._queue_id) - _interpreters.destroy(self._interpreter_id) - - def call( - self, - func: Callable[..., T_Retval], - args: tuple[Any, ...], - ) -> T_Retval: - import pickle - - item = pickle.dumps((func, args), pickle.HIGHEST_PROTOCOL) - _interpqueues.put(self._queue_id, item, *QUEUE_PICKLE_ARGS) - exc_info = _interpreters.exec(self._interpreter_id, _run_func) - if exc_info: - raise BrokenWorkerInterpreter(exc_info) - - res = _interpqueues.get(self._queue_id) - (res, is_exception), fmt = res[:2] - if fmt == FMT_PICKLED: - res = pickle.loads(res) - - if is_exception: - raise res - - return res -else: - - class _Worker: - last_used: float = 0 - - def __init__(self) -> None: - raise RuntimeError("subinterpreters require at least Python 3.13") - - def call( - self, - func: Callable[..., T_Retval], - args: tuple[Any, ...], - ) -> T_Retval: - raise NotImplementedError - - def destroy(self) -> None: - pass - - -DEFAULT_CPU_COUNT: Final = 8 # this is just an arbitrarily selected value -MAX_WORKER_IDLE_TIME = ( - 30 # seconds a subinterpreter can be idle before becoming eligible for pruning -) - -T_Retval = TypeVar("T_Retval") -PosArgsT = TypeVarTuple("PosArgsT") - -_idle_workers = RunVar[deque[_Worker]]("_available_workers") -_default_interpreter_limiter = RunVar[CapacityLimiter]("_default_interpreter_limiter") - - -def _stop_workers(workers: deque[_Worker]) -> None: - for worker in workers: - worker.destroy() - - workers.clear() - - -async def run_sync( - func: Callable[[Unpack[PosArgsT]], T_Retval], - *args: Unpack[PosArgsT], - limiter: CapacityLimiter | None = None, -) -> T_Retval: - """ - Call the given function with the given arguments in a subinterpreter. - - .. warning:: On Python 3.13, the :mod:`concurrent.interpreters` module was not yet - available, so the code path for that Python version relies on an undocumented, - private API. As such, it is recommended to not rely on this function for anything - mission-critical on Python 3.13. - - :param func: a callable - :param args: the positional arguments for the callable - :param limiter: capacity limiter to use to limit the total number of subinterpreters - running (if omitted, the default limiter is used) - :return: the result of the call - :raises BrokenWorkerInterpreter: if there's an internal error in a subinterpreter - - """ - if limiter is None: - limiter = current_default_interpreter_limiter() - - try: - idle_workers = _idle_workers.get() - except LookupError: - idle_workers = deque() - _idle_workers.set(idle_workers) - atexit.register(_stop_workers, idle_workers) - - async with limiter: - try: - worker = idle_workers.pop() - except IndexError: - worker = _Worker() - - try: - return await to_thread.run_sync( - worker.call, - func, - args, - limiter=limiter, - ) - finally: - # Prune workers that have been idle for too long - now = current_time() - while idle_workers: - if now - idle_workers[0].last_used <= MAX_WORKER_IDLE_TIME: - break - - await to_thread.run_sync(idle_workers.popleft().destroy, limiter=limiter) - - worker.last_used = current_time() - idle_workers.append(worker) - - -def current_default_interpreter_limiter() -> CapacityLimiter: - """ - Return the capacity limiter used by default to limit the number of concurrently - running subinterpreters. - - Defaults to the number of CPU cores. - - :return: a capacity limiter object - - """ - try: - return _default_interpreter_limiter.get() - except LookupError: - limiter = CapacityLimiter(os.cpu_count() or DEFAULT_CPU_COUNT) - _default_interpreter_limiter.set(limiter) - return limiter diff --git a/venv/lib/python3.11/site-packages/anyio/to_process.py b/venv/lib/python3.11/site-packages/anyio/to_process.py deleted file mode 100755 index 584128e..0000000 --- a/venv/lib/python3.11/site-packages/anyio/to_process.py +++ /dev/null @@ -1,269 +0,0 @@ -from __future__ import annotations - -__all__ = ( - "current_default_process_limiter", - "process_worker", - "run_sync", -) - -import os -import pickle -import runpy -import subprocess -import sys -from collections import deque -from collections.abc import Callable -from types import ModuleType -from typing import TypeVar, cast - -from ._core._eventloop import current_time, get_async_backend, get_cancelled_exc_class -from ._core._exceptions import BrokenWorkerProcess -from ._core._subprocesses import open_process -from ._core._synchronization import CapacityLimiter -from ._core._tasks import CancelScope, fail_after -from .abc import ByteReceiveStream, ByteSendStream, Process -from .lowlevel import RunVar, checkpoint_if_cancelled -from .streams.buffered import BufferedByteReceiveStream - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -WORKER_MAX_IDLE_TIME = 300 # 5 minutes - -T_Retval = TypeVar("T_Retval") -PosArgsT = TypeVarTuple("PosArgsT") - -_process_pool_workers: RunVar[set[Process]] = RunVar("_process_pool_workers") -_process_pool_idle_workers: RunVar[deque[tuple[Process, float]]] = RunVar( - "_process_pool_idle_workers" -) -_default_process_limiter: RunVar[CapacityLimiter] = RunVar("_default_process_limiter") - - -async def run_sync( # type: ignore[return] - func: Callable[[Unpack[PosArgsT]], T_Retval], - *args: Unpack[PosArgsT], - cancellable: bool = False, - limiter: CapacityLimiter | None = None, -) -> T_Retval: - """ - Call the given function with the given arguments in a worker process. - - If the ``cancellable`` option is enabled and the task waiting for its completion is - cancelled, the worker process running it will be abruptly terminated using SIGKILL - (or ``terminateProcess()`` on Windows). - - :param func: a callable - :param args: positional arguments for the callable - :param cancellable: ``True`` to allow cancellation of the operation while it's - running - :param limiter: capacity limiter to use to limit the total amount of processes - running (if omitted, the default limiter is used) - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - :return: an awaitable that yields the return value of the function. - - """ - - async def send_raw_command(pickled_cmd: bytes) -> object: - try: - await stdin.send(pickled_cmd) - response = await buffered.receive_until(b"\n", 50) - status, length = response.split(b" ") - if status not in (b"RETURN", b"EXCEPTION"): - raise RuntimeError( - f"Worker process returned unexpected response: {response!r}" - ) - - pickled_response = await buffered.receive_exactly(int(length)) - except BaseException as exc: - workers.discard(process) - try: - process.kill() - with CancelScope(shield=True): - await process.aclose() - except ProcessLookupError: - pass - - if isinstance(exc, get_cancelled_exc_class()): - raise - else: - raise BrokenWorkerProcess from exc - - retval = pickle.loads(pickled_response) - if status == b"EXCEPTION": - assert isinstance(retval, BaseException) - raise retval - else: - return retval - - # First pickle the request before trying to reserve a worker process - await checkpoint_if_cancelled() - request = pickle.dumps(("run", func, args), protocol=pickle.HIGHEST_PROTOCOL) - - # If this is the first run in this event loop thread, set up the necessary variables - try: - workers = _process_pool_workers.get() - idle_workers = _process_pool_idle_workers.get() - except LookupError: - workers = set() - idle_workers = deque() - _process_pool_workers.set(workers) - _process_pool_idle_workers.set(idle_workers) - get_async_backend().setup_process_pool_exit_at_shutdown(workers) - - async with limiter or current_default_process_limiter(): - # Pop processes from the pool (starting from the most recently used) until we - # find one that hasn't exited yet - process: Process - while idle_workers: - process, _idle_since = idle_workers.pop() - if process.returncode is None: - stdin = cast(ByteSendStream, process.stdin) - buffered = BufferedByteReceiveStream( - cast(ByteReceiveStream, process.stdout) - ) - - # Prune any other workers that have been idle for WORKER_MAX_IDLE_TIME - # seconds or longer - now = current_time() - killed_processes: list[Process] = [] - while idle_workers: - if now - idle_workers[0][1] < WORKER_MAX_IDLE_TIME: - break - - process_to_kill, _idle_since = idle_workers.popleft() - process_to_kill.kill() - workers.remove(process_to_kill) - killed_processes.append(process_to_kill) - - with CancelScope(shield=True): - for killed_process in killed_processes: - await killed_process.aclose() - - break - - workers.remove(process) - else: - command = [sys.executable, "-u", "-m", __name__] - process = await open_process( - command, stdin=subprocess.PIPE, stdout=subprocess.PIPE - ) - try: - stdin = cast(ByteSendStream, process.stdin) - buffered = BufferedByteReceiveStream( - cast(ByteReceiveStream, process.stdout) - ) - with fail_after(20): - message = await buffered.receive(6) - - if message != b"READY\n": - raise BrokenWorkerProcess( - f"Worker process returned unexpected response: {message!r}" - ) - - main_module_path = getattr(sys.modules["__main__"], "__file__", None) - pickled = pickle.dumps( - ("init", sys.path, main_module_path), - protocol=pickle.HIGHEST_PROTOCOL, - ) - await send_raw_command(pickled) - except (BrokenWorkerProcess, get_cancelled_exc_class()): - raise - except BaseException as exc: - process.kill() - raise BrokenWorkerProcess( - "Error during worker process initialization" - ) from exc - - workers.add(process) - - with CancelScope(shield=not cancellable): - try: - return cast(T_Retval, await send_raw_command(request)) - finally: - if process in workers: - idle_workers.append((process, current_time())) - - -def current_default_process_limiter() -> CapacityLimiter: - """ - Return the capacity limiter that is used by default to limit the number of worker - processes. - - :return: a capacity limiter object - - """ - try: - return _default_process_limiter.get() - except LookupError: - limiter = CapacityLimiter(os.cpu_count() or 2) - _default_process_limiter.set(limiter) - return limiter - - -def process_worker() -> None: - # Redirect standard streams to os.devnull so that user code won't interfere with the - # parent-worker communication - stdin = sys.stdin - stdout = sys.stdout - sys.stdin = open(os.devnull) - sys.stdout = open(os.devnull, "w") - sys.stderr = open(os.devnull, "w") - - stdout.buffer.write(b"READY\n") - while True: - retval = exception = None - try: - command, *args = pickle.load(stdin.buffer) - except EOFError: - return - except BaseException as exc: - exception = exc - else: - if command == "run": - func, args = args - try: - retval = func(*args) - except BaseException as exc: - exception = exc - elif command == "init": - main_module_path: str | None - sys.path, main_module_path = args - del sys.modules["__main__"] - if main_module_path and os.path.isfile(main_module_path): - # Load the parent's main module but as __mp_main__ instead of - # __main__ (like multiprocessing does) to avoid infinite recursion - try: - main = ModuleType("__mp_main__") - main_content = runpy.run_path( - main_module_path, run_name="__mp_main__" - ) - main.__dict__.update(main_content) - sys.modules["__main__"] = sys.modules["__mp_main__"] = main - except BaseException as exc: - exception = exc - try: - if exception is not None: - status = b"EXCEPTION" - pickled = pickle.dumps(exception, pickle.HIGHEST_PROTOCOL) - else: - status = b"RETURN" - pickled = pickle.dumps(retval, pickle.HIGHEST_PROTOCOL) - except BaseException as exc: - exception = exc - status = b"EXCEPTION" - pickled = pickle.dumps(exc, pickle.HIGHEST_PROTOCOL) - - stdout.buffer.write(b"%s %d\n" % (status, len(pickled))) - stdout.buffer.write(pickled) - - # Respect SIGTERM - if isinstance(exception, SystemExit): - raise exception - - -if __name__ == "__main__": - process_worker() diff --git a/venv/lib/python3.11/site-packages/anyio/to_thread.py b/venv/lib/python3.11/site-packages/anyio/to_thread.py deleted file mode 100755 index 5cdb725..0000000 --- a/venv/lib/python3.11/site-packages/anyio/to_thread.py +++ /dev/null @@ -1,80 +0,0 @@ -from __future__ import annotations - -__all__ = ( - "current_default_thread_limiter", - "run_sync", -) - -import sys -from collections.abc import Callable -from typing import TYPE_CHECKING, TypeVar -from warnings import warn - -from ._core._eventloop import get_async_backend - -if TYPE_CHECKING: - from ._core._synchronization import CapacityLimiter - -if sys.version_info >= (3, 11): - from typing import TypeVarTuple, Unpack -else: - from typing_extensions import TypeVarTuple, Unpack - -T_Retval = TypeVar("T_Retval") -PosArgsT = TypeVarTuple("PosArgsT") - - -async def run_sync( - func: Callable[[Unpack[PosArgsT]], T_Retval], - *args: Unpack[PosArgsT], - abandon_on_cancel: bool = False, - cancellable: bool | None = None, - limiter: CapacityLimiter | None = None, -) -> T_Retval: - """ - Call the given function with the given arguments in a worker thread. - - If the ``abandon_on_cancel`` option is enabled and the task waiting for its - completion is cancelled, the thread will still run its course but its - return value (or any raised exception) will be ignored. - - :param func: a callable - :param args: positional arguments for the callable - :param abandon_on_cancel: ``True`` to abandon the thread (leaving it to run - unchecked on own) if the host task is cancelled, ``False`` to ignore - cancellations in the host task until the operation has completed in the worker - thread - :param cancellable: deprecated alias of ``abandon_on_cancel``; will override - ``abandon_on_cancel`` if both parameters are passed - :param limiter: capacity limiter to use to limit the total amount of threads running - (if omitted, the default limiter is used) - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - :return: an awaitable that yields the return value of the function. - - """ - if cancellable is not None: - abandon_on_cancel = cancellable - warn( - "The `cancellable=` keyword argument to `anyio.to_thread.run_sync` is " - "deprecated since AnyIO 4.1.0; use `abandon_on_cancel=` instead", - DeprecationWarning, - stacklevel=2, - ) - - return await get_async_backend().run_sync_in_worker_thread( - func, args, abandon_on_cancel=abandon_on_cancel, limiter=limiter - ) - - -def current_default_thread_limiter() -> CapacityLimiter: - """ - Return the capacity limiter that is used by default to limit the number of - concurrent threads. - - :return: a capacity limiter object - :raises NoEventLoopError: if no supported asynchronous event loop is running in the - current thread - - """ - return get_async_backend().current_default_thread_limiter() diff --git a/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/INSTALLER deleted file mode 100755 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/METADATA b/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/METADATA deleted file mode 100755 index eb460c2..0000000 --- a/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/METADATA +++ /dev/null @@ -1,78 +0,0 @@ -Metadata-Version: 2.4 -Name: certifi -Version: 2026.7.22 -Summary: Python package for providing Mozilla's CA Bundle. -Home-page: https://github.com/certifi/python-certifi -Author: Kenneth Reitz -Author-email: me@kennethreitz.com -License: MPL-2.0 -Project-URL: Source, https://github.com/certifi/python-certifi -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0) -Classifier: Natural Language :: English -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Requires-Python: >=3.7 -License-File: LICENSE -Dynamic: author -Dynamic: author-email -Dynamic: classifier -Dynamic: description -Dynamic: home-page -Dynamic: license -Dynamic: license-file -Dynamic: project-url -Dynamic: requires-python -Dynamic: summary - -Certifi: Python SSL Certificates -================================ - -Certifi provides Mozilla's carefully curated collection of Root Certificates for -validating the trustworthiness of SSL certificates while verifying the identity -of TLS hosts. It has been extracted from the `Requests`_ project. - -Installation ------------- - -``certifi`` is available on PyPI. Simply install it with ``pip``:: - - $ pip install certifi - -Usage ------ - -To reference the installed certificate authority (CA) bundle, you can use the -built-in function:: - - >>> import certifi - - >>> certifi.where() - '/usr/local/lib/python3.7/site-packages/certifi/cacert.pem' - -Or from the command line:: - - $ python -m certifi - /usr/local/lib/python3.7/site-packages/certifi/cacert.pem - -Enjoy! - -.. _`Requests`: https://requests.readthedocs.io/en/latest/ - -Addition/Removal of Certificates --------------------------------- - -Certifi does not support any addition/removal or other modification of the -CA trust store content. This project is intended to provide a reliable and -highly portable root of trust to python deployments. Look to upstream projects -for methods to use alternate trust. diff --git a/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/RECORD b/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/RECORD deleted file mode 100755 index c06242e..0000000 --- a/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/RECORD +++ /dev/null @@ -1,18 +0,0 @@ -certifi-2026.7.22.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -certifi-2026.7.22.dist-info/METADATA,sha256=71rxY4-7I2dqw8V3ffz8LNnDSP5Bcu1bo9J3ZVskgJA,2474 -certifi-2026.7.22.dist-info/RECORD,, -certifi-2026.7.22.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91 -certifi-2026.7.22.dist-info/licenses/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 -certifi-2026.7.22.dist-info/top_level.txt,sha256=KMu4vUCfsjLrkPbSNdgdekS-pVJzBAJFO__nI8NF6-U,8 -certifi/__init__.py,sha256=elLl9CBfmz0SoxiYzqp-P2g30ZzCMHALyuGp2R0UhsE,94 -certifi/__main__.py,sha256=xBBoj905TUWBLRGANOcf7oi6e-3dMP4cEoG9OyMs11g,243 -certifi/__pycache__/__init__.cpython-311.pyc,, -certifi/__pycache__/__main__.cpython-311.pyc,, -certifi/__pycache__/core.cpython-311.pyc,, -certifi/cacert.pem,sha256=nMKndLUZjc_xTZvh5mCR9TiXXYZ84Cmpa84VpV39cw8,240216 -certifi/core.py,sha256=XFXycndG5pf37ayeF8N32HUuDafsyhkVMbO4BAPWHa0,3394 -certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -certifi/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -certifi/tests/__pycache__/__init__.cpython-311.pyc,, -certifi/tests/__pycache__/test_certify.cpython-311.pyc,, -certifi/tests/test_certify.py,sha256=fBedHt839-kSsTNmNzX7RsYzjV0OX4kV0Rw7wofSJ7g,467 diff --git a/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/WHEEL b/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/WHEEL deleted file mode 100755 index 1d472b6..0000000 --- a/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (83.0.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/licenses/LICENSE b/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/licenses/LICENSE deleted file mode 100755 index 62b076c..0000000 --- a/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/licenses/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -This package contains a modified version of ca-bundle.crt: - -ca-bundle.crt -- Bundle of CA Root Certificates - -This is a bundle of X.509 certificates of public Certificate Authorities -(CA). These were automatically extracted from Mozilla's root certificates -file (certdata.txt). This file can be found in the mozilla source tree: -https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt -It contains the certificates in PEM format and therefore -can be directly used with curl / libcurl / php_curl, or with -an Apache+mod_ssl webserver for SSL client authentication. -Just configure this file as the SSLCACertificateFile.# - -***** BEGIN LICENSE BLOCK ***** -This Source Code Form is subject to the terms of the Mozilla Public License, -v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain -one at http://mozilla.org/MPL/2.0/. - -***** END LICENSE BLOCK ***** -@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ diff --git a/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/top_level.txt deleted file mode 100755 index 963eac5..0000000 --- a/venv/lib/python3.11/site-packages/certifi-2026.7.22.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -certifi diff --git a/venv/lib/python3.11/site-packages/certifi/__init__.py b/venv/lib/python3.11/site-packages/certifi/__init__.py deleted file mode 100755 index 66dae9e..0000000 --- a/venv/lib/python3.11/site-packages/certifi/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .core import contents, where - -__all__ = ["contents", "where"] -__version__ = "2026.07.22" diff --git a/venv/lib/python3.11/site-packages/certifi/__main__.py b/venv/lib/python3.11/site-packages/certifi/__main__.py deleted file mode 100755 index 8945b5d..0000000 --- a/venv/lib/python3.11/site-packages/certifi/__main__.py +++ /dev/null @@ -1,12 +0,0 @@ -import argparse - -from certifi import contents, where - -parser = argparse.ArgumentParser() -parser.add_argument("-c", "--contents", action="store_true") -args = parser.parse_args() - -if args.contents: - print(contents()) -else: - print(where()) diff --git a/venv/lib/python3.11/site-packages/certifi/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/certifi/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 4be1efbb56f6a6deb66b873a014339e6117ac02a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326 zcmZ3^%ge<81UIJ4%8CQhk3k$5V1hC}D*+kP8B!Qh7;_kM8KW3;nWC5&8B&;1nA4e} zm{VAySW;Mn88q2mG6EH9GTq`x&d)1J%_}Ls#af<`T9jJE3=}V70TNYQMg~S^dIsit zMn-;`thZQ_^O2=*vB$?J=H$f3-{OvsFH0>d&dkq?k6+2~8K{-vm$!aKer~FMZeme# zzP?v}dcLuKVnKm^S!!OHeokhRenDkPMt+{Lo}rG_O#oZ0S4{u_ diff --git a/venv/lib/python3.11/site-packages/certifi/__pycache__/__main__.cpython-311.pyc b/venv/lib/python3.11/site-packages/certifi/__pycache__/__main__.cpython-311.pyc deleted file mode 100755 index c86a550f5fd8cec75571bd7fa8d815c48b9b5db1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 715 zcmah`&ubGw6n?Y6cQGo4KPdmzlMzTjV5n40Q=WXQ0Q6L%e$p=CmBf=h#Z$j)Q8e7 z*!BCgKMwfVCxStlRx&BO=6IgX8_OEA%3FaGrj(}|Q$I|L@17Z*Ao9i| za*y8Pv&GXTANg@2BZLaLk(Fx!w`c#_3v+qW%+2MwxssbJnO1;y4D}|O}p;A!QNWPR3(LW%E{sBGO)=Hq2kRnw*aI=JR;nX*4d$FBFx%7GG&D+^| z^YMGX_xwjR8bTnazx=xWSrnmv*h@z|ZR6rMFdicn<&ny%o+6j$oZgf7s1cR_iO+j6 zx6OClRNs9cv&k6D@)vz2f8JjT}r{wgpMT4>c-DPtgUN zdHF@QV3csSBooERE*V?KOja(Jv%6T|%@(!qvgJKmF!Y(s&6`ii9hzftQvM1VK!`dNYWb<$As~3{qFC*k=dKLo>Ydg5 zCi9dXuPu}vyDe3J$Lj76;pNyJ=vxa>(fx$B-L>f8)o8B=*TaW(^whgz2ilRi3|%oU z9kL^xuzz)X<4Xc5iO4ljwy6 z0p`yRNP^7E_n?3YCfC7!8=Cnos0w;9fFiM4IPqcx#Z$k(dlamvrmfWUNot{yT6nfx zPu;arck5$I*4WacduQ>9CqJAdW*dpwdScE>%+=%bR($@^@>yi?=hY{x^~jVJnW{ym z{uSdjA?|G6Lje{%)-H5VKmj+b2y(v{w$~(1U!bd110zh4s<>*AUvuGNIKcIw!?6VwS?`R3J0MA_p+Itb%{{Y)5Cg}K>|$cV-cEa}`!ocK( diff --git a/venv/lib/python3.11/site-packages/certifi/cacert.pem b/venv/lib/python3.11/site-packages/certifi/cacert.pem deleted file mode 100755 index 9a40f43..0000000 --- a/venv/lib/python3.11/site-packages/certifi/cacert.pem +++ /dev/null @@ -1,3959 +0,0 @@ - -# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited -# Label: "COMODO ECC Certification Authority" -# Serial: 41578283867086692638256921589707938090 -# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23 -# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11 -# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7 ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -# Issuer: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Subject: CN=NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny O=NetLock Kft. OU=Tan\xfas\xedtv\xe1nykiad\xf3k (Certification Services) -# Label: "NetLock Arany (Class Gold) F\u0151tan\xfas\xedtv\xe1ny" -# Serial: 80544274841616 -# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88 -# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91 -# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98 ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG -EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3 -MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl -cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR -dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB -pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM -b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm -aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz -IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT -lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz -AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5 -VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG -ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2 -BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG -AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M -U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh -bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C -+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F -uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 -XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. -# Label: "Microsec e-Szigno Root CA 2009" -# Serial: 14014712776195784473 -# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1 -# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e -# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78 ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G -CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y -OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx -FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp -Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP -kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc -cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U -fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7 -N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC -xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1 -+rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM -Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG -SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h -mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk -ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c -2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t -HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 -# Label: "GlobalSign Root CA - R3" -# Serial: 4835703278459759426209954 -# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28 -# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad -# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4 -MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8 -RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT -gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm -KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd -QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ -XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw -DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o -LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU -RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp -jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK -6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX -mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs -Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH -WD9f ------END CERTIFICATE----- - -# Issuer: CN=Izenpe.com O=IZENPE S.A. -# Subject: CN=Izenpe.com O=IZENPE S.A. -# Label: "Izenpe.com" -# Serial: 917563065490389241595536686991402621 -# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73 -# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19 -# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc. -# Label: "Go Daddy Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01 -# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b -# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT -EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp -ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz -NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH -EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE -AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD -E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH -/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy -DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh -GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR -tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA -AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX -WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu -9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr -gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo -2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI -4uJEvlz36hz1 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96 -# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e -# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs -ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw -MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj -aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp -Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg -nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1 -HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N -Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN -dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0 -HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G -CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU -sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3 -4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg -8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1 -mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc. -# Label: "Starfield Services Root Certificate Authority - G2" -# Serial: 0 -# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2 -# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f -# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5 ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT -HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs -ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD -VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy -ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy -dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p -OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2 -8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K -Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe -hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk -6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q -AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI -bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB -ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z -qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn -0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN -sSi6 ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA" -# Serial: 279744 -# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78 -# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e -# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM -MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D -ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU -cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3 -WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg -Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw -IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH -UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM -TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU -BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM -kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x -AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV -HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y -sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL -I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8 -J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY -VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA -# Label: "TWCA Root Certification Authority" -# Serial: 1 -# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79 -# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48 -# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44 ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES -MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU -V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz -WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO -LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE -AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH -K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX -RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z -rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx -3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq -hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC -MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls -XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D -lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn -aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ -YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2 -# Label: "Security Communication RootCA2" -# Serial: 0 -# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43 -# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74 -# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6 ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl -MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe -U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX -DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy -dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj -YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV -OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr -zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM -VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ -hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO -ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw -awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs -OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 -DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF -coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc -okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8 -t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy -1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/ -SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967 -# Label: "Actalis Authentication Root CA" -# Serial: 6271844772424770508 -# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6 -# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac -# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66 ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE -BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w -MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC -SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1 -ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv -UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX -4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9 -KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/ -gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb -rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ -51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F -be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe -KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F -v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn -fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7 -jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz -ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL -e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70 -jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz -WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V -SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j -pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX -X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok -fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R -K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU -ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU -LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT -LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 2 Root CA" -# Serial: 2 -# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29 -# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99 -# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48 ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr -6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV -L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91 -1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx -MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ -QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB -arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr -Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi -FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS -P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN -9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz -uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h -9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t -OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo -+fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7 -KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2 -DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us -H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ -I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7 -5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h -3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz -Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA= ------END CERTIFICATE----- - -# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327 -# Label: "Buypass Class 3 Root CA" -# Serial: 2 -# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec -# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57 -# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg -Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow -TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw -HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB -BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y -ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E -N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9 -tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX -0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c -/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X -KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY -zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS -O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D -34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP -K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3 -AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv -Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj -QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS -IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2 -HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa -O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv -033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u -dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE -kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41 -3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD -u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq -4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 3" -# Serial: 1 -# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef -# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1 -# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN -8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/ -RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4 -hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5 -ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM -EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1 -A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy -WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ -1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30 -6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT -91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p -TpPDpFQUWw== ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 2009" -# Serial: 623603 -# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f -# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0 -# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1 ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha -ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM -HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03 -UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42 -tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R -ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM -lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp -/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G -A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G -A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj -dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy -MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl -cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js -L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL -BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni -acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K -zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8 -PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y -Johw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH -# Label: "D-TRUST Root Class 3 CA 2 EV 2009" -# Serial: 623604 -# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6 -# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83 -# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81 ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF -MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD -bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw -NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV -BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn -ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0 -3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z -qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR -p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8 -HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw -ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea -HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw -Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh -c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E -RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt -dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku -Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp -3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF -CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na -xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX -KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -# Issuer: CN=CA Disig Root R2 O=Disig a.s. -# Subject: CN=CA Disig Root R2 O=Disig a.s. -# Label: "CA Disig Root R2" -# Serial: 10572350602393338211 -# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03 -# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71 -# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03 ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV -BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu -MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy -MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx -EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw -ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe -NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH -PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I -x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe -QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR -yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO -QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912 -H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ -QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD -i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs -nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1 -rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI -hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf -GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb -lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka -+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal -TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i -nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3 -gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr -G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os -zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x -L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -# Issuer: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Subject: CN=ACCVRAIZ1 O=ACCV OU=PKIACCV -# Label: "ACCVRAIZ1" -# Serial: 6828503384748696800 -# MD5 Fingerprint: d0:a0:5a:ee:05:b6:09:94:21:a1:7d:f1:b2:29:82:02 -# SHA1 Fingerprint: 93:05:7a:88:15:c6:4f:ce:88:2f:fa:91:16:52:28:78:bc:53:64:17 -# SHA256 Fingerprint: 9a:6e:c0:12:e1:a7:da:9d:be:34:19:4d:47:8a:d7:c0:db:18:22:fb:07:1d:f1:29:81:49:6e:d1:04:38:41:13 ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UE -AwwJQUNDVlJBSVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQsw -CQYDVQQGEwJFUzAeFw0xMTA1MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQ -BgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwHUEtJQUNDVjENMAsGA1UECgwEQUND -VjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCb -qau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gMjmoY -HtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWo -G2ioPej0RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpA -lHPrzg5XPAOBOp0KoVdDaaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhr -IA8wKFSVf+DuzgpmndFALW4ir50awQUZ0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/ -0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDGWuzndN9wrqODJerWx5eH -k6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs78yM2x/47 -4KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMO -m3WR5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpa -cXpkatcnYGMN285J9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPl -uUsXQA+xtrn13k/c4LOsOxFwYIRKQ26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYI -KwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRwOi8vd3d3LmFjY3YuZXMvZmls -ZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEuY3J0MB8GCCsG -AQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeT -VfZW6oHlNsyMHj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIG -CCsGAQUFBwICMIIBFB6CARAAQQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUA -cgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBhAO0AegAgAGQAZQAgAGwAYQAgAEEA -QwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUAYwBuAG8AbABvAGcA -7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBjAHQA -cgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAA -QwBQAFMAIABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUA -czAwBggrBgEFBQcCARYkaHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2Mu -aHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRt -aW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2MV9kZXIuY3JsMA4GA1Ud -DwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZIhvcNAQEF -BQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdp -D70ER9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gU -JyCpZET/LtZ1qmxNYEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+m -AM/EKXMRNt6GGT6d7hmKG9Ww7Y49nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepD -vV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJTS+xJlsndQAJxGJ3KQhfnlms -tn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3sCPdK6jT2iWH -7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szA -h1xA2syVP1XgNce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xF -d3+YJ5oyXSrjhO7FmGYvliAd3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2H -pPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3pEfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -# Issuer: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA Global Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA Global Root CA" -# Serial: 3262 -# MD5 Fingerprint: f9:03:7e:cf:e6:9e:3c:73:7a:2a:90:07:69:ff:2b:96 -# SHA1 Fingerprint: 9c:bb:48:53:f6:a4:f6:d3:52:a4:e8:32:52:55:60:13:f5:ad:af:65 -# SHA256 Fingerprint: 59:76:90:07:f7:68:5d:0f:cd:50:87:2f:9f:95:d5:75:5a:5b:2b:45:7d:81:f3:69:2b:61:0a:98:67:2f:0e:1b ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcx -EjAQBgNVBAoTCVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMT -VFdDQSBHbG9iYWwgUm9vdCBDQTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5 -NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQKEwlUQUlXQU4tQ0ExEDAOBgNVBAsT -B1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3QgQ0EwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2CnJfF -10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz -0ALfUPZVr2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfCh -MBwqoJimFb3u/Rk28OKRQ4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbH -zIh1HrtsBv+baz4X7GGqcXzGHaL3SekVtTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc -46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1WKKD+u4ZqyPpcC1jcxkt2 -yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99sy2sbZCi -laLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYP -oA/pyJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQA -BDzfuBSO6N+pjWxnkjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcE -qYSjMq+u7msXi7Kx/mzhkIyIqJdIzshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm -4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6gcFGn90xHNcgL -1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WF -H6vPNOw/KP4M8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNo -RI2T9GRwoD2dKAXDOXC4Ynsg/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+ -nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlglPx4mI88k1HtQJAH32RjJMtOcQWh -15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryPA9gK8kxkRr05YuWW -6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3mi4TW -nsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5j -wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz -aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy -KwbQBM0= ------END CERTIFICATE----- - -# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center -# Label: "T-TeleSec GlobalRoot Class 2" -# Serial: 1 -# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a -# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 -# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx -KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd -BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl -YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 -OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy -aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 -ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd -AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC -FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi -1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq -jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ -wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ -WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy -NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC -uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw -IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 -g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP -BSeOE6Fuwg== ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 1 G3" -# Serial: 687049649626669250736271037606554624078720034195 -# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab -# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 -# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 -MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV -wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe -rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 -68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh -4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp -UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o -abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc -3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G -KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt -hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO -Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt -zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD -ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 -cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN -qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 -YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv -b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 -8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k -NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj -ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp -q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt -nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 2 G3" -# Serial: 390156079458959257446133169266079962026824725800 -# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 -# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 -# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 -MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf -qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW -n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym -c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ -O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 -o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j -IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq -IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz -8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh -vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l -7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG -cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD -ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC -roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga -W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n -lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE -+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV -csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd -dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg -KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM -HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 -WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited -# Label: "QuoVadis Root CA 3 G3" -# Serial: 268090761170461462463995952157327242137089239581 -# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 -# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d -# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL -BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc -BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 -MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM -aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR -/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu -FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR -U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c -ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR -FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k -A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw -eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl -sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp -VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q -A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ -ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD -ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI -FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv -oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg -u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP -0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf -3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl -8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ -DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN -PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ -ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G2" -# Serial: 15385348160840213938643033620894905419 -# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d -# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f -# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA -n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc -biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp -EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA -bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu -YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW -BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI -QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I -0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni -lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 -B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv -ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Assured ID Root G3" -# Serial: 15459312981008553731928384953135426796 -# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb -# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 -# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg -RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf -Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q -RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ -BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD -AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY -JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv -6pZjamVFkpUBtA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G2" -# Serial: 4293743540046975378534879503202253541 -# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 -# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 -# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH -MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI -2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx -1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ -q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz -tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ -vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV -5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY -1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 -NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG -Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 -8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe -pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Global Root G3" -# Serial: 7089244469030293291760083333884364146 -# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca -# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e -# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw -CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu -ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe -Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw -EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x -IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG -fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO -Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd -BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx -AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ -oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 -sycX ------END CERTIFICATE----- - -# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com -# Label: "DigiCert Trusted Root G4" -# Serial: 7451500558977370777930084869016614236 -# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 -# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 -# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg -RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu -Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y -ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If -xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV -ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO -DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ -jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ -CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi -EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM -fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY -uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK -chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t -9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 -SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd -+SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc -fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa -sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N -cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N -0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie -4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI -r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 -/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm -gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ ------END CERTIFICATE----- - -# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited -# Label: "COMODO RSA Certification Authority" -# Serial: 101909084537582093308941363524873193117 -# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 -# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 -# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network -# Label: "USERTrust RSA Certification Authority" -# Serial: 2645093764781058787591871645665788717 -# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 -# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e -# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 ------BEGIN CERTIFICATE----- -MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB -iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl -cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV -BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw -MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV -BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK -AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B -3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY -tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ -Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 -VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT -79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 -c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT -Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l -c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee -UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE -Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd -BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF -Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO -VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 -ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs -8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR -iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze -Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ -XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ -qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB -VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB -L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG -jjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network -# Label: "USERTrust ECC Certification Authority" -# Serial: 123013823720199481456569720443997572134 -# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 -# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 -# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL -MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl -eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT -JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT -Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg -VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm -aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo -I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng -o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G -A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB -zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW -RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 -# Label: "GlobalSign ECC Root CA - R5" -# Serial: 32785792099990507226680698011560947931244 -# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 -# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa -# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk -MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH -bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX -DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD -QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu -MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc -8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke -hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI -KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg -515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO -xwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust -# Label: "IdenTrust Commercial Root CA 1" -# Serial: 13298821034946342390520003877796839426 -# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 -# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 -# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu -VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw -MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw -JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG -SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT -3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU -+ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp -S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 -bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi -T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL -vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK -Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK -dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT -c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv -l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N -iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD -ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt -LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 -nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 -+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK -W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT -AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq -l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG -4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ -mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A -7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust -# Label: "IdenTrust Public Sector Root CA 1" -# Serial: 13298821034946342390521976156843933698 -# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba -# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd -# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu -VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN -MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 -MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 -ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy -RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS -bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF -/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R -3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw -EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy -9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V -GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ -2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV -WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD -W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN -AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV -DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 -TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G -lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW -mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df -WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 -+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ -tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA -GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv -8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority -# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority -# Label: "CFCA EV ROOT" -# Serial: 407555286 -# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 -# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 -# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD -TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y -aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx -MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j -aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP -T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 -sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL -TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 -/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp -7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz -EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt -hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP -a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot -aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg -TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV -PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv -cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL -tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd -BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT -ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL -jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS -ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy -P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 -xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d -Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN -5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe -/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z -AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ -5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GB CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GB CA" -# Serial: 157768595616588414422159278966750757568 -# MD5 Fingerprint: a4:eb:b9:61:28:2e:b7:2f:98:b0:35:26:90:99:51:1d -# SHA1 Fingerprint: 0f:f9:40:76:18:d3:d7:6a:4b:98:f0:a8:35:9e:0c:fd:27:ac:cc:ed -# SHA256 Fingerprint: 6b:9c:08:e8:6e:b0:f7:67:cf:ad:65:cd:98:b6:21:49:e5:49:4a:67:f5:84:5e:7b:d1:ed:01:9f:27:b8:6b:d6 ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBt -MQswCQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUg -Rm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9i -YWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAwMzJaFw0zOTEyMDExNTEwMzFaMG0x -CzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBG -b3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh -bCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3 -HEokKtaXscriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGx -WuR51jIjK+FTzJlFXHtPrby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX -1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNk -u7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4oQnc/nSMbsrY9gBQHTC5P -99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvgGUpuuy9r -M2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUB -BAMCAQAwDQYJKoZIhvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrgh -cViXfa43FK8+5/ea4n32cZiZBKpDdHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5 -gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0VQreUGdNZtGn//3ZwLWoo4rO -ZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEuiHZeeevJuQHHf -aPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic -Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= ------END CERTIFICATE----- - -# Issuer: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Subject: CN=SZAFIR ROOT CA2 O=Krajowa Izba Rozliczeniowa S.A. -# Label: "SZAFIR ROOT CA2" -# Serial: 357043034767186914217277344587386743377558296292 -# MD5 Fingerprint: 11:64:c1:89:b0:24:b1:8c:b1:07:7e:89:9e:51:9e:99 -# SHA1 Fingerprint: e2:52:fa:95:3f:ed:db:24:60:bd:6e:28:f3:9c:cc:cf:5e:b3:3f:de -# SHA256 Fingerprint: a1:33:9d:33:28:1a:0b:56:e5:57:d3:d3:2b:1c:e7:f9:36:7e:b0:94:bd:5f:a7:2a:7e:50:04:c8:de:d7:ca:fe ------BEGIN CERTIFICATE----- -MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6 -ZW5pb3dhIFMuQS4xGDAWBgNVBAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkw -NzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJBgNVBAYTAlBMMSgwJgYDVQQKDB9L -cmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYDVQQDDA9TWkFGSVIg -Uk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5QqEvN -QLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT -3PSQ1hNKDJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw -3gAeqDRHu5rr/gsUvTaE2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr6 -3fE9biCloBK0TXC5ztdyO4mTp4CEHCdJckm1/zuVnsHMyAHs6A6KCpbns6aH5db5 -BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwiieDhZNRnvDF5YTy7ykHN -XGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsF -AAOCAQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw -8PRBEew/R40/cof5O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOG -nXkZ7/e7DDWQw4rtTw/1zBLZpD67oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCP -oky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul4+vJhaAlIDf7js4MNIThPIGy -d05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6+/NNIxuZMzSg -LvWpCz/UXeHPhJ/iGcJfitYgHuNztw== ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Network CA 2 O=Unizeto Technologies S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Network CA 2" -# Serial: 44979900017204383099463764357512596969 -# MD5 Fingerprint: 6d:46:9e:d9:25:6d:08:23:5b:5e:74:7d:1e:27:db:f2 -# SHA1 Fingerprint: d3:dd:48:3e:2b:bf:4c:05:e8:af:10:f5:fa:76:26:cf:d3:dc:30:92 -# SHA256 Fingerprint: b6:76:f2:ed:da:e8:77:5c:d3:6c:b0:f6:3c:d1:d4:60:39:61:f4:9e:62:65:ba:01:3a:2f:03:07:b6:d0:b8:04 ------BEGIN CERTIFICATE----- -MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB -gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu -QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG -A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz -OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ -VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3 -b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA -DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn -0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB -OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE -fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E -Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m -o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i -sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW -OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez -Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS -adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n -3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ -F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf -CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29 -XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm -djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/ -WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb -AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq -P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko -b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj -XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P -5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi -DrW5viSP ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: ca:ff:e2:db:03:d9:cb:4b:e9:0f:ad:84:fd:7b:18:ce -# SHA1 Fingerprint: 01:0c:06:95:a6:98:19:14:ff:bf:5f:c6:b0:b6:95:ea:29:e9:12:a6 -# SHA256 Fingerprint: a0:40:92:9a:02:ce:53:b4:ac:f4:f2:ff:c6:98:1c:e4:49:6f:75:5e:6d:45:fe:0b:2a:69:2b:cd:52:52:3f:36 ------BEGIN CERTIFICATE----- -MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1Ix -DzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5k -IFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMT -N0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9v -dENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAxMTIxWjCBpjELMAkG -A1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNh -ZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkx -QDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1 -dGlvbnMgUm9vdENBIDIwMTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQDC+Kk/G4n8PDwEXT2QNrCROnk8ZlrvbTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA -4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+ehiGsxr/CL0BgzuNtFajT0 -AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+6PAQZe10 -4S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06C -ojXdFPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV -9Cz82XBST3i4vTwri5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrD -gfgXy5I2XdGj2HUb4Ysn6npIQf1FGQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6 -Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2fu/Z8VFRfS0myGlZYeCsargq -NhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9muiNX6hME6wGko -LfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc -Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVd -ctA4GGqd83EkVAswDQYJKoZIhvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0I -XtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+D1hYc2Ryx+hFjtyp8iY/xnmMsVMI -M4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrMd/K4kPFox/la/vot -9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+yd+2V -Z5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/ea -j8GsGsVn82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnh -X9izjFk0WaSrT2y7HxjbdavYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQ -l033DlZdwJVqwjbDG2jJ9SrcR5q+ss7FJej6A7na+RZukYT1HCjI/CbM1xyQVqdf -bzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVtJ94Cj8rDtSvK6evIIVM4 -pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGaJI7ZjnHK -e7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0 -vm9qp/UsQu0yrbYhnr68 ------END CERTIFICATE----- - -# Issuer: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Subject: CN=Hellenic Academic and Research Institutions ECC RootCA 2015 O=Hellenic Academic and Research Institutions Cert. Authority -# Label: "Hellenic Academic and Research Institutions ECC RootCA 2015" -# Serial: 0 -# MD5 Fingerprint: 81:e5:b4:17:eb:c2:f5:e1:4b:0d:41:7b:49:92:fe:ef -# SHA1 Fingerprint: 9f:f1:71:8d:92:d5:9a:f3:7d:74:97:b4:bc:6f:84:68:0b:ba:b6:66 -# SHA256 Fingerprint: 44:b5:45:aa:8a:25:e6:5a:73:ca:15:dc:27:fc:36:d2:4c:1c:b9:95:3a:06:65:39:b1:15:82:dc:48:7b:48:33 ------BEGIN CERTIFICATE----- -MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzAN -BgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hl -bGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgRUNDIFJv -b3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEwMzcxMlowgaoxCzAJ -BgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmljIEFj -YWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5 -MUQwQgYDVQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0 -dXRpb25zIEVDQyBSb290Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKg -QehLgoRc4vgxEZmGZE4JJS+dQS8KrjVPdJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJa -jq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoKVlp8aQuqgAkkbH7BRqNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFLQi -C4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaep -lSTAGiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7Sof -TUwJCA3sS61kFyjndc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X1 O=Internet Security Research Group -# Subject: CN=ISRG Root X1 O=Internet Security Research Group -# Label: "ISRG Root X1" -# Serial: 172886928669790476064670243504169061120 -# MD5 Fingerprint: 0c:d2:f9:e0:da:17:73:e9:ed:86:4d:a5:e3:70:e7:4e -# SHA1 Fingerprint: ca:bd:2a:79:a1:07:6a:31:f2:1d:25:36:35:cb:03:9d:43:29:a5:e8 -# SHA256 Fingerprint: 96:bc:ec:06:26:49:76:f3:74:60:77:9a:cf:28:c5:a7:cf:e8:a3:c0:aa:e1:1a:8f:fc:ee:05:c0:bd:df:08:c6 ------BEGIN CERTIFICATE----- -MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw -TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh -cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4 -WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu -ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY -MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc -h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+ -0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U -A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW -T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH -B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC -B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv -KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn -OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn -jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw -qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI -rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq -hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL -ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ -3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK -NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5 -ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur -TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC -jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc -oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq -4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA -mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d -emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc= ------END CERTIFICATE----- - -# Issuer: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Subject: O=FNMT-RCM OU=AC RAIZ FNMT-RCM -# Label: "AC RAIZ FNMT-RCM" -# Serial: 485876308206448804701554682760554759 -# MD5 Fingerprint: e2:09:04:b4:d3:bd:d1:a0:14:fd:1a:d2:47:c4:57:1d -# SHA1 Fingerprint: ec:50:35:07:b2:15:c4:95:62:19:e2:a8:9a:5b:42:99:2c:4c:2c:20 -# SHA256 Fingerprint: eb:c5:57:0c:29:01:8c:4d:67:b1:aa:12:7b:af:12:f7:03:b4:61:1e:bc:17:b7:da:b5:57:38:94:17:9b:93:fa ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsx -CzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJ -WiBGTk1ULVJDTTAeFw0wODEwMjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJ -BgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBG -Tk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALpxgHpMhm5/ -yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcfqQgf -BBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAz -WHFctPVrbtQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxF -tBDXaEAUwED653cXeuYLj2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z -374jNUUeAlz+taibmSXaXvMiwzn15Cou08YfxGyqxRxqAQVKL9LFwag0Jl1mpdIC -IfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mwWsXmo8RZZUc1g16p6DUL -mbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnTtOmlcYF7 -wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peS -MKGJ47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2 -ZSysV4999AeU14ECll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMet -UqIJ5G+GR4of6ygnXYMgrwTJbFaai0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFPd9xf3E6Jobd2Sn9R2gzL+H -YJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3 -LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD -nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1 -RXxlDPiyN8+sD8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYM -LVN0V2Ue1bLdI4E7pWYjJ2cJj+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf -77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrTQfv6MooqtyuGC2mDOL7Nii4LcK2N -JpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW+YJF1DngoABd15jm -fZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7Ixjp -6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp -1txyM/1d8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B -9kiABdcPUXmsEKvU7ANm5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wok -RqEIr9baRRmW1FMdW4R58MD3R++Lj8UGrp1MYp3/RgT408m2ECVAdf4WqslKYIYv -uu8wd+RU4riEmViAqhOLUTpPSPaLtrM= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 1 O=Amazon -# Subject: CN=Amazon Root CA 1 O=Amazon -# Label: "Amazon Root CA 1" -# Serial: 143266978916655856878034712317230054538369994 -# MD5 Fingerprint: 43:c6:bf:ae:ec:fe:ad:2f:18:c6:88:68:30:fc:c8:e6 -# SHA1 Fingerprint: 8d:a7:f9:65:ec:5e:fc:37:91:0f:1c:6e:59:fd:c1:cc:6a:6e:de:16 -# SHA256 Fingerprint: 8e:cd:e6:88:4f:3d:87:b1:12:5b:a3:1a:c3:fc:b1:3d:70:16:de:7f:57:cc:90:4f:e1:cb:97:c6:ae:98:19:6e ------BEGIN CERTIFICATE----- -MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj -ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM -9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw -IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 -VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L -93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm -jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA -A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI -U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs -N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv -o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU -5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy -rqXRfboQnoZsG4q5WTP468SQvvG5 ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 2 O=Amazon -# Subject: CN=Amazon Root CA 2 O=Amazon -# Label: "Amazon Root CA 2" -# Serial: 143266982885963551818349160658925006970653239 -# MD5 Fingerprint: c8:e5:8d:ce:a8:42:e2:7a:c0:2a:5c:7c:9e:26:bf:66 -# SHA1 Fingerprint: 5a:8c:ef:45:d7:a6:98:59:76:7a:8c:8b:44:96:b5:78:cf:47:4b:1a -# SHA256 Fingerprint: 1b:a5:b2:aa:8c:65:40:1a:82:96:01:18:f8:0b:ec:4f:62:30:4d:83:ce:c4:71:3a:19:c3:9c:01:1e:a4:6d:b4 ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF -ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 -b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL -MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv -b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK -gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ -W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg -1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K -8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r -2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me -z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR -8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj -mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz -7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6 -+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI -0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm -UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2 -LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY -+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS -k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl -7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm -btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl -urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+ -fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63 -n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE -76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H -9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT -4PsJYGw= ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 3 O=Amazon -# Subject: CN=Amazon Root CA 3 O=Amazon -# Label: "Amazon Root CA 3" -# Serial: 143266986699090766294700635381230934788665930 -# MD5 Fingerprint: a0:d4:ef:0b:f7:b5:d8:49:95:2a:ec:f5:c4:fc:81:87 -# SHA1 Fingerprint: 0d:44:dd:8c:3c:8c:1a:1a:58:75:64:81:e9:0f:2e:2a:ff:b3:d2:6e -# SHA256 Fingerprint: 18:ce:6c:fe:7b:f1:4e:60:b2:e3:47:b8:df:e8:68:cb:31:d0:2e:bb:3a:da:27:15:69:f5:03:43:b4:6d:b3:a4 ------BEGIN CERTIFICATE----- -MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl -ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j -QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr -ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr -BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM -YyRIHN8wfdVoOw== ------END CERTIFICATE----- - -# Issuer: CN=Amazon Root CA 4 O=Amazon -# Subject: CN=Amazon Root CA 4 O=Amazon -# Label: "Amazon Root CA 4" -# Serial: 143266989758080763974105200630763877849284878 -# MD5 Fingerprint: 89:bc:27:d5:eb:17:8d:06:6a:69:d5:fd:89:47:b4:cd -# SHA1 Fingerprint: f6:10:84:07:d6:f8:bb:67:98:0c:c2:e2:44:c2:eb:ae:1c:ef:63:be -# SHA256 Fingerprint: e3:5d:28:41:9e:d0:20:25:cf:a6:90:38:cd:62:39:62:45:8d:a5:c6:95:fb:de:a3:c2:2b:0b:fb:25:89:70:92 ------BEGIN CERTIFICATE----- -MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5 -MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g -Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG -A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg -Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi -9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk -M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB -MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw -CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW -1KyLa2tJElMzrdfkviT8tQp21KW8EA== ------END CERTIFICATE----- - -# Issuer: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Subject: CN=TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 O=Turkiye Bilimsel ve Teknolojik Arastirma Kurumu - TUBITAK OU=Kamu Sertifikasyon Merkezi - Kamu SM -# Label: "TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1" -# Serial: 1 -# MD5 Fingerprint: dc:00:81:dc:69:2f:3e:2f:b0:3b:f6:3d:5a:91:8e:49 -# SHA1 Fingerprint: 31:43:64:9b:ec:ce:27:ec:ed:3a:3f:0b:8f:0d:e4:e8:91:dd:ee:ca -# SHA256 Fingerprint: 46:ed:c3:68:90:46:d5:3a:45:3f:b3:10:4a:b8:0d:ca:ec:65:8b:26:60:ea:16:29:dd:7e:86:79:90:64:87:16 ------BEGIN CERTIFICATE----- -MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIx -GDAWBgNVBAcTD0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxp -bXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0w -KwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00xNjA0 -BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3Vy -dW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYDVQQG -EwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXll -IEJpbGltc2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklU -QUsxLTArBgNVBAsTJEthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBT -TTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kg -LSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr3UwM6q7 -a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y86Ij5iySr -LqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INr -N3wcwv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2X -YacQuFWQfw4tJzh03+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/ -iSIzL+aFCr2lqBs23tPcLG07xxO9WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4f -AJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQUZT/HiobGPN08VFw1+DrtUgxH -V8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh -AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPf -IPP54+M638yclNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4 -lzwDGrpDxpa5RXI4s6ehlj2Re37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c -8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0jq5Rm+K37DwhuJi1/FwcJsoz7UMCf -lo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= ------END CERTIFICATE----- - -# Issuer: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Subject: CN=GDCA TrustAUTH R5 ROOT O=GUANG DONG CERTIFICATE AUTHORITY CO.,LTD. -# Label: "GDCA TrustAUTH R5 ROOT" -# Serial: 9009899650740120186 -# MD5 Fingerprint: 63:cc:d9:3d:34:35:5c:6f:53:a3:e2:08:70:48:1f:b4 -# SHA1 Fingerprint: 0f:36:38:5b:81:1a:25:c3:9b:31:4e:83:ca:e9:34:66:70:cc:74:b4 -# SHA256 Fingerprint: bf:ff:8f:d0:44:33:48:7d:6a:8a:a6:0c:1a:29:76:7a:9f:c2:bb:b0:5e:42:0f:71:3a:13:b9:92:89:1d:38:93 ------BEGIN CERTIFICATE----- -MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UE -BhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ -IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0 -MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVowYjELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8w -HQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0BAQEF -AAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJj -Dp6L3TQsAlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBj -TnnEt1u9ol2x8kECK62pOqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+u -KU49tm7srsHwJ5uu4/Ts765/94Y9cnrrpftZTqfrlYwiOXnhLQiPzLyRuEH3FMEj -qcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ9Cy5WmYqsBebnh52nUpm -MUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQxXABZG12 -ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloP -zgsMR6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3Gk -L30SgLdTMEZeS1SZD2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeC -jGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4oR24qoAATILnsn8JuLwwoC8N9VKejveSswoA -HQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx9hoh49pwBiFYFIeFd3mqgnkC -AwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlRMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg -p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZm -DRd9FBUb1Ov9H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5 -COmSdI31R9KrO9b7eGZONn356ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ry -L3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd+PwyvzeG5LuOmCd+uh8W4XAR8gPf -JWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQHtZa37dG/OaG+svg -IHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBDF8Io -2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV -09tL7ECQ8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQ -XR4EzzffHqhmsYzmIGrv/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrq -T8p+ck0LcIymSLumoRT2+1hEmRSuqguTaaApJUqlyyvdimYHFngVV3Eb7PVHhPOe -MTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority RSA O=SSL Corporation -# Label: "SSL.com Root Certification Authority RSA" -# Serial: 8875640296558310041 -# MD5 Fingerprint: 86:69:12:c0:70:f1:ec:ac:ac:c2:d5:bc:a5:5b:a1:29 -# SHA1 Fingerprint: b7:ab:33:08:d1:ea:44:77:ba:14:80:12:5a:6f:bd:a9:36:49:0c:bb -# SHA256 Fingerprint: 85:66:6a:56:2e:e0:be:5c:e9:25:c1:d8:89:0a:6f:76:a8:7e:c1:6d:4d:7d:5f:29:ea:74:19:cf:20:12:3b:69 ------BEGIN CERTIFICATE----- -MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UE -BhMCVVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQK -DA9TU0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYwMjEyMTczOTM5WhcNNDEwMjEyMTcz -OTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv -bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2R -xFdHaxh3a3by/ZPkPQ/CFp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aX -qhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcC -C52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/geoeOy3ZExqysdBP+lSgQ3 -6YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkpk8zruFvh -/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrF -YD3ZfBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93E -JNyAKoFBbZQ+yODJgUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVc -US4cK38acijnALXRdMbX5J+tB5O2UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8 -ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi81xtZPCvM8hnIk2snYxnP/Okm -+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4sbE6x/c+cCbqi -M+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV -HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4G -A1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGV -cpNxJK1ok1iOMq8bs3AD/CUrdIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBc -Hadm47GUBwwyOabqG7B52B2ccETjit3E+ZUfijhDPwGFpUenPUayvOUiaPd7nNgs -PgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAslu1OJD7OAUN5F7kR/ -q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjqerQ0 -cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jr -a6x+3uxjMxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90I -H37hVZkLId6Tngr75qNJvTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/Y -K9f1JmzJBjSWFupwWRoyeXkLtoh/D1JIPb9s2KJELtFOt3JY04kTlf5Eq/jXixtu -nLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406ywKBjYZC6VWg3dGq2ktuf -oYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NIWuuA8ShY -Ic2wBlX7Jz9TkHCpBB5XJ7k= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com Root Certification Authority ECC" -# Serial: 8495723813297216424 -# MD5 Fingerprint: 2e:da:e4:39:7f:9c:8f:37:d1:70:9f:26:17:51:3a:8e -# SHA1 Fingerprint: c3:19:7c:39:24:e6:54:af:1b:c4:ab:20:95:7a:e2:c3:0e:13:02:6a -# SHA256 Fingerprint: 34:17:bb:06:cc:60:07:da:1b:96:1c:92:0b:8a:b4:ce:3f:ad:82:0e:4a:a3:0b:9a:cb:c4:a7:4e:bd:ce:bc:65 ------BEGIN CERTIFICATE----- -MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xMTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNDAzWhcNNDEwMjEyMTgxNDAz -WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0 -b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNvbSBS -b290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI -7Z4INcgn64mMU1jrYor+8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPg -CemB+vNH06NjMGEwHQYDVR0OBBYEFILRhXMw5zUE044CkvvlpNHEIejNMA8GA1Ud -EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTTjgKS++Wk0cQh6M0wDgYD -VR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCWe+0F+S8T -kdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+ -gA0z5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority RSA R2 O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority RSA R2" -# Serial: 6248227494352943350 -# MD5 Fingerprint: e1:1e:31:58:1a:ae:54:53:02:f6:17:6a:11:7b:4d:95 -# SHA1 Fingerprint: 74:3a:f0:52:9b:d0:32:a0:f4:4a:83:cd:d4:ba:a9:7b:7c:2e:c4:9a -# SHA256 Fingerprint: 2e:7b:f1:6c:c2:24:85:a7:bb:e2:aa:86:96:75:07:61:b0:ae:39:be:3b:2f:e9:d0:cc:6d:4e:f7:34:91:42:5c ------BEGIN CERTIFICATE----- -MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNV -BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UE -CgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2Vy -dGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMB4XDTE3MDUzMTE4MTQzN1oXDTQy -MDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQIDAVUZXhhczEQMA4G -A1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYDVQQD -DC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvq -M0fNTPl9fb69LT3w23jhhqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssuf -OePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7wcXHswxzpY6IXFJ3vG2fThVUCAtZJycxa -4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTOZw+oz12WGQvE43LrrdF9 -HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+B6KjBSYR -aZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcA -b9ZhCBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQ -Gp8hLH94t2S42Oim9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQV -PWKchjgGAGYS5Fl2WlPAApiiECtoRHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMO -pgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+SlmJuwgUHfbSguPvuUCYHBBXtSu -UDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48+qvWBkofZ6aY -MBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV -HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa4 -9QaAJadz20ZpqJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBW -s47LCp1Jjr+kxJG7ZhcFUZh1++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5 -Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nxY/hoLVUE0fKNsKTPvDxeH3jnpaAg -cLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2GguDKBAdRUNf/ktUM -79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDzOFSz -/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXt -ll9ldDz7CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEm -Kf7GUmG6sXP/wwyc5WxqlD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKK -QbNmC1r7fSOl8hqw/96bg5Qu0T/fkreRrwU7ZcegbLHNYhLDkBvjJc40vG93drEQ -w/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1hlMYegouCRw2n5H9gooi -S9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX9hwJ1C07 -mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== ------END CERTIFICATE----- - -# Issuer: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Subject: CN=SSL.com EV Root Certification Authority ECC O=SSL Corporation -# Label: "SSL.com EV Root Certification Authority ECC" -# Serial: 3182246526754555285 -# MD5 Fingerprint: 59:53:22:65:83:42:01:54:c0:ce:42:b9:5a:7c:f2:90 -# SHA1 Fingerprint: 4c:dd:51:a3:d1:f5:20:32:14:b0:c6:c5:32:23:03:91:c7:46:42:6d -# SHA256 Fingerprint: 22:a2:c1:f7:bd:ed:70:4c:c1:e7:01:b5:f4:08:c3:10:88:0f:e9:56:b5:de:2a:4a:44:f9:9c:87:3a:25:a7:c8 ------BEGIN CERTIFICATE----- -MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMC -VVMxDjAMBgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9T -U0wgQ29ycG9yYXRpb24xNDAyBgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEyMTgxNTIzWhcNNDEwMjEyMTgx -NTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hv -dXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NMLmNv -bSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMA -VIbc/R/fALhBYlzccBYy3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1Kthku -WnBaBu2+8KGwytAJKaNjMGEwHQYDVR0OBBYEFFvKXuXe0oGqzagtZFG22XKbl+ZP -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe5d7SgarNqC1kUbbZcpuX -5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJN+vp1RPZ -ytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZg -h5Mmm7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R6 -# Label: "GlobalSign Root CA - R6" -# Serial: 1417766617973444989252670301619537 -# MD5 Fingerprint: 4f:dd:07:e4:d4:22:64:39:1e:0c:37:42:ea:d1:c6:ae -# SHA1 Fingerprint: 80:94:64:0e:b5:a7:a1:ca:11:9c:1f:dd:d5:9f:81:02:63:a7:fb:d1 -# SHA256 Fingerprint: 2c:ab:ea:fe:37:d0:6c:a2:2a:ba:73:91:c0:03:3d:25:98:29:52:c4:53:64:73:49:76:3a:3a:b5:ad:6c:cf:69 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEg -MB4GA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQx -MjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNjET -MBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQssgrRI -xutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1k -ZguSgMpE3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxD -aNc9PIrFsmbVkJq3MQbFvuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJw -LnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqMPKq0pPbzlUoSB239jLKJz9CgYXfIWHSw -1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+azayOeSsJDa38O+2HBNX -k7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05OWgtH8wY2 -SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/h -bguyCLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4n -WUx2OVvq+aWh2IMP0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpY -rZxCRXluDocZXFSxZba/jJvcE+kNb7gu3GduyYsRtYQUigAZcIN5kZeR1Bonvzce -MgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNVHSMEGDAWgBSu -bAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN -nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGt -Ixg93eFyRJa0lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr61 -55wsTLxDKZmOMNOsIeDjHfrYBzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLj -vUYAGm0CuiVdjaExUd1URhxN25mW7xocBFymFe944Hn+Xds+qkxV/ZoVqW/hpvvf -cDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr3TsTjxKM4kEaSHpz -oHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB10jZp -nOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfs -pA9MRf/TuTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+v -JJUEeKgDu+6B5dpffItKoZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R -8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+tJDfLRVpOoERIyNiwmcUVhAn21klJwGW4 -5hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= ------END CERTIFICATE----- - -# Issuer: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Subject: CN=OISTE WISeKey Global Root GC CA O=WISeKey OU=OISTE Foundation Endorsed -# Label: "OISTE WISeKey Global Root GC CA" -# Serial: 44084345621038548146064804565436152554 -# MD5 Fingerprint: a9:d6:b9:2d:2f:93:64:f8:a5:69:ca:91:e9:68:07:23 -# SHA1 Fingerprint: e0:11:84:5e:34:de:be:88:81:b9:9c:f6:16:26:d1:96:1f:c3:b9:31 -# SHA256 Fingerprint: 85:60:f9:1c:36:24:da:ba:95:70:b5:fe:a0:db:e3:6f:f1:1a:83:23:be:94:86:85:4f:b3:f3:4a:55:71:19:8d ------BEGIN CERTIFICATE----- -MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQsw -CQYDVQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91 -bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwg -Um9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRaFw00MjA1MDkwOTU4MzNaMG0xCzAJ -BgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQLExlPSVNURSBGb3Vu -ZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2JhbCBS -b290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4ni -eUqjFqdrVCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4W -p2OQ0jnUsYd4XxiWD1AbNTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7T -rYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0EAwMDaAAwZQIwJsdpW9zV -57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtkAjEA2zQg -Mgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 ------END CERTIFICATE----- - -# Issuer: CN=UCA Global G2 Root O=UniTrust -# Subject: CN=UCA Global G2 Root O=UniTrust -# Label: "UCA Global G2 Root" -# Serial: 124779693093741543919145257850076631279 -# MD5 Fingerprint: 80:fe:f0:c4:4a:f0:5c:62:32:9f:1c:ba:78:a9:50:f8 -# SHA1 Fingerprint: 28:f9:78:16:19:7a:ff:18:25:18:aa:44:fe:c1:a0:ce:5c:b6:4c:8a -# SHA256 Fingerprint: 9b:ea:11:c9:76:fe:01:47:64:c1:be:56:a6:f9:14:b5:a5:60:31:7a:bd:99:88:39:33:82:e5:16:1a:a0:49:3c ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9 -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBH -bG9iYWwgRzIgUm9vdDAeFw0xNjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0x -CzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlUcnVzdDEbMBkGA1UEAwwSVUNBIEds -b2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxeYr -b3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmToni9 -kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzm -VHqUwCoV8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/R -VogvGjqNO7uCEeBHANBSh6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDc -C/Vkw85DvG1xudLeJ1uK6NjGruFZfc8oLTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIj -tm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/R+zvWr9LesGtOxdQXGLY -D0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBeKW4bHAyv -j5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6Dl -NaBa4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6 -iIis7nCs+dwp4wwcOxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznP -O6Q0ibd5Ei9Hxeepl2n8pndntd978XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIHEjMz15DD/pQwIX4wV -ZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo5sOASD0Ee/oj -L3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 -1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl -1qnN3e92mI0ADs0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oU -b3n09tDh05S60FdRvScFDcH9yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LV -PtateJLbXDzz2K36uGt/xDYotgIVilQsnLAXc47QN6MUPJiVAAwpBVueSUmxX8fj -y88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHojhJi6IjMtX9Gl8Cb -EGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZkbxqg -DMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI -+Vg7RE+xygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGy -YiGqhkCyLmTTX8jjfhFnRR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bX -UB+K+wb1whnw0A== ------END CERTIFICATE----- - -# Issuer: CN=UCA Extended Validation Root O=UniTrust -# Subject: CN=UCA Extended Validation Root O=UniTrust -# Label: "UCA Extended Validation Root" -# Serial: 106100277556486529736699587978573607008 -# MD5 Fingerprint: a1:f3:5f:43:c6:34:9b:da:bf:8c:7e:05:53:ad:96:e2 -# SHA1 Fingerprint: a3:a1:b0:6f:24:61:23:4a:e3:36:a5:c2:37:fc:a6:ff:dd:f0:d7:3a -# SHA256 Fingerprint: d4:3a:f9:b3:54:73:75:5c:96:84:fc:06:d7:d8:cb:70:ee:5c:28:e7:73:fb:29:4e:b4:1e:e7:17:22:92:4d:24 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBH -MQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBF -eHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMx -MDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNV -BAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrsiWog -D4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvS -sPGP2KxFRv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aop -O2z6+I9tTcg1367r3CTueUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dk -sHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR59mzLC52LqGj3n5qiAno8geK+LLNEOfi -c0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH0mK1lTnj8/FtDw5lhIpj -VMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KRel7sFsLz -KuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/ -TuDvB0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41G -sx2VYVdWf6/wFlthWG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs -1+lvK9JKBZP8nm9rZ/+I8U6laUpSNwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQD -fwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS3H5aBZ8eNJr34RQwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBADaN -l8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR -ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQ -VBcZEhrxH9cMaVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5 -c6sq1WnIeJEmMX3ixzDx/BR4dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp -4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb+7lsq+KePRXBOy5nAliRn+/4Qh8s -t2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOWF3sGPjLtx7dCvHaj -2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwiGpWO -vpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2C -xR9GUeOcGMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmx -cmtpzyKEC2IPrNkZAJSidjzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbM -fjKaiJUINlK73nZfdklJrX+9ZSCyycErdhh2n1ax ------END CERTIFICATE----- - -# Issuer: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Subject: CN=Certigna Root CA O=Dhimyotis OU=0002 48146308100036 -# Label: "Certigna Root CA" -# Serial: 269714418870597844693661054334862075617 -# MD5 Fingerprint: 0e:5c:30:62:27:eb:5b:bc:d7:ae:62:ba:e9:d5:df:77 -# SHA1 Fingerprint: 2d:0d:52:14:ff:9e:ad:99:24:01:74:20:47:6e:6c:85:27:27:f5:43 -# SHA256 Fingerprint: d4:8d:3d:23:ee:db:50:a4:59:e5:51:97:60:1c:27:77:4b:9d:7b:18:c9:4d:5a:05:95:11:a1:02:50:b9:31:68 ------BEGIN CERTIFICATE----- -MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAw -WjELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAw -MiA0ODE0NjMwODEwMDAzNjEZMBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0x -MzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjdaMFoxCzAJBgNVBAYTAkZSMRIwEAYD -VQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYzMDgxMDAwMzYxGTAX -BgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sO -ty3tRQgXstmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9M -CiBtnyN6tMbaLOQdLNyzKNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPu -I9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8JXrJhFwLrN1CTivngqIkicuQstDuI7pm -TLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16XdG+RCYyKfHx9WzMfgIh -C59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq4NYKpkDf -ePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3Yz -IoejwpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWT -Co/1VTp2lc5ZmIoJlXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1k -JWumIWmbat10TWuXekG9qxf5kBdIjzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5 -hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp//TBt2dzhauH8XwIDAQABo4IB -GjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE -FBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of -1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczov -L3d3d3cuY2VydGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilo -dHRwOi8vY3JsLmNlcnRpZ25hLmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYr -aHR0cDovL2NybC5kaGlteW90aXMuY29tL2NlcnRpZ25hcm9vdGNhLmNybDANBgkq -hkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOItOoldaDgvUSILSo3L -6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxPTGRG -HVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH6 -0BGM+RFq7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncB -lA2c5uk5jR+mUYyZDDl34bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdi -o2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1 -gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS6Cvu5zHbugRqh5jnxV/v -faci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaYtlu3zM63 -Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayh -jWZSaX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw -3kAP+HwV96LOPNdeE4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign Root CA - G1 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign Root CA - G1" -# Serial: 235931866688319308814040 -# MD5 Fingerprint: 9c:42:84:57:dd:cb:0b:a7:2e:95:ad:b6:f3:da:bc:ac -# SHA1 Fingerprint: 8a:c7:ad:8f:73:ac:4e:c1:b5:75:4d:a5:40:f4:fc:cf:7c:b5:8e:8c -# SHA256 Fingerprint: 40:f6:af:03:46:a9:9a:a1:cd:1d:55:5a:4e:9c:ce:62:c7:f9:63:46:03:ee:40:66:15:83:3d:c8:c8:d0:03:67 ------BEGIN CERTIFICATE----- -MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYD -VQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBU -ZWNobm9sb2dpZXMgTGltaXRlZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBH -MTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgxODMwMDBaMGcxCzAJBgNVBAYTAklO -MRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVkaHJhIFRlY2hub2xv -Z2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQz -f2N4aLTNLnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO -8oG0x5ZOrRkVUkr+PHB1cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aq -d7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHWDV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhM -tTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ6DqS0hdW5TUaQBw+jSzt -Od9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrHhQIDAQAB -o0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQD -AgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31x -PaOfG1vR2vjTnGs2vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjM -wiI/aTvFthUvozXGaCocV685743QNcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6d -GNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q+Mri/Tm3R7nrft8EI6/6nAYH -6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeihU80Bv2noWgby -RQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx -iN66zB+Afko= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Subject: CN=emSign ECC Root CA - G3 O=eMudhra Technologies Limited OU=emSign PKI -# Label: "emSign ECC Root CA - G3" -# Serial: 287880440101571086945156 -# MD5 Fingerprint: ce:0b:72:d1:9f:88:8e:d0:50:03:e8:e3:b8:8b:67:40 -# SHA1 Fingerprint: 30:43:fa:4f:f2:57:dc:a0:c3:80:ee:2e:58:ea:78:b2:3f:e6:bb:c1 -# SHA256 Fingerprint: 86:a1:ec:ba:08:9c:4a:8d:3b:be:27:34:c6:12:ba:34:1d:81:3e:04:3c:f9:e8:a8:62:cd:5c:57:a3:6b:be:6b ------BEGIN CERTIFICATE----- -MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQG -EwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNo -bm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g -RzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4MTgzMDAwWjBrMQswCQYDVQQGEwJJ -TjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9s -b2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMw -djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0 -WXTsuwYc58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xyS -fvalY8L1X44uT6EYGQIrMgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuB -zhccLikenEhjQjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggq -hkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+DCBeQyh+KTOgNG3qxrdWB -CUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7jHvrZQnD -+JbNR6iC8hZVdyR+EhCVBCyj ------END CERTIFICATE----- - -# Issuer: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign Root CA - C1 O=eMudhra Inc OU=emSign PKI -# Label: "emSign Root CA - C1" -# Serial: 825510296613316004955058 -# MD5 Fingerprint: d8:e3:5d:01:21:fa:78:5a:b0:df:ba:d2:ee:2a:5f:68 -# SHA1 Fingerprint: e7:2e:f1:df:fc:b2:09:28:cf:5d:d4:d5:67:37:b1:51:cb:86:4f:01 -# SHA256 Fingerprint: 12:56:09:aa:30:1d:a0:a2:49:b9:7a:82:39:cb:6a:34:21:6f:44:dc:ac:9f:39:54:b1:42:92:f2:e8:c8:60:8f ------BEGIN CERTIFICATE----- -MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkG -A1UEBhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEg -SW5jMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNpZ24gUm9v -dCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+upufGZ -BczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZ -HdPIWoU/Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH -3DspVpNqs8FqOp099cGXOFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvH -GPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4VI5b2P/AgNBbeCsbEBEV5f6f9vtKppa+c -xSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleoomslMuoaJuvimUnzYnu3Yy1 -aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+XJGFehiq -TbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87 -/kOXSTKZEhVb3xEp/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4 -kqNPEjE2NuLe/gDEo2APJ62gsIq1NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrG -YQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9wC68AivTxEDkigcxHpvOJpkT -+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQBmIMMMAVSKeo -WXzhriKi4gp6D/piq1JM4fHfyr6DDUI= ------END CERTIFICATE----- - -# Issuer: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Subject: CN=emSign ECC Root CA - C3 O=eMudhra Inc OU=emSign PKI -# Label: "emSign ECC Root CA - C3" -# Serial: 582948710642506000014504 -# MD5 Fingerprint: 3e:53:b3:a3:81:ee:d7:10:f8:d3:b0:1d:17:92:f5:d5 -# SHA1 Fingerprint: b6:af:43:c2:9b:81:53:7d:f6:ef:6b:c3:1f:1f:60:15:0c:ee:48:66 -# SHA256 Fingerprint: bc:4d:80:9b:15:18:9d:78:db:3e:1d:8c:f4:f9:72:6a:79:5d:a1:64:3c:a5:f1:35:8e:1d:db:0e:dc:0d:7e:b3 ------BEGIN CERTIFICATE----- -MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQG -EwJVUzETMBEGA1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMx -IDAeBgNVBAMTF2VtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAw -MFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UEBhMCVVMxEzARBgNVBAsTCmVtU2ln -biBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQDExdlbVNpZ24gRUND -IFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd6bci -MK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4Ojavti -sIGJAnB9SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0O -BBYEFPtaSNCAIEDyqOkAB2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB -Af8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQC02C8Cif22TGK6Q04ThHK1rt0c -3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwUZOR8loMRnLDRWmFLpg9J -0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== ------END CERTIFICATE----- - -# Issuer: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 3 O=Hongkong Post -# Label: "Hongkong Post Root CA 3" -# Serial: 46170865288971385588281144162979347873371282084 -# MD5 Fingerprint: 11:fc:9f:bd:73:30:02:8a:fd:3f:f3:58:b9:cb:20:f0 -# SHA1 Fingerprint: 58:a2:d0:ec:20:52:81:5b:c1:f3:f8:64:02:24:4e:c2:8e:02:4b:02 -# SHA256 Fingerprint: 5a:2f:c0:3f:0c:83:b0:90:bb:fa:40:60:4b:09:88:44:6c:76:36:18:3d:f9:84:6e:17:10:1a:44:7f:b8:ef:d6 ------BEGIN CERTIFICATE----- -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 -mpv0 ------END CERTIFICATE----- - -# Issuer: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation -# Subject: CN=Microsoft ECC Root Certificate Authority 2017 O=Microsoft Corporation -# Label: "Microsoft ECC Root Certificate Authority 2017" -# Serial: 136839042543790627607696632466672567020 -# MD5 Fingerprint: dd:a1:03:e6:4a:93:10:d1:bf:f0:19:42:cb:fe:ed:67 -# SHA1 Fingerprint: 99:9a:64:c3:7f:f4:7d:9f:ab:95:f1:47:69:89:14:60:ee:c4:c3:c5 -# SHA256 Fingerprint: 35:8d:f3:9d:76:4a:f9:e1:b7:66:e9:c9:72:df:35:2e:e1:5c:fa:c2:27:af:6a:d1:d7:0e:8e:4a:6e:dc:ba:02 ------BEGIN CERTIFICATE----- -MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQsw -CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYD -VQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw -MTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4MjMxNjA0WjBlMQswCQYDVQQGEwJV -UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNy -b3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZR -ogPZnZH6thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYb -hGBKia/teQ87zvH2RPUBeMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBTIy5lycFIM+Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3 -FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlfXu5gKcs68tvWMoQZP3zV -L8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaReNtUjGUB -iudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= ------END CERTIFICATE----- - -# Issuer: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation -# Subject: CN=Microsoft RSA Root Certificate Authority 2017 O=Microsoft Corporation -# Label: "Microsoft RSA Root Certificate Authority 2017" -# Serial: 40975477897264996090493496164228220339 -# MD5 Fingerprint: 10:ff:00:ff:cf:c9:f8:c7:7a:c0:ee:35:8e:c9:0f:47 -# SHA1 Fingerprint: 73:a5:e6:4a:3b:ff:83:16:ff:0e:dc:cc:61:8a:90:6e:4e:ae:4d:74 -# SHA256 Fingerprint: c7:41:f7:0f:4b:2a:8d:88:bf:2e:71:c1:41:22:ef:53:ef:10:eb:a0:cf:a5:e6:4c:fa:20:f4:18:85:30:73:e0 ------BEGIN CERTIFICATE----- -MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBl -MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw -NAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIwNzE4MjMwMDIzWjBlMQswCQYDVQQG -EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1N -aWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZ -Nt9GkMml7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0 -ZdDMbRnMlfl7rEqUrQ7eS0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1 -HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw71VdyvD/IybLeS2v4I2wDwAW9lcfNcztm -gGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+dkC0zVJhUXAoP8XFWvLJ -jEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49FyGcohJUc -aDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaG -YaRSMLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6 -W6IYZVcSn2i51BVrlMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4K -UGsTuqwPN1q3ErWQgR5WrlcihtnJ0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH -+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJClTUFLkqqNfs+avNJVgyeY+Q -W5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZC -LgLNFgVZJ8og6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OC -gMNPOsduET/m4xaRhPtthH80dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6 -tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk+ONVFT24bcMKpBLBaYVu32TxU5nh -SnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex/2kskZGT4d9Mozd2 -TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDyAmH3 -pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGR -xpl/j8nWZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiApp -GWSZI1b7rCoucL5mxAyE7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9 -dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKTc0QWbej09+CVgI+WXTik9KveCjCHk9hN -AHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D5KbvtwEwXlGjefVwaaZB -RA+GsCyRxj3qrg+E ------END CERTIFICATE----- - -# Issuer: CN=e-Szigno Root CA 2017 O=Microsec Ltd. -# Subject: CN=e-Szigno Root CA 2017 O=Microsec Ltd. -# Label: "e-Szigno Root CA 2017" -# Serial: 411379200276854331539784714 -# MD5 Fingerprint: de:1f:f6:9e:84:ae:a7:b4:21:ce:1e:58:7d:d1:84:98 -# SHA1 Fingerprint: 89:d4:83:03:4f:9e:9a:48:80:5f:72:37:d4:a9:a6:ef:cb:7c:1f:d1 -# SHA256 Fingerprint: be:b0:0b:30:83:9b:9b:c3:2c:32:e4:44:79:05:95:06:41:f2:64:21:b1:5e:d0:89:19:8b:51:8a:e2:ea:1b:99 ------BEGIN CERTIFICATE----- -MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNV -BAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRk -LjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJv -b3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZaFw00MjA4MjIxMjA3MDZaMHExCzAJ -BgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMg -THRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25v -IFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtv -xie+RJCxs1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+H -Wyx7xf58etqjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBSHERUI0arBeAyxr87GyZDvvzAEwDAfBgNVHSMEGDAWgBSHERUI0arB -eAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEAtVfd14pVCzbhhkT61Nlo -jbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxOsvxyqltZ -+efcMQ== ------END CERTIFICATE----- - -# Issuer: O=CERTSIGN SA OU=certSIGN ROOT CA G2 -# Subject: O=CERTSIGN SA OU=certSIGN ROOT CA G2 -# Label: "certSIGN Root CA G2" -# Serial: 313609486401300475190 -# MD5 Fingerprint: 8c:f1:75:8a:c6:19:cf:94:b7:f7:65:20:87:c3:97:c7 -# SHA1 Fingerprint: 26:f9:93:b4:ed:3d:28:27:b0:b9:4b:a7:e9:15:1d:a3:8d:92:e5:32 -# SHA256 Fingerprint: 65:7c:fe:2f:a7:3f:aa:38:46:25:71:f3:32:a2:36:3a:46:fc:e7:02:09:51:71:07:02:cd:fb:b6:ee:da:33:05 ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNV -BAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04g -Uk9PVCBDQSBHMjAeFw0xNzAyMDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJ -BgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJ -R04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDF -dRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05N0Iw -vlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZ -uIt4ImfkabBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhp -n+Sc8CnTXPnGFiWeI8MgwT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKs -cpc/I1mbySKEwQdPzH/iV8oScLumZfNpdWO9lfsbl83kqK/20U6o2YpxJM02PbyW -xPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91QqhngLjYl/rNUssuHLoPj1P -rCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732jcZZroiF -DsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fx -DTvf95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgy -LcsUDFDYg2WD7rlcz8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6C -eWRgKRM+o/1Pcmqr4tTluCRVLERLiohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSCIS1mxteg4BXrzkwJ -d8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOBywaK8SJJ6ejq -kX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC -b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQl -qiCA2ClV9+BB/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0 -OJD7uNGzcgbJceaBxXntC6Z58hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+c -NywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5BiKDUyUM/FHE5r7iOZULJK2v0ZXk -ltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklWatKcsWMy5WHgUyIO -pwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tUSxfj -03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZk -PuXaTH4MNMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE -1LlSVHJ7liXMvGnjSG4N0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MX -QRBdJ3NghVdJIgc= ------END CERTIFICATE----- - -# Issuer: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. -# Subject: CN=NAVER Global Root Certification Authority O=NAVER BUSINESS PLATFORM Corp. -# Label: "NAVER Global Root Certification Authority" -# Serial: 9013692873798656336226253319739695165984492813 -# MD5 Fingerprint: c8:7e:41:f6:25:3b:f5:09:b3:17:e8:46:3d:bf:d0:9b -# SHA1 Fingerprint: 8f:6b:f2:a9:27:4a:da:14:a0:c4:f4:8e:61:27:f9:c0:1e:78:5d:d1 -# SHA256 Fingerprint: 88:f4:38:dc:f8:ff:d1:fa:8f:42:91:15:ff:e5:f8:2a:e1:e0:6e:0c:70:c3:75:fa:ad:71:7b:34:a4:9e:72:65 ------BEGIN CERTIFICATE----- -MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEM -BQAwaTELMAkGA1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRG -T1JNIENvcnAuMTIwMAYDVQQDDClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4NDJaFw0zNzA4MTgyMzU5NTlaMGkx -CzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVTUyBQTEFURk9STSBD -b3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVA -iQqrDZBbUGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH -38dq6SZeWYp34+hInDEW+j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lE -HoSTGEq0n+USZGnQJoViAbbJAh2+g1G7XNr4rRVqmfeSVPc0W+m/6imBEtRTkZaz -kVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2aacp+yPOiNgSnABIqKYP -szuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4Yb8Obtoq -vC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHf -nZ3zVHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaG -YQ5fG8Ir4ozVu53BA0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo -0es+nPxdGoMuK8u180SdOqcXYZaicdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3a -CJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejyYhbLgGvtPe31HzClrkvJE+2K -AQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNVHQ4EFgQU0p+I -36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoN -qo0hV4/GPnrK21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatj -cu3cvuzHV+YwIHHW1xDBE1UBjCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm -+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bxhYTeodoS76TiEJd6eN4MUZeoIUCL -hr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTgE34h5prCy8VCZLQe -lHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTHD8z7 -p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8 -piKCk5XQA76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLR -LBT/DShycpWbXgnbiUSYqqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX -5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oGI/hGoiLtk/bdmuYqh7GYVPEi92tF4+KO -dh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmgkpzNNIaRkPpkUZ3+/uul -9XXeifdy ------END CERTIFICATE----- - -# Issuer: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres -# Subject: CN=AC RAIZ FNMT-RCM SERVIDORES SEGUROS O=FNMT-RCM OU=Ceres -# Label: "AC RAIZ FNMT-RCM SERVIDORES SEGUROS" -# Serial: 131542671362353147877283741781055151509 -# MD5 Fingerprint: 19:36:9c:52:03:2f:d2:d1:bb:23:cc:dd:1e:12:55:bb -# SHA1 Fingerprint: 62:ff:d9:9e:c0:65:0d:03:ce:75:93:d2:ed:3f:2d:32:c9:e3:e5:4a -# SHA256 Fingerprint: 55:41:53:b1:3d:2c:f9:dd:b7:53:bf:be:1a:4e:0a:e0:8d:0a:a4:18:70:58:fe:60:a2:b8:62:b2:e4:b8:7b:cb ------BEGIN CERTIFICATE----- -MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw -CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw -FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S -Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 -MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL -DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS -QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB -BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH -sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK -Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu -SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC -MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy -v+c= ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign Root R46 O=GlobalSign nv-sa -# Subject: CN=GlobalSign Root R46 O=GlobalSign nv-sa -# Label: "GlobalSign Root R46" -# Serial: 1552617688466950547958867513931858518042577 -# MD5 Fingerprint: c4:14:30:e4:fa:66:43:94:2a:6a:1b:24:5f:19:d0:ef -# SHA1 Fingerprint: 53:a2:b0:4b:ca:6b:d6:45:e6:39:8a:8e:c4:0d:d2:bf:77:c3:a2:90 -# SHA256 Fingerprint: 4f:a3:12:6d:8d:3a:11:d1:c4:85:5a:4f:80:7c:ba:d6:cf:91:9d:3a:5a:88:b0:3b:ea:2c:63:72:d9:3c:40:c9 ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUA -MEYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYD -VQQDExNHbG9iYWxTaWduIFJvb3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMy -MDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt -c2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08EsCVeJ -OaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQG -vGIFAha/r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud -316HCkD7rRlr+/fKYIje2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo -0q3v84RLHIf8E6M6cqJaESvWJ3En7YEtbWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSE -y132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvjK8Cd+RTyG/FWaha/LIWF -zXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD412lPFzYE -+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCN -I/onccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzs -x2sZy/N78CsHpdlseVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqa -ByFrgY/bxFn63iLABJzjqls2k+g9vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC -4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEMBQADggIBAHx4 -7PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg -JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti -2kM3S+LGteWygxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIk -pnnpHs6i58FZFZ8d4kuaPp92CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRF -FRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZmOUdkLG5NrmJ7v2B0GbhWrJKsFjLt -rWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qqJZ4d16GLuc1CLgSk -ZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwyeqiv5 -u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP -4vkYxboznxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6 -N3ec592kD3ZDZopD8p/7DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3 -vouXsXgxT7PntgMTzlSdriVZzH81Xwj3QEUxeCp6 ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign Root E46 O=GlobalSign nv-sa -# Subject: CN=GlobalSign Root E46 O=GlobalSign nv-sa -# Label: "GlobalSign Root E46" -# Serial: 1552617690338932563915843282459653771421763 -# MD5 Fingerprint: b5:b8:66:ed:de:08:83:e3:c9:e2:01:34:06:ac:51:6f -# SHA1 Fingerprint: 39:b4:6c:d5:fe:80:06:eb:e2:2f:4a:bb:08:33:a0:af:db:b9:dd:84 -# SHA256 Fingerprint: cb:b9:c4:4d:84:b8:04:3e:10:50:ea:31:a6:9f:51:49:55:d7:bf:d2:e2:c6:b4:93:01:01:9a:d6:1d:9f:50:58 ------BEGIN CERTIFICATE----- -MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYx -CzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQD -ExNHbG9iYWxTaWduIFJvb3QgRTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAw -MDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex -HDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkBjtjq -R+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGdd -yXqBPCCjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBQxCpCPtsad0kRLgLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ -7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZkvLtoURMMA/cVi4RguYv/Uo7njLwcAjA8 -+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+CAezNIm8BZ/3Hobui3A= ------END CERTIFICATE----- - -# Issuer: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz -# Subject: CN=ANF Secure Server Root CA O=ANF Autoridad de Certificacion OU=ANF CA Raiz -# Label: "ANF Secure Server Root CA" -# Serial: 996390341000653745 -# MD5 Fingerprint: 26:a6:44:5a:d9:af:4e:2f:b2:1d:b6:65:b0:4e:e8:96 -# SHA1 Fingerprint: 5b:6e:68:d0:cc:15:b6:a0:5f:1e:c1:5f:ae:02:fc:6b:2f:5d:6f:74 -# SHA256 Fingerprint: fb:8f:ec:75:91:69:b9:10:6b:1e:51:16:44:c6:18:c5:13:04:37:3f:6c:06:43:08:8d:8b:ef:fd:1b:99:75:99 ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Subject: CN=Certum EC-384 CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Label: "Certum EC-384 CA" -# Serial: 160250656287871593594747141429395092468 -# MD5 Fingerprint: b6:65:b3:96:60:97:12:a1:ec:4e:e1:3d:a3:c6:c9:f1 -# SHA1 Fingerprint: f3:3e:78:3c:ac:df:f4:a2:cc:ac:67:55:69:56:d7:e5:16:3c:e1:ed -# SHA256 Fingerprint: 6b:32:80:85:62:53:18:aa:50:d1:73:c9:8d:8b:da:09:d5:7e:27:41:3d:11:4c:f7:87:a0:f5:d0:6c:03:0c:f6 ------BEGIN CERTIFICATE----- -MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQsw -CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScw -JQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMT -EENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2MDcyNDU0WhcNNDMwMzI2MDcyNDU0 -WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBT -LkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGTAX -BgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATE -KI6rGFtqvm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7Tm -Fy8as10CW4kjPMIRBSqniBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68Kj -QjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI0GZnQkdjrzife81r1HfS+8 -EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNoADBlAjADVS2m5hjEfO/J -UG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0QoSZ/6vn -nvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= ------END CERTIFICATE----- - -# Issuer: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Subject: CN=Certum Trusted Root CA O=Asseco Data Systems S.A. OU=Certum Certification Authority -# Label: "Certum Trusted Root CA" -# Serial: 40870380103424195783807378461123655149 -# MD5 Fingerprint: 51:e1:c2:e7:fe:4c:84:af:59:0e:2f:f4:54:6f:ea:29 -# SHA1 Fingerprint: c8:83:44:c0:18:ae:9f:cc:f1:87:b7:8f:22:d1:c5:d7:45:84:ba:e5 -# SHA256 Fingerprint: fe:76:96:57:38:55:77:3e:37:a9:5e:7a:d4:d9:cc:96:c3:01:57:c1:5d:31:76:5b:a9:b1:57:04:e1:ae:78:fd ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -# Issuer: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique -# Subject: CN=TunTrust Root CA O=Agence Nationale de Certification Electronique -# Label: "TunTrust Root CA" -# Serial: 108534058042236574382096126452369648152337120275 -# MD5 Fingerprint: 85:13:b9:90:5b:36:5c:b6:5e:b8:5a:f8:e0:31:57:b4 -# SHA1 Fingerprint: cf:e9:70:84:0f:e0:73:0f:9d:f6:0c:7f:2c:4b:ee:20:46:34:9c:bb -# SHA256 Fingerprint: 2e:44:10:2a:b5:8c:b8:54:19:45:1c:8e:19:d9:ac:f3:66:2c:af:bc:61:4b:6a:53:96:0a:30:f7:d0:e2:eb:41 ------BEGIN CERTIFICATE----- -MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQEL -BQAwYTELMAkGA1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUg -Q2VydGlmaWNhdGlvbiBFbGVjdHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJv -b3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQwNDI2MDg1NzU2WjBhMQswCQYDVQQG -EwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBDZXJ0aWZpY2F0aW9u -IEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZ -n56eY+hz2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd -2JQDoOw05TDENX37Jk0bbjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgF -VwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZ -GoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAdgjH8KcwAWJeRTIAAHDOF -li/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViWVSHbhlnU -r8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2 -eY8fTpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIb -MlEsPvLfe/ZdeikZjuXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISg -jwBUFfyRbVinljvrS5YnzWuioYasDXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB -7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwSVXAkPcvCFDVDXSdOvsC9qnyW -5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI04Y+oXNZtPdE -ITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 -90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+z -xiD2BkewhpMl0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYu -QEkHDVneixCwSQXi/5E/S7fdAo74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4 -FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRYYdZ2vyJ/0Adqp2RT8JeNnYA/u8EH -22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJpadbGNjHh/PqAulxP -xOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65xxBzn -dFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5 -Xc0yGYuPjCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7b -nV2UqL1g52KAdoGDDIzMMEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQ -CvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9zZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZH -u/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3rAZ3r2OvEhJn7wAzMMujj -d9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= ------END CERTIFICATE----- - -# Issuer: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Subject: CN=HARICA TLS RSA Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Label: "HARICA TLS RSA Root CA 2021" -# Serial: 76817823531813593706434026085292783742 -# MD5 Fingerprint: 65:47:9b:58:86:dd:2c:f0:fc:a2:84:1f:1e:96:c4:91 -# SHA1 Fingerprint: 02:2d:05:82:fa:88:ce:14:0c:06:79:de:7f:14:10:e9:45:d7:a5:6d -# SHA256 Fingerprint: d9:5d:0e:8e:da:79:52:5b:f9:be:b1:1b:14:d2:10:0d:32:94:98:5f:0c:62:d9:fa:bd:9c:d9:99:ec:cb:7b:1d ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBs -MQswCQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl -c2VhcmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0Eg -Um9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUzOFoXDTQ1MDIxMzEwNTUzN1owbDEL -MAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl -YXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNBIFJv -b3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569l -mwVnlskNJLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE -4VGC/6zStGndLuwRo0Xua2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uv -a9of08WRiFukiZLRgeaMOVig1mlDqa2YUlhu2wr7a89o+uOkXjpFc5gH6l8Cct4M -pbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K5FrZx40d/JiZ+yykgmvw -Kh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEvdmn8kN3b -LW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcY -AuUR0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqB -AGMUuTNe3QvboEUHGjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYq -E613TBoYm5EPWNgGVMWX+Ko/IIqmhaZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHr -W2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQCPxrvrNQKlr9qEgYRtaQQJKQ -CoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAU -X15QvWiWkKQUEapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3 -f5Z2EMVGpdAgS1D0NTsY9FVqQRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxaja -H6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxDQpSbIPDRzbLrLFPCU3hKTwSUQZqP -JzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcRj88YxeMn/ibvBZ3P -zzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5vZSt -jBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0 -/L5H9MG0qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pT -BGIBnfHAT+7hOtSLIBD6Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79 -aPib8qXPMThcFarmlwDB31qlpzmq6YR/PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YW -xw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnnkf3/W9b3raYvAwtt41dU -63ZTGI0RmLo= ------END CERTIFICATE----- - -# Issuer: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Subject: CN=HARICA TLS ECC Root CA 2021 O=Hellenic Academic and Research Institutions CA -# Label: "HARICA TLS ECC Root CA 2021" -# Serial: 137515985548005187474074462014555733966 -# MD5 Fingerprint: ae:f7:4c:e5:66:35:d1:b7:9b:8c:22:93:74:d3:4b:b0 -# SHA1 Fingerprint: bc:b0:c1:9d:e9:98:92:70:19:38:57:e9:8d:a7:b4:5d:6e:ee:01:48 -# SHA256 Fingerprint: 3f:99:cc:47:4a:cf:ce:4d:fe:d5:87:94:66:5e:47:8d:15:47:73:9f:2e:78:0f:1b:b4:ca:9b:13:30:97:d4:01 ------BEGIN CERTIFICATE----- -MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQsw -CQYDVQQGEwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2Vh -cmNoIEluc3RpdHV0aW9ucyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9v -dCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoXDTQ1MDIxMzExMDEwOVowbDELMAkG -A1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj -aCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJvb3Qg -Q0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7 -KKrxcm1lAEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9Y -STHMmE5gEYd103KUkE+bECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQD -AgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAircJRQO9gcS3ujwLEXQNw -SaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/QwCZ61IygN -nxS2PFOiTAZpffpskcYqSUXm7LcT4Tps ------END CERTIFICATE----- - -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068" -# Serial: 1977337328857672817 -# MD5 Fingerprint: 4e:6e:9b:54:4c:ca:b7:fa:48:e4:90:b1:15:4b:1c:a3 -# SHA1 Fingerprint: 0b:be:c2:27:22:49:cb:39:aa:db:35:5c:53:e3:8c:ae:78:ff:b6:fe -# SHA256 Fingerprint: 57:de:05:83:ef:d2:b2:6e:03:61:da:99:da:9d:f4:64:8d:ef:7e:e8:44:1c:3b:72:8a:fa:9b:cd:e0:f9:b2:6a ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UE -BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h -cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1 -MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg -Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9 -thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM -cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG -L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i -NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h -X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b -m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy -Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja -EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T -KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF -6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh -OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1UdDgQWBBRlzeurNR4APn7VdMAc -tHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4wgZswgZgGBFUd -IAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j -b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABC -AG8AbgBhAG4AbwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAw -ADEANzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9m -iWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL4QjbEwj4KKE1soCzC1HA01aajTNF -Sa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDbLIpgD7dvlAceHabJ -hfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1ilI45P -Vf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZE -EAEeiGaPcjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV -1aUsIC+nmCjuRfzxuIgALI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2t -CsvMo2ebKHTEm9caPARYpoKdrcd7b/+Alun4jWq9GJAd/0kakFI3ky88Al2CdgtR -5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH9IBk9W6VULgRfhVwOEqw -f9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpfNIbnYrX9 -ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNK -GbqEZycPvEJdvSRUDewdcAZfpLz6IHxV ------END CERTIFICATE----- - -# Issuer: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. -# Subject: CN=vTrus ECC Root CA O=iTrusChina Co.,Ltd. -# Label: "vTrus ECC Root CA" -# Serial: 630369271402956006249506845124680065938238527194 -# MD5 Fingerprint: de:4b:c1:f5:52:8c:9b:43:e1:3e:8f:55:54:17:8d:85 -# SHA1 Fingerprint: f6:9c:db:b0:fc:f6:02:13:b6:52:32:a6:a3:91:3f:16:70:da:c3:e1 -# SHA256 Fingerprint: 30:fb:ba:2c:32:23:8e:2a:98:54:7a:f9:79:31:e5:50:42:8b:9b:3f:1c:8e:eb:66:33:dc:fa:86:c5:b2:7d:d3 ------BEGIN CERTIFICATE----- -MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMw -RzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAY -BgNVBAMTEXZUcnVzIEVDQyBSb290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDcz -MTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28u -LEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYwEAYHKoZIzj0CAQYF -K4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+cToL0 -v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUd -e4BdS49nTPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIw -V53dVvHH4+m4SVBrm2nDb+zDfSXkV5UTQJtS0zvzQBm8JsctBp61ezaf9SXUY2sA -AjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQLYgmRWAD5Tfs0aNoJrSEG -GJTO ------END CERTIFICATE----- - -# Issuer: CN=vTrus Root CA O=iTrusChina Co.,Ltd. -# Subject: CN=vTrus Root CA O=iTrusChina Co.,Ltd. -# Label: "vTrus Root CA" -# Serial: 387574501246983434957692974888460947164905180485 -# MD5 Fingerprint: b8:c9:37:df:fa:6b:31:84:64:c5:ea:11:6a:1b:75:fc -# SHA1 Fingerprint: 84:1a:69:fb:f5:cd:1a:25:34:13:3d:e3:f8:fc:b8:99:d0:c9:14:b7 -# SHA256 Fingerprint: 8a:71:de:65:59:33:6f:42:6c:26:e5:38:80:d0:0d:88:a1:8d:a4:c6:a9:1f:0d:cb:61:94:e2:06:c5:c9:63:87 ------BEGIN CERTIFICATE----- -MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQEL -BQAwQzELMAkGA1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4x -FjAUBgNVBAMTDXZUcnVzIFJvb3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMx -MDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoGA1UEChMTaVRydXNDaGluYSBDby4s -THRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZotsSKYc -IrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykU -AyyNJJrIZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+ -GrPSbcKvdmaVayqwlHeFXgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z9 -8Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KAYPxMvDVTAWqXcoKv8R1w6Jz1717CbMdH -flqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70kLJrxLT5ZOrpGgrIDajt -J8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2AXPKBlim -0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZN -pGvu/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQ -UqqzApVg+QxMaPnu1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHW -OXSuTEGC2/KmSNGzm/MzqvOmwMVO9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMB -AAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYgscasGrz2iTAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAKbqSSaet -8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd -nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1j -bhd47F18iMjrjld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvM -Kar5CKXiNxTKsbhm7xqC5PD48acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIiv -TDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJnxDHO2zTlJQNgJXtxmOTAGytfdELS -S8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554WgicEFOwE30z9J4nfr -I8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4sEb9 -b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNB -UvupLnKWnyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1P -Ti07NEPhmg4NpGaXutIcSkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929ven -sBxXVsFy6K2ir40zSbofitzmdHxghm+Hl3s= ------END CERTIFICATE----- - -# Issuer: CN=ISRG Root X2 O=Internet Security Research Group -# Subject: CN=ISRG Root X2 O=Internet Security Research Group -# Label: "ISRG Root X2" -# Serial: 87493402998870891108772069816698636114 -# MD5 Fingerprint: d3:9e:c4:1e:23:3c:a6:df:cf:a3:7e:6d:e0:14:e6:e5 -# SHA1 Fingerprint: bd:b1:b9:3c:d5:97:8d:45:c6:26:14:55:f8:db:95:c7:5a:d1:53:af -# SHA256 Fingerprint: 69:72:9b:8e:15:a8:6e:fc:17:7a:57:af:b7:17:1d:fc:64:ad:d2:8c:2f:ca:8c:f1:50:7e:34:45:3c:cb:14:70 ------BEGIN CERTIFICATE----- -MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQsw -CQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2gg -R3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00 -MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVTMSkwJwYDVQQKEyBJbnRlcm5ldCBT -ZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNSRyBSb290IFgyMHYw -EAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0HttwW -+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9 -ItgKbppbd9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZI -zj0EAwMDaAAwZQIwe3lORlCEwkSHRhtFcP9Ymd70/aTSVaYgLXTWNLxBo1BfASdW -tL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5U6VR5CmD1/iQMVtCnwr1 -/q4AaOeMSQ+2b1tbFfLn ------END CERTIFICATE----- - -# Issuer: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. -# Subject: CN=HiPKI Root CA - G1 O=Chunghwa Telecom Co., Ltd. -# Label: "HiPKI Root CA - G1" -# Serial: 60966262342023497858655262305426234976 -# MD5 Fingerprint: 69:45:df:16:65:4b:e8:68:9a:8f:76:5f:ff:80:9e:d3 -# SHA1 Fingerprint: 6a:92:e4:a8:ee:1b:ec:96:45:37:e3:29:57:49:cd:96:e3:e5:d2:60 -# SHA256 Fingerprint: f0:15:ce:3c:c2:39:bf:ef:06:4b:e9:f1:d2:c4:17:e1:a0:26:4a:0a:94:be:1f:0c:8d:12:18:64:eb:69:49:cc ------BEGIN CERTIFICATE----- -MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBP -MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 -ZC4xGzAZBgNVBAMMEkhpUEtJIFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRa -Fw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3 -YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kgUm9vdCBDQSAtIEcx -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0o9Qw -qNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twv -Vcg3Px+kwJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6 -lZgRZq2XNdZ1AYDgr/SEYYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnz -Qs7ZngyzsHeXZJzA9KMuH5UHsBffMNsAGJZMoYFL3QRtU6M9/Aes1MU3guvklQgZ -KILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfdhSi8MEyr48KxRURHH+CK -FgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj1jOXTyFj -HluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDr -y+K49a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ -/W3c1pzAtH2lsN0/Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgM -a/aOEmem8rJY5AIJEzypuxC00jBF8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6 -fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV -HQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQDAgGGMA0GCSqG -SIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi -7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqc -SE5XCV0vrPSltJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6Fza -ZsT0pPBWGTMpWmWSBUdGSquEwx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9Tc -XzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07QJNBAsNB1CI69aO4I1258EHBGG3zg -iLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv5wiZqAxeJoBF1Pho -L5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+GpzjLrF -Ne85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wr -kkVbbiVghUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+ -vhV4nYWBSipX3tUZQ9rbyltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQU -YDksswBVLuT1sw5XxJFBAJw/6KXf6vb/yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== ------END CERTIFICATE----- - -# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 -# Label: "GlobalSign ECC Root CA - R4" -# Serial: 159662223612894884239637590694 -# MD5 Fingerprint: 26:29:f8:6d:e1:88:bf:a2:65:7f:aa:c4:cd:0f:7f:fc -# SHA1 Fingerprint: 6b:a0:b0:98:e1:71:ef:5a:ad:fe:48:15:80:77:10:f4:bd:6f:0b:28 -# SHA256 Fingerprint: b0:85:d7:0b:96:4f:19:1a:73:e4:af:0d:54:ae:7a:0e:07:aa:fd:af:9b:71:dd:08:62:13:8a:b7:32:5a:24:a2 ------BEGIN CERTIFICATE----- -MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD -VQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh -bFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw -MTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g -UjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT -BgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx -uYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV -HQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/ -+wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147 -bmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R1 O=Google Trust Services LLC -# Subject: CN=GTS Root R1 O=Google Trust Services LLC -# Label: "GTS Root R1" -# Serial: 159662320309726417404178440727 -# MD5 Fingerprint: 05:fe:d0:bf:71:a8:a3:76:63:da:01:e0:d8:52:dc:40 -# SHA1 Fingerprint: e5:8c:1c:c4:91:3b:38:63:4b:e9:10:6e:e3:ad:8e:6b:9d:d9:81:4a -# SHA256 Fingerprint: d9:47:43:2a:bd:e7:b7:fa:90:fc:2e:6b:59:10:1b:12:80:e0:e1:c7:e4:e4:0f:a3:c6:88:7f:ff:57:a7:f4:cf ------BEGIN CERTIFICATE----- -MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw -CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU -MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw -MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp -Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo -27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w -Cl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw -TcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl -qAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH -szVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8 -Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk -MiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92 -wO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p -aDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN -VjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID -AQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb -C5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe -QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy -h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4 -7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J -ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef -MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/ -Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT -6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ -0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm -2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb -bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R3 O=Google Trust Services LLC -# Subject: CN=GTS Root R3 O=Google Trust Services LLC -# Label: "GTS Root R3" -# Serial: 159662495401136852707857743206 -# MD5 Fingerprint: 3e:e7:9d:58:02:94:46:51:94:e5:e0:22:4a:8b:e7:73 -# SHA1 Fingerprint: ed:e5:71:80:2b:c8:92:b9:5b:83:3c:d2:32:68:3f:09:cd:a0:1e:46 -# SHA256 Fingerprint: 34:d8:a7:3e:e2:08:d9:bc:db:0d:95:65:20:93:4b:4e:40:e6:94:82:59:6e:8b:6f:73:c8:42:6b:01:0a:6f:48 ------BEGIN CERTIFICATE----- -MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYD -VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG -A1UEAxMLR1RTIFJvb3QgUjMwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw -WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz -IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout736G -jOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL2 -4CejQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBTB8Sa6oC2uhYHP0/EqEr24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7 -VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azTL818+FsuVbu/3ZL3pAzcMeGiAjEA/Jdm -ZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV11RZt+cRLInUue4X ------END CERTIFICATE----- - -# Issuer: CN=GTS Root R4 O=Google Trust Services LLC -# Subject: CN=GTS Root R4 O=Google Trust Services LLC -# Label: "GTS Root R4" -# Serial: 159662532700760215368942768210 -# MD5 Fingerprint: 43:96:83:77:19:4d:76:b3:9d:65:52:e4:1d:22:a5:e8 -# SHA1 Fingerprint: 77:d3:03:67:b5:e0:0c:15:f6:0c:38:61:df:7c:e1:3b:92:46:4d:47 -# SHA256 Fingerprint: 34:9d:fa:40:58:c5:e2:63:12:3b:39:8a:e7:95:57:3c:4e:13:13:c8:3f:e6:8f:93:55:6c:d5:e8:03:1b:3c:7d ------BEGIN CERTIFICATE----- -MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD -VQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG -A1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw -WjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz -IExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi -QHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR -HYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D -9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8 -p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD ------END CERTIFICATE----- - -# Issuer: CN=Telia Root CA v2 O=Telia Finland Oyj -# Subject: CN=Telia Root CA v2 O=Telia Finland Oyj -# Label: "Telia Root CA v2" -# Serial: 7288924052977061235122729490515358 -# MD5 Fingerprint: 0e:8f:ac:aa:82:df:85:b1:f4:dc:10:1c:fc:99:d9:48 -# SHA1 Fingerprint: b9:99:cd:d1:73:50:8a:c4:47:05:08:9c:8c:88:fb:be:a0:2b:40:cd -# SHA256 Fingerprint: 24:2b:69:74:2f:cb:1e:5b:2a:bf:98:89:8b:94:57:21:87:54:4e:5b:4d:99:11:78:65:73:62:1f:6a:74:b8:2c ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQx -CzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UE -AwwQVGVsaWEgUm9vdCBDQSB2MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1 -NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZ -MBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ76zBq -AMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9 -vVYiQJ3q9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9 -lRdU2HhE8Qx3FZLgmEKnpNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTOD -n3WhUidhOPFZPY5Q4L15POdslv5e2QJltI5c0BE0312/UqeBAMN/mUWZFdUXyApT -7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW5olWK8jjfN7j/4nlNW4o -6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNrRBH0pUPC -TEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6 -WT0EBXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63R -DolUK5X6wK0dmBR4M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZI -pEYslOqodmJHixBTB0hXbOKSTbauBcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGj -YzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7Wxy+G2CQ5MB0GA1UdDgQWBBRy -rOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ -8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi -0f6X+J8wfBj5tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMM -A8iZGok1GTzTyVR8qPAs5m4HeW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBS -SRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+Cy748fdHif64W1lZYudogsYMVoe+K -TTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygCQMez2P2ccGrGKMOF -6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15h2Er -3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMt -Ty3EHD70sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pT -VmBds9hCG1xLEooc6+t9xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAW -ysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQraVplI/owd8k+BsHMYeB2F326CjYSlKA -rBPuUBQemMc= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH -# Subject: CN=D-TRUST BR Root CA 1 2020 O=D-Trust GmbH -# Label: "D-TRUST BR Root CA 1 2020" -# Serial: 165870826978392376648679885835942448534 -# MD5 Fingerprint: b5:aa:4b:d5:ed:f7:e3:55:2e:8f:72:0a:f3:75:b8:ed -# SHA1 Fingerprint: 1f:5b:98:f0:e3:b5:f7:74:3c:ed:e6:b0:36:7d:32:cd:f4:09:41:67 -# SHA256 Fingerprint: e5:9a:aa:81:60:09:c2:2b:ff:5b:25:ba:d3:7d:f3:06:f0:49:79:7c:1f:81:d8:5a:b0:89:e6:57:bd:8f:00:44 ------BEGIN CERTIFICATE----- -MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQsw -CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS -VVNUIEJSIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5 -NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG -A1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB -BAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7dPYS -zuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0 -QVK5buXuQqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/ -VbNafAkl1bK6CKBrqx9tMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g -PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2JyX3Jvb3Rf -Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l -dC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 -c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO -PQQDAwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFW -wKrY7RjEsK70PvomAjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHV -dWNbFJWcHwHP2NVypw87 ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH -# Subject: CN=D-TRUST EV Root CA 1 2020 O=D-Trust GmbH -# Label: "D-TRUST EV Root CA 1 2020" -# Serial: 126288379621884218666039612629459926992 -# MD5 Fingerprint: 8c:2d:9d:70:9f:48:99:11:06:11:fb:e9:cb:30:c0:6e -# SHA1 Fingerprint: 61:db:8c:21:59:69:03:90:d8:7c:9c:12:86:54:cf:9d:3d:f4:dd:07 -# SHA256 Fingerprint: 08:17:0d:1a:a3:64:53:90:1a:2f:95:92:45:e3:47:db:0c:8d:37:ab:aa:bc:56:b8:1a:a1:00:dc:95:89:70:db ------BEGIN CERTIFICATE----- -MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQsw -CQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRS -VVNUIEVWIFJvb3QgQ0EgMSAyMDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5 -NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEiMCAG -A1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAGByqGSM49AgEGBSuB -BAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8ZRCC -/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rD -wpdhQntJraOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3 -OqQo5FD4pPfsazK2/umLMA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6g -PKA6hjhodHRwOi8vY3JsLmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X2V2X3Jvb3Rf -Y2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVjdG9yeS5kLXRydXN0Lm5l -dC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxPPUQtVHJ1 -c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjO -PQQDAwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CA -y/m0sRtW9XLS/BnRAjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJb -gfM0agPnIjhQW+0ZT0MW ------END CERTIFICATE----- - -# Issuer: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. -# Subject: CN=DigiCert TLS ECC P384 Root G5 O=DigiCert, Inc. -# Label: "DigiCert TLS ECC P384 Root G5" -# Serial: 13129116028163249804115411775095713523 -# MD5 Fingerprint: d3:71:04:6a:43:1c:db:a6:59:e1:a8:a3:aa:c5:71:ed -# SHA1 Fingerprint: 17:f3:de:5e:9f:0f:19:e9:8e:f6:1f:32:26:6e:20:c4:07:ae:30:ee -# SHA256 Fingerprint: 01:8e:13:f0:77:25:32:cf:80:9b:d1:b1:72:81:86:72:83:fc:48:c6:e1:3b:e9:c6:98:12:85:4a:49:0c:1b:05 ------BEGIN CERTIFICATE----- -MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURp -Z2lDZXJ0IFRMUyBFQ0MgUDM4NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2 -MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJ -bmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNTB2MBAG -ByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1TzvdlHJS -7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp -0zVozptjn4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICIS -B4CIfBFqMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49 -BAMDA2gAMGUCMQCJao1H5+z8blUD2WdsJk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQ -LgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIxAJSdYsiJvRmEFOml+wG4 -DXZDjC5Ty3zfDBeWUA== ------END CERTIFICATE----- - -# Issuer: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. -# Subject: CN=DigiCert TLS RSA4096 Root G5 O=DigiCert, Inc. -# Label: "DigiCert TLS RSA4096 Root G5" -# Serial: 11930366277458970227240571539258396554 -# MD5 Fingerprint: ac:fe:f7:34:96:a9:f2:b3:b4:12:4b:e4:27:41:6f:e1 -# SHA1 Fingerprint: a7:88:49:dc:5d:7c:75:8c:8c:de:39:98:56:b3:aa:d0:b2:a5:71:35 -# SHA256 Fingerprint: 37:1a:00:dc:05:33:b3:72:1a:7e:eb:40:e8:41:9e:70:79:9d:2b:0a:0f:2c:1d:80:69:31:65:f7:ce:c4:ad:75 ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBN -MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMT -HERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcN -NDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs -IEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2IFJvb3QgRzUwggIi -MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS87IE+ -ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG0 -2C+JFvuUAT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgp -wgscONyfMXdcvyej/Cestyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZM -pG2T6T867jp8nVid9E6P/DsjyG244gXazOvswzH016cpVIDPRFtMbzCe88zdH5RD -nU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnVDdXifBBiqmvwPXbzP6Po -sMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9qTXeXAaDx -Zre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cd -Lvvyz6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvX -KyY//SovcfXWJL5/MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNe -XoVPzthwiHvOAbWWl9fNff2C+MIkwcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPL -tgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4EFgQUUTMc7TZArxfTJc1paPKv -TiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN -AQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw -GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7H -PNtQOa27PShNlnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLF -O4uJ+DQtpBflF+aZfTCIITfNMBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQ -REtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/u4cnYiWB39yhL/btp/96j1EuMPik -AdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9GOUrYU9DzLjtxpdRv -/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh47a+ -p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilw -MUc/dNAUFvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WF -qUITVuwhd4GTWgzqltlJyqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCK -ovfepEWFJqgejF0pW8hL2JpqA15w8oVPbEtoL8pU9ozaMv7Da4M/OMZ+ ------END CERTIFICATE----- - -# Issuer: CN=Certainly Root R1 O=Certainly -# Subject: CN=Certainly Root R1 O=Certainly -# Label: "Certainly Root R1" -# Serial: 188833316161142517227353805653483829216 -# MD5 Fingerprint: 07:70:d4:3e:82:87:a0:fa:33:36:13:f4:fa:33:e7:12 -# SHA1 Fingerprint: a0:50:ee:0f:28:71:f4:27:b2:12:6d:6f:50:96:25:ba:cc:86:42:af -# SHA256 Fingerprint: 77:b8:2c:d8:64:4c:43:05:f7:ac:c5:cb:15:6b:45:67:50:04:03:3d:51:c6:0c:62:02:a8:e0:c3:34:67:d3:a0 ------BEGIN CERTIFICATE----- -MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAw -PTELMAkGA1UEBhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2Vy -dGFpbmx5IFJvb3QgUjEwHhcNMjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9 -MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0 -YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANA2 -1B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O5MQT -vqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbed -aFySpvXl8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b0 -1C7jcvk2xusVtyWMOvwlDbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5 -r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGIXsXwClTNSaa/ApzSRKft43jvRl5tcdF5 -cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkNKPl6I7ENPT2a/Z2B7yyQ -wHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQAjeZjOVJ -6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA -2CnbrlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyH -Wyf5QBGenDPBt+U1VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMR -eiFPCyEQtkA6qyI6BJyLm4SGcprSp6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB -/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTgqj8ljZ9EXME66C6u -d0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAszHQNTVfSVcOQr -PbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d -8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi -1wrykXprOQ4vMMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrd -rRT90+7iIgXr0PK3aBLXWopBGsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9di -taY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+gjwN/KUD+nsa2UUeYNrEjvn8K8l7 -lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgHJBu6haEaBQmAupVj -yTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7fpYn -Kx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLy -yCwzk5Iwx06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5n -wXARPbv0+Em34yaXOp/SX3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6 -OV+KmalBWQewLK8= ------END CERTIFICATE----- - -# Issuer: CN=Certainly Root E1 O=Certainly -# Subject: CN=Certainly Root E1 O=Certainly -# Label: "Certainly Root E1" -# Serial: 8168531406727139161245376702891150584 -# MD5 Fingerprint: 0a:9e:ca:cd:3e:52:50:c6:36:f3:4b:a3:ed:a7:53:e9 -# SHA1 Fingerprint: f9:e1:6d:dc:01:89:cf:d5:82:45:63:3e:c5:37:7d:c2:eb:93:6f:2b -# SHA256 Fingerprint: b4:58:5f:22:e4:ac:75:6a:4e:86:12:a1:36:1c:5d:9d:03:1a:93:fd:84:fe:bb:77:8f:a3:06:8b:0f:c4:2d:c2 ------BEGIN CERTIFICATE----- -MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQsw -CQYDVQQGEwJVUzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlu -bHkgUm9vdCBFMTAeFw0yMTA0MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJ -BgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlubHkxGjAYBgNVBAMTEUNlcnRhaW5s -eSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4fxzf7flHh4axpMCK -+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9YBk2 -QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4 -hevIIgcwCgYIKoZIzj0EAwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozm -ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG -BtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR ------END CERTIFICATE----- - -# Issuer: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. -# Subject: CN=Security Communication ECC RootCA1 O=SECOM Trust Systems CO.,LTD. -# Label: "Security Communication ECC RootCA1" -# Serial: 15446673492073852651 -# MD5 Fingerprint: 7e:43:b0:92:68:ec:05:43:4c:98:ab:5d:35:2e:7e:86 -# SHA1 Fingerprint: b8:0e:26:a9:bf:d2:b2:3b:c0:ef:46:c9:ba:c7:bb:f6:1d:0d:41:41 -# SHA256 Fingerprint: e7:4f:bd:a5:5b:d5:64:c4:73:a3:6b:44:1a:a7:99:c8:a6:8e:07:74:40:e8:28:8b:9f:a1:e5:0e:4b:ba:ca:11 ------BEGIN CERTIFICATE----- -MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYT -AkpQMSUwIwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYD -VQQDEyJTZWN1cml0eSBDb21tdW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYx -NjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTELMAkGA1UEBhMCSlAxJTAjBgNVBAoT -HFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNVBAMTIlNlY3VyaXR5 -IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQAIgNi -AASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+Cnnfdl -dB9sELLo5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpK -ULGjQjBAMB0GA1UdDgQWBBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu -9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3LsnNdo4gIxwwCMQDAqy0O -be0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70eN9k= ------END CERTIFICATE----- - -# Issuer: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY -# Subject: CN=BJCA Global Root CA1 O=BEIJING CERTIFICATE AUTHORITY -# Label: "BJCA Global Root CA1" -# Serial: 113562791157148395269083148143378328608 -# MD5 Fingerprint: 42:32:99:76:43:33:36:24:35:07:82:9b:28:f9:d0:90 -# SHA1 Fingerprint: d5:ec:8d:7b:4c:ba:79:f4:e7:e8:cb:9d:6b:ae:77:83:10:03:21:6a -# SHA256 Fingerprint: f3:89:6f:88:fe:7c:0a:88:27:66:a7:fa:6a:d2:74:9f:b5:7a:7f:3e:98:fb:76:9c:1f:a7:b0:9c:2c:44:d5:ae ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBU -MQswCQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRI -T1JJVFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAz -MTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJF -SUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2Jh -bCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFmCL3Z -xRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZ -spDyRhySsTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O5 -58dnJCNPYwpj9mZ9S1WnP3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgR -at7GGPZHOiJBhyL8xIkoVNiMpTAK+BcWyqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll -5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRjeulumijWML3mG90Vr4Tq -nMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNnMoH1V6XK -V0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/ -pj+bOT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZO -z2nxbkRs1CTqjSShGL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXn -jSXWgXSHRtQpdaJCbPdzied9v3pKH9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+ -WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMBAAGjQjBAMB0GA1UdDgQWBBTF -7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 -YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3Kli -awLwQ8hOnThJdMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u -+2D2/VnGKhs/I0qUJDAnyIm860Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88 -X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuhTaRjAv04l5U/BXCga99igUOLtFkN -SoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW4AB+dAb/OMRyHdOo -P2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmpGQrI -+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRz -znfSxqxx4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9 -eVzYH6Eze9mCUAyTF6ps3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2 -YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4SSPfSKcOYKMryMguTjClPPGAyzQWWYezy -r/6zcCwupvI= ------END CERTIFICATE----- - -# Issuer: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY -# Subject: CN=BJCA Global Root CA2 O=BEIJING CERTIFICATE AUTHORITY -# Label: "BJCA Global Root CA2" -# Serial: 58605626836079930195615843123109055211 -# MD5 Fingerprint: 5e:0a:f6:47:5f:a6:14:e8:11:01:95:3f:4d:01:eb:3c -# SHA1 Fingerprint: f4:27:86:eb:6e:b8:6d:88:31:67:02:fb:ba:66:a4:53:00:aa:7a:a6 -# SHA256 Fingerprint: 57:4d:f6:93:1e:27:80:39:66:7b:72:0a:fd:c1:60:0f:c2:7e:b6:6d:d3:09:29:79:fb:73:85:64:87:21:28:82 ------BEGIN CERTIFICATE----- -MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQsw -CQYDVQQGEwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJ -VFkxHTAbBgNVBAMMFEJKQ0EgR2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgy -MVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJ -TkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRCSkNBIEdsb2JhbCBS -b290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jlSR9B -IgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK+ -+kpRuDCK/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJK -sVF/BvDRgh9Obl+rg/xI1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA -94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8gUXOQwKhbYdDFUDn9hf7B -43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== ------END CERTIFICATE----- - -# Issuer: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited -# Subject: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited -# Label: "Sectigo Public Server Authentication Root E46" -# Serial: 88989738453351742415770396670917916916 -# MD5 Fingerprint: 28:23:f8:b2:98:5c:37:16:3b:3e:46:13:4e:b0:b3:01 -# SHA1 Fingerprint: ec:8a:39:6c:40:f0:2e:bc:42:75:d4:9f:ab:1c:1a:5b:67:be:d2:9a -# SHA256 Fingerprint: c9:0f:26:f0:fb:1b:40:18:b2:22:27:51:9b:5c:a2:b5:3e:2c:a5:b3:be:5c:f1:8e:fe:1b:ef:47:38:0c:53:83 ------BEGIN CERTIFICATE----- -MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw -CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T -ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN -MjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG -A1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT -ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC -WvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+ -6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B -Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa -qCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q -4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw== ------END CERTIFICATE----- - -# Issuer: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited -# Subject: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited -# Label: "Sectigo Public Server Authentication Root R46" -# Serial: 156256931880233212765902055439220583700 -# MD5 Fingerprint: 32:10:09:52:00:d5:7e:6c:43:df:15:c0:b1:16:93:e5 -# SHA1 Fingerprint: ad:98:f9:f3:e4:7d:75:3b:65:d4:82:b3:a4:52:17:bb:6e:f5:e4:38 -# SHA256 Fingerprint: 7b:b6:47:a6:2a:ee:ac:88:bf:25:7a:a5:22:d0:1f:fe:a3:95:e0:ab:45:c7:3f:93:f6:56:54:ec:38:f2:5a:06 ------BEGIN CERTIFICATE----- -MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf -MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD -Ey1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw -HhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY -MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp -YyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa -ef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz -SDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf -iOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X -ME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3 -IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS -VYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE -SJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu -+Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt -8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L -HaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt -zwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P -AQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c -mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ -YKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52 -gDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA -Fv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB -JYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX -DhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui -TdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5 -dHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65 -LvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp -0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY -QqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL ------END CERTIFICATE----- - -# Issuer: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation -# Subject: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation -# Label: "SSL.com TLS RSA Root CA 2022" -# Serial: 148535279242832292258835760425842727825 -# MD5 Fingerprint: d8:4e:c6:59:30:d8:fe:a0:d6:7a:5a:2c:2c:69:78:da -# SHA1 Fingerprint: ec:2c:83:40:72:af:26:95:10:ff:0e:f2:03:ee:31:70:f6:78:9d:ca -# SHA256 Fingerprint: 8f:af:7d:2e:2c:b4:70:9b:b8:e0:b3:36:66:bf:75:a5:dd:45:b5:de:48:0f:8e:a8:d4:bf:e6:be:bc:17:f2:ed ------BEGIN CERTIFICATE----- -MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBO -MQswCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQD -DBxTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloX -DTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jw -b3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMjCC -AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u9nTP -L3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OY -t6/wNr/y7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0ins -S657Lb85/bRi3pZ7QcacoOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3 -PnxEX4MN8/HdIGkWCVDi1FW24IBydm5MR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBO -L9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDGD6C1vBdOSHtRwvzpXGk3 -R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEWTO6Af77w -dr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS -+YCk8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYS -d66UNHsef8JmAOSqg+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoG -AtUjHBPW6dvbxrB6y3snm/vg1UYk7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2f -gTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsuN+7jhHonLs0Z -NbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt -hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsM -QtfhWsSWTVTNj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvf -R4iyrT7gJ4eLSYwfqUdYe5byiB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJ -DPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjUo3KUQyxi4U5cMj29TH0ZR6LDSeeW -P4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqoENjwuSfr98t67wVy -lrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7EgkaibMOlq -bLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2w -AgDHbICivRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3q -r5nsLFR+jM4uElZI7xc7P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sji -Mho6/4UIyYOf8kpIEFR3N+2ivEC+5BB09+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU -98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= ------END CERTIFICATE----- - -# Issuer: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation -# Subject: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation -# Label: "SSL.com TLS ECC Root CA 2022" -# Serial: 26605119622390491762507526719404364228 -# MD5 Fingerprint: 99:d7:5c:f1:51:36:cc:e9:ce:d9:19:2e:77:71:56:c5 -# SHA1 Fingerprint: 9f:5f:d9:1a:54:6d:f5:0c:71:f0:ee:7a:bd:17:49:98:84:73:e2:39 -# SHA256 Fingerprint: c3:2f:fd:9f:46:f9:36:d1:6c:36:73:99:09:59:43:4b:9a:d6:0a:af:bb:9e:7c:f3:36:54:f1:44:cc:1b:a1:43 ------BEGIN CERTIFICATE----- -MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQsw -CQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxT -U0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2 -MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3Jh -dGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMjB2MBAG -ByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWyJGYm -acCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFN -SeR7T5v15wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME -GDAWgBSJjy+j6CugFFR781a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NW -uCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp -15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w7deedWo1dlJF4AIxAMeN -b0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5Zn6g6g== ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos -# Subject: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos -# Label: "Atos TrustedRoot Root CA ECC TLS 2021" -# Serial: 81873346711060652204712539181482831616 -# MD5 Fingerprint: 16:9f:ad:f1:70:ad:79:d6:ed:29:b4:d1:c5:79:70:a8 -# SHA1 Fingerprint: 9e:bc:75:10:42:b3:02:f3:81:f4:f7:30:62:d4:8f:c3:a7:51:b2:dd -# SHA256 Fingerprint: b2:fa:e5:3e:14:cc:d7:ab:92:12:06:47:01:ae:27:9c:1d:89:88:fa:cb:77:5f:a8:a0:08:91:4e:66:39:88:a8 ------BEGIN CERTIFICATE----- -MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4w -LAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0w -CwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0 -MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBF -Q0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMHYwEAYHKoZI -zj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6KDP/X -tXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4 -AjJn8ZQSb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2 -KCXWfeBmmnoJsmo7jjPXNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMD -aAAwZQIwW5kp85wxtolrbNa9d+F851F+uDrNozZffPc8dz7kUK2o59JZDCaOMDtu -CCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGYa3cpetskz2VAv9LcjBHo -9H1/IISpQuQo ------END CERTIFICATE----- - -# Issuer: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos -# Subject: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos -# Label: "Atos TrustedRoot Root CA RSA TLS 2021" -# Serial: 111436099570196163832749341232207667876 -# MD5 Fingerprint: d4:d3:46:b8:9a:c0:9c:76:5d:9e:3a:c3:b9:99:31:d2 -# SHA1 Fingerprint: 18:52:3b:0d:06:37:e4:d6:3a:df:23:e4:98:fb:5b:16:fb:86:74:48 -# SHA256 Fingerprint: 81:a9:08:8e:a5:9f:b3:64:c5:48:a6:f8:55:59:09:9b:6f:04:05:ef:bf:18:e5:32:4e:c9:f4:57:ba:00:11:2f ------BEGIN CERTIFICATE----- -MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBM -MS4wLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIx -MQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00 -MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBD -QSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BBl01Z -4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYv -Ye+W/CBGvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZ -kmGbzSoXfduP9LVq6hdKZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDs -GY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt0xU6kGpn8bRrZtkh68rZYnxGEFzedUln -nkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVKPNe0OwANwI8f4UDErmwh -3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMYsluMWuPD -0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzy -geBYBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8 -ANSbhqRAvNncTFd+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezB -c6eUWsuSZIKmAMFwoW4sKeFYV+xafJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lI -pw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -dEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -DAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS -4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPs -o0UvFJ/1TCplQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJ -qM7F78PRreBrAwA0JrRUITWXAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuyw -xfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9GslA9hGCZcbUztVdF5kJHdWoOsAgM -rr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2VktafcxBPTy+av5EzH4 -AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9qTFsR -0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuY -o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5 -dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE -oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ== ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia Global Root CA G3 O=TrustAsia Technologies, Inc. -# Label: "TrustAsia Global Root CA G3" -# Serial: 576386314500428537169965010905813481816650257167 -# MD5 Fingerprint: 30:42:1b:b7:bb:81:75:35:e4:16:4f:53:d2:94:de:04 -# SHA1 Fingerprint: 63:cf:b6:c1:27:2b:56:e4:88:8e:1c:23:9a:b6:2e:81:47:24:c3:c7 -# SHA256 Fingerprint: e0:d3:22:6a:eb:11:63:c2:e4:8f:f9:be:3b:50:b4:c6:43:1b:e7:bb:1e:ac:c5:c3:6b:5d:5e:c5:09:03:9a:08 ------BEGIN CERTIFICATE----- -MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEM -BQAwWjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dp -ZXMsIEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAe -Fw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEwMTlaMFoxCzAJBgNVBAYTAkNOMSUw -IwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtU -cnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNS -T1QY4SxzlZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqK -AtCWHwDNBSHvBm3dIZwZQ0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1 -nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/VP68czH5GX6zfZBCK70bwkPAPLfSIC7Ep -qq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1AgdB4SQXMeJNnKziyhWTXA -yB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm9WAPzJMs -hH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gX -zhqcD0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAv -kV34PmVACxmZySYgWmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msT -f9FkPz2ccEblooV7WIQn3MSAPmeamseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jA -uPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCFTIcQcf+eQxuulXUtgQIDAQAB -o2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj7zjKsK5Xf/Ih -MBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E -BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4 -wM8zAQLpw6o1D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2 -XFNFV1pF1AWZLy4jVe5jaN/TG3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1 -JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNjduMNhXJEIlU/HHzp/LgV6FL6qj6j -ITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstlcHboCoWASzY9M/eV -VHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys+TIx -xHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1on -AX1daBli2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d -7XB4tmBZrOFdRWOPyN9yaFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2Ntjj -gKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsASZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV -+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFRJQJ6+N1rZdVtTTDIZbpo -FGWsJwt0ivKH ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia Global Root CA G4 O=TrustAsia Technologies, Inc. -# Label: "TrustAsia Global Root CA G4" -# Serial: 451799571007117016466790293371524403291602933463 -# MD5 Fingerprint: 54:dd:b2:d7:5f:d8:3e:ed:7c:e0:0b:2e:cc:ed:eb:eb -# SHA1 Fingerprint: 57:73:a5:61:5d:80:b2:e6:ac:38:82:fc:68:07:31:ac:9f:b5:92:5a -# SHA256 Fingerprint: be:4b:56:cb:50:56:c0:13:6a:52:6d:f4:44:50:8d:aa:36:a0:b5:4f:42:e4:ac:38:f7:2a:f4:70:e4:79:65:4c ------BEGIN CERTIFICATE----- -MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMw -WjELMAkGA1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs -IEluYy4xJDAiBgNVBAMMG1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0y -MTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJaMFoxCzAJBgNVBAYTAkNOMSUwIwYD -VQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQwIgYDVQQDDBtUcnVz -dEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATx -s8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbw -LxYI+hW8m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJij -YzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mD -pm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/pDHel4NZg6ZvccveMA4GA1UdDwEB/wQE -AwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AAbbd+NvBNEU/zy4k6LHiR -UKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xkdUfFVZDj -/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== ------END CERTIFICATE----- - -# Issuer: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH -# Subject: CN=Telekom Security TLS ECC Root 2020 O=Deutsche Telekom Security GmbH -# Label: "Telekom Security TLS ECC Root 2020" -# Serial: 72082518505882327255703894282316633856 -# MD5 Fingerprint: c1:ab:fe:6a:10:2c:03:8d:bc:1c:22:32:c0:85:a7:fd -# SHA1 Fingerprint: c0:f8:96:c5:a9:3b:01:06:21:07:da:18:42:48:bc:e9:9d:88:d5:ec -# SHA256 Fingerprint: 57:8a:f4:de:d0:85:3f:4e:59:98:db:4a:ea:f9:cb:ea:8d:94:5f:60:b6:20:a3:8d:1a:3c:13:b2:bc:7b:a8:e1 ------BEGIN CERTIFICATE----- -MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQsw -CQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBH -bWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIw -MB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIzNTk1OVowYzELMAkGA1UEBhMCREUx -JzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkGA1UE -AwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/O -tdKPD/M12kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDP -f8iAC8GXs7s1J8nCG6NCMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6f -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cA -MGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZMo7k+5Dck2TOrbRBR2Di -z6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdUga/sf+Rn -27iQ7t0l ------END CERTIFICATE----- - -# Issuer: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH -# Subject: CN=Telekom Security TLS RSA Root 2023 O=Deutsche Telekom Security GmbH -# Label: "Telekom Security TLS RSA Root 2023" -# Serial: 44676229530606711399881795178081572759 -# MD5 Fingerprint: bf:5b:eb:54:40:cd:48:71:c4:20:8d:7d:de:0a:42:f2 -# SHA1 Fingerprint: 54:d3:ac:b3:bd:57:56:f6:85:9d:ce:e5:c3:21:e2:d4:ad:83:d0:93 -# SHA256 Fingerprint: ef:c6:5c:ad:bb:59:ad:b6:ef:e8:4d:a2:23:11:b3:56:24:b7:1b:3b:1e:a0:da:8b:66:55:17:4e:c8:97:86:46 ------BEGIN CERTIFICATE----- -MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBj -MQswCQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0 -eSBHbWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAy -MDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMyNzIzNTk1OVowYzELMAkGA1UEBhMC -REUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkG -A1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9 -cUD/h3VCKSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHV -cp6R+SPWcHu79ZvB7JPPGeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMA -U6DksquDOFczJZSfvkgdmOGjup5czQRxUX11eKvzWarE4GC+j4NSuHUaQTXtvPM6 -Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWol8hHD/BeEIvnHRz+sTug -BTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9FIS3R/qy -8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73J -co4vzLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg -8qKrBC7m8kwOFjQgrIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8 -rFEz0ciD0cmfHdRHNCk+y7AO+oMLKFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12 -mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7SWWO/gLCMk3PLNaaZlSJhZQNg -+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtqeX -gj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 -p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQ -pGv7qHBFfLp+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm -9S3ul0A8Yute1hTWjOKWi0FpkzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErw -M807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy/SKE8YXJN3nptT+/XOR0so8RYgDd -GGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4mZqTuXNnQkYRIer+ -CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtzaL1t -xKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+ -w6jv/naaoqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aK -L4x35bcF7DvB7L6Gs4a8wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+lj -X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q -ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm -dTdmQRCsu/WU48IxK63nI1bMNSWSs1A= ------END CERTIFICATE----- - -# Issuer: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA -# Subject: CN=TWCA CYBER Root CA O=TAIWAN-CA OU=Root CA -# Label: "TWCA CYBER Root CA" -# Serial: 85076849864375384482682434040119489222 -# MD5 Fingerprint: 0b:33:a0:97:52:95:d4:a9:fd:bb:db:6e:a3:55:5b:51 -# SHA1 Fingerprint: f6:b1:1c:1a:83:38:e9:7b:db:b3:a8:c8:33:24:e0:2d:9c:7f:26:66 -# SHA256 Fingerprint: 3f:63:bb:28:14:be:17:4e:c8:b6:43:9c:f0:8d:6d:56:f0:b7:c4:05:88:3a:56:48:a3:34:42:4d:6b:3e:c5:58 ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIQQAE0jMIAAAAAAAAAATzyxjANBgkqhkiG9w0BAQwFADBQ -MQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FOLUNBMRAwDgYDVQQLEwdSb290 -IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3QgQ0EwHhcNMjIxMTIyMDY1NDI5 -WhcNNDcxMTIyMTU1OTU5WjBQMQswCQYDVQQGEwJUVzESMBAGA1UEChMJVEFJV0FO -LUNBMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJUV0NBIENZQkVSIFJvb3Qg -Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDG+Moe2Qkgfh1sTs6P -40czRJzHyWmqOlt47nDSkvgEs1JSHWdyKKHfi12VCv7qze33Kc7wb3+szT3vsxxF -avcokPFhV8UMxKNQXd7UtcsZyoC5dc4pztKFIuwCY8xEMCDa6pFbVuYdHNWdZsc/ -34bKS1PE2Y2yHer43CdTo0fhYcx9tbD47nORxc5zb87uEB8aBs/pJ2DFTxnk684i -JkXXYJndzk834H/nY62wuFm40AZoNWDTNq5xQwTxaWV4fPMf88oon1oglWa0zbfu -j3ikRRjpJi+NmykosaS3Om251Bw4ckVYsV7r8Cibt4LK/c/WMw+f+5eesRycnupf -Xtuq3VTpMCEobY5583WSjCb+3MX2w7DfRFlDo7YDKPYIMKoNM+HvnKkHIuNZW0CP -2oi3aQiotyMuRAlZN1vH4xfyIutuOVLF3lSnmMlLIJXcRolftBL5hSmO68gnFSDA -S9TMfAxsNAwmmyYxpjyn9tnQS6Jk/zuZQXLB4HCX8SS7K8R0IrGsayIyJNN4KsDA -oS/xUgXJP+92ZuJF2A09rZXIx4kmyA+upwMu+8Ff+iDhcK2wZSA3M2Cw1a/XDBzC -kHDXShi8fgGwsOsVHkQGzaRP6AzRwyAQ4VRlnrZR0Bp2a0JaWHY06rc3Ga4udfmW -5cFZ95RXKSWNOkyrTZpB0F8mAwIDAQABo2MwYTAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSdhWEUfMFib5do5E83QOGt4A1WNzAd -BgNVHQ4EFgQUnYVhFHzBYm+XaORPN0DhreANVjcwDQYJKoZIhvcNAQEMBQADggIB -AGSPesRiDrWIzLjHhg6hShbNcAu3p4ULs3a2D6f/CIsLJc+o1IN1KriWiLb73y0t -tGlTITVX1olNc79pj3CjYcya2x6a4CD4bLubIp1dhDGaLIrdaqHXKGnK/nZVekZn -68xDiBaiA9a5F/gZbG0jAn/xX9AKKSM70aoK7akXJlQKTcKlTfjF/biBzysseKNn -TKkHmvPfXvt89YnNdJdhEGoHK4Fa0o635yDRIG4kqIQnoVesqlVYL9zZyvpoBJ7t -RCT5dEA7IzOrg1oYJkK2bVS1FmAwbLGg+LhBoF1JSdJlBTrq/p1hvIbZv97Tujqx -f36SNI7JAG7cmL3c7IAFrQI932XtCwP39xaEBDG6k5TY8hL4iuO/Qq+n1M0RFxbI -Qh0UqEL20kCGoE8jypZFVmAGzbdVAaYBlGX+bgUJurSkquLvWL69J1bY73NxW0Qz -8ppy6rBePm6pUlvscG21h483XjyMnM7k8M4MZ0HMzvaAq07MTFb1wWFZk7Q+ptq4 -NxKfKjLji7gh7MMrZQzvIt6IKTtM1/r+t+FHvpw+PoP7UV31aPcuIYXcv/Fa4nzX -xeSDwWrruoBa3lwtcHb4yOWHh8qgnaHlIhInD0Q9HWzq1MKLL295q39QpsQZp6F6 -t5b5wR9iWqJDB0BeJsas7a5wFsWqynKKTbDPAYsDP27X ------END CERTIFICATE----- - -# Issuer: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. -# Subject: CN=SecureSign Root CA14 O=Cybertrust Japan Co., Ltd. -# Label: "SecureSign Root CA14" -# Serial: 575790784512929437950770173562378038616896959179 -# MD5 Fingerprint: 71:0d:72:fa:92:19:65:5e:89:04:ac:16:33:f0:bc:d5 -# SHA1 Fingerprint: dd:50:c0:f7:79:b3:64:2e:74:a2:b8:9d:9f:d3:40:dd:bb:f0:f2:4f -# SHA256 Fingerprint: 4b:00:9c:10:34:49:4f:9a:b5:6b:ba:3b:a1:d6:27:31:fc:4d:20:d8:95:5a:dc:ec:10:a9:25:60:72:61:e3:38 ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIUZNtaDCBO6Ncpd8hQJ6JaJ90t8sswDQYJKoZIhvcNAQEM -BQAwUTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28u -LCBMdGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNDAeFw0yMDA0MDgw -NzA2MTlaFw00NTA0MDgwNzA2MTlaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpD -eWJlcnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBS -b290IENBMTQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDF0nqh1oq/ -FjHQmNE6lPxauG4iwWL3pwon71D2LrGeaBLwbCRjOfHw3xDG3rdSINVSW0KZnvOg -vlIfX8xnbacuUKLBl422+JX1sLrcneC+y9/3OPJH9aaakpUqYllQC6KxNedlsmGy -6pJxaeQp8E+BgQQ8sqVb1MWoWWd7VRxJq3qdwudzTe/NCcLEVxLbAQ4jeQkHO6Lo -/IrPj8BGJJw4J+CDnRugv3gVEOuGTgpa/d/aLIJ+7sr2KeH6caH3iGicnPCNvg9J -kdjqOvn90Ghx2+m1K06Ckm9mH+Dw3EzsytHqunQG+bOEkJTRX45zGRBdAuVwpcAQ -0BB8b8VYSbSwbprafZX1zNoCr7gsfXmPvkPx+SgojQlD+Ajda8iLLCSxjVIHvXib -y8posqTdDEx5YMaZ0ZPxMBoH064iwurO8YQJzOAUbn8/ftKChazcqRZOhaBgy/ac -18izju3Gm5h1DVXoX+WViwKkrkMpKBGk5hIwAUt1ax5mnXkvpXYvHUC0bcl9eQjs -0Wq2XSqypWa9a4X0dFbD9ed1Uigspf9mR6XU/v6eVL9lfgHWMI+lNpyiUBzuOIAB -SMbHdPTGrMNASRZhdCyvjG817XsYAFs2PJxQDcqSMxDxJklt33UkN4Ii1+iW/RVL -ApY+B3KVfqs9TC7XyvDf4Fg/LS8EmjijAQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUBpOjCl4oaTeqYR3r6/wtbyPk -86AwDQYJKoZIhvcNAQEMBQADggIBAJaAcgkGfpzMkwQWu6A6jZJOtxEaCnFxEM0E -rX+lRVAQZk5KQaID2RFPeje5S+LGjzJmdSX7684/AykmjbgWHfYfM25I5uj4V7Ib -ed87hwriZLoAymzvftAj63iP/2SbNDefNWWipAA9EiOWWF3KY4fGoweITedpdopT -zfFP7ELyk+OZpDc8h7hi2/DsHzc/N19DzFGdtfCXwreFamgLRB7lUe6TzktuhsHS -DCRZNhqfLJGP4xjblJUK7ZGqDpncllPjYYPGFrojutzdfhrGe0K22VoF3Jpf1d+4 -2kd92jjbrDnVHmtsKheMYc2xbXIBw8MgAGJoFjHVdqqGuw6qnsb58Nn4DSEC5MUo -FlkRudlpcyqSeLiSV5sI8jrlL5WwWLdrIBRtFO8KvH7YVdiI2i/6GaX7i+B/OfVy -K4XELKzvGUWSTLNhB9xNH27SgRNcmvMSZ4PPmz+Ln52kuaiWA3rF7iDeM9ovnhp6 -dB7h7sxaOgTdsxoEqBRjrLdHEoOabPXm6RUVkRqEGQ6UROcSjiVbgGcZ3GOTEAtl -Lor6CZpO2oYofaphNdgOpygau1LgePhsumywbrmHXumZNTfxPWQrqaA0k89jL9WB -365jJ6UeTo3cKXhZ+PmhIIynJkBugnLNeLLIjzwec+fBH7/PzqUqm9tEZDKgu39c -JRNItX+S ------END CERTIFICATE----- - -# Issuer: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. -# Subject: CN=SecureSign Root CA15 O=Cybertrust Japan Co., Ltd. -# Label: "SecureSign Root CA15" -# Serial: 126083514594751269499665114766174399806381178503 -# MD5 Fingerprint: 13:30:fc:c4:62:a6:a9:de:b5:c1:68:af:b5:d2:31:47 -# SHA1 Fingerprint: cb:ba:83:c8:c1:5a:5d:f1:f9:73:6f:ca:d7:ef:28:13:06:4a:07:7d -# SHA256 Fingerprint: e7:78:f0:f0:95:fe:84:37:29:cd:1a:00:82:17:9e:53:14:a9:c2:91:44:28:05:e1:fb:1d:8f:b6:b8:88:6c:3a ------BEGIN CERTIFICATE----- -MIICIzCCAamgAwIBAgIUFhXHw9hJp75pDIqI7fBw+d23PocwCgYIKoZIzj0EAwMw -UTELMAkGA1UEBhMCSlAxIzAhBgNVBAoTGkN5YmVydHJ1c3QgSmFwYW4gQ28uLCBM -dGQuMR0wGwYDVQQDExRTZWN1cmVTaWduIFJvb3QgQ0ExNTAeFw0yMDA0MDgwODMy -NTZaFw00NTA0MDgwODMyNTZaMFExCzAJBgNVBAYTAkpQMSMwIQYDVQQKExpDeWJl -cnRydXN0IEphcGFuIENvLiwgTHRkLjEdMBsGA1UEAxMUU2VjdXJlU2lnbiBSb290 -IENBMTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQLUHSNZDKZmbPSYAi4Io5GdCx4 -wCtELW1fHcmuS1Iggz24FG1Th2CeX2yF2wYUleDHKP+dX+Sq8bOLbe1PL0vJSpSR -ZHX+AezB2Ot6lHhWGENfa4HL9rzatAy2KZMIaY+jQjBAMA8GA1UdEwEB/wQFMAMB -Af8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTrQciu/NWeUUj1vYv0hyCTQSvT -9DAKBggqhkjOPQQDAwNoADBlAjEA2S6Jfl5OpBEHvVnCB96rMjhTKkZEBhd6zlHp -4P9mLQlO4E/0BdGF9jVg3PVys0Z9AjBEmEYagoUeYWmJSwdLZrWeqrqgHkHZAXQ6 -bkU6iYAZezKYVWOr62Nuk22rGwlgMU4= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH -# Subject: CN=D-TRUST BR Root CA 2 2023 O=D-Trust GmbH -# Label: "D-TRUST BR Root CA 2 2023" -# Serial: 153168538924886464690566649552453098598 -# MD5 Fingerprint: e1:09:ed:d3:60:d4:56:1b:47:1f:b7:0c:5f:1b:5f:85 -# SHA1 Fingerprint: 2d:b0:70:ee:71:94:af:69:68:17:db:79:ce:58:9f:a0:6b:96:f7:87 -# SHA256 Fingerprint: 05:52:e6:f8:3f:df:65:e8:fa:96:70:e6:66:df:28:a4:e2:13:40:b5:10:cb:e5:25:66:f9:7c:4f:b9:4b:2b:d1 ------BEGIN CERTIFICATE----- -MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBI -MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE -LVRSVVNUIEJSIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUw -OTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi -MCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCTcfKr -i3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNE -gXtRr90zsWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8 -k12b9py0i4a6Ibn08OhZWiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCT -Rphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl -2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LULQyReS2tNZ9/WtT5PeB+U -cSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIvx9gvdhFP -/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bS -uREVMweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+ -0bpwHJwh5Q8xaRfX/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4N -DfTisl01gLmB1IRpkQLLddCNxbU9CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+ -XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUZ5Dw1t61 -GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG -OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y -XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tI -FoE9c+CeJyrrd6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67n -riv6uvw8l5VAk1/DLQOj7aRvU9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTR -VFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4nj8+AybmTNudX0KEPUUDAxxZiMrc -LmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdijYQ6qgYF/6FKC0ULn -4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff/vtD -hQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsG -koHU6XCPpz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46 -ls/pdu4D58JDUjxqgejBWoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aS -Ecr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/5usWDiJFAbzdNpQ0qTUmiteXue4Icr80 -knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jtn/mtd+ArY0+ew+43u3gJ -hJ65bvspmZDogNOfJA== ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia TLS ECC Root CA O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia TLS ECC Root CA O=TrustAsia Technologies, Inc. -# Label: "TrustAsia TLS ECC Root CA" -# Serial: 310892014698942880364840003424242768478804666567 -# MD5 Fingerprint: 09:48:04:77:d2:fc:65:93:71:66:b1:11:95:4f:06:8c -# SHA1 Fingerprint: b5:ec:39:f3:a1:66:37:ae:c3:05:94:57:e2:be:11:be:b7:a1:7f:36 -# SHA256 Fingerprint: c0:07:6b:9e:f0:53:1f:b1:a6:56:d6:7c:4e:be:97:cd:5d:ba:a4:1e:f4:45:98:ac:c2:48:98:78:c9:2d:87:11 ------BEGIN CERTIFICATE----- -MIICMTCCAbegAwIBAgIUNnThTXxlE8msg1UloD5Sfi9QaMcwCgYIKoZIzj0EAwMw -WDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dpZXMs -IEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgRUNDIFJvb3QgQ0EwHhcNMjQw -NTE1MDU0MTU2WhcNNDQwNTE1MDU0MTU1WjBYMQswCQYDVQQGEwJDTjElMCMGA1UE -ChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAGA1UEAxMZVHJ1c3RB -c2lhIFRMUyBFQ0MgUm9vdCBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABLh/pVs/ -AT598IhtrimY4ZtcU5nb9wj/1WrgjstEpvDBjL1P1M7UiFPoXlfXTr4sP/MSpwDp -guMqWzJ8S5sUKZ74LYO1644xST0mYekdcouJtgq7nDM1D9rs3qlKH8kzsaNCMEAw -DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQULIVTu7FDzTLqnqOH/qKYqKaT6RAw -DgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMFRH18MtYYZI9HlaVQ01 -L18N9mdsd0AaRuf4aFtOJx24mH1/k78ITcTaRTChD15KeAIxAKORh/IRM4PDwYqR -OkwrULG9IpRdNYlzg8WbGf60oenUoWa2AaU2+dhoYSi3dOGiMQ== ------END CERTIFICATE----- - -# Issuer: CN=TrustAsia TLS RSA Root CA O=TrustAsia Technologies, Inc. -# Subject: CN=TrustAsia TLS RSA Root CA O=TrustAsia Technologies, Inc. -# Label: "TrustAsia TLS RSA Root CA" -# Serial: 160405846464868906657516898462547310235378010780 -# MD5 Fingerprint: 3b:9e:c3:86:0f:34:3c:6b:c5:46:c4:8e:1d:e7:19:12 -# SHA1 Fingerprint: a5:46:50:c5:62:ea:95:9a:1a:a7:04:6f:17:58:c7:29:53:3d:03:fa -# SHA256 Fingerprint: 06:c0:8d:7d:af:d8:76:97:1e:b1:12:4f:e6:7f:84:7e:c0:c7:a1:58:d3:ea:53:cb:e9:40:e2:ea:97:91:f4:c3 ------BEGIN CERTIFICATE----- -MIIFgDCCA2igAwIBAgIUHBjYz+VTPyI1RlNUJDxsR9FcSpwwDQYJKoZIhvcNAQEM -BQAwWDELMAkGA1UEBhMCQ04xJTAjBgNVBAoTHFRydXN0QXNpYSBUZWNobm9sb2dp -ZXMsIEluYy4xIjAgBgNVBAMTGVRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EwHhcN -MjQwNTE1MDU0MTU3WhcNNDQwNTE1MDU0MTU2WjBYMQswCQYDVQQGEwJDTjElMCMG -A1UEChMcVHJ1c3RBc2lhIFRlY2hub2xvZ2llcywgSW5jLjEiMCAGA1UEAxMZVHJ1 -c3RBc2lhIFRMUyBSU0EgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC -AgoCggIBAMMWuBtqpERz5dZO9LnPWwvB0ZqB9WOwj0PBuwhaGnrhB3YmH49pVr7+ -NmDQDIPNlOrnxS1cLwUWAp4KqC/lYCZUlviYQB2srp10Zy9U+5RjmOMmSoPGlbYJ -Q1DNDX3eRA5gEk9bNb2/mThtfWza4mhzH/kxpRkQcwUqwzIZheo0qt1CHjCNP561 -HmHVb70AcnKtEj+qpklz8oYVlQwQX1Fkzv93uMltrOXVmPGZLmzjyUT5tUMnCE32 -ft5EebuyjBza00tsLtbDeLdM1aTk2tyKjg7/D8OmYCYozza/+lcK7Fs/6TAWe8Tb -xNRkoDD75f0dcZLdKY9BWN4ArTr9PXwaqLEX8E40eFgl1oUh63kd0Nyrz2I8sMeX -i9bQn9P+PN7F4/w6g3CEIR0JwqH8uyghZVNgepBtljhb//HXeltt08lwSUq6HTrQ -UNoyIBnkiz/r1RYmNzz7dZ6wB3C4FGB33PYPXFIKvF1tjVEK2sUYyJtt3LCDs3+j -TnhMmCWr8n4uIF6CFabW2I+s5c0yhsj55NqJ4js+k8UTav/H9xj8Z7XvGCxUq0DT -bE3txci3OE9kxJRMT6DNrqXGJyV1J23G2pyOsAWZ1SgRxSHUuPzHlqtKZFlhaxP8 -S8ySpg+kUb8OWJDZgoM5pl+z+m6Ss80zDoWo8SnTq1mt1tve1CuBAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLgHkXlcBvRG/XtZylomkadFK/hT -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQwFAAOCAgEAIZtqBSBdGBanEqT3 -Rz/NyjuujsCCztxIJXgXbODgcMTWltnZ9r96nBO7U5WS/8+S4PPFJzVXqDuiGev4 -iqME3mmL5Dw8veWv0BIb5Ylrc5tvJQJLkIKvQMKtuppgJFqBTQUYo+IzeXoLH5Pt -7DlK9RME7I10nYEKqG/odv6LTytpEoYKNDbdgptvT+Bz3Ul/KD7JO6NXBNiT2Twp -2xIQaOHEibgGIOcberyxk2GaGUARtWqFVwHxtlotJnMnlvm5P1vQiJ3koP26TpUJ -g3933FEFlJ0gcXax7PqJtZwuhfG5WyRasQmr2soaB82G39tp27RIGAAtvKLEiUUj -pQ7hRGU+isFqMB3iYPg6qocJQrmBktwliJiJ8Xw18WLK7nn4GS/+X/jbh87qqA8M -pugLoDzga5SYnH+tBuYc6kIQX+ImFTw3OffXvO645e8D7r0i+yiGNFjEWn9hongP -XvPKnbwbPKfILfanIhHKA9jnZwqKDss1jjQ52MjqjZ9k4DewbNfFj8GQYSbbJIwe -SsCI3zWQzj8C9GRh3sfIB5XeMhg6j6JCQCTl1jNdfK7vsU1P1FeQNWrcrgSXSYk0 -ly4wBOeY99sLAZDBHwo/+ML+TvrbmnNzFrwFuHnYWa8G5z9nODmxfKuU4CkUpijy -323imttUQ/hHWKNddBWcwauwxzQ= ------END CERTIFICATE----- - -# Issuer: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH -# Subject: CN=D-TRUST EV Root CA 2 2023 O=D-Trust GmbH -# Label: "D-TRUST EV Root CA 2 2023" -# Serial: 139766439402180512324132425437959641711 -# MD5 Fingerprint: 96:b4:78:09:f0:09:cb:77:eb:bb:1b:4d:6f:36:bc:b6 -# SHA1 Fingerprint: a5:5b:d8:47:6c:8f:19:f7:4c:f4:6d:6b:b6:c2:79:82:22:df:54:8b -# SHA256 Fingerprint: 8e:82:21:b2:e7:d4:00:78:36:a1:67:2f:0d:cc:29:9c:33:bc:07:d3:16:f1:32:fa:1a:20:6d:58:71:50:f1:ce ------BEGIN CERTIFICATE----- -MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBI -MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE -LVRSVVNUIEVWIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUw -OTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi -MCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN -AQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1sJkK -F8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE -7CUXFId/MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFe -EMbsh2aJgWi6zCudR3Mfvc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6 -lHPTGGkKSv/BAQP/eX+1SH977ugpbzZMlWGG2Pmic4ruri+W7mjNPU0oQvlFKzIb -RlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3YG14C8qKXO0elg6DpkiV -jTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq9107PncjLgc -jmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZx -TnXonMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+ -ARZZaBhDM7DS3LAaQzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nk -hbDhezGdpn9yo7nELC7MmVcOIQxFAZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knF -NXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqvyREBuH -kV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG -OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y -XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14 -QvBukEdHjqOSMo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4 -pZt+UPJ26oUFKidBK7GB0aL2QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q -3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xDUmPBEcrCRbH0O1P1aa4846XerOhU -t7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V4U/M5d40VxDJI3IX -cI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuodNv8 -ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT -2vFp4LJiTZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs -7dpn1mKmS00PaaLJvOwiS5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNP -gofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAst -Nl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L+KIkBI3Y4WNeApI02phh -XBxvWHZks/wCuPWdCg== ------END CERTIFICATE----- - -# Issuer: CN=SwissSign RSA TLS Root CA 2022 - 1 O=SwissSign AG -# Subject: CN=SwissSign RSA TLS Root CA 2022 - 1 O=SwissSign AG -# Label: "SwissSign RSA TLS Root CA 2022 - 1" -# Serial: 388078645722908516278762308316089881486363258315 -# MD5 Fingerprint: 16:2e:e4:19:76:81:85:ba:8e:91:58:f1:15:ef:72:39 -# SHA1 Fingerprint: 81:34:0a:be:4c:cd:ce:cc:e7:7d:cc:8a:d4:57:e2:45:a0:77:5d:ce -# SHA256 Fingerprint: 19:31:44:f4:31:e0:fd:db:74:07:17:d4:de:92:6a:57:11:33:88:4b:43:60:d3:0e:27:29:13:cb:e6:60:ce:41 ------BEGIN CERTIFICATE----- -MIIFkzCCA3ugAwIBAgIUQ/oMX04bgBhE79G0TzUfRPSA7cswDQYJKoZIhvcNAQEL -BQAwUTELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzErMCkGA1UE -AxMiU3dpc3NTaWduIFJTQSBUTFMgUm9vdCBDQSAyMDIyIC0gMTAeFw0yMjA2MDgx -MTA4MjJaFw00NzA2MDgxMTA4MjJaMFExCzAJBgNVBAYTAkNIMRUwEwYDVQQKEwxT -d2lzc1NpZ24gQUcxKzApBgNVBAMTIlN3aXNzU2lnbiBSU0EgVExTIFJvb3QgQ0Eg -MjAyMiAtIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDLKmjiC8NX -vDVjvHClO/OMPE5Xlm7DTjak9gLKHqquuN6orx122ro10JFwB9+zBvKK8i5VUXu7 -LCTLf5ImgKO0lPaCoaTo+nUdWfMHamFk4saMla+ju45vVs9xzF6BYQ1t8qsCLqSX -5XH8irCRIFucdFJtrhUnWXjyCcplDn/L9Ovn3KlMd/YrFgSVrpxxpT8q2kFC5zyE -EPThPYxr4iuRR1VPuFa+Rd4iUU1OKNlfGUEGjw5NBuBwQCMBauTLE5tzrE0USJIt -/m2n+IdreXXhvhCxqohAWVTXz8TQm0SzOGlkjIHRI36qOTw7D59Ke4LKa2/KIj4x -0LDQKhySio/YGZxH5D4MucLNvkEM+KRHBdvBFzA4OmnczcNpI/2aDwLOEGrOyvi5 -KaM2iYauC8BPY7kGWUleDsFpswrzd34unYyzJ5jSmY0lpx+Gs6ZUcDj8fV3oT4MM -0ZPlEuRU2j7yrTrePjxF8CgPBrnh25d7mUWe3f6VWQQvdT/TromZhqwUtKiE+shd -OxtYk8EXlFXIC+OCeYSf8wCENO7cMdWP8vpPlkwGqnj73mSiI80fPsWMvDdUDrta -clXvyFu1cvh43zcgTFeRc5JzrBh3Q4IgaezprClG5QtO+DdziZaKHG29777YtvTK -wP1H8K4LWCDFyB02rpeNUIMmJCn3nTsPBQIDAQABo2MwYTAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBRvjmKLk0Ow4UD2p8P98Q+4 -DxU4pTAdBgNVHQ4EFgQUb45ii5NDsOFA9qfD/fEPuA8VOKUwDQYJKoZIhvcNAQEL -BQADggIBAKwsKUF9+lz1GpUYvyypiqkkVHX1uECry6gkUSsYP2OprphWKwVDIqO3 -10aewCoSPY6WlkDfDDOLazeROpW7OSltwAJsipQLBwJNGD77+3v1dj2b9l4wBlgz -Hqp41eZUBDqyggmNzhYzWUUo8aWjlw5DI/0LIICQ/+Mmz7hkkeUFjxOgdg3XNwwQ -iJb0Pr6VvfHDffCjw3lHC1ySFWPtUnWK50Zpy1FVCypM9fJkT6lc/2cyjlUtMoIc -gC9qkfjLvH4YoiaoLqNTKIftV+Vlek4ASltOU8liNr3CjlvrzG4ngRhZi0Rjn9UM -ZfQpZX+RLOV/fuiJz48gy20HQhFRJjKKLjpHE7iNvUcNCfAWpO2Whi4Z2L6MOuhF -LhG6rlrnub+xzI/goP+4s9GFe3lmozm1O2bYQL7Pt2eLSMkZJVX8vY3PXtpOpvJp -zv1/THfQwUY1mFwjmwJFQ5Ra3bxHrSL+ul4vkSkphnsh3m5kt8sNjzdbowhq6/Td -Ao9QAwKxuDdollDruF/UKIqlIgyKhPBZLtU30WHlQnNYKoH3dtvi4k0NX/a3vgW0 -rk4N3hY9A4GzJl5LuEsAz/+MF7psYC0nhzck5npgL7XTgwSqT0N1osGDsieYK7EO -gLrAhV5Cud+xYJHT6xh+cHiudoO+cVrQkOPKwRYlZ0rwtnu64ZzZ ------END CERTIFICATE----- - -# Issuer: CN=OISTE Server Root ECC G1 O=OISTE Foundation -# Subject: CN=OISTE Server Root ECC G1 O=OISTE Foundation -# Label: "OISTE Server Root ECC G1" -# Serial: 47819833811561661340092227008453318557 -# MD5 Fingerprint: 42:a7:d2:35:ae:02:92:db:19:76:08:de:2f:05:b4:d4 -# SHA1 Fingerprint: 3b:f6:8b:09:ae:2a:92:7b:ba:e3:8d:3f:11:95:d9:e6:44:0c:45:e2 -# SHA256 Fingerprint: ee:c9:97:c0:c3:0f:21:6f:7e:3b:8b:30:7d:2b:ae:42:41:2d:75:3f:c8:21:9d:af:d1:52:0b:25:72:85:0f:49 ------BEGIN CERTIFICATE----- -MIICNTCCAbqgAwIBAgIQI/nD1jWvjyhLH/BU6n6XnTAKBggqhkjOPQQDAzBLMQsw -CQYDVQQGEwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UEAwwY -T0lTVEUgU2VydmVyIFJvb3QgRUNDIEcxMB4XDTIzMDUzMTE0NDIyOFoXDTQ4MDUy -NDE0NDIyN1owSzELMAkGA1UEBhMCQ0gxGTAXBgNVBAoMEE9JU1RFIEZvdW5kYXRp -b24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IEVDQyBHMTB2MBAGByqGSM49 -AgEGBSuBBAAiA2IABBcv+hK8rBjzCvRE1nZCnrPoH7d5qVi2+GXROiFPqOujvqQy -cvO2Ackr/XeFblPdreqqLiWStukhEaivtUwL85Zgmjvn6hp4LrQ95SjeHIC6XG4N -2xml4z+cKrhAS93mT6NjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBQ3 -TYhlz/w9itWj8UnATgwQb0K0nDAdBgNVHQ4EFgQUN02IZc/8PYrVo/FJwE4MEG9C -tJwwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2kAMGYCMQCpKjAd0MKfkFFR -QD6VVCHNFmb3U2wIFjnQEnx/Yxvf4zgAOdktUyBFCxxgZzFDJe0CMQCSia7pXGKD -YmH5LVerVrkR3SW+ak5KGoJr3M/TvEqzPNcum9v4KGm8ay3sMaE641c= ------END CERTIFICATE----- - -# Issuer: CN=OISTE Server Root RSA G1 O=OISTE Foundation -# Subject: CN=OISTE Server Root RSA G1 O=OISTE Foundation -# Label: "OISTE Server Root RSA G1" -# Serial: 113845518112613905024960613408179309848 -# MD5 Fingerprint: 23:a7:9e:d4:70:b8:b9:14:57:41:8a:7e:44:59:e2:68 -# SHA1 Fingerprint: f7:00:34:25:94:88:68:31:e4:34:87:3f:70:fe:86:b3:86:9f:f0:6e -# SHA256 Fingerprint: 9a:e3:62:32:a5:18:9f:fd:db:35:3d:fd:26:52:0c:01:53:95:d2:27:77:da:c5:9d:b5:7b:98:c0:89:a6:51:e6 ------BEGIN CERTIFICATE----- -MIIFgzCCA2ugAwIBAgIQVaXZZ5Qoxu0M+ifdWwFNGDANBgkqhkiG9w0BAQwFADBL -MQswCQYDVQQGEwJDSDEZMBcGA1UECgwQT0lTVEUgRm91bmRhdGlvbjEhMB8GA1UE -AwwYT0lTVEUgU2VydmVyIFJvb3QgUlNBIEcxMB4XDTIzMDUzMTE0MzcxNloXDTQ4 -MDUyNDE0MzcxNVowSzELMAkGA1UEBhMCQ0gxGTAXBgNVBAoMEE9JU1RFIEZvdW5k -YXRpb24xITAfBgNVBAMMGE9JU1RFIFNlcnZlciBSb290IFJTQSBHMTCCAiIwDQYJ -KoZIhvcNAQEBBQADggIPADCCAgoCggIBAKqu9KuCz/vlNwvn1ZatkOhLKdxVYOPM -vLO8LZK55KN68YG0nnJyQ98/qwsmtO57Gmn7KNByXEptaZnwYx4M0rH/1ow00O7b -rEi56rAUjtgHqSSY3ekJvqgiG1k50SeH3BzN+Puz6+mTeO0Pzjd8JnduodgsIUzk -ik/HEzxux9UTl7Ko2yRpg1bTacuCErudG/L4NPKYKyqOBGf244ehHa1uzjZ0Dl4z -O8vbUZeUapU8zhhabkvG/AePLhq5SvdkNCncpo1Q4Y2LS+VIG24ugBA/5J8bZT8R -tOpXaZ+0AOuFJJkk9SGdl6r7NH8CaxWQrbueWhl/pIzY+m0o/DjH40ytas7ZTpOS -jswMZ78LS5bOZmdTaMsXEY5Z96ycG7mOaES3GK/m5Q9l3JUJsJMStR8+lKXHiHUh -sd4JJCpM4rzsTGdHwimIuQq6+cF0zowYJmXa92/GjHtoXAvuY8BeS/FOzJ8vD+Ho -mnqT8eDI278n5mUpezbgMxVz8p1rhAhoKzYHKyfMeNhqhw5HdPSqoBNdZH702xSu -+zrkL8Fl47l6QGzwBrd7KJvX4V84c5Ss2XCTLdyEr0YconosP4EmQufU2MVshGYR -i3drVByjtdgQ8K4p92cIiBdcuJd5z+orKu5YM+Vt6SmqZQENghPsJQtdLEByFSnT -kCz3GkPVavBpAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU -8snBDw1jALvsRQ5KH7WxszbNDo0wHQYDVR0OBBYEFPLJwQ8NYwC77EUOSh+1sbM2 -zQ6NMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQwFAAOCAgEANGd5sjrG5T33 -I3K5Ce+SrScfoE4KsvXaFwyihdJ+klH9FWXXXGtkFu6KRcoMQzZENdl//nk6HOjG -5D1rd9QhEOP28yBOqb6J8xycqd+8MDoX0TJD0KqKchxRKEzdNsjkLWd9kYccnbz8 -qyiWXmFcuCIzGEgWUOrKL+mlSdx/PKQZvDatkuK59EvV6wit53j+F8Bdh3foZ3dP -AGav9LEDOr4SfEE15fSmG0eLy3n31r8Xbk5l8PjaV8GUgeV6Vg27Rn9vkf195hfk -gSe7BYhW3SCl95gtkRlpMV+bMPKZrXJAlszYd2abtNUOshD+FKrDgHGdPY3ofRRs -YWSGRqbXVMW215AWRqWFyp464+YTFrYVI8ypKVL9AMb2kI5Wj4kI3Zaq5tNqqYY1 -9tVFeEJKRvwDyF7YZvZFZSS0vod7VSCd9521Kvy5YhnLbDuv0204bKt7ph6N/Ome -/msVuduCmsuY33OhkKCgxeDoAaijFJzIwZqsFVAzje18KotzlUBDJvyBpCpfOZC3 -J8tRd/iWkx7P8nd9H0aTolkelUTFLXVksNb54Dxp6gS1HAviRkRNQzuXSXERvSS2 -wq1yVAb+axj5d9spLFKebXd7Yv0PTY6YMjAwcRLWJTXjn/hvnLXrahut6hDTlhZy -BiElxky8j3C7DOReIoMt0r7+hVu05L0= ------END CERTIFICATE----- - -# Issuer: CN=e-Szigno TLS Root CA 2023 O=Microsec Ltd. -# Subject: CN=e-Szigno TLS Root CA 2023 O=Microsec Ltd. -# Label: "e-Szigno TLS Root CA 2023" -# Serial: 71934828665710877219916191754 -# MD5 Fingerprint: 6a:e9:99:74:a5:da:5e:f1:d9:2e:f2:c8:d1:86:8b:71 -# SHA1 Fingerprint: 6f:9a:d5:d5:df:e8:2c:eb:be:37:07:ee:4f:4f:52:58:29:41:d1:fe -# SHA256 Fingerprint: b4:91:41:50:2d:00:66:3d:74:0f:2e:7e:c3:40:c5:28:00:96:26:66:12:1a:36:d0:9c:f7:dd:2b:90:38:4f:b4 ------BEGIN CERTIFICATE----- -MIICzzCCAjGgAwIBAgINAOhvGHvWOWuYSkmYCjAKBggqhkjOPQQDBDB1MQswCQYD -VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0 -ZC4xFzAVBgNVBGEMDlZBVEhVLTIzNTg0NDk3MSIwIAYDVQQDDBllLVN6aWdubyBU -TFMgUm9vdCBDQSAyMDIzMB4XDTIzMDcxNzE0MDAwMFoXDTM4MDcxNzE0MDAwMFow -dTELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRYwFAYDVQQKDA1NaWNy -b3NlYyBMdGQuMRcwFQYDVQRhDA5WQVRIVS0yMzU4NDQ5NzEiMCAGA1UEAwwZZS1T -emlnbm8gVExTIFJvb3QgQ0EgMjAyMzCBmzAQBgcqhkjOPQIBBgUrgQQAIwOBhgAE -AGgP36J8PKp0iGEKjcJMpQEiFNT3YHdCnAo4YKGMZz6zY+n6kbCLS+Y53wLCMAFS -AL/fjO1ZrTJlqwlZULUZwmgcAOAFX9pQJhzDrAQixTpN7+lXWDajwRlTEArRzT/v -SzUaQ49CE0y5LBqcvjC2xN7cS53kpDzLLtmt3999Cd8ukv+ho2MwYTAPBgNVHRMB -Af8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUWYQCYlpGePVd3I8K -ECgj3NXW+0UwHwYDVR0jBBgwFoAUWYQCYlpGePVd3I8KECgj3NXW+0UwCgYIKoZI -zj0EAwQDgYsAMIGHAkIBLdqu9S54tma4n7Zwf2Z0z+yOfP7AAXmazlIC58PRDHpt -y7Ve7hekm9sEdu4pKeiv+62sUvTXK9Z3hBC9xdIoaDQCQTV2WnXzkoYI9bIeCvZl -C9p2x1L/Cx6AcCIwwzPbGO2E14vs7dOoY4G1VnxHx1YwlGhza9IuqbnZLBwpvQy6 -uWWL ------END CERTIFICATE----- - -# Issuer: CN=SECOM TLS RSA Root CA 2024 O=SECOM Trust Systems Co., Ltd. -# Subject: CN=SECOM TLS RSA Root CA 2024 O=SECOM Trust Systems Co., Ltd. -# Label: "SECOM TLS RSA Root CA 2024" -# Serial: 17188327524208271538 -# MD5 Fingerprint: d0:a4:db:32:eb:44:98:d2:62:0b:3e:bc:4d:7c:5c:e9 -# SHA1 Fingerprint: fb:97:96:7c:ef:8d:98:63:06:c0:3b:b6:11:f8:e0:13:97:a2:98:d3 -# SHA256 Fingerprint: 14:35:f2:25:c5:d2:52:d7:a2:19:48:cc:3c:e6:2a:ec:fa:88:00:1e:3d:d7:2d:1c:c3:55:51:00:eb:37:2f:93 ------BEGIN CERTIFICATE----- -MIIFmjCCA4KgAwIBAgIJAO6JNNDLgOCyMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNV -BAYTAkpQMSYwJAYDVQQKEx1TRUNPTSBUcnVzdCBTeXN0ZW1zIENvLiwgTHRkLjEj -MCEGA1UEAxMaU0VDT00gVExTIFJTQSBSb290IENBIDIwMjQwHhcNMjQwMTMxMDUx -MTU1WhcNNDkwMTE0MDUxMTU1WjBaMQswCQYDVQQGEwJKUDEmMCQGA1UEChMdU0VD -T00gVHJ1c3QgU3lzdGVtcyBDby4sIEx0ZC4xIzAhBgNVBAMTGlNFQ09NIFRMUyBS -U0EgUm9vdCBDQSAyMDI0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA -4TjizUwzxbInq8Tx11gaFYNk5fO+34y7TyM4neh0UgL5JIZbJNLTz2x//L/B71+5 -m6X6nGIr7d4lFJBGtjO677hXOz93zkcWaUTm3VbOAjBlt4YWxlcccBHXuZ7o3Q+4 -R+ormrBdHeJ1CTUEG8ttQbKIl3G7OZYbnH8/pP8cjPub/0kDVNuMzp7xsVRROOis -Qt53fMoJLlYgoebbuMphOqMCtjkJ7R6efEMfLp8UAVi9ZaLRn76ET/CJkk925ndu -uufC4BatS4mnXFmxN0vUXb0ij9B8O/D8gixQEsVSD4GK8FWRPh3bVd/6bzdkHGJj -y21XI0yejVomZUbRrOfNuz0boPGV1pt18fFC39IHQEth3OFqb5NDO3L+A9bNqTgA -yUgRmIn4ucgDc/Ri/Km3V51ueZjy1/yk0qwJVadAVVrCt56iNeXOyEvzJADGgDQ8 -E1Pdaqct8Cynz/47ReQM62vFYO08wcQkrjmX/tesiko1V1yyaf6EfPzUFzmaGy9x -vkCwdbm15EdTolOjE0H2Vb5/APDOyCFEokiYGmXTLdAUl0wKZ4IyjkHGzy0jhpaX -EXE/GJcEvI6VzEchjaBL03EJ0h9pG4OqeIOycKvAo3A+TbetyfsrgYyHzU0a7/qU -jGat1AAq1nVljMpKqpinPTsf/d9H39FTUeJL7TpzzjUCAwEAAaNjMGEwHQYDVR0O -BBYEFCzrchKOWHdkNRVWNQFXB6l9DTbmMB8GA1UdIwQYMBaAFCzrchKOWHdkNRVW -NQFXB6l9DTbmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBDAUAA4ICAQAVwsvluSafaez5tFPR/hRTBzRxEyMMQF3XJXCVi3yegZyK -oec7hmE6jx2ZM8KgM1kn2yJRwFXHX8zUW9nBLEDWc4wuE8LrlZqhGZM9pJQXGmGz -ResDJV6JgRBna+j4sA1M7yIdlvL0sAfFXFCTRaWTD4E1V99RLrFzWfTcC+e180hD -uNMpqOEo46+lMeW/Wvh7ifOQs+kiK0O2gHxQDNxslSavnCs4V7l8HRDJ2La10o70 -Bo7VLzf1W8MBvv0VTnxB+NjT5qTAbhGFh9Gvp4BaJpmdUf0C5CEP6dbQlfgxWfzY -r69yVT6dPQB+GFEaY03IMY+AcBCs+om1fNxrQXt9zoofMBNFbLhvpNH/JsXWdGUz -fNbO12uswTa5wah8LB18FTQN2/zPHYmvBEoLuyUgZ09VNLJo5YA0kXItVYkLjMe2 -SixzK4scUHv81IK99I91DWx7FwMVKw2xgFp+ZLYB2dnpQQrqwlW64glHUcK2N9BD -snjLSxeZ+UPECh9RxH4WAcKiZW+cqaKMmhP2WBfR4IcR7NOL32ml11ds87hhV1CZ -WWFCJAcCidYZz6CZa8exzHojP9SB5RH0/v1KdHAisqhSjtJl/UIAHIQ48elOn8wr -TdFap4Yb5aHglmMeNx+fAIhDluWVfxTO7H4dTPU+SFVRMLAh+wwKZfqb94nMeQ== ------END CERTIFICATE----- - -# Issuer: CN=SECOM TLS ECC Root CA 2024 O=SECOM Trust Systems Co., Ltd. -# Subject: CN=SECOM TLS ECC Root CA 2024 O=SECOM Trust Systems Co., Ltd. -# Label: "SECOM TLS ECC Root CA 2024" -# Serial: 9329818985461676612 -# MD5 Fingerprint: 99:d3:9d:e4:d2:b1:2d:f0:2a:04:67:85:f3:df:46:d6 -# SHA1 Fingerprint: 7a:1f:22:2d:72:b2:c3:19:87:44:db:61:69:e8:a6:4b:d7:0d:44:0e -# SHA256 Fingerprint: 6a:b2:ab:75:f5:1c:b4:f4:f0:15:62:03:fb:f6:f6:46:23:2f:51:4b:e0:59:f6:28:33:30:8b:82:b4:d7:2d:b1 ------BEGIN CERTIFICATE----- -MIICTDCCAdGgAwIBAgIJAIF6LO+PI3pEMAoGCCqGSM49BAMDMFoxCzAJBgNVBAYT -AkpQMSYwJAYDVQQKEx1TRUNPTSBUcnVzdCBTeXN0ZW1zIENvLiwgTHRkLjEjMCEG -A1UEAxMaU0VDT00gVExTIEVDQyBSb290IENBIDIwMjQwHhcNMjQwMTMxMDU1MjM0 -WhcNNDkwMTE0MDU1MjM0WjBaMQswCQYDVQQGEwJKUDEmMCQGA1UEChMdU0VDT00g -VHJ1c3QgU3lzdGVtcyBDby4sIEx0ZC4xIzAhBgNVBAMTGlNFQ09NIFRMUyBFQ0Mg -Um9vdCBDQSAyMDI0MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE7NzFMtu9dzQXSNC1 -2fabk0+GlC5finB3R7XaZonRUd20aFiWObtuNBCLUZSfk6QXAE55BjEXsXQ/NG8y -UqicXjsu9ksDK3JZBgCwLOVh6+nwJXTvso/dEj/GUYH5mBdoo2MwYTAdBgNVHQ4E -FgQUO3YReyl04k4GTFaCQNAhL3qzydUwHwYDVR0jBBgwFoAUO3YReyl04k4GTFaC -QNAhL3qzydUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wCgYIKoZI -zj0EAwMDaQAwZgIxAN3ib8fi1pMYtAPjMilB5e5/H+t5CL0xPL+cZ5oTTZuSCjpA -n1v7F/VAr8bFxQXAowIxAKsBVO1ACFp7skwzPvdv1EUY5a897WGLT4lb+bjxFAWy -l8wDcZJdwGZ/pAHxt1AJ1g== ------END CERTIFICATE----- - -# Issuer: CN=Telia EC TLS Root CA v3 O=Telia Company AB -# Subject: CN=Telia EC TLS Root CA v3 O=Telia Company AB -# Label: "Telia EC TLS Root CA v3" -# Serial: 8028200332079443110287896228123317 -# MD5 Fingerprint: b6:fa:6a:5c:42:fb:c5:67:72:c0:e0:2f:72:fb:5a:44 -# SHA1 Fingerprint: b4:d6:07:c2:a5:95:bc:5b:f4:67:4d:c9:dc:6f:6f:0a:00:7a:a5:35 -# SHA256 Fingerprint: 09:8e:08:a9:1d:bb:f7:74:78:b9:6c:ce:b8:9b:14:13:a5:da:37:b7:c8:62:60:6a:95:5d:eb:07:17:9f:43:26 ------BEGIN CERTIFICATE----- -MIICMjCCAbegAwIBAgIPAYvSIlRjTQSLbOVHH9K1MAoGCCqGSM49BAMDMEoxCzAJ -BgNVBAYTAlNFMRkwFwYDVQQKDBBUZWxpYSBDb21wYW55IEFCMSAwHgYDVQQDDBdU -ZWxpYSBFQyBUTFMgUm9vdCBDQSB2MzAeFw0yMzExMTUwODU1MjZaFw00ODA1MjMx -MTAwMDBaMEoxCzAJBgNVBAYTAlNFMRkwFwYDVQQKDBBUZWxpYSBDb21wYW55IEFC -MSAwHgYDVQQDDBdUZWxpYSBFQyBUTFMgUm9vdCBDQSB2MzB2MBAGByqGSM49AgEG -BSuBBAAiA2IABMHIlhVDLbmFKUpW0iK4dpryT6emYOeS31JPwWnWPmkWRrAkTbPX -40sQfHI9mpR7Rbktu3ngg6W+BBSXSechtMCnBmWXj/EaVlmV5cY1jD2HoTfhBQ3A -acpCNMLJK4NpZaNjMGEwHwYDVR0jBBgwFoAU1GToQ4g6cy/QGnGCNgtehd7H3kMw -HQYDVR0OBBYEFNRk6EOIOnMv0BpxgjYLXoXex95DMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2kAMGYCMQCXAUdS/9bbJ8A1JYaG -f/bWt/s7Ta0ot5Ulno8OjSNYRWQIlS4tVWldvTAVA7heOFgCMQCvKr8+Z2Rn+OBr -5UHzlgBObpad1LuwNTRcdNgUJxIWadcki+UBLEi1/AURKV5md2M= ------END CERTIFICATE----- - -# Issuer: CN=Telia RSA TLS Root CA v3 O=Telia Company AB -# Subject: CN=Telia RSA TLS Root CA v3 O=Telia Company AB -# Label: "Telia RSA TLS Root CA v3" -# Serial: 8028214673410753541795188766939845 -# MD5 Fingerprint: f4:8b:9c:f3:f8:63:cf:dc:25:8f:b4:bb:a2:e9:9d:e2 -# SHA1 Fingerprint: b5:2e:88:4e:40:c1:11:fb:50:c7:e2:4f:ac:18:2b:bd:68:15:d2:34 -# SHA256 Fingerprint: d1:3d:b1:29:4c:45:eb:c6:fc:86:c6:bb:f6:9f:a2:9b:df:e6:92:df:f7:c7:13:c2:43:c7:a9:56:c6:a2:28:4c ------BEGIN CERTIFICATE----- -MIIFgjCCA2qgAwIBAgIPAYvSUKtCVSxHWr2h3BrFMA0GCSqGSIb3DQEBDAUAMEsx -CzAJBgNVBAYTAlNFMRkwFwYDVQQKDBBUZWxpYSBDb21wYW55IEFCMSEwHwYDVQQD -DBhUZWxpYSBSU0EgVExTIFJvb3QgQ0EgdjMwHhcNMjMxMTE1MDk0NzQyWhcNNDgw -NTIzMTEwMDAwWjBLMQswCQYDVQQGEwJTRTEZMBcGA1UECgwQVGVsaWEgQ29tcGFu -eSBBQjEhMB8GA1UEAwwYVGVsaWEgUlNBIFRMUyBSb290IENBIHYzMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsV89KG19hCf4S1Fvk8D3TyDERhmcvx8F -7Kmb4WATx3ije1id3KHxRE0TKmcNCbAQ57bvHFEYa4hR2l20VjVadExqOW+2ld99 -MbEiO+jRVOz+BbxLxJnmGwCqI+BfuTjjVReDxsxjQvjgBsClaO/sm5i70nlZcWGR -tIkvWDK3NNkT5RtwXc/O8NTFVpbUqT6cRjIj3olAblR+lRf4Ffy5o+Q9fabjYn9Z -9S4itruElcEFf9Ljk7fwdTycT/rvJW9w/B3G2a3r0f/zXNOVruIBcqE6pkSospAC -U2bG42fYKrbM/GWnp7u+p9Frz4jaNwpb4YHuEeS8BratNcP8X62jXIvvKHxlsMDJ -Cnb4U8JzFOLsU6mohVY58BdZrvi0Gk9UOuqmgoG6dskHoksjZTlK61D/InzmEoA1 -yAYJFDVysjRxDUOu9cAwANbqmq77WIFL6BpnZgVqPtMfG6wN8BrTKdapvilVsYR5 -9BFgIsAVBMxrGh+W+QcvmJafUpASvlArKvVG2FI4i6PiLjSBT0+6F6EQLrYqefOQ -F/fBNEXb+njUQ0SUVrAqtH4Y+OjCI/a4/JJQppxeemZcQ0SUShgiI5AM5xHO5iya -UrTjYH4zxUz9j+1FEbDH/xpstr1gXBykspup+hRTaJcbA+UbpJqtWZndAPddJmt6 -YJQ+dU3pDu8CAwEAAaNjMGEwHwYDVR0jBBgwFoAUsMep0t2yKFZzBJSMFFxIbzdS -kqgwHQYDVR0OBBYEFLDHqdLdsihWcwSUjBRcSG83UpKoMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQBdYzFsNGDRk7bR -/AgRKq+5637YuOW+w6uhpoS0VnKMUpyHCwku86hEvqivakPtfmlm4bFwt++sb/8O -XsWBqtfbXMaBNDTZl8XRMJuLWOW2JrbKkRzgG0eBUcvsadG1rrhbmZqYvFXaAZO7 -o4TdOZzxhBB5GOAWWXB3IeraNP4J63zyo9n8Gqw3sJBG44em5hoYjBffP+npibys -lnslRi4L6xHsCYj/Pab+OlqbMCB6v+sTCLeEIukRVzoR9aQ45pEK7Z1QBnSsbAKQ -tss0JKD9d/mX143H1xePjPhTXlv5JCkhrcj+SShz0P9+EHoWe6m9lyUEOIVn0rp+ -yVJWNbmyDv3VkwFxHC1ApSQsgSimjGQ4wtr6cSmordYxkV+Ro8lOIIhRksXPyDk2 -7gW6IjUXCkZKpxFjkL3jiBSc8SkxnwCWtXg8xwNwdFVNBGLCCuJnsneYXjJNqzRq -UcoGwzsvF3Qi/ZnHUNvISdevlgIAXL4Wvrxaqvoa01wB+GCfs57RTGE4TvAGhKNK -us8K3hRT1BSpigzMIRzSxtAOrqPN6j//QSmW9f8Jcncri4j2ihSpVrFU0NdNkMhZ -eAKidTFPsxCVFuW4Aniz7jqiw5sWtjbQrlW035izIEU4sYwQoC1Nx0Svy+mMTRai -50LqFQ+A1/Hq6xHHDNx7CI83d23Erw== ------END CERTIFICATE----- diff --git a/venv/lib/python3.11/site-packages/certifi/core.py b/venv/lib/python3.11/site-packages/certifi/core.py deleted file mode 100755 index 1c9661c..0000000 --- a/venv/lib/python3.11/site-packages/certifi/core.py +++ /dev/null @@ -1,83 +0,0 @@ -""" -certifi.py -~~~~~~~~~~ - -This module returns the installation location of cacert.pem or its contents. -""" -import sys -import atexit - -def exit_cacert_ctx() -> None: - _CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr] - - -if sys.version_info >= (3, 11): - - from importlib.resources import as_file, files - - _CACERT_CTX = None - _CACERT_PATH = None - - def where() -> str: - # This is slightly terrible, but we want to delay extracting the file - # in cases where we're inside of a zipimport situation until someone - # actually calls where(), but we don't want to re-extract the file - # on every call of where(), so we'll do it once then store it in a - # global variable. - global _CACERT_CTX - global _CACERT_PATH - if _CACERT_PATH is None: - # This is slightly janky, the importlib.resources API wants you to - # manage the cleanup of this file, so it doesn't actually return a - # path, it returns a context manager that will give you the path - # when you enter it and will do any cleanup when you leave it. In - # the common case of not needing a temporary file, it will just - # return the file system location and the __exit__() is a no-op. - # - # We also have to hold onto the actual context manager, because - # it will do the cleanup whenever it gets garbage collected, so - # we will also store that at the global level as well. - _CACERT_CTX = as_file(files("certifi").joinpath("cacert.pem")) - _CACERT_PATH = str(_CACERT_CTX.__enter__()) - atexit.register(exit_cacert_ctx) - - return _CACERT_PATH - - def contents() -> str: - return files("certifi").joinpath("cacert.pem").read_text(encoding="ascii") - -else: - - from importlib.resources import path as get_path, read_text - - _CACERT_CTX = None - _CACERT_PATH = None - - def where() -> str: - # This is slightly terrible, but we want to delay extracting the - # file in cases where we're inside of a zipimport situation until - # someone actually calls where(), but we don't want to re-extract - # the file on every call of where(), so we'll do it once then store - # it in a global variable. - global _CACERT_CTX - global _CACERT_PATH - if _CACERT_PATH is None: - # This is slightly janky, the importlib.resources API wants you - # to manage the cleanup of this file, so it doesn't actually - # return a path, it returns a context manager that will give - # you the path when you enter it and will do any cleanup when - # you leave it. In the common case of not needing a temporary - # file, it will just return the file system location and the - # __exit__() is a no-op. - # - # We also have to hold onto the actual context manager, because - # it will do the cleanup whenever it gets garbage collected, so - # we will also store that at the global level as well. - _CACERT_CTX = get_path("certifi", "cacert.pem") - _CACERT_PATH = str(_CACERT_CTX.__enter__()) - atexit.register(exit_cacert_ctx) - - return _CACERT_PATH - - def contents() -> str: - return read_text("certifi", "cacert.pem", encoding="ascii") diff --git a/venv/lib/python3.11/site-packages/certifi/py.typed b/venv/lib/python3.11/site-packages/certifi/py.typed deleted file mode 100755 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/certifi/tests/__init__.py b/venv/lib/python3.11/site-packages/certifi/tests/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/certifi/tests/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/certifi/tests/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 74850189d3f49788df8aed60bd259d27c12e62a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmZ3^%ge<81UIJ4$^y}kK?DpiLK&agfQ;!3DGb33nv8xc8H$*I{LdiCUxE4=`MIh3 zxrs%|`TAb@>G{U`i3J7vWvO{(`Z<|N`URCG8Tom}dWMGj#hE3kx&?{J*@@|?#rnyq zMJ1VOnffKE#U;i1@$s2?nI-Y@dIgogIBatBQ%ZAE?TT1|Hh|nv%nu|!Ff%eTeqewR IMa)1k0OhkVCIA2c diff --git a/venv/lib/python3.11/site-packages/certifi/tests/__pycache__/test_certify.cpython-311.pyc b/venv/lib/python3.11/site-packages/certifi/tests/__pycache__/test_certify.cpython-311.pyc deleted file mode 100755 index a55cc2974898918182220bc74c38b05c7dec4e0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1666 zcmb7E&ubGw6rS1aCTW{CH58}&!BIL4cv(t8Cvb)Z1swpZ# zJctN-5Qp4(Lcj#4rM_QJb8=MlPBMsP1bCG9GnT?ym@ct&6{t&&AY+DegbXd z#jDC!O2`kKbeqyKHZOs(OblYsDk%jcEm1L-N|Hnh#E>2lBgSYY*4?}c)>=3#$p*bn za`I0M7t7s6I7*$#=20+~2_u-fBpGod_DC+pV3c8$VN_sL3<>fi{DB$fdJ~L$=A7xr zIrHk=Dwg2}VUxka^EWF1%ft%_YFd0c6l zJcPQTHd@RnzGS<;?C9QtA7^(>*K_?uxl^oiXMu6{p8B%Os&g);$o{#ZF4#4u)^uLB z)oFX)9#?h8Q5TuDs8-Ec)oFMOwl$tVc~W&vkDYMz@-2OyxoRh?>H!_DKrL`J@=n7a zLAO@cXX}zO01%#p{5jr8%4iO=a%TYh{P)<$?hB?%tBfbpLygdN@1qgc$gt?i=jP`kYwJn_W` zo=UtMiR#&)t3cga_;p01(HBZOjl9=zn2}3xye>!i@IC-vuGpsKCk&HYdX04+OVj2| z5TnLZuq4ob@IZlDorWf|?XK1>E7F+e8bFU)zomwr7M@*sa^-bqW$&AVuMU3L+sd6; zA3fU|J^N{TJymF>3cq5~aQ|-t&?Zvfjv(F>M1}u^#a!G^Y8qZd)BJu-tJy{!@8PF3 z?RH(S1`&?s@DYSjfcHe?5Etb590HIg_bNa$>}`oEYMVqME-9y>xCkU;3e>s_1c%`{ zIYm5%pR8M^hsy7;F9ff None: - assert os.path.exists(certifi.where()) - - def test_read_contents(self) -> None: - content = certifi.contents() - assert "-----BEGIN CERTIFICATE-----" in content - - def test_py_typed_exists(self) -> None: - assert os.path.exists( - os.path.join(os.path.dirname(certifi.__file__), 'py.typed') - ) diff --git a/venv/lib/python3.11/site-packages/distutils-precedence.pth b/venv/lib/python3.11/site-packages/distutils-precedence.pth deleted file mode 100755 index 7f009fe..0000000 --- a/venv/lib/python3.11/site-packages/distutils-precedence.pth +++ /dev/null @@ -1 +0,0 @@ -import os; var = 'SETUPTOOLS_USE_DISTUTILS'; enabled = os.environ.get(var, 'local') == 'local'; enabled and __import__('_distutils_hack').add_shim(); diff --git a/venv/lib/python3.11/site-packages/dotenv/__init__.py b/venv/lib/python3.11/site-packages/dotenv/__init__.py deleted file mode 100755 index 7f4c631..0000000 --- a/venv/lib/python3.11/site-packages/dotenv/__init__.py +++ /dev/null @@ -1,49 +0,0 @@ -from typing import Any, Optional - -from .main import (dotenv_values, find_dotenv, get_key, load_dotenv, set_key, - unset_key) - - -def load_ipython_extension(ipython: Any) -> None: - from .ipython import load_ipython_extension - load_ipython_extension(ipython) - - -def get_cli_string( - path: Optional[str] = None, - action: Optional[str] = None, - key: Optional[str] = None, - value: Optional[str] = None, - quote: Optional[str] = None, -): - """Returns a string suitable for running as a shell script. - - Useful for converting a arguments passed to a fabric task - to be passed to a `local` or `run` command. - """ - command = ['dotenv'] - if quote: - command.append(f'-q {quote}') - if path: - command.append(f'-f {path}') - if action: - command.append(action) - if key: - command.append(key) - if value: - if ' ' in value: - command.append(f'"{value}"') - else: - command.append(value) - - return ' '.join(command).strip() - - -__all__ = ['get_cli_string', - 'load_dotenv', - 'dotenv_values', - 'get_key', - 'set_key', - 'unset_key', - 'find_dotenv', - 'load_ipython_extension'] diff --git a/venv/lib/python3.11/site-packages/dotenv/__main__.py b/venv/lib/python3.11/site-packages/dotenv/__main__.py deleted file mode 100755 index 3977f55..0000000 --- a/venv/lib/python3.11/site-packages/dotenv/__main__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Entry point for cli, enables execution with `python -m dotenv`""" - -from .cli import cli - -if __name__ == "__main__": - cli() diff --git a/venv/lib/python3.11/site-packages/dotenv/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/dotenv/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 9c690b5d22f7a4d3bcb458bc0ccf13b727848b8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2026 zcmb_d&1)M+6rcTGX(ic>71yyHd$HwEx!6iDr8&5Tl0qO*6`JOv%X+O@$!qUdW>=;T zYw*E`Vhk3g5YrGaJ){lkseg%71YH&ihMsa;@Xe>bSy@hP$31m+_P6ss=Dm5p8I69) z=d%b}^y5$KIRT-+sW51{v%$&lFnEqI!i*&^7hHAw)kKMpKlwqnI{^>%Jq4EhPUqnP*fU@aE)I%PiQD4{}1cPu<@ z0sD1Y=AhAW%GECLLAh!&+d{~bu~0Y~_+0p6HsoKRm+WN@L-ZeWxDdT}4ny?o@`TKl z3@mwct@qXSaAXPdA-9Rh_;s_e5OOaN7G83fb2&G!n-gB~#r)CvS^76sp>Q$k5j`$f z+AGk!IoHBD6rcU}O?s$(RagChm`+pmTV|lIT87$iiAq|ILzQ~!ux416>eq?s1&i6N z3hjw+G+I{bT6djIg9NF!s*`5RHk`m$J>B;WtOhP*Xy~iNtgC_UZ=|z9xoTYSSh3u? zZmp=0dIfT?sCC!2bq6n|{;}9U#m~5frz${0J!PQJlsPzpo@Y2X=GR@*i3M7VR~E?# zR7;8!Zc-Sf@F74fodxzqkZ2{UN2 zluHmJ+==9&gTh{+y?ywkz1`mK%5yz=t|QMyl0xls1ABP*Z98m-UAfegOC7lsN%;iH z!u-I#*_Eey@>EBjij+cv#LRq@8#$=%RS%cCx#?bRx|5rZhKdQ|^YhWj=;2&@xxE|} zC!SY-s2(jJwcv%PTfEyV-tDCQ_{{i8w^;5K%bjBRSScLb-@D&_*i|Nb%H*HQ%pb~3 zS1I+BQim^*8&F|cPAeuE7!%43ktxvs5Ta0^cSU-0l!Yp7Yv6)L%s_{FP@kKmeYi>q-nZkY1(U)t|Q%yQ+e5TamzA3CwIV`o_v28FyR=6 ziICcPUr%_3nF8wnH;`GTbo3xW@cH%2^m7?-PIL)eVLL0A}E+*nF^tx$PwU-}9P6C@7)0232`fX4V| zh!bHVadIPJW3mrq@UFeywcmZ;rSJLtA@DYTe!ZLe^E)l}7W^gabDz8b4qAXi9z;;V z7KA_q9QC&tdmI1(-#qGb-wPn%nVan{9*k=Z?d%B0Mrwy|jm2Rk&#=&}6Nv2gvBu#dQuX}4%sPH%asaAq!Xo>g?-i)3E2sgy;M0KZE_dN z@IfSMHvO@5qU6$t6@n1XL45}5OK>v#zn19eY5au>GgO#ovXiT6`U-)}slT>4 G&+!W?SZvz> diff --git a/venv/lib/python3.11/site-packages/dotenv/__pycache__/cli.cpython-311.pyc b/venv/lib/python3.11/site-packages/dotenv/__pycache__/cli.cpython-311.pyc deleted file mode 100755 index c6b836c6bea1d94a31ad313eeb4971e16a72cacc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10794 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 diff --git a/venv/lib/python3.11/site-packages/dotenv/__pycache__/ipython.cpython-311.pyc b/venv/lib/python3.11/site-packages/dotenv/__pycache__/ipython.cpython-311.pyc deleted file mode 100755 index 2385e86f2a3ec5d20a0c29f2a43c48cd6b3aca2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2306 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 diff --git a/venv/lib/python3.11/site-packages/dotenv/__pycache__/parser.cpython-311.pyc b/venv/lib/python3.11/site-packages/dotenv/__pycache__/parser.cpython-311.pyc deleted file mode 100755 index 402e2b47cdde32fe74c317b031eac97bd588f572..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11363 zcmcIKTWlLwb~EIV8ootI)YE!c)QglQ*-0!pc5FAc<;0IDK^%8?W!VJH8OgFFQkkLr zVB~}eTr6z}ur~G9+(6zXicP9)T+|==NQ2F@S&oMS>sa;-Z|L_izmFl(j+GE(^W8NJ%@Cbnv?^ zJ$93_PAKcLv(&HGOH!NGfA|GRH9lRaFR4+C%1n0SNXdZ4VgROXpxxL(NjRpk31 z-(SjiLU}*r2e<(qxXs`(=$GL;jXczgK)nb@pQ9p!e?W3fL|D~!>TQ)hmF9(bIwh!% zx8mu<71ccvU*Ng-mKNuEm3@0LJ)26#=hd2b;%TUuRM~U<`%8Q>!K)6fj#Eqvv&k9N z!{0~?@!0fyd`48A0-s(Ik_nw_VMGUfxEIe(0(d~Bb*`tVt9p8wN<(QmT-Dnz)0rBI zGSm1R^(8$Kv8y(LS8Ecfg~eHza?SaPQ^(&vF&?oA9_U8!0uZsAuC5nvj$BDC@FNRx zA(0w6otjC#JQ81A9J$6PuZ_&lULIMznZA-rzC65d--tMy=7$#JiMjX;FOG1jG}c*+ z3nDKJFWyw$3-LKVCh#--4FNO=1#_dsHUL>_)8kt?xH|pt^4it)LvqKc>={!$V-hp= z42r3YcVJ4GN-pD{5Xso5#At*jlgzj;T$(zEg%_il(7@4y{Efwwkk*ldk)s(`|Gdv^K2W_}W zrWxuRJ%sgwqnTC%jeY8KU+#%yn#%P^iMFPxB+RpRYU%OGaUUIV0qwV&W0(@4!p|%OA50yv%r#MdsSwBHpx#! zoGKfOC4q5cG1VQ5Eu^@mc}#m_vG-Og40b_6>;{mn_!Yf@?3wJDkIxj{zU-;&sgL2yp3<6Q%k5YA4wP6|Xvin;D6JOO zZNie3^G+zY6Kd2ziXqf+05zOy&9T`ehtg-C<8P{tYw`IdklIvfHE?}=h zD+1(F0r^$HQ@?tA z<*>vw!=KDF7yVdJE-TRusi%#AeVWMS1O$d>?*cH$#nHT-v%zQQ7*L-MP-P4d!UG2> z^99uW3fqt{>Eyf|3*|MOi)TrFhI2#S#W6rIpUS?I0?~$@R~?BfAkIQFv=e*)CK6?K z#GX)NVE!3y{{w27UZ!G@(!#P0a&$SzQRgTDkLxdOLIfhxC8#Av)E4b2d_a_}RROX!0`Ee1X^Rou@9F!N=w zSvcDxyH#68mY#R7Wa(g%?bkUnk}$G)7`xg;)zFveK33z%~RXa|Xq}2igiR z0VpYUjih#wPiMTwl=<{Ntb!X%2zmd4M#`4^r%l8pio`Tuv;hf4e+LPeFLk40#%U}m zg=N}oePn=<61ECP!Irps5-MA!Q36ZhD()Z&X=0aZY3LhT8g}2dBk6tXOc-$zmQ(HX zd{SfXTIf%$nFd7>pPvWDOY+xIX_o1Tr=*FFHF54*91i$Qtxn4lWOFpqhL9|{^qQ?y+vI3TJ2Dfaqqi2gMgQs@D-M*kG0&2P*T>&I|Qwi9O&~o$vB-ju%ukL;3hZNtNqz0n^4bk>1E9>0p6_o`J=2nng>v8M$6%7t4nk z12*kkS)z|ZS*1i1p~(a^Lg}XrsWk>wL6{qNJ(&A+?iUO97eF(5Hk-SCtHtc#Z@#%!z(4#c;m~`j%2hmCB71gGp<_*Q3)|W?N4V|23^)?4RQ2O#2;TYt! zqZE%2LWeJDat>4;TkMs%27#aROS2s2^alf%=tON}&7mbL$O{+T`B-O7H%S zzOk2YoaD3DtN_p&v)0i%H3a(*&c=Mk;;G7OF^=erDPyszJ0-@^~F>!z}OtXGSG|! z1N#>?Lj#!F>0A8Ba)zPKngBM%GeC2Uc0&W(R%vPEoJ1G)Ok#)KVA%m?zi0U*mBrw-A^e1&k<}< zc9)yb4NSw-QZj8a32^y@d=ro`b3!HgjNRV>OC$L!30D?zyG9h9(aXYo2I^M|v&t;; z{9MLUT03U&ZXt#NXw3aV{*|@EO51R0&A&e{kDQj;PAh>k5~~^B+pp~3p@;v=mEE#c z8ac~0vpg)*nv4s9v*D9+l?7uJI(-m74C- z{1jjx5oXf~Ef9@D4oI{eB6iKZM7pCJLtL6qn@o4%btuv4k0YD|gm@7E&>vWm3=3Eza;NFE480hf^X%Vn;w7e+MPoyhw`BfPlx2`*sN=knup}NVWnliwr{ZQ`DvN$RoGsM?JWjEIbVr2iO<2bfle5iu;w0+V%R{s0Ep^PNk~ZB z$~6pmHrt!GY|FOnAKx6kpB*-*V*8eD1)OVDu$-Q@LWON?R5sVD6d^NX;r16;qn(j5 z_n@&zJ8q!n$T`?m@^N*6cc5z;Q~(!osg4EoidlI^XBT3As&+ofsm>W8wX`Uf83?6P zzmOWy@A*fM6g{qVoRHaZg&mjJ@nWFi z-tyh$J0GrmD6#E?yGj=ML?mc6Cy~E2`x*^!p%1}H1aBh1JE4HOS0Fa}TbM#A5pWv> z6mQ`?0*g_41aS!P6Tb(L)qh(yyQ4QR6vAuQK`}de*Iyx#6}V}~Xr374qiB^^0w?Y0 zMO-CtG7fkC%`FNdEAY~evvfX;EzZ(~Qmo}n(CKhAVl{}c7DQIycQ`rFT7d>FrYwkGd-o8){i*++I%VzpBIk| zSJp~EYZ2KK4TsRmt^E1lT=?w5dhl15)-FjyhvmQ#C2&Myk7#0I7mx}>9#p%ybQwgR zNIN-LE?`%5jdyLN2pG&_$+j4EiVAGRe_eQY$+wgulII09k?>KYyx%%(Q z_|Ff^!F@__AEJvMfA%!lGt*unH<7)%3yGcgs#2)8p%qTh`B@7(ZrejbqhdlmoQkKf3?hmR_wtC9S>g$CKvr+E6Fc!oASL$YT? z@r+2!NHtAyg@mRr0SE3((;wvjeLHe(1^u?!36tTQuCPVGR0YX0e0nD7+IciLtfdtG z=xF%fRSMgV#$2O7uHp3{t-mniMcmvk=wYWOb3zU+NJeO0bMsMH_4!{$Ppf%b1ZUVeOD4jfVfha~n8%6h}y zUAbL9zP=RfkzDv!L`V652Ev7ta$ryi3`*=^HLs$*tMMwpoq5$PpETt{t^U8%$6y^( z1stm?n0ps{P1iDTUO+q4Q&qv-j-wyhz5wa?N|zAe@ttN_!K-HeqkoV);f&g;M^r|o zVC@mwR9rO6weVfhT$5u;r(JZ%Q5uZa=C&|zw1rE-Dpha}!ih=@vF&#aJszcC?RUqy zw3b`I>p1jk{4WX2rDDDCfQ1I&pSXizDvi#wQs|+CV}y^kUqwf`-Ve`+`|&*Gu<}&G z_A{_du2VPcKclYGpsP-TRe)zZQ4B&4rg{-*X2aq4BDLC0g%}N?*aBSYXYmmvcKr%G z^o#J&&ujOY-Pj7RGHOjsdw?fqf$FKOiFyw(@Q)DjdC+b%@WhQ6HU|HMu)rtN@azm1 z!dPlLhGP)FJ6I*)OGuY-Wo4$%*{sZbnlihrJ?;u0LhnC^PyB13IH)tm{qwg!d0S>e z3KNo;(3Y*s0Z%XfCv3|G+wyJeh|KO)*u4_F7aRxoKDzsn9OzO4U0amX<=?Dtg~!BV zV{5Uc^GQo|qa`Z0>`_|w6dT*NT#g3+QwqRy1aMjL`M123E1>oJuwQ1o6}DSqyEpw! zd8h2}RQ#PeyFT#4L7DAS*glEvGnr2La~qy6$t8;W&}RsA+@ z*DvW@0}kl+`|rOOQ6~TD^}2C4^)Hd*T@d}N`*qjJM*F{oXn+EG-c9x&>f)G1vph1d%R8Nn4@g`8|z&-*q)g%U)6HGo_ z6tVkE7N1vRwv3?Wbqc z-645VBZ+mshf8 z@)-VteNFoxm?Oe%C_qIm;{P{n*=d?CQobzt6)9Ji{NM^o4+8=JUja+g2XKr7t0IZ; zwH0!YfAY<_uct`T3Rue9m^-+d(oFs=TWs#my9=X_g|C;T<`Z)B38ndjM1_j}=G@hM zyX@~*{QX%^(cO@XN}(ayJ*>Egvo*y~=jvp^D~E=Z(2zvc6>D2p-T5POZB(g^W__f! z)Dn^XQN%jY(8PHKK0UYBYaQt{YV92D5>pCzLxVHSUu=FDagv zV3vWFTt;dglLH5oz=5onj3>42mup9r+EEw~S0RN*<>oP^83qVx%Q`4G4=c^Xkl%9J zXi&e^AeVWH*yl!(o1tsLlT`(BSDzyGxl!Z~&|_OvHF%1+=SD#fO}lU(tRQ#lDPo@+ zMeJ_6V~eT=PZ9UrD0q`*=)rtHxbpVkR0kj1N%V~tk#q&{vvgo}dW(Xn(7Yc0EqKl# zX$6fodT#+dZxF2?Cy^DnJ@lTubBltg01g$1tYB9+?audYQ4ke=LLw_TP21_7d|m$d XS`#=P>7K$**JqU8QIg&f5Fz{@#`T+C diff --git a/venv/lib/python3.11/site-packages/dotenv/__pycache__/variables.cpython-311.pyc b/venv/lib/python3.11/site-packages/dotenv/__pycache__/variables.cpython-311.pyc deleted file mode 100755 index b9f438225af2667e7bba15592dc672689347e3b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5524 zcmbVQ+iw)t89#HMy?EE_3yuv*%q5AJ7>sQaC&4Ig7Ekawku^YcI3PiKpj_X7;z~MU7^)>70@A^u#LJ>pV_DV-4(* z;&hVYbfyR`|*cB)<}s|q25|b+-(kC0JmF~`4Vrntg}F<(%L^y zN_>=@CwDlso19J?pQO`HY^rFzlb_ESd81$%dQxyi)5y)xC@hN7nV?t`r2%C>JvTC2 z%o`(ljb@4??-s8X$49`hBa231aU_?W9-03XOkWs3I669FW-a5uyq3A9T{X-Ry=Wm% zL-Xdr`A<=Tf{{)yMNl6H-A*^W$Q%Z;Lh6a$wVhw>tX$kk?5!pCmgRaR@uw?xWG`F~ zyLa2s-SzJN@{+CgKL&o{2=Ib{8c{J!jcD36h{5xO#-VwK+~H{#G-w|X6E!wCNPD1i z6xeSuw`eRynM_^}ZEGq(K&UrPeJ9Wz(4I<092JBHHw7(*)9HLsU&vuQnofVRpyj+7 zxi~#%WGqLVE*5jN7oMad5){f2AYv%4Om`x|7qP{eG&F);Bq*#o4P?dtZStZtP&u#~M zLRrh?G}Fw$fM0yrqcGGSD!Ks9FG8q@5D3BykAaYqbQuDNHx!stpszwZ1am61!+OYw z7=jTsgk})U1Op1!3BlxL1@&fYWd%-Ds2g>4&a2b9~eHlL_VH$;C zf;7YD3v?1 z8@Nn#GLR~Mpeo)9+wlY5r5Kz37V%MUbACT~B$IBP>0_Q?%$eu_Ob2v|xU&>*IJXCQ2*4&LBIre+ zI>1==-eipKf>HWB5)1%}{ziw8;4}0^B!fs$4oAoqEIN)|M7!;QZXeDf!G+Dg16lEZ zn>;7&tYpBN($1>Rs&*oC(!t7J96i`hWI;+INXm7{o>ln1DOID@=CpzdM92LZLj z1HAe$(S%o?VnESf07(k&nd=WUk_z{%Lmyg7G{o^yb`*w9gmCc0p638%L-oEFpo*5^ zw>6IOWMW}}%RLKhThR=_SNKK(J%|9ljW-XW9!@NUhX*}XoS^$*E&59&ZIR4;J|MIU z!mk0ZiJ^euGYKFZvg4C*-M{edWw(V?opjw~dpKT%CECE~|Ak{RC&FT^%e-(#@g%I z;tga(rGdZidHL3`z315KzMI3V!{6~`rJm?n>-(y&((`qH_3TDsxRw}(RKEX3yZ_bl zVtMg?m#vO7&1`eHuE{Wo|j&%oZlo+tslLA z>fQ;~d~ktP?L_6I)0}%&oaPYx+bA41Z*%Tx^ET%mH*W(Ujs_?kIVas^PU0%91eQ3w z^~ixiJaVAgmblKv_KI071Mol|iigi$xF1i0`jgU4mgf}uv)&ar|KGf6(af}fgI z-`yI|V|^R$yZ*ps;8_-y#S*W#B=pM?^jnhsWw|7jxN9OlMh7gkxK~P;xC_5;dG?+d zl;#py<2YjZ|Dh04l1lPDDHs4QS4mvvZltY9V|Cyq!PS-(c%O2OG0LgzkU3KezjpQJ+KvnlT(xFR71qUY#o~U_#^*I^8vcJCCOro%XW%yf0p#ECgQ)F@ zt(^HWG5F6!^7}+`{iTh>p;`hG=#bRQNLi})?OI#dgAZYOXdoZg(Bt=sH~MI&4S1>&MuR%H;Yh zc5G}THdc#`*{XK|R+Qzk{9{MwYVVh+8>y8ub){of{^GNh&mP8lE2pb3ukWZHsO>sr z$3{0|qqP`j#I4t+K-9jK&s;p|a(HSuf;OF@h_CFk+mWqL@sB8qnLGX$hy?_2RGZV{k;lHD_RwxuL4gbC};d2GOsA(~#)wb{Vr|NO{KYg8?@plT~A fTaR$`NpotrlN+l5wn0@rx;}Ypf;G1#%(DLjLSA2( diff --git a/venv/lib/python3.11/site-packages/dotenv/__pycache__/version.cpython-311.pyc b/venv/lib/python3.11/site-packages/dotenv/__pycache__/version.cpython-311.pyc deleted file mode 100755 index 793f6763ccfeac7466373e01d60b6a9cd35c8fd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmZ3^%ge<81UIJ4$`S+8k3k$5V1zP0gOp5XNMVR#NMQ_S&}6D&HPkcIGw{=7yu}?K zUzS=_oSB~&AHR~}Gf2lTPyLMi+*JMC#G>SUeXsoVd}IB@f&%@r)VwnNoXjNsg36MN z{5)elLqq-I%#u{yg2d$P#Prl+{gnI?kQ%6gdIgogIBatBQ%ZAE?TXldCW9PQ%m*Ys TFf%eT-ry5$;0D1W7N8ISk480D diff --git a/venv/lib/python3.11/site-packages/dotenv/cli.py b/venv/lib/python3.11/site-packages/dotenv/cli.py deleted file mode 100755 index 33ae148..0000000 --- a/venv/lib/python3.11/site-packages/dotenv/cli.py +++ /dev/null @@ -1,190 +0,0 @@ -import json -import os -import shlex -import sys -from contextlib import contextmanager -from typing import Any, Dict, IO, Iterator, List, Optional - -try: - import click -except ImportError: - sys.stderr.write('It seems python-dotenv is not installed with cli option. \n' - 'Run pip install "python-dotenv[cli]" to fix this.') - sys.exit(1) - -from .main import dotenv_values, set_key, unset_key -from .version import __version__ - - -def enumerate_env() -> Optional[str]: - """ - Return a path for the ${pwd}/.env file. - - If pwd does not exist, return None. - """ - try: - cwd = os.getcwd() - except FileNotFoundError: - return None - path = os.path.join(cwd, '.env') - return path - - -@click.group() -@click.option('-f', '--file', default=enumerate_env(), - type=click.Path(file_okay=True), - help="Location of the .env file, defaults to .env file in current working directory.") -@click.option('-q', '--quote', default='always', - type=click.Choice(['always', 'never', 'auto']), - help="Whether to quote or not the variable values. Default mode is always. This does not affect parsing.") -@click.option('-e', '--export', default=False, - type=click.BOOL, - help="Whether to write the dot file as an executable bash script.") -@click.version_option(version=__version__) -@click.pass_context -def cli(ctx: click.Context, file: Any, quote: Any, export: Any) -> None: - """This script is used to set, get or unset values from a .env file.""" - ctx.obj = {'QUOTE': quote, 'EXPORT': export, 'FILE': file} - - -@contextmanager -def stream_file(path: os.PathLike) -> Iterator[IO[str]]: - """ - Open a file and yield the corresponding (decoded) stream. - - Exits with error code 2 if the file cannot be opened. - """ - - try: - with open(path) as stream: - yield stream - except OSError as exc: - print(f"Error opening env file: {exc}", file=sys.stderr) - exit(2) - - -@cli.command() -@click.pass_context -@click.option('--format', default='simple', - type=click.Choice(['simple', 'json', 'shell', 'export']), - help="The format in which to display the list. Default format is simple, " - "which displays name=value without quotes.") -def list(ctx: click.Context, format: bool) -> None: - """Display all the stored key/value.""" - file = ctx.obj['FILE'] - - with stream_file(file) as stream: - values = dotenv_values(stream=stream) - - if format == 'json': - click.echo(json.dumps(values, indent=2, sort_keys=True)) - else: - prefix = 'export ' if format == 'export' else '' - for k in sorted(values): - v = values[k] - if v is not None: - if format in ('export', 'shell'): - v = shlex.quote(v) - click.echo(f'{prefix}{k}={v}') - - -@cli.command() -@click.pass_context -@click.argument('key', required=True) -@click.argument('value', required=True) -def set(ctx: click.Context, key: Any, value: Any) -> None: - """Store the given key/value.""" - file = ctx.obj['FILE'] - quote = ctx.obj['QUOTE'] - export = ctx.obj['EXPORT'] - success, key, value = set_key(file, key, value, quote, export) - if success: - click.echo(f'{key}={value}') - else: - exit(1) - - -@cli.command() -@click.pass_context -@click.argument('key', required=True) -def get(ctx: click.Context, key: Any) -> None: - """Retrieve the value for the given key.""" - file = ctx.obj['FILE'] - - with stream_file(file) as stream: - values = dotenv_values(stream=stream) - - stored_value = values.get(key) - if stored_value: - click.echo(stored_value) - else: - exit(1) - - -@cli.command() -@click.pass_context -@click.argument('key', required=True) -def unset(ctx: click.Context, key: Any) -> None: - """Removes the given key.""" - file = ctx.obj['FILE'] - quote = ctx.obj['QUOTE'] - success, key = unset_key(file, key, quote) - if success: - click.echo(f"Successfully removed {key}") - else: - exit(1) - - -@cli.command(context_settings={'ignore_unknown_options': True}) -@click.pass_context -@click.option( - "--override/--no-override", - default=True, - help="Override variables from the environment file with those from the .env file.", -) -@click.argument('commandline', nargs=-1, type=click.UNPROCESSED) -def run(ctx: click.Context, override: bool, commandline: List[str]) -> None: - """Run command with environment variables present.""" - file = ctx.obj['FILE'] - if not os.path.isfile(file): - raise click.BadParameter( - f'Invalid value for \'-f\' "{file}" does not exist.', - ctx=ctx - ) - dotenv_as_dict = { - k: v - for (k, v) in dotenv_values(file).items() - if v is not None and (override or k not in os.environ) - } - - if not commandline: - click.echo('No command given.') - exit(1) - run_command(commandline, dotenv_as_dict) - - -def run_command(command: List[str], env: Dict[str, str]) -> None: - """Replace the current process with the specified command. - - Replaces the current process with the specified command and the variables from `env` - added in the current environment variables. - - Parameters - ---------- - command: List[str] - The command and it's parameters - env: Dict - The additional environment variables - - Returns - ------- - None - This function does not return any value. It replaces the current process with the new one. - - """ - # copy the current environment variables and add the vales from - # `env` - cmd_env = os.environ.copy() - cmd_env.update(env) - - os.execvpe(command[0], args=command, env=cmd_env) diff --git a/venv/lib/python3.11/site-packages/dotenv/ipython.py b/venv/lib/python3.11/site-packages/dotenv/ipython.py deleted file mode 100755 index 7df727c..0000000 --- a/venv/lib/python3.11/site-packages/dotenv/ipython.py +++ /dev/null @@ -1,39 +0,0 @@ -from IPython.core.magic import Magics, line_magic, magics_class # type: ignore -from IPython.core.magic_arguments import (argument, magic_arguments, # type: ignore - parse_argstring) # type: ignore - -from .main import find_dotenv, load_dotenv - - -@magics_class -class IPythonDotEnv(Magics): - - @magic_arguments() - @argument( - '-o', '--override', action='store_true', - help="Indicate to override existing variables" - ) - @argument( - '-v', '--verbose', action='store_true', - help="Indicate function calls to be verbose" - ) - @argument('dotenv_path', nargs='?', type=str, default='.env', - help='Search in increasingly higher folders for the `dotenv_path`') - @line_magic - def dotenv(self, line): - args = parse_argstring(self.dotenv, line) - # Locate the .env file - dotenv_path = args.dotenv_path - try: - dotenv_path = find_dotenv(dotenv_path, True, True) - except IOError: - print("cannot find .env file") - return - - # Load the .env file - load_dotenv(dotenv_path, verbose=args.verbose, override=args.override) - - -def load_ipython_extension(ipython): - """Register the %dotenv magic.""" - ipython.register_magics(IPythonDotEnv) diff --git a/venv/lib/python3.11/site-packages/dotenv/main.py b/venv/lib/python3.11/site-packages/dotenv/main.py deleted file mode 100755 index 1848d60..0000000 --- a/venv/lib/python3.11/site-packages/dotenv/main.py +++ /dev/null @@ -1,398 +0,0 @@ -import io -import logging -import os -import pathlib -import shutil -import sys -import tempfile -from collections import OrderedDict -from contextlib import contextmanager -from typing import IO, Dict, Iterable, Iterator, Mapping, Optional, Tuple, Union - -from .parser import Binding, parse_stream -from .variables import parse_variables - -# A type alias for a string path to be used for the paths in this file. -# These paths may flow to `open()` and `shutil.move()`; `shutil.move()` -# only accepts string paths, not byte paths or file descriptors. See -# https://github.com/python/typeshed/pull/6832. -StrPath = Union[str, "os.PathLike[str]"] - -logger = logging.getLogger(__name__) - - -def with_warn_for_invalid_lines(mappings: Iterator[Binding]) -> Iterator[Binding]: - for mapping in mappings: - if mapping.error: - logger.warning( - "python-dotenv could not parse statement starting at line %s", - mapping.original.line, - ) - yield mapping - - -class DotEnv: - def __init__( - self, - dotenv_path: Optional[StrPath], - stream: Optional[IO[str]] = None, - verbose: bool = False, - encoding: Optional[str] = None, - interpolate: bool = True, - override: bool = True, - ) -> None: - self.dotenv_path: Optional[StrPath] = dotenv_path - self.stream: Optional[IO[str]] = stream - self._dict: Optional[Dict[str, Optional[str]]] = None - self.verbose: bool = verbose - self.encoding: Optional[str] = encoding - self.interpolate: bool = interpolate - self.override: bool = override - - @contextmanager - def _get_stream(self) -> Iterator[IO[str]]: - if self.dotenv_path and os.path.isfile(self.dotenv_path): - with open(self.dotenv_path, encoding=self.encoding) as stream: - yield stream - elif self.stream is not None: - yield self.stream - else: - if self.verbose: - logger.info( - "python-dotenv could not find configuration file %s.", - self.dotenv_path or ".env", - ) - yield io.StringIO("") - - def dict(self) -> Dict[str, Optional[str]]: - """Return dotenv as dict""" - if self._dict: - return self._dict - - raw_values = self.parse() - - if self.interpolate: - self._dict = OrderedDict( - resolve_variables(raw_values, override=self.override) - ) - else: - self._dict = OrderedDict(raw_values) - - return self._dict - - def parse(self) -> Iterator[Tuple[str, Optional[str]]]: - with self._get_stream() as stream: - for mapping in with_warn_for_invalid_lines(parse_stream(stream)): - if mapping.key is not None: - yield mapping.key, mapping.value - - def set_as_environment_variables(self) -> bool: - """ - Load the current dotenv as system environment variable. - """ - if not self.dict(): - return False - - for k, v in self.dict().items(): - if k in os.environ and not self.override: - continue - if v is not None: - os.environ[k] = v - - return True - - def get(self, key: str) -> Optional[str]: - """ """ - data = self.dict() - - if key in data: - return data[key] - - if self.verbose: - logger.warning("Key %s not found in %s.", key, self.dotenv_path) - - return None - - -def get_key( - dotenv_path: StrPath, - key_to_get: str, - encoding: Optional[str] = "utf-8", -) -> Optional[str]: - """ - Get the value of a given key from the given .env. - - Returns `None` if the key isn't found or doesn't have a value. - """ - return DotEnv(dotenv_path, verbose=True, encoding=encoding).get(key_to_get) - - -@contextmanager -def rewrite( - path: StrPath, - encoding: Optional[str], -) -> Iterator[Tuple[IO[str], IO[str]]]: - pathlib.Path(path).touch() - - with tempfile.NamedTemporaryFile(mode="w", encoding=encoding, delete=False) as dest: - error = None - try: - with open(path, encoding=encoding) as source: - yield (source, dest) - except BaseException as err: - error = err - - if error is None: - shutil.move(dest.name, path) - else: - os.unlink(dest.name) - raise error from None - - -def set_key( - dotenv_path: StrPath, - key_to_set: str, - value_to_set: str, - quote_mode: str = "always", - export: bool = False, - encoding: Optional[str] = "utf-8", -) -> Tuple[Optional[bool], str, str]: - """ - Adds or Updates a key/value to the given .env - - If the .env path given doesn't exist, fails instead of risking creating - an orphan .env somewhere in the filesystem - """ - if quote_mode not in ("always", "auto", "never"): - raise ValueError(f"Unknown quote_mode: {quote_mode}") - - quote = quote_mode == "always" or ( - quote_mode == "auto" and not value_to_set.isalnum() - ) - - if quote: - value_out = "'{}'".format(value_to_set.replace("'", "\\'")) - else: - value_out = value_to_set - if export: - line_out = f"export {key_to_set}={value_out}\n" - else: - line_out = f"{key_to_set}={value_out}\n" - - with rewrite(dotenv_path, encoding=encoding) as (source, dest): - replaced = False - missing_newline = False - for mapping in with_warn_for_invalid_lines(parse_stream(source)): - if mapping.key == key_to_set: - dest.write(line_out) - replaced = True - else: - dest.write(mapping.original.string) - missing_newline = not mapping.original.string.endswith("\n") - if not replaced: - if missing_newline: - dest.write("\n") - dest.write(line_out) - - return True, key_to_set, value_to_set - - -def unset_key( - dotenv_path: StrPath, - key_to_unset: str, - quote_mode: str = "always", - encoding: Optional[str] = "utf-8", -) -> Tuple[Optional[bool], str]: - """ - Removes a given key from the given `.env` file. - - If the .env path given doesn't exist, fails. - If the given key doesn't exist in the .env, fails. - """ - if not os.path.exists(dotenv_path): - logger.warning("Can't delete from %s - it doesn't exist.", dotenv_path) - return None, key_to_unset - - removed = False - with rewrite(dotenv_path, encoding=encoding) as (source, dest): - for mapping in with_warn_for_invalid_lines(parse_stream(source)): - if mapping.key == key_to_unset: - removed = True - else: - dest.write(mapping.original.string) - - if not removed: - logger.warning( - "Key %s not removed from %s - key doesn't exist.", key_to_unset, dotenv_path - ) - return None, key_to_unset - - return removed, key_to_unset - - -def resolve_variables( - values: Iterable[Tuple[str, Optional[str]]], - override: bool, -) -> Mapping[str, Optional[str]]: - new_values: Dict[str, Optional[str]] = {} - - for name, value in values: - if value is None: - result = None - else: - atoms = parse_variables(value) - env: Dict[str, Optional[str]] = {} - if override: - env.update(os.environ) # type: ignore - env.update(new_values) - else: - env.update(new_values) - env.update(os.environ) # type: ignore - result = "".join(atom.resolve(env) for atom in atoms) - - new_values[name] = result - - return new_values - - -def _walk_to_root(path: str) -> Iterator[str]: - """ - Yield directories starting from the given directory up to the root - """ - if not os.path.exists(path): - raise IOError("Starting path not found") - - if os.path.isfile(path): - path = os.path.dirname(path) - - last_dir = None - current_dir = os.path.abspath(path) - while last_dir != current_dir: - yield current_dir - parent_dir = os.path.abspath(os.path.join(current_dir, os.path.pardir)) - last_dir, current_dir = current_dir, parent_dir - - -def find_dotenv( - filename: str = ".env", - raise_error_if_not_found: bool = False, - usecwd: bool = False, -) -> str: - """ - Search in increasingly higher folders for the given file - - Returns path to the file if found, or an empty string otherwise - """ - - def _is_interactive(): - """Decide whether this is running in a REPL or IPython notebook""" - try: - main = __import__("__main__", None, None, fromlist=["__file__"]) - except ModuleNotFoundError: - return False - return not hasattr(main, "__file__") - - def _is_debugger(): - return sys.gettrace() is not None - - if usecwd or _is_interactive() or _is_debugger() or getattr(sys, "frozen", False): - # Should work without __file__, e.g. in REPL or IPython notebook. - path = os.getcwd() - else: - # will work for .py files - frame = sys._getframe() - current_file = __file__ - - while frame.f_code.co_filename == current_file or not os.path.exists( - frame.f_code.co_filename - ): - assert frame.f_back is not None - frame = frame.f_back - frame_filename = frame.f_code.co_filename - path = os.path.dirname(os.path.abspath(frame_filename)) - - for dirname in _walk_to_root(path): - check_path = os.path.join(dirname, filename) - if os.path.isfile(check_path): - return check_path - - if raise_error_if_not_found: - raise IOError("File not found") - - return "" - - -def load_dotenv( - dotenv_path: Optional[StrPath] = None, - stream: Optional[IO[str]] = None, - verbose: bool = False, - override: bool = False, - interpolate: bool = True, - encoding: Optional[str] = "utf-8", -) -> bool: - """Parse a .env file and then load all the variables found as environment variables. - - Parameters: - dotenv_path: Absolute or relative path to .env file. - stream: Text stream (such as `io.StringIO`) with .env content, used if - `dotenv_path` is `None`. - verbose: Whether to output a warning the .env file is missing. - override: Whether to override the system environment variables with the variables - from the `.env` file. - encoding: Encoding to be used to read the file. - Returns: - Bool: True if at least one environment variable is set else False - - If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the - .env file with it's default parameters. If you need to change the default parameters - of `find_dotenv()`, you can explicitly call `find_dotenv()` and pass the result - to this function as `dotenv_path`. - """ - if dotenv_path is None and stream is None: - dotenv_path = find_dotenv() - - dotenv = DotEnv( - dotenv_path=dotenv_path, - stream=stream, - verbose=verbose, - interpolate=interpolate, - override=override, - encoding=encoding, - ) - return dotenv.set_as_environment_variables() - - -def dotenv_values( - dotenv_path: Optional[StrPath] = None, - stream: Optional[IO[str]] = None, - verbose: bool = False, - interpolate: bool = True, - encoding: Optional[str] = "utf-8", -) -> Dict[str, Optional[str]]: - """ - Parse a .env file and return its content as a dict. - - The returned dict will have `None` values for keys without values in the .env file. - For example, `foo=bar` results in `{"foo": "bar"}` whereas `foo` alone results in - `{"foo": None}` - - Parameters: - dotenv_path: Absolute or relative path to the .env file. - stream: `StringIO` object with .env content, used if `dotenv_path` is `None`. - verbose: Whether to output a warning if the .env file is missing. - encoding: Encoding to be used to read the file. - - If both `dotenv_path` and `stream` are `None`, `find_dotenv()` is used to find the - .env file. - """ - if dotenv_path is None and stream is None: - dotenv_path = find_dotenv() - - return DotEnv( - dotenv_path=dotenv_path, - stream=stream, - verbose=verbose, - interpolate=interpolate, - override=True, - encoding=encoding, - ).dict() diff --git a/venv/lib/python3.11/site-packages/dotenv/parser.py b/venv/lib/python3.11/site-packages/dotenv/parser.py deleted file mode 100755 index 735f14a..0000000 --- a/venv/lib/python3.11/site-packages/dotenv/parser.py +++ /dev/null @@ -1,175 +0,0 @@ -import codecs -import re -from typing import (IO, Iterator, Match, NamedTuple, Optional, # noqa:F401 - Pattern, Sequence, Tuple) - - -def make_regex(string: str, extra_flags: int = 0) -> Pattern[str]: - return re.compile(string, re.UNICODE | extra_flags) - - -_newline = make_regex(r"(\r\n|\n|\r)") -_multiline_whitespace = make_regex(r"\s*", extra_flags=re.MULTILINE) -_whitespace = make_regex(r"[^\S\r\n]*") -_export = make_regex(r"(?:export[^\S\r\n]+)?") -_single_quoted_key = make_regex(r"'([^']+)'") -_unquoted_key = make_regex(r"([^=\#\s]+)") -_equal_sign = make_regex(r"(=[^\S\r\n]*)") -_single_quoted_value = make_regex(r"'((?:\\'|[^'])*)'") -_double_quoted_value = make_regex(r'"((?:\\"|[^"])*)"') -_unquoted_value = make_regex(r"([^\r\n]*)") -_comment = make_regex(r"(?:[^\S\r\n]*#[^\r\n]*)?") -_end_of_line = make_regex(r"[^\S\r\n]*(?:\r\n|\n|\r|$)") -_rest_of_line = make_regex(r"[^\r\n]*(?:\r|\n|\r\n)?") -_double_quote_escapes = make_regex(r"\\[\\'\"abfnrtv]") -_single_quote_escapes = make_regex(r"\\[\\']") - - -class Original(NamedTuple): - string: str - line: int - - -class Binding(NamedTuple): - key: Optional[str] - value: Optional[str] - original: Original - error: bool - - -class Position: - def __init__(self, chars: int, line: int) -> None: - self.chars = chars - self.line = line - - @classmethod - def start(cls) -> "Position": - return cls(chars=0, line=1) - - def set(self, other: "Position") -> None: - self.chars = other.chars - self.line = other.line - - def advance(self, string: str) -> None: - self.chars += len(string) - self.line += len(re.findall(_newline, string)) - - -class Error(Exception): - pass - - -class Reader: - def __init__(self, stream: IO[str]) -> None: - self.string = stream.read() - self.position = Position.start() - self.mark = Position.start() - - def has_next(self) -> bool: - return self.position.chars < len(self.string) - - def set_mark(self) -> None: - self.mark.set(self.position) - - def get_marked(self) -> Original: - return Original( - string=self.string[self.mark.chars:self.position.chars], - line=self.mark.line, - ) - - def peek(self, count: int) -> str: - return self.string[self.position.chars:self.position.chars + count] - - def read(self, count: int) -> str: - result = self.string[self.position.chars:self.position.chars + count] - if len(result) < count: - raise Error("read: End of string") - self.position.advance(result) - return result - - def read_regex(self, regex: Pattern[str]) -> Sequence[str]: - match = regex.match(self.string, self.position.chars) - if match is None: - raise Error("read_regex: Pattern not found") - self.position.advance(self.string[match.start():match.end()]) - return match.groups() - - -def decode_escapes(regex: Pattern[str], string: str) -> str: - def decode_match(match: Match[str]) -> str: - return codecs.decode(match.group(0), 'unicode-escape') # type: ignore - - return regex.sub(decode_match, string) - - -def parse_key(reader: Reader) -> Optional[str]: - char = reader.peek(1) - if char == "#": - return None - elif char == "'": - (key,) = reader.read_regex(_single_quoted_key) - else: - (key,) = reader.read_regex(_unquoted_key) - return key - - -def parse_unquoted_value(reader: Reader) -> str: - (part,) = reader.read_regex(_unquoted_value) - return re.sub(r"\s+#.*", "", part).rstrip() - - -def parse_value(reader: Reader) -> str: - char = reader.peek(1) - if char == u"'": - (value,) = reader.read_regex(_single_quoted_value) - return decode_escapes(_single_quote_escapes, value) - elif char == u'"': - (value,) = reader.read_regex(_double_quoted_value) - return decode_escapes(_double_quote_escapes, value) - elif char in (u"", u"\n", u"\r"): - return u"" - else: - return parse_unquoted_value(reader) - - -def parse_binding(reader: Reader) -> Binding: - reader.set_mark() - try: - reader.read_regex(_multiline_whitespace) - if not reader.has_next(): - return Binding( - key=None, - value=None, - original=reader.get_marked(), - error=False, - ) - reader.read_regex(_export) - key = parse_key(reader) - reader.read_regex(_whitespace) - if reader.peek(1) == "=": - reader.read_regex(_equal_sign) - value: Optional[str] = parse_value(reader) - else: - value = None - reader.read_regex(_comment) - reader.read_regex(_end_of_line) - return Binding( - key=key, - value=value, - original=reader.get_marked(), - error=False, - ) - except Error: - reader.read_regex(_rest_of_line) - return Binding( - key=None, - value=None, - original=reader.get_marked(), - error=True, - ) - - -def parse_stream(stream: IO[str]) -> Iterator[Binding]: - reader = Reader(stream) - while reader.has_next(): - yield parse_binding(reader) diff --git a/venv/lib/python3.11/site-packages/dotenv/py.typed b/venv/lib/python3.11/site-packages/dotenv/py.typed deleted file mode 100755 index 7632ecf..0000000 --- a/venv/lib/python3.11/site-packages/dotenv/py.typed +++ /dev/null @@ -1 +0,0 @@ -# Marker file for PEP 561 diff --git a/venv/lib/python3.11/site-packages/dotenv/variables.py b/venv/lib/python3.11/site-packages/dotenv/variables.py deleted file mode 100755 index 667f2f2..0000000 --- a/venv/lib/python3.11/site-packages/dotenv/variables.py +++ /dev/null @@ -1,86 +0,0 @@ -import re -from abc import ABCMeta, abstractmethod -from typing import Iterator, Mapping, Optional, Pattern - -_posix_variable: Pattern[str] = re.compile( - r""" - \$\{ - (?P[^\}:]*) - (?::- - (?P[^\}]*) - )? - \} - """, - re.VERBOSE, -) - - -class Atom(metaclass=ABCMeta): - def __ne__(self, other: object) -> bool: - result = self.__eq__(other) - if result is NotImplemented: - return NotImplemented - return not result - - @abstractmethod - def resolve(self, env: Mapping[str, Optional[str]]) -> str: ... - - -class Literal(Atom): - def __init__(self, value: str) -> None: - self.value = value - - def __repr__(self) -> str: - return f"Literal(value={self.value})" - - def __eq__(self, other: object) -> bool: - if not isinstance(other, self.__class__): - return NotImplemented - return self.value == other.value - - def __hash__(self) -> int: - return hash((self.__class__, self.value)) - - def resolve(self, env: Mapping[str, Optional[str]]) -> str: - return self.value - - -class Variable(Atom): - def __init__(self, name: str, default: Optional[str]) -> None: - self.name = name - self.default = default - - def __repr__(self) -> str: - return f"Variable(name={self.name}, default={self.default})" - - def __eq__(self, other: object) -> bool: - if not isinstance(other, self.__class__): - return NotImplemented - return (self.name, self.default) == (other.name, other.default) - - def __hash__(self) -> int: - return hash((self.__class__, self.name, self.default)) - - def resolve(self, env: Mapping[str, Optional[str]]) -> str: - default = self.default if self.default is not None else "" - result = env.get(self.name, default) - return result if result is not None else "" - - -def parse_variables(value: str) -> Iterator[Atom]: - cursor = 0 - - for match in _posix_variable.finditer(value): - (start, end) = match.span() - name = match["name"] - default = match["default"] - - if start > cursor: - yield Literal(value=value[cursor:start]) - - yield Variable(name=name, default=default) - cursor = end - - length = len(value) - if cursor < length: - yield Literal(value=value[cursor:length]) diff --git a/venv/lib/python3.11/site-packages/dotenv/version.py b/venv/lib/python3.11/site-packages/dotenv/version.py deleted file mode 100755 index 6849410..0000000 --- a/venv/lib/python3.11/site-packages/dotenv/version.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "1.1.0" diff --git a/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/INSTALLER deleted file mode 100755 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/METADATA b/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/METADATA deleted file mode 100755 index 8a2f639..0000000 --- a/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/METADATA +++ /dev/null @@ -1,202 +0,0 @@ -Metadata-Version: 2.4 -Name: h11 -Version: 0.16.0 -Summary: A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 -Home-page: https://github.com/python-hyper/h11 -Author: Nathaniel J. Smith -Author-email: njs@pobox.com -License: MIT -Classifier: Development Status :: 3 - Alpha -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Topic :: Internet :: WWW/HTTP -Classifier: Topic :: System :: Networking -Requires-Python: >=3.8 -License-File: LICENSE.txt -Dynamic: author -Dynamic: author-email -Dynamic: classifier -Dynamic: description -Dynamic: home-page -Dynamic: license -Dynamic: license-file -Dynamic: requires-python -Dynamic: summary - -h11 -=== - -.. image:: https://travis-ci.org/python-hyper/h11.svg?branch=master - :target: https://travis-ci.org/python-hyper/h11 - :alt: Automated test status - -.. image:: https://codecov.io/gh/python-hyper/h11/branch/master/graph/badge.svg - :target: https://codecov.io/gh/python-hyper/h11 - :alt: Test coverage - -.. image:: https://readthedocs.org/projects/h11/badge/?version=latest - :target: http://h11.readthedocs.io/en/latest/?badge=latest - :alt: Documentation Status - -This is a little HTTP/1.1 library written from scratch in Python, -heavily inspired by `hyper-h2 `_. - -It's a "bring-your-own-I/O" library; h11 contains no IO code -whatsoever. This means you can hook h11 up to your favorite network -API, and that could be anything you want: synchronous, threaded, -asynchronous, or your own implementation of `RFC 6214 -`_ -- h11 won't judge you. -(Compare this to the current state of the art, where every time a `new -network API `_ comes along then someone -gets to start over reimplementing the entire HTTP protocol from -scratch.) Cory Benfield made an `excellent blog post describing the -benefits of this approach -`_, or if you like video -then here's his `PyCon 2016 talk on the same theme -`_. - -This also means that h11 is not immediately useful out of the box: -it's a toolkit for building programs that speak HTTP, not something -that could directly replace ``requests`` or ``twisted.web`` or -whatever. But h11 makes it much easier to implement something like -``requests`` or ``twisted.web``. - -At a high level, working with h11 goes like this: - -1) First, create an ``h11.Connection`` object to track the state of a - single HTTP/1.1 connection. - -2) When you read data off the network, pass it to - ``conn.receive_data(...)``; you'll get back a list of objects - representing high-level HTTP "events". - -3) When you want to send a high-level HTTP event, create the - corresponding "event" object and pass it to ``conn.send(...)``; - this will give you back some bytes that you can then push out - through the network. - -For example, a client might instantiate and then send a -``h11.Request`` object, then zero or more ``h11.Data`` objects for the -request body (e.g., if this is a POST), and then a -``h11.EndOfMessage`` to indicate the end of the message. Then the -server would then send back a ``h11.Response``, some ``h11.Data``, and -its own ``h11.EndOfMessage``. If either side violates the protocol, -you'll get a ``h11.ProtocolError`` exception. - -h11 is suitable for implementing both servers and clients, and has a -pleasantly symmetric API: the events you send as a client are exactly -the ones that you receive as a server and vice-versa. - -`Here's an example of a tiny HTTP client -`_ - -It also has `a fine manual `_. - -FAQ ---- - -*Whyyyyy?* - -I wanted to play with HTTP in `Curio -`__ and `Trio -`__, which at the time didn't have any -HTTP libraries. So I thought, no big deal, Python has, like, a dozen -different implementations of HTTP, surely I can find one that's -reusable. I didn't find one, but I did find Cory's call-to-arms -blog-post. So I figured, well, fine, if I have to implement HTTP from -scratch, at least I can make sure no-one *else* has to ever again. - -*Should I use it?* - -Maybe. You should be aware that it's a very young project. But, it's -feature complete and has an exhaustive test-suite and complete docs, -so the next step is for people to try using it and see how it goes -:-). If you do then please let us know -- if nothing else we'll want -to talk to you before making any incompatible changes! - -*What are the features/limitations?* - -Roughly speaking, it's trying to be a robust, complete, and non-hacky -implementation of the first "chapter" of the HTTP/1.1 spec: `RFC 7230: -HTTP/1.1 Message Syntax and Routing -`_. That is, it mostly focuses on -implementing HTTP at the level of taking bytes on and off the wire, -and the headers related to that, and tries to be anal about spec -conformance. It doesn't know about higher-level concerns like URL -routing, conditional GETs, cross-origin cookie policies, or content -negotiation. But it does know how to take care of framing, -cross-version differences in keep-alive handling, and the "obsolete -line folding" rule, so you can focus your energies on the hard / -interesting parts for your application, and it tries to support the -full specification in the sense that any useful HTTP/1.1 conformant -application should be able to use h11. - -It's pure Python, and has no dependencies outside of the standard -library. - -It has a test suite with 100.0% coverage for both statements and -branches. - -Currently it supports Python 3 (testing on 3.8-3.12) and PyPy 3. -The last Python 2-compatible version was h11 0.11.x. -(Originally it had a Cython wrapper for `http-parser -`_ and a beautiful nested state -machine implemented with ``yield from`` to postprocess the output. But -I had to take these out -- the new *parser* needs fewer lines-of-code -than the old *parser wrapper*, is written in pure Python, uses no -exotic language syntax, and has more features. It's sad, really; that -old state machine was really slick. I just need a few sentences here -to mourn that.) - -I don't know how fast it is. I haven't benchmarked or profiled it yet, -so it's probably got a few pointless hot spots, and I've been trying -to err on the side of simplicity and robustness instead of -micro-optimization. But at the architectural level I tried hard to -avoid fundamentally bad decisions, e.g., I believe that all the -parsing algorithms remain linear-time even in the face of pathological -input like slowloris, and there are no byte-by-byte loops. (I also -believe that it maintains bounded memory usage in the face of -arbitrary/pathological input.) - -The whole library is ~800 lines-of-code. You can read and understand -the whole thing in less than an hour. Most of the energy invested in -this so far has been spent on trying to keep things simple by -minimizing special-cases and ad hoc state manipulation; even though it -is now quite small and simple, I'm still annoyed that I haven't -figured out how to make it even smaller and simpler. (Unfortunately, -HTTP does not lend itself to simplicity.) - -The API is ~feature complete and I don't expect the general outlines -to change much, but you can't judge an API's ergonomics until you -actually document and use it, so I'd expect some changes in the -details. - -*How do I try it?* - -.. code-block:: sh - - $ pip install h11 - $ git clone git@github.com:python-hyper/h11 - $ cd h11/examples - $ python basic-client.py - -and go from there. - -*License?* - -MIT - -*Code of conduct?* - -Contributors are requested to follow our `code of conduct -`_ in -all project spaces. diff --git a/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/RECORD b/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/RECORD deleted file mode 100755 index 8768040..0000000 --- a/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/RECORD +++ /dev/null @@ -1,29 +0,0 @@ -h11-0.16.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -h11-0.16.0.dist-info/METADATA,sha256=KPMmCYrAn8unm48YD5YIfIQf4kViFct7hyqcfVzRnWQ,8348 -h11-0.16.0.dist-info/RECORD,, -h11-0.16.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91 -h11-0.16.0.dist-info/licenses/LICENSE.txt,sha256=N9tbuFkm2yikJ6JYZ_ELEjIAOuob5pzLhRE4rbjm82E,1124 -h11-0.16.0.dist-info/top_level.txt,sha256=F7dC4jl3zeh8TGHEPaWJrMbeuoWbS379Gwdi-Yvdcis,4 -h11/__init__.py,sha256=iO1KzkSO42yZ6ffg-VMgbx_ZVTWGUY00nRYEWn-s3kY,1507 -h11/__pycache__/__init__.cpython-311.pyc,, -h11/__pycache__/_abnf.cpython-311.pyc,, -h11/__pycache__/_connection.cpython-311.pyc,, -h11/__pycache__/_events.cpython-311.pyc,, -h11/__pycache__/_headers.cpython-311.pyc,, -h11/__pycache__/_readers.cpython-311.pyc,, -h11/__pycache__/_receivebuffer.cpython-311.pyc,, -h11/__pycache__/_state.cpython-311.pyc,, -h11/__pycache__/_util.cpython-311.pyc,, -h11/__pycache__/_version.cpython-311.pyc,, -h11/__pycache__/_writers.cpython-311.pyc,, -h11/_abnf.py,sha256=ybixr0xsupnkA6GFAyMubuXF6Tc1lb_hF890NgCsfNc,4815 -h11/_connection.py,sha256=k9YRVf6koZqbttBW36xSWaJpWdZwa-xQVU9AHEo9DuI,26863 -h11/_events.py,sha256=I97aXoal1Wu7dkL548BANBUCkOIbe-x5CioYA9IBY14,11792 -h11/_headers.py,sha256=P7D-lBNxHwdLZPLimmYwrPG-9ZkjElvvJZJdZAgSP-4,10412 -h11/_readers.py,sha256=a4RypORUCC3d0q_kxPuBIM7jTD8iLt5X91TH0FsduN4,8590 -h11/_receivebuffer.py,sha256=xrspsdsNgWFxRfQcTXxR8RrdjRXXTK0Io5cQYWpJ1Ws,5252 -h11/_state.py,sha256=_5LG_BGR8FCcFQeBPH-TMHgm_-B-EUcWCnQof_9XjFE,13231 -h11/_util.py,sha256=LWkkjXyJaFlAy6Lt39w73UStklFT5ovcvo0TkY7RYuk,4888 -h11/_version.py,sha256=GVSsbPSPDcOuF6ptfIiXnVJoaEm3ygXbMnqlr_Giahw,686 -h11/_writers.py,sha256=oFKm6PtjeHfbj4RLX7VB7KDc1gIY53gXG3_HR9ltmTA,5081 -h11/py.typed,sha256=sow9soTwP9T_gEAQSVh7Gb8855h04Nwmhs2We-JRgZM,7 diff --git a/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/WHEEL b/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/WHEEL deleted file mode 100755 index 1eb3c49..0000000 --- a/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: setuptools (78.1.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/licenses/LICENSE.txt b/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/licenses/LICENSE.txt deleted file mode 100755 index 8f080ea..0000000 --- a/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/licenses/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Nathaniel J. Smith and other contributors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/top_level.txt b/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/top_level.txt deleted file mode 100755 index 0d24def..0000000 --- a/venv/lib/python3.11/site-packages/h11-0.16.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -h11 diff --git a/venv/lib/python3.11/site-packages/h11/__init__.py b/venv/lib/python3.11/site-packages/h11/__init__.py deleted file mode 100755 index 989e92c..0000000 --- a/venv/lib/python3.11/site-packages/h11/__init__.py +++ /dev/null @@ -1,62 +0,0 @@ -# A highish-level implementation of the HTTP/1.1 wire protocol (RFC 7230), -# containing no networking code at all, loosely modelled on hyper-h2's generic -# implementation of HTTP/2 (and in particular the h2.connection.H2Connection -# class). There's still a bunch of subtle details you need to get right if you -# want to make this actually useful, because it doesn't implement all the -# semantics to check that what you're asking to write to the wire is sensible, -# but at least it gets you out of dealing with the wire itself. - -from h11._connection import Connection, NEED_DATA, PAUSED -from h11._events import ( - ConnectionClosed, - Data, - EndOfMessage, - Event, - InformationalResponse, - Request, - Response, -) -from h11._state import ( - CLIENT, - CLOSED, - DONE, - ERROR, - IDLE, - MIGHT_SWITCH_PROTOCOL, - MUST_CLOSE, - SEND_BODY, - SEND_RESPONSE, - SERVER, - SWITCHED_PROTOCOL, -) -from h11._util import LocalProtocolError, ProtocolError, RemoteProtocolError -from h11._version import __version__ - -PRODUCT_ID = "python-h11/" + __version__ - - -__all__ = ( - "Connection", - "NEED_DATA", - "PAUSED", - "ConnectionClosed", - "Data", - "EndOfMessage", - "Event", - "InformationalResponse", - "Request", - "Response", - "CLIENT", - "CLOSED", - "DONE", - "ERROR", - "IDLE", - "MUST_CLOSE", - "SEND_BODY", - "SEND_RESPONSE", - "SERVER", - "SWITCHED_PROTOCOL", - "ProtocolError", - "LocalProtocolError", - "RemoteProtocolError", -) diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 7f5d31f2576f889415cce4bcad67ba87333a329b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1313 zcmc(d&u`N(6vv(ZNZO=Xf354*G2k#Edf1|AClEp!O|%uYO_g*Y%)tt+w-w^JB-y0x zv_Ap~#EBc?zZtj5C#0RYRoZPQ?2LhiG>Ho$aXxu|wx7T6*`IY?1^hXE_wn^v7JxI+ zxq4DRjq^|3cn?NkB>8|yP$DUqB59bGgfHc1NET*^3}vD~h2&t4?I+cI7{;;P{7kpl0GaxQ4*zYDp|G*eqN2=Fi-(}3lBmSrMyW3a*G{>HXznN5Y2 zeotumG{Pg6F}>Jh1uGcYJ6#+_-Y#ZY>i`EatF?n28WK;0^Lz(K6BJ7x-=3DWwcF*F09LIK8rfqgCR_nGmw+6_4-X65JP~Wi!cFXQCwY%*O zP_m5WU8`rJC${;5>51uBZr|>?7L#4ed1g7Re7T%wb`^l9UFp!F=l4Sz(;@Y(Fr*>V zuXn2sCN##^oK1;o2p!-s;t3*jq)iUvJsPa+t*sf&dYI-l4Ko7#c7RY8Py})Uc>!^O zLQS9`pbN|h6a`8GWr3=|tUyg*PM|KZATTe`;OI5)vLfGo6%Bu#;~z4ZmW*R@K+#`l zVrnu!ioF=$tgj*z+$56alMwsy*uRvTh!%QTAsP8u!EjNyRDLezc58szCQ}gdd>^4N z;G7SEi%nyX5^NAJ98%*c-KFb>H<=hbmjlBezcMcCzrM=rAB|(YGVz9Q_XbC;DmGENmcm9?9!jN6Dsz(=H@;20CU&sh z(mFHpBS;7hX%aug!;mIuMIS)oVIUrc#5;NDL*!TZ11xP%d*ayckMu3pmG3?0e(t&F ze2?Xy7$%C~={)%E?muaS{&kJxhdNq3JqRH5H4+hr!~hq-0WK&8xsVv*2uyHf5Q)Uy zV-|^N2?Y`E`wjcq3Va#h!a$Nekr5!Np2#R<69c-hCz=++90PQuCps=hxdhO$ zp6DcybWdbTWVkfY@t){@F~JQ0o$QHzK}_95Y`;ORjg<6q&KO?HkB(h@^|fqnV)73E z(Y;TL`8S2Uv5@D=6Gm*Uv~y`HU)s5X%SL4FPHCrDENNvU+uD$DUF5ebH9<8e#^-0e zXcK4MY|coJAGs=utYcX>*?Hso`25POe_j?Ecx^{o@cGfdV) zjBxAdc4O?uty?Pv_e@RKoBTFbHA#`@)}WGdY0{fm<861pf%Tdq&b9p6WJg@5E~r(k z&$U$i@fOx}-nU`1)g8_>!d|4-v}wFJ?v;Db&wy7{URl?89q&MWIb-?kIqwcl7xXQS zuP7oE(`A?}Xy*|s7Bom2vT$dnL?!627_k{dL*%kE0^$)KtErJZKsn;(R zP16XyHJS74tJJpSOxaD;1Ua~Ul+mPe&mY43lCuT`4$;8w&g>`vj zvbp;_Jljyjtva4lhao8ZDv|aFyq!=W5O9*HFKLCGG>T*`(g~w@zZG@f37|;EB0B>k zZItT7U$$bMo+3(TM_qFiPG(-ZU;RpYAayxID8M)uQ8Zyuoz&R<;ltEeJ5_}7 zu==q2gY-!9Ei2whykXG}L68^RXy+h!=7Jk1=bAYPK9c?BlW%vw-|cdG!Ox?_dAF>~ z?PTH5eZLFiaprO6_n|+Bd<)7V!er4wVUm58M7g4q3X@k|^D4+TJ@ZTUSN1oy%L##L zXAngPEy|%0NWr{v$gpkZGK{^&y~X{dgC*YrjcLU6TM>r{l7kKklBxev8HXfD%1xYd aC=^S7mi?Ulf_3^%oNnS4ZPDrw^zeT(7Yu^{ diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_connection.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_connection.cpython-311.pyc deleted file mode 100755 index 892374befce25367b180ed71eac47a455b5e093a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24947 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 diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_events.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_events.cpython-311.pyc deleted file mode 100755 index 1e807849ddbe4bc1f359bf95dd8c6675ef1c5f18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15108 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 I!i*LC4=dj#>i_@% diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_headers.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_headers.cpython-311.pyc deleted file mode 100755 index c22978beaec12e3cf255ea3408ed52217847b8af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9269 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%0Dh;n)^W9(_T;?A4xn&Fmz;;J zn;pYFRvAx$EEbs!7J`Kx3&mn!`I0uha2$s~5s!xp!GlI%ge?544*|gXKFg79+m}w| z21bm5<9Xu1vkZW&xC;*IM^^qK=W0neue-W*S68lk@J09j_3r)I?lGf#Z23~IZ}dgq zk@dbK&qlL-?;3sYqF+LP0C1?y`Nm%Oj;{NTW_`yE-*Ln=;VG=)om_L<EquK}NdITgTbSZ~^v zvcK7Dz_T2Ys#E~x&6l!)U+jTI_ig>SH+xs5zog(-i7h^{S1U__Q&p*4@urTq90fhY z6yTC2rm*1b7fW73XP}W@M~eEAXRy1AX>5_PrKV&^Jh~TLqi}=ch5f(MH)23Tz=73Y z!xwy`nGEfN*njYZaqv7ITi=5dDZ;F{f4M$go4Hi(9GgL*e$Auzyqk5OG~6e3_sQ3} zmL5FF9$;X(CMPz%5Vx<3+tcH}JOA7BznS=aV%4vAjAq3#LmboDyW!fA*^_k*8LlCn zAF`anNv&V0C?*eEGAx|vSCarLZ@y&i7T~}fHW?OT`6&t@f_T8sBXmV+c$`Na5TYwZ*!Obw!oGdn=HuI;y`RV3O#Yq;vHJs zY*-Ch_z-YoJ34Zsw}A+L%qA*s-0Zw6dJJbrIe%3 z^3C&hZXm})npOS2&N*Rs=D2|p$nk#tO)si9@cQ*@$lAJkbkd%u9BGwS-hUL#)Mi`u z7%h8r(wJ-LSZRE;UGE%BpEo)OS7)-F2aL`G*@lBg!@;HcTw~`-@1p^|YdC$)=o(&g zX1fjfhj{{@HMpIG&s%|t5#lSyQSwi&lQs5#5jlYW3tJ9dcK`qY diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_readers.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_readers.cpython-311.pyc deleted file mode 100755 index 5e18be62fcb38f9eb8e06b37679ccd4e37fb539f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11057 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 XL*9~Ynqgq4JHvlc`oDIWr8@r?hDUI5 diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_state.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_state.cpython-311.pyc deleted file mode 100755 index bc29c31a8b5e247bbd2917d5a84dfff466bf0b35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9687 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 K_uF7;c=~_UGSS!o diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_util.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_util.cpython-311.pyc deleted file mode 100755 index b306f966ef8aba5020c66e4dead4cc8bf0ac903e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5366 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 rhuHgQcj!4;7+ROs>BhUC$G^Jp^Lo+=CKTXD4 z-0|^csYS(^`FZj2D;Yk6wES|{&&bbB)z3{VO3v5!%1_TX)=w-b&@W5PE7Q-(Owuo? zEXl~vGuAUS)Gy8~N!2Y#OwLYBPc7EZ0E)nj(<`X_#bJ}1pHiBWYFEStG#BKaVgVrW Vftit!@q+>bzjy;T2o|vb1p)GgH2VMm diff --git a/venv/lib/python3.11/site-packages/h11/__pycache__/_writers.cpython-311.pyc b/venv/lib/python3.11/site-packages/h11/__pycache__/_writers.cpython-311.pyc deleted file mode 100755 index f7e96e4c9157f12f681e29f2dbfaff216555c7e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7303 zcmcIo+iw$B8lM@@*kgO_ICc^OB*BC@U?3PaP*}=x$)#L2acB}+>b7gSo=IZxB|S5t zBnnct>VrX%>Xj;yu0YB|#e({hhd%Ui|AaBJwBFGoA?;J&jKWH*KJE9Nu^roSSlZPd zkH2%~JNNJMJKveVxLghfQt_KV-}<|cVg89PmE5F2z;Da|5qOZc%KCq_}H)*R=6Kn|&N}nUPz+Vr1_V z*!B1DH&etQGRPU;u}nOcyiPJ&CZ0)-5|SZ?I0Z{cq?M#$ z`*8B=^yuW2VVg7OFoZ8iLQ@PYQM3h;4#%rz1zWPhA5CfV36O`(GII-ZGu`8sxe?~m zu1}!;p5-2YPgv$<_BQQJJRGyk%G|PLS(xFLV3a2ypzl#gG_lNTchla~Y~Q9g9pBP8 zs?2~2`LN2vEOQxEQ$;8Q)U*D8>T+!2(p(M@uQNKckW5Bl*C{nLLWo9#jq1gO<2$X#%luUdUnqSoB zGU>r%Cr*S^m}+1?7QYSlpoZpv6Qx2Y>aqDn!$r%{vOY)vrs#mb`X?YOOi5%~I}4rz zD_4vA50@BDI7LZb?9Ph0zBQrfY{{K|a3Oo4D79usa|7#Vp5D-V2lL*+ymYc4oz$h1 z|Nb9(^7fU{?7=^VzY4F=-zF@IF>J)N+B#zqpoSXD8Wie{1q{PfZHq>890WX$t5@Kc ztf^Kov#Jq7x!R+-DQR|dG^EfPS3%P`_*AS$gCc@Q|;50Az(J+S~=(-nBc=Z2{dDc;WWz`%mZHXA15!x_G9D zn$R8l)=z(Te&h5H=k?y9ykjWO4;T1hogaR|x8@Fh6Iwr&=Ys`4s8=4+kMoM8j5o~{ z_77lCI{#Z84@RaL!W*Lj#=Tap|6_Z~;p&o6VeYTQBTuC3vqwXO2DgVKdC2|^Qc z7>FUn)OaF6^;}UpY8x>kD3T-Cj;hz9YQ%7=T1;C|qw$Ok7^$SqoG39BtN>lrRJetN zuuM@zDtGy8QG+7@MFN0f>fdX+dMv#dt!RXth6YFBuYLgp{N2iko`S7w-TK_tuiN?? z%;1HuBX_s3>qy>rwBS4XH{alM-{8jOyzgAWcWz~@07F6H^5 z0zahlLue$23f|uJ(L8^+z#rBt54Dmw%wJ6ibeJ};0eQ$MOoWx02q&|OMdlP@pAN>@XZd8F}$TJadR4D0ntfv5_vAC>*a^5WJz) z;QQutAP*U>dVYYdvGo?FRRM!x78ugK%&gaNpnEwjvs-Yo%ryguH_n3RNja5gsj>e` z4X*B1MSe{4S*|f(vd`Es1RA^sVFbZ=*03WGMP&>jc%(!^u1L8`CRMgHgIAU03^@yR zCcxBLm>7-1>7R^7mwa1tK2~8~fKF-*$O`iU&JE%IyQ}X$?$ez;@DwG_*Wm}@wNsDI zt}o=Jfr2!kSDqKH)?DEJ$EzPd9@AZi;K9b@560I5j|QH$=cQ0V3h9;SrPP@nqZUPQ zzB-kn3aLs_J`X7(6AZqdG0!aI5)^2c?fW9

C%y_83 z)y!lBT2>~nh5~hNOD;l_I(b%9g3dwSL(&ffj2py{;X*WOIHJ*1MqWr_S&BwKUx+2m z8iLSeSWOQgL--<4sGxf!tvK36B)BkhGksY4ZH1sH)USc8RDUJTD(qfUN(^LA-=o=v zMzcoZVFed9gbW)(h7BQWBv#<9+sqbLn*DgPu}ytHbFH|{IQ*-r;t885r$!`^Ei=5# z13K`spp=mWcvg7}MJT#Zo{1tBiXy(@Oj-l%7*o=-+FThrOtoQCBla!9X%*+Twgcy3r5jv|Z__eqsXeKi z23}m_xaEM!5+*3UrQmcX<4-Nb=lqCGez?r|WhI`B5k>ZwB{5)XBWNL$(8I8RDCtp3 zM&Y&IrKmr5H}fi-v?@Ketc`qYe`L>#`?K&0q3`Oswf)bXdv)jD7v4TS za6RvRzukqWS^6_YzYP{p;#BINK;hTLK+7yh7sn{4#<=E7I63LP z#FXO^lw&fXX-Vb3N^&VsFIj&KB2|sV5=n?d{cJKax*Vhj77%0!qTfzVzpHLv$Exl=1ASC97#ah6Ku@gQSCqWj_e@_-JU*}{ ze;a%h%)1Zd#lC{rr;B}cZf?HJ-gmFMv-G!v&+{+|6&FSx56fbzk0;rNXtQ|~7v#d! z(~je31@ktrgZFhb*))W78QgP#?%7=Y-2Il-mTb!lu{}4twvZPC1u>vk9=e@pVuNeF zwL^Ub^AIEo&Whr$xD!a6vkAM@?dGqL(*4?}yy z8pY283h`nCG!}v(DQQQ7pZyFWx}YVJrrJ7@VT(rTjjqPg5i;o4Bl`8gyc*y!MBST8 zocsp6I!(V&@l!R~jhq%3ES=8465unI8jUun>}T2LQGnULP>dFgD+9$B%yw72F?*h>Pumza9e=VIX=ww=5}-s`Q3qiz;Mljd~o@GDyLy0*SoVgaDHliame$bG$4 z)njGRpPJL$*;lmYb!~kI)8d1#li5Iy&)xjSz0R-S{LZa=jujlCjkb-sA9{4hg#v#O zn&AC>D%Y1=f^Sf|tG6H?D2kq3K<^xQdROl}UGSdyv0rb!^w*Pm>*a!Y1uGA(y`#7G zu8-)ghYDh_Byjd4uPwY_Em;J?_S#}=;Z~ermsTk|y%Nri7X>F4^tOI1eX8?&_3luS ocNKm9;+}zGo4;h^J#cIxvD-Vj6&j0`b diff --git a/venv/lib/python3.11/site-packages/h11/_abnf.py b/venv/lib/python3.11/site-packages/h11/_abnf.py deleted file mode 100755 index 933587f..0000000 --- a/venv/lib/python3.11/site-packages/h11/_abnf.py +++ /dev/null @@ -1,132 +0,0 @@ -# We use native strings for all the re patterns, to take advantage of string -# formatting, and then convert to bytestrings when compiling the final re -# objects. - -# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#whitespace -# OWS = *( SP / HTAB ) -# ; optional whitespace -OWS = r"[ \t]*" - -# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#rule.token.separators -# token = 1*tchar -# -# tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" -# / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" -# / DIGIT / ALPHA -# ; any VCHAR, except delimiters -token = r"[-!#$%&'*+.^_`|~0-9a-zA-Z]+" - -# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#header.fields -# field-name = token -field_name = token - -# The standard says: -# -# field-value = *( field-content / obs-fold ) -# field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] -# field-vchar = VCHAR / obs-text -# obs-fold = CRLF 1*( SP / HTAB ) -# ; obsolete line folding -# ; see Section 3.2.4 -# -# https://tools.ietf.org/html/rfc5234#appendix-B.1 -# -# VCHAR = %x21-7E -# ; visible (printing) characters -# -# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#rule.quoted-string -# obs-text = %x80-FF -# -# However, the standard definition of field-content is WRONG! It disallows -# fields containing a single visible character surrounded by whitespace, -# e.g. "foo a bar". -# -# See: https://www.rfc-editor.org/errata_search.php?rfc=7230&eid=4189 -# -# So our definition of field_content attempts to fix it up... -# -# Also, we allow lots of control characters, because apparently people assume -# that they're legal in practice (e.g., google analytics makes cookies with -# \x01 in them!): -# https://github.com/python-hyper/h11/issues/57 -# We still don't allow NUL or whitespace, because those are often treated as -# meta-characters and letting them through can lead to nasty issues like SSRF. -vchar = r"[\x21-\x7e]" -vchar_or_obs_text = r"[^\x00\s]" -field_vchar = vchar_or_obs_text -field_content = r"{field_vchar}+(?:[ \t]+{field_vchar}+)*".format(**globals()) - -# We handle obs-fold at a different level, and our fixed-up field_content -# already grows to swallow the whole value, so ? instead of * -field_value = r"({field_content})?".format(**globals()) - -# header-field = field-name ":" OWS field-value OWS -header_field = ( - r"(?P{field_name})" - r":" - r"{OWS}" - r"(?P{field_value})" - r"{OWS}".format(**globals()) -) - -# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#request.line -# -# request-line = method SP request-target SP HTTP-version CRLF -# method = token -# HTTP-version = HTTP-name "/" DIGIT "." DIGIT -# HTTP-name = %x48.54.54.50 ; "HTTP", case-sensitive -# -# request-target is complicated (see RFC 7230 sec 5.3) -- could be path, full -# URL, host+port (for connect), or even "*", but in any case we are guaranteed -# that it contists of the visible printing characters. -method = token -request_target = r"{vchar}+".format(**globals()) -http_version = r"HTTP/(?P[0-9]\.[0-9])" -request_line = ( - r"(?P{method})" - r" " - r"(?P{request_target})" - r" " - r"{http_version}".format(**globals()) -) - -# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#status.line -# -# status-line = HTTP-version SP status-code SP reason-phrase CRLF -# status-code = 3DIGIT -# reason-phrase = *( HTAB / SP / VCHAR / obs-text ) -status_code = r"[0-9]{3}" -reason_phrase = r"([ \t]|{vchar_or_obs_text})*".format(**globals()) -status_line = ( - r"{http_version}" - r" " - r"(?P{status_code})" - # However, there are apparently a few too many servers out there that just - # leave out the reason phrase: - # https://github.com/scrapy/scrapy/issues/345#issuecomment-281756036 - # https://github.com/seanmonstar/httparse/issues/29 - # so make it optional. ?: is a non-capturing group. - r"(?: (?P{reason_phrase}))?".format(**globals()) -) - -HEXDIG = r"[0-9A-Fa-f]" -# Actually -# -# chunk-size = 1*HEXDIG -# -# but we impose an upper-limit to avoid ridiculosity. len(str(2**64)) == 20 -chunk_size = r"({HEXDIG}){{1,20}}".format(**globals()) -# Actually -# -# chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) -# -# but we aren't parsing the things so we don't really care. -chunk_ext = r";.*" -chunk_header = ( - r"(?P{chunk_size})" - r"(?P{chunk_ext})?" - r"{OWS}\r\n".format( - **globals() - ) # Even though the specification does not allow for extra whitespaces, - # we are lenient with trailing whitespaces because some servers on the wild use it. -) diff --git a/venv/lib/python3.11/site-packages/h11/_connection.py b/venv/lib/python3.11/site-packages/h11/_connection.py deleted file mode 100755 index e37d82a..0000000 --- a/venv/lib/python3.11/site-packages/h11/_connection.py +++ /dev/null @@ -1,659 +0,0 @@ -# This contains the main Connection class. Everything in h11 revolves around -# this. -from typing import ( - Any, - Callable, - cast, - Dict, - List, - Optional, - overload, - Tuple, - Type, - Union, -) - -from ._events import ( - ConnectionClosed, - Data, - EndOfMessage, - Event, - InformationalResponse, - Request, - Response, -) -from ._headers import get_comma_header, has_expect_100_continue, set_comma_header -from ._readers import READERS, ReadersType -from ._receivebuffer import ReceiveBuffer -from ._state import ( - _SWITCH_CONNECT, - _SWITCH_UPGRADE, - CLIENT, - ConnectionState, - DONE, - ERROR, - MIGHT_SWITCH_PROTOCOL, - SEND_BODY, - SERVER, - SWITCHED_PROTOCOL, -) -from ._util import ( # Import the internal things we need - LocalProtocolError, - RemoteProtocolError, - Sentinel, -) -from ._writers import WRITERS, WritersType - -# Everything in __all__ gets re-exported as part of the h11 public API. -__all__ = ["Connection", "NEED_DATA", "PAUSED"] - - -class NEED_DATA(Sentinel, metaclass=Sentinel): - pass - - -class PAUSED(Sentinel, metaclass=Sentinel): - pass - - -# If we ever have this much buffered without it making a complete parseable -# event, we error out. The only time we really buffer is when reading the -# request/response line + headers together, so this is effectively the limit on -# the size of that. -# -# Some precedents for defaults: -# - node.js: 80 * 1024 -# - tomcat: 8 * 1024 -# - IIS: 16 * 1024 -# - Apache: <8 KiB per line> -DEFAULT_MAX_INCOMPLETE_EVENT_SIZE = 16 * 1024 - - -# RFC 7230's rules for connection lifecycles: -# - If either side says they want to close the connection, then the connection -# must close. -# - HTTP/1.1 defaults to keep-alive unless someone says Connection: close -# - HTTP/1.0 defaults to close unless both sides say Connection: keep-alive -# (and even this is a mess -- e.g. if you're implementing a proxy then -# sending Connection: keep-alive is forbidden). -# -# We simplify life by simply not supporting keep-alive with HTTP/1.0 peers. So -# our rule is: -# - If someone says Connection: close, we will close -# - If someone uses HTTP/1.0, we will close. -def _keep_alive(event: Union[Request, Response]) -> bool: - connection = get_comma_header(event.headers, b"connection") - if b"close" in connection: - return False - if getattr(event, "http_version", b"1.1") < b"1.1": - return False - return True - - -def _body_framing( - request_method: bytes, event: Union[Request, Response] -) -> Tuple[str, Union[Tuple[()], Tuple[int]]]: - # Called when we enter SEND_BODY to figure out framing information for - # this body. - # - # These are the only two events that can trigger a SEND_BODY state: - assert type(event) in (Request, Response) - # Returns one of: - # - # ("content-length", count) - # ("chunked", ()) - # ("http/1.0", ()) - # - # which are (lookup key, *args) for constructing body reader/writer - # objects. - # - # Reference: https://tools.ietf.org/html/rfc7230#section-3.3.3 - # - # Step 1: some responses always have an empty body, regardless of what the - # headers say. - if type(event) is Response: - if ( - event.status_code in (204, 304) - or request_method == b"HEAD" - or (request_method == b"CONNECT" and 200 <= event.status_code < 300) - ): - return ("content-length", (0,)) - # Section 3.3.3 also lists another case -- responses with status_code - # < 200. For us these are InformationalResponses, not Responses, so - # they can't get into this function in the first place. - assert event.status_code >= 200 - - # Step 2: check for Transfer-Encoding (T-E beats C-L): - transfer_encodings = get_comma_header(event.headers, b"transfer-encoding") - if transfer_encodings: - assert transfer_encodings == [b"chunked"] - return ("chunked", ()) - - # Step 3: check for Content-Length - content_lengths = get_comma_header(event.headers, b"content-length") - if content_lengths: - return ("content-length", (int(content_lengths[0]),)) - - # Step 4: no applicable headers; fallback/default depends on type - if type(event) is Request: - return ("content-length", (0,)) - else: - return ("http/1.0", ()) - - -################################################################ -# -# The main Connection class -# -################################################################ - - -class Connection: - """An object encapsulating the state of an HTTP connection. - - Args: - our_role: If you're implementing a client, pass :data:`h11.CLIENT`. If - you're implementing a server, pass :data:`h11.SERVER`. - - max_incomplete_event_size (int): - The maximum number of bytes we're willing to buffer of an - incomplete event. In practice this mostly sets a limit on the - maximum size of the request/response line + headers. If this is - exceeded, then :meth:`next_event` will raise - :exc:`RemoteProtocolError`. - - """ - - def __init__( - self, - our_role: Type[Sentinel], - max_incomplete_event_size: int = DEFAULT_MAX_INCOMPLETE_EVENT_SIZE, - ) -> None: - self._max_incomplete_event_size = max_incomplete_event_size - # State and role tracking - if our_role not in (CLIENT, SERVER): - raise ValueError(f"expected CLIENT or SERVER, not {our_role!r}") - self.our_role = our_role - self.their_role: Type[Sentinel] - if our_role is CLIENT: - self.their_role = SERVER - else: - self.their_role = CLIENT - self._cstate = ConnectionState() - - # Callables for converting data->events or vice-versa given the - # current state - self._writer = self._get_io_object(self.our_role, None, WRITERS) - self._reader = self._get_io_object(self.their_role, None, READERS) - - # Holds any unprocessed received data - self._receive_buffer = ReceiveBuffer() - # If this is true, then it indicates that the incoming connection was - # closed *after* the end of whatever's in self._receive_buffer: - self._receive_buffer_closed = False - - # Extra bits of state that don't fit into the state machine. - # - # These two are only used to interpret framing headers for figuring - # out how to read/write response bodies. their_http_version is also - # made available as a convenient public API. - self.their_http_version: Optional[bytes] = None - self._request_method: Optional[bytes] = None - # This is pure flow-control and doesn't at all affect the set of legal - # transitions, so no need to bother ConnectionState with it: - self.client_is_waiting_for_100_continue = False - - @property - def states(self) -> Dict[Type[Sentinel], Type[Sentinel]]: - """A dictionary like:: - - {CLIENT: , SERVER: } - - See :ref:`state-machine` for details. - - """ - return dict(self._cstate.states) - - @property - def our_state(self) -> Type[Sentinel]: - """The current state of whichever role we are playing. See - :ref:`state-machine` for details. - """ - return self._cstate.states[self.our_role] - - @property - def their_state(self) -> Type[Sentinel]: - """The current state of whichever role we are NOT playing. See - :ref:`state-machine` for details. - """ - return self._cstate.states[self.their_role] - - @property - def they_are_waiting_for_100_continue(self) -> bool: - return self.their_role is CLIENT and self.client_is_waiting_for_100_continue - - def start_next_cycle(self) -> None: - """Attempt to reset our connection state for a new request/response - cycle. - - If both client and server are in :data:`DONE` state, then resets them - both to :data:`IDLE` state in preparation for a new request/response - cycle on this same connection. Otherwise, raises a - :exc:`LocalProtocolError`. - - See :ref:`keepalive-and-pipelining`. - - """ - old_states = dict(self._cstate.states) - self._cstate.start_next_cycle() - self._request_method = None - # self.their_http_version gets left alone, since it presumably lasts - # beyond a single request/response cycle - assert not self.client_is_waiting_for_100_continue - self._respond_to_state_changes(old_states) - - def _process_error(self, role: Type[Sentinel]) -> None: - old_states = dict(self._cstate.states) - self._cstate.process_error(role) - self._respond_to_state_changes(old_states) - - def _server_switch_event(self, event: Event) -> Optional[Type[Sentinel]]: - if type(event) is InformationalResponse and event.status_code == 101: - return _SWITCH_UPGRADE - if type(event) is Response: - if ( - _SWITCH_CONNECT in self._cstate.pending_switch_proposals - and 200 <= event.status_code < 300 - ): - return _SWITCH_CONNECT - return None - - # All events go through here - def _process_event(self, role: Type[Sentinel], event: Event) -> None: - # First, pass the event through the state machine to make sure it - # succeeds. - old_states = dict(self._cstate.states) - if role is CLIENT and type(event) is Request: - if event.method == b"CONNECT": - self._cstate.process_client_switch_proposal(_SWITCH_CONNECT) - if get_comma_header(event.headers, b"upgrade"): - self._cstate.process_client_switch_proposal(_SWITCH_UPGRADE) - server_switch_event = None - if role is SERVER: - server_switch_event = self._server_switch_event(event) - self._cstate.process_event(role, type(event), server_switch_event) - - # Then perform the updates triggered by it. - - if type(event) is Request: - self._request_method = event.method - - if role is self.their_role and type(event) in ( - Request, - Response, - InformationalResponse, - ): - event = cast(Union[Request, Response, InformationalResponse], event) - self.their_http_version = event.http_version - - # Keep alive handling - # - # RFC 7230 doesn't really say what one should do if Connection: close - # shows up on a 1xx InformationalResponse. I think the idea is that - # this is not supposed to happen. In any case, if it does happen, we - # ignore it. - if type(event) in (Request, Response) and not _keep_alive( - cast(Union[Request, Response], event) - ): - self._cstate.process_keep_alive_disabled() - - # 100-continue - if type(event) is Request and has_expect_100_continue(event): - self.client_is_waiting_for_100_continue = True - if type(event) in (InformationalResponse, Response): - self.client_is_waiting_for_100_continue = False - if role is CLIENT and type(event) in (Data, EndOfMessage): - self.client_is_waiting_for_100_continue = False - - self._respond_to_state_changes(old_states, event) - - def _get_io_object( - self, - role: Type[Sentinel], - event: Optional[Event], - io_dict: Union[ReadersType, WritersType], - ) -> Optional[Callable[..., Any]]: - # event may be None; it's only used when entering SEND_BODY - state = self._cstate.states[role] - if state is SEND_BODY: - # Special case: the io_dict has a dict of reader/writer factories - # that depend on the request/response framing. - framing_type, args = _body_framing( - cast(bytes, self._request_method), cast(Union[Request, Response], event) - ) - return io_dict[SEND_BODY][framing_type](*args) # type: ignore[index] - else: - # General case: the io_dict just has the appropriate reader/writer - # for this state - return io_dict.get((role, state)) # type: ignore[return-value] - - # This must be called after any action that might have caused - # self._cstate.states to change. - def _respond_to_state_changes( - self, - old_states: Dict[Type[Sentinel], Type[Sentinel]], - event: Optional[Event] = None, - ) -> None: - # Update reader/writer - if self.our_state != old_states[self.our_role]: - self._writer = self._get_io_object(self.our_role, event, WRITERS) - if self.their_state != old_states[self.their_role]: - self._reader = self._get_io_object(self.their_role, event, READERS) - - @property - def trailing_data(self) -> Tuple[bytes, bool]: - """Data that has been received, but not yet processed, represented as - a tuple with two elements, where the first is a byte-string containing - the unprocessed data itself, and the second is a bool that is True if - the receive connection was closed. - - See :ref:`switching-protocols` for discussion of why you'd want this. - """ - return (bytes(self._receive_buffer), self._receive_buffer_closed) - - def receive_data(self, data: bytes) -> None: - """Add data to our internal receive buffer. - - This does not actually do any processing on the data, just stores - it. To trigger processing, you have to call :meth:`next_event`. - - Args: - data (:term:`bytes-like object`): - The new data that was just received. - - Special case: If *data* is an empty byte-string like ``b""``, - then this indicates that the remote side has closed the - connection (end of file). Normally this is convenient, because - standard Python APIs like :meth:`file.read` or - :meth:`socket.recv` use ``b""`` to indicate end-of-file, while - other failures to read are indicated using other mechanisms - like raising :exc:`TimeoutError`. When using such an API you - can just blindly pass through whatever you get from ``read`` - to :meth:`receive_data`, and everything will work. - - But, if you have an API where reading an empty string is a - valid non-EOF condition, then you need to be aware of this and - make sure to check for such strings and avoid passing them to - :meth:`receive_data`. - - Returns: - Nothing, but after calling this you should call :meth:`next_event` - to parse the newly received data. - - Raises: - RuntimeError: - Raised if you pass an empty *data*, indicating EOF, and then - pass a non-empty *data*, indicating more data that somehow - arrived after the EOF. - - (Calling ``receive_data(b"")`` multiple times is fine, - and equivalent to calling it once.) - - """ - if data: - if self._receive_buffer_closed: - raise RuntimeError("received close, then received more data?") - self._receive_buffer += data - else: - self._receive_buffer_closed = True - - def _extract_next_receive_event( - self, - ) -> Union[Event, Type[NEED_DATA], Type[PAUSED]]: - state = self.their_state - # We don't pause immediately when they enter DONE, because even in - # DONE state we can still process a ConnectionClosed() event. But - # if we have data in our buffer, then we definitely aren't getting - # a ConnectionClosed() immediately and we need to pause. - if state is DONE and self._receive_buffer: - return PAUSED - if state is MIGHT_SWITCH_PROTOCOL or state is SWITCHED_PROTOCOL: - return PAUSED - assert self._reader is not None - event = self._reader(self._receive_buffer) - if event is None: - if not self._receive_buffer and self._receive_buffer_closed: - # In some unusual cases (basically just HTTP/1.0 bodies), EOF - # triggers an actual protocol event; in that case, we want to - # return that event, and then the state will change and we'll - # get called again to generate the actual ConnectionClosed(). - if hasattr(self._reader, "read_eof"): - event = self._reader.read_eof() - else: - event = ConnectionClosed() - if event is None: - event = NEED_DATA - return event # type: ignore[no-any-return] - - def next_event(self) -> Union[Event, Type[NEED_DATA], Type[PAUSED]]: - """Parse the next event out of our receive buffer, update our internal - state, and return it. - - This is a mutating operation -- think of it like calling :func:`next` - on an iterator. - - Returns: - : One of three things: - - 1) An event object -- see :ref:`events`. - - 2) The special constant :data:`NEED_DATA`, which indicates that - you need to read more data from your socket and pass it to - :meth:`receive_data` before this method will be able to return - any more events. - - 3) The special constant :data:`PAUSED`, which indicates that we - are not in a state where we can process incoming data (usually - because the peer has finished their part of the current - request/response cycle, and you have not yet called - :meth:`start_next_cycle`). See :ref:`flow-control` for details. - - Raises: - RemoteProtocolError: - The peer has misbehaved. You should close the connection - (possibly after sending some kind of 4xx response). - - Once this method returns :class:`ConnectionClosed` once, then all - subsequent calls will also return :class:`ConnectionClosed`. - - If this method raises any exception besides :exc:`RemoteProtocolError` - then that's a bug -- if it happens please file a bug report! - - If this method raises any exception then it also sets - :attr:`Connection.their_state` to :data:`ERROR` -- see - :ref:`error-handling` for discussion. - - """ - - if self.their_state is ERROR: - raise RemoteProtocolError("Can't receive data when peer state is ERROR") - try: - event = self._extract_next_receive_event() - if event not in [NEED_DATA, PAUSED]: - self._process_event(self.their_role, cast(Event, event)) - if event is NEED_DATA: - if len(self._receive_buffer) > self._max_incomplete_event_size: - # 431 is "Request header fields too large" which is pretty - # much the only situation where we can get here - raise RemoteProtocolError( - "Receive buffer too long", error_status_hint=431 - ) - if self._receive_buffer_closed: - # We're still trying to complete some event, but that's - # never going to happen because no more data is coming - raise RemoteProtocolError("peer unexpectedly closed connection") - return event - except BaseException as exc: - self._process_error(self.their_role) - if isinstance(exc, LocalProtocolError): - exc._reraise_as_remote_protocol_error() - else: - raise - - @overload - def send(self, event: ConnectionClosed) -> None: - ... - - @overload - def send( - self, event: Union[Request, InformationalResponse, Response, Data, EndOfMessage] - ) -> bytes: - ... - - @overload - def send(self, event: Event) -> Optional[bytes]: - ... - - def send(self, event: Event) -> Optional[bytes]: - """Convert a high-level event into bytes that can be sent to the peer, - while updating our internal state machine. - - Args: - event: The :ref:`event ` to send. - - Returns: - If ``type(event) is ConnectionClosed``, then returns - ``None``. Otherwise, returns a :term:`bytes-like object`. - - Raises: - LocalProtocolError: - Sending this event at this time would violate our - understanding of the HTTP/1.1 protocol. - - If this method raises any exception then it also sets - :attr:`Connection.our_state` to :data:`ERROR` -- see - :ref:`error-handling` for discussion. - - """ - data_list = self.send_with_data_passthrough(event) - if data_list is None: - return None - else: - return b"".join(data_list) - - def send_with_data_passthrough(self, event: Event) -> Optional[List[bytes]]: - """Identical to :meth:`send`, except that in situations where - :meth:`send` returns a single :term:`bytes-like object`, this instead - returns a list of them -- and when sending a :class:`Data` event, this - list is guaranteed to contain the exact object you passed in as - :attr:`Data.data`. See :ref:`sendfile` for discussion. - - """ - if self.our_state is ERROR: - raise LocalProtocolError("Can't send data when our state is ERROR") - try: - if type(event) is Response: - event = self._clean_up_response_headers_for_sending(event) - # We want to call _process_event before calling the writer, - # because if someone tries to do something invalid then this will - # give a sensible error message, while our writers all just assume - # they will only receive valid events. But, _process_event might - # change self._writer. So we have to do a little dance: - writer = self._writer - self._process_event(self.our_role, event) - if type(event) is ConnectionClosed: - return None - else: - # In any situation where writer is None, process_event should - # have raised ProtocolError - assert writer is not None - data_list: List[bytes] = [] - writer(event, data_list.append) - return data_list - except: - self._process_error(self.our_role) - raise - - def send_failed(self) -> None: - """Notify the state machine that we failed to send the data it gave - us. - - This causes :attr:`Connection.our_state` to immediately become - :data:`ERROR` -- see :ref:`error-handling` for discussion. - - """ - self._process_error(self.our_role) - - # When sending a Response, we take responsibility for a few things: - # - # - Sometimes you MUST set Connection: close. We take care of those - # times. (You can also set it yourself if you want, and if you do then - # we'll respect that and close the connection at the right time. But you - # don't have to worry about that unless you want to.) - # - # - The user has to set Content-Length if they want it. Otherwise, for - # responses that have bodies (e.g. not HEAD), then we will automatically - # select the right mechanism for streaming a body of unknown length, - # which depends on depending on the peer's HTTP version. - # - # This function's *only* responsibility is making sure headers are set up - # right -- everything downstream just looks at the headers. There are no - # side channels. - def _clean_up_response_headers_for_sending(self, response: Response) -> Response: - assert type(response) is Response - - headers = response.headers - need_close = False - - # HEAD requests need some special handling: they always act like they - # have Content-Length: 0, and that's how _body_framing treats - # them. But their headers are supposed to match what we would send if - # the request was a GET. (Technically there is one deviation allowed: - # we're allowed to leave out the framing headers -- see - # https://tools.ietf.org/html/rfc7231#section-4.3.2 . But it's just as - # easy to get them right.) - method_for_choosing_headers = cast(bytes, self._request_method) - if method_for_choosing_headers == b"HEAD": - method_for_choosing_headers = b"GET" - framing_type, _ = _body_framing(method_for_choosing_headers, response) - if framing_type in ("chunked", "http/1.0"): - # This response has a body of unknown length. - # If our peer is HTTP/1.1, we use Transfer-Encoding: chunked - # If our peer is HTTP/1.0, we use no framing headers, and close the - # connection afterwards. - # - # Make sure to clear Content-Length (in principle user could have - # set both and then we ignored Content-Length b/c - # Transfer-Encoding overwrote it -- this would be naughty of them, - # but the HTTP spec says that if our peer does this then we have - # to fix it instead of erroring out, so we'll accord the user the - # same respect). - headers = set_comma_header(headers, b"content-length", []) - if self.their_http_version is None or self.their_http_version < b"1.1": - # Either we never got a valid request and are sending back an - # error (their_http_version is None), so we assume the worst; - # or else we did get a valid HTTP/1.0 request, so we know that - # they don't understand chunked encoding. - headers = set_comma_header(headers, b"transfer-encoding", []) - # This is actually redundant ATM, since currently we - # unconditionally disable keep-alive when talking to HTTP/1.0 - # peers. But let's be defensive just in case we add - # Connection: keep-alive support later: - if self._request_method != b"HEAD": - need_close = True - else: - headers = set_comma_header(headers, b"transfer-encoding", [b"chunked"]) - - if not self._cstate.keep_alive or need_close: - # Make sure Connection: close is set - connection = set(get_comma_header(headers, b"connection")) - connection.discard(b"keep-alive") - connection.add(b"close") - headers = set_comma_header(headers, b"connection", sorted(connection)) - - return Response( - headers=headers, - status_code=response.status_code, - http_version=response.http_version, - reason=response.reason, - ) diff --git a/venv/lib/python3.11/site-packages/h11/_events.py b/venv/lib/python3.11/site-packages/h11/_events.py deleted file mode 100755 index ca1c3ad..0000000 --- a/venv/lib/python3.11/site-packages/h11/_events.py +++ /dev/null @@ -1,369 +0,0 @@ -# High level events that make up HTTP/1.1 conversations. Loosely inspired by -# the corresponding events in hyper-h2: -# -# http://python-hyper.org/h2/en/stable/api.html#events -# -# Don't subclass these. Stuff will break. - -import re -from abc import ABC -from dataclasses import dataclass -from typing import List, Tuple, Union - -from ._abnf import method, request_target -from ._headers import Headers, normalize_and_validate -from ._util import bytesify, LocalProtocolError, validate - -# Everything in __all__ gets re-exported as part of the h11 public API. -__all__ = [ - "Event", - "Request", - "InformationalResponse", - "Response", - "Data", - "EndOfMessage", - "ConnectionClosed", -] - -method_re = re.compile(method.encode("ascii")) -request_target_re = re.compile(request_target.encode("ascii")) - - -class Event(ABC): - """ - Base class for h11 events. - """ - - __slots__ = () - - -@dataclass(init=False, frozen=True) -class Request(Event): - """The beginning of an HTTP request. - - Fields: - - .. attribute:: method - - An HTTP method, e.g. ``b"GET"`` or ``b"POST"``. Always a byte - string. :term:`Bytes-like objects ` and native - strings containing only ascii characters will be automatically - converted to byte strings. - - .. attribute:: target - - The target of an HTTP request, e.g. ``b"/index.html"``, or one of the - more exotic formats described in `RFC 7320, section 5.3 - `_. Always a byte - string. :term:`Bytes-like objects ` and native - strings containing only ascii characters will be automatically - converted to byte strings. - - .. attribute:: headers - - Request headers, represented as a list of (name, value) pairs. See - :ref:`the header normalization rules ` for details. - - .. attribute:: http_version - - The HTTP protocol version, represented as a byte string like - ``b"1.1"``. See :ref:`the HTTP version normalization rules - ` for details. - - """ - - __slots__ = ("method", "headers", "target", "http_version") - - method: bytes - headers: Headers - target: bytes - http_version: bytes - - def __init__( - self, - *, - method: Union[bytes, str], - headers: Union[Headers, List[Tuple[bytes, bytes]], List[Tuple[str, str]]], - target: Union[bytes, str], - http_version: Union[bytes, str] = b"1.1", - _parsed: bool = False, - ) -> None: - super().__init__() - if isinstance(headers, Headers): - object.__setattr__(self, "headers", headers) - else: - object.__setattr__( - self, "headers", normalize_and_validate(headers, _parsed=_parsed) - ) - if not _parsed: - object.__setattr__(self, "method", bytesify(method)) - object.__setattr__(self, "target", bytesify(target)) - object.__setattr__(self, "http_version", bytesify(http_version)) - else: - object.__setattr__(self, "method", method) - object.__setattr__(self, "target", target) - object.__setattr__(self, "http_version", http_version) - - # "A server MUST respond with a 400 (Bad Request) status code to any - # HTTP/1.1 request message that lacks a Host header field and to any - # request message that contains more than one Host header field or a - # Host header field with an invalid field-value." - # -- https://tools.ietf.org/html/rfc7230#section-5.4 - host_count = 0 - for name, value in self.headers: - if name == b"host": - host_count += 1 - if self.http_version == b"1.1" and host_count == 0: - raise LocalProtocolError("Missing mandatory Host: header") - if host_count > 1: - raise LocalProtocolError("Found multiple Host: headers") - - validate(method_re, self.method, "Illegal method characters") - validate(request_target_re, self.target, "Illegal target characters") - - # This is an unhashable type. - __hash__ = None # type: ignore - - -@dataclass(init=False, frozen=True) -class _ResponseBase(Event): - __slots__ = ("headers", "http_version", "reason", "status_code") - - headers: Headers - http_version: bytes - reason: bytes - status_code: int - - def __init__( - self, - *, - headers: Union[Headers, List[Tuple[bytes, bytes]], List[Tuple[str, str]]], - status_code: int, - http_version: Union[bytes, str] = b"1.1", - reason: Union[bytes, str] = b"", - _parsed: bool = False, - ) -> None: - super().__init__() - if isinstance(headers, Headers): - object.__setattr__(self, "headers", headers) - else: - object.__setattr__( - self, "headers", normalize_and_validate(headers, _parsed=_parsed) - ) - if not _parsed: - object.__setattr__(self, "reason", bytesify(reason)) - object.__setattr__(self, "http_version", bytesify(http_version)) - if not isinstance(status_code, int): - raise LocalProtocolError("status code must be integer") - # Because IntEnum objects are instances of int, but aren't - # duck-compatible (sigh), see gh-72. - object.__setattr__(self, "status_code", int(status_code)) - else: - object.__setattr__(self, "reason", reason) - object.__setattr__(self, "http_version", http_version) - object.__setattr__(self, "status_code", status_code) - - self.__post_init__() - - def __post_init__(self) -> None: - pass - - # This is an unhashable type. - __hash__ = None # type: ignore - - -@dataclass(init=False, frozen=True) -class InformationalResponse(_ResponseBase): - """An HTTP informational response. - - Fields: - - .. attribute:: status_code - - The status code of this response, as an integer. For an - :class:`InformationalResponse`, this is always in the range [100, - 200). - - .. attribute:: headers - - Request headers, represented as a list of (name, value) pairs. See - :ref:`the header normalization rules ` for - details. - - .. attribute:: http_version - - The HTTP protocol version, represented as a byte string like - ``b"1.1"``. See :ref:`the HTTP version normalization rules - ` for details. - - .. attribute:: reason - - The reason phrase of this response, as a byte string. For example: - ``b"OK"``, or ``b"Not Found"``. - - """ - - def __post_init__(self) -> None: - if not (100 <= self.status_code < 200): - raise LocalProtocolError( - "InformationalResponse status_code should be in range " - "[100, 200), not {}".format(self.status_code) - ) - - # This is an unhashable type. - __hash__ = None # type: ignore - - -@dataclass(init=False, frozen=True) -class Response(_ResponseBase): - """The beginning of an HTTP response. - - Fields: - - .. attribute:: status_code - - The status code of this response, as an integer. For an - :class:`Response`, this is always in the range [200, - 1000). - - .. attribute:: headers - - Request headers, represented as a list of (name, value) pairs. See - :ref:`the header normalization rules ` for details. - - .. attribute:: http_version - - The HTTP protocol version, represented as a byte string like - ``b"1.1"``. See :ref:`the HTTP version normalization rules - ` for details. - - .. attribute:: reason - - The reason phrase of this response, as a byte string. For example: - ``b"OK"``, or ``b"Not Found"``. - - """ - - def __post_init__(self) -> None: - if not (200 <= self.status_code < 1000): - raise LocalProtocolError( - "Response status_code should be in range [200, 1000), not {}".format( - self.status_code - ) - ) - - # This is an unhashable type. - __hash__ = None # type: ignore - - -@dataclass(init=False, frozen=True) -class Data(Event): - """Part of an HTTP message body. - - Fields: - - .. attribute:: data - - A :term:`bytes-like object` containing part of a message body. Or, if - using the ``combine=False`` argument to :meth:`Connection.send`, then - any object that your socket writing code knows what to do with, and for - which calling :func:`len` returns the number of bytes that will be - written -- see :ref:`sendfile` for details. - - .. attribute:: chunk_start - - A marker that indicates whether this data object is from the start of a - chunked transfer encoding chunk. This field is ignored when when a Data - event is provided to :meth:`Connection.send`: it is only valid on - events emitted from :meth:`Connection.next_event`. You probably - shouldn't use this attribute at all; see - :ref:`chunk-delimiters-are-bad` for details. - - .. attribute:: chunk_end - - A marker that indicates whether this data object is the last for a - given chunked transfer encoding chunk. This field is ignored when when - a Data event is provided to :meth:`Connection.send`: it is only valid - on events emitted from :meth:`Connection.next_event`. You probably - shouldn't use this attribute at all; see - :ref:`chunk-delimiters-are-bad` for details. - - """ - - __slots__ = ("data", "chunk_start", "chunk_end") - - data: bytes - chunk_start: bool - chunk_end: bool - - def __init__( - self, data: bytes, chunk_start: bool = False, chunk_end: bool = False - ) -> None: - object.__setattr__(self, "data", data) - object.__setattr__(self, "chunk_start", chunk_start) - object.__setattr__(self, "chunk_end", chunk_end) - - # This is an unhashable type. - __hash__ = None # type: ignore - - -# XX FIXME: "A recipient MUST ignore (or consider as an error) any fields that -# are forbidden to be sent in a trailer, since processing them as if they were -# present in the header section might bypass external security filters." -# https://svn.tools.ietf.org/svn/wg/httpbis/specs/rfc7230.html#chunked.trailer.part -# Unfortunately, the list of forbidden fields is long and vague :-/ -@dataclass(init=False, frozen=True) -class EndOfMessage(Event): - """The end of an HTTP message. - - Fields: - - .. attribute:: headers - - Default value: ``[]`` - - Any trailing headers attached to this message, represented as a list of - (name, value) pairs. See :ref:`the header normalization rules - ` for details. - - Must be empty unless ``Transfer-Encoding: chunked`` is in use. - - """ - - __slots__ = ("headers",) - - headers: Headers - - def __init__( - self, - *, - headers: Union[ - Headers, List[Tuple[bytes, bytes]], List[Tuple[str, str]], None - ] = None, - _parsed: bool = False, - ) -> None: - super().__init__() - if headers is None: - headers = Headers([]) - elif not isinstance(headers, Headers): - headers = normalize_and_validate(headers, _parsed=_parsed) - - object.__setattr__(self, "headers", headers) - - # This is an unhashable type. - __hash__ = None # type: ignore - - -@dataclass(frozen=True) -class ConnectionClosed(Event): - """This event indicates that the sender has closed their outgoing - connection. - - Note that this does not necessarily mean that they can't *receive* further - data, because TCP connections are composed to two one-way channels which - can be closed independently. See :ref:`closing` for details. - - No fields. - """ - - pass diff --git a/venv/lib/python3.11/site-packages/h11/_headers.py b/venv/lib/python3.11/site-packages/h11/_headers.py deleted file mode 100755 index 31da3e2..0000000 --- a/venv/lib/python3.11/site-packages/h11/_headers.py +++ /dev/null @@ -1,282 +0,0 @@ -import re -from typing import AnyStr, cast, List, overload, Sequence, Tuple, TYPE_CHECKING, Union - -from ._abnf import field_name, field_value -from ._util import bytesify, LocalProtocolError, validate - -if TYPE_CHECKING: - from ._events import Request - -try: - from typing import Literal -except ImportError: - from typing_extensions import Literal # type: ignore - -CONTENT_LENGTH_MAX_DIGITS = 20 # allow up to 1 billion TB - 1 - - -# Facts -# ----- -# -# Headers are: -# keys: case-insensitive ascii -# values: mixture of ascii and raw bytes -# -# "Historically, HTTP has allowed field content with text in the ISO-8859-1 -# charset [ISO-8859-1], supporting other charsets only through use of -# [RFC2047] encoding. In practice, most HTTP header field values use only a -# subset of the US-ASCII charset [USASCII]. Newly defined header fields SHOULD -# limit their field values to US-ASCII octets. A recipient SHOULD treat other -# octets in field content (obs-text) as opaque data." -# And it deprecates all non-ascii values -# -# Leading/trailing whitespace in header names is forbidden -# -# Values get leading/trailing whitespace stripped -# -# Content-Disposition actually needs to contain unicode semantically; to -# accomplish this it has a terrifically weird way of encoding the filename -# itself as ascii (and even this still has lots of cross-browser -# incompatibilities) -# -# Order is important: -# "a proxy MUST NOT change the order of these field values when forwarding a -# message" -# (and there are several headers where the order indicates a preference) -# -# Multiple occurences of the same header: -# "A sender MUST NOT generate multiple header fields with the same field name -# in a message unless either the entire field value for that header field is -# defined as a comma-separated list [or the header is Set-Cookie which gets a -# special exception]" - RFC 7230. (cookies are in RFC 6265) -# -# So every header aside from Set-Cookie can be merged by b", ".join if it -# occurs repeatedly. But, of course, they can't necessarily be split by -# .split(b","), because quoting. -# -# Given all this mess (case insensitive, duplicates allowed, order is -# important, ...), there doesn't appear to be any standard way to handle -# headers in Python -- they're almost like dicts, but... actually just -# aren't. For now we punt and just use a super simple representation: headers -# are a list of pairs -# -# [(name1, value1), (name2, value2), ...] -# -# where all entries are bytestrings, names are lowercase and have no -# leading/trailing whitespace, and values are bytestrings with no -# leading/trailing whitespace. Searching and updating are done via naive O(n) -# methods. -# -# Maybe a dict-of-lists would be better? - -_content_length_re = re.compile(rb"[0-9]+") -_field_name_re = re.compile(field_name.encode("ascii")) -_field_value_re = re.compile(field_value.encode("ascii")) - - -class Headers(Sequence[Tuple[bytes, bytes]]): - """ - A list-like interface that allows iterating over headers as byte-pairs - of (lowercased-name, value). - - Internally we actually store the representation as three-tuples, - including both the raw original casing, in order to preserve casing - over-the-wire, and the lowercased name, for case-insensitive comparisions. - - r = Request( - method="GET", - target="/", - headers=[("Host", "example.org"), ("Connection", "keep-alive")], - http_version="1.1", - ) - assert r.headers == [ - (b"host", b"example.org"), - (b"connection", b"keep-alive") - ] - assert r.headers.raw_items() == [ - (b"Host", b"example.org"), - (b"Connection", b"keep-alive") - ] - """ - - __slots__ = "_full_items" - - def __init__(self, full_items: List[Tuple[bytes, bytes, bytes]]) -> None: - self._full_items = full_items - - def __bool__(self) -> bool: - return bool(self._full_items) - - def __eq__(self, other: object) -> bool: - return list(self) == list(other) # type: ignore - - def __len__(self) -> int: - return len(self._full_items) - - def __repr__(self) -> str: - return "" % repr(list(self)) - - def __getitem__(self, idx: int) -> Tuple[bytes, bytes]: # type: ignore[override] - _, name, value = self._full_items[idx] - return (name, value) - - def raw_items(self) -> List[Tuple[bytes, bytes]]: - return [(raw_name, value) for raw_name, _, value in self._full_items] - - -HeaderTypes = Union[ - List[Tuple[bytes, bytes]], - List[Tuple[bytes, str]], - List[Tuple[str, bytes]], - List[Tuple[str, str]], -] - - -@overload -def normalize_and_validate(headers: Headers, _parsed: Literal[True]) -> Headers: - ... - - -@overload -def normalize_and_validate(headers: HeaderTypes, _parsed: Literal[False]) -> Headers: - ... - - -@overload -def normalize_and_validate( - headers: Union[Headers, HeaderTypes], _parsed: bool = False -) -> Headers: - ... - - -def normalize_and_validate( - headers: Union[Headers, HeaderTypes], _parsed: bool = False -) -> Headers: - new_headers = [] - seen_content_length = None - saw_transfer_encoding = False - for name, value in headers: - # For headers coming out of the parser, we can safely skip some steps, - # because it always returns bytes and has already run these regexes - # over the data: - if not _parsed: - name = bytesify(name) - value = bytesify(value) - validate(_field_name_re, name, "Illegal header name {!r}", name) - validate(_field_value_re, value, "Illegal header value {!r}", value) - assert isinstance(name, bytes) - assert isinstance(value, bytes) - - raw_name = name - name = name.lower() - if name == b"content-length": - lengths = {length.strip() for length in value.split(b",")} - if len(lengths) != 1: - raise LocalProtocolError("conflicting Content-Length headers") - value = lengths.pop() - validate(_content_length_re, value, "bad Content-Length") - if len(value) > CONTENT_LENGTH_MAX_DIGITS: - raise LocalProtocolError("bad Content-Length") - if seen_content_length is None: - seen_content_length = value - new_headers.append((raw_name, name, value)) - elif seen_content_length != value: - raise LocalProtocolError("conflicting Content-Length headers") - elif name == b"transfer-encoding": - # "A server that receives a request message with a transfer coding - # it does not understand SHOULD respond with 501 (Not - # Implemented)." - # https://tools.ietf.org/html/rfc7230#section-3.3.1 - if saw_transfer_encoding: - raise LocalProtocolError( - "multiple Transfer-Encoding headers", error_status_hint=501 - ) - # "All transfer-coding names are case-insensitive" - # -- https://tools.ietf.org/html/rfc7230#section-4 - value = value.lower() - if value != b"chunked": - raise LocalProtocolError( - "Only Transfer-Encoding: chunked is supported", - error_status_hint=501, - ) - saw_transfer_encoding = True - new_headers.append((raw_name, name, value)) - else: - new_headers.append((raw_name, name, value)) - return Headers(new_headers) - - -def get_comma_header(headers: Headers, name: bytes) -> List[bytes]: - # Should only be used for headers whose value is a list of - # comma-separated, case-insensitive values. - # - # The header name `name` is expected to be lower-case bytes. - # - # Connection: meets these criteria (including cast insensitivity). - # - # Content-Length: technically is just a single value (1*DIGIT), but the - # standard makes reference to implementations that do multiple values, and - # using this doesn't hurt. Ditto, case insensitivity doesn't things either - # way. - # - # Transfer-Encoding: is more complex (allows for quoted strings), so - # splitting on , is actually wrong. For example, this is legal: - # - # Transfer-Encoding: foo; options="1,2", chunked - # - # and should be parsed as - # - # foo; options="1,2" - # chunked - # - # but this naive function will parse it as - # - # foo; options="1 - # 2" - # chunked - # - # However, this is okay because the only thing we are going to do with - # any Transfer-Encoding is reject ones that aren't just "chunked", so - # both of these will be treated the same anyway. - # - # Expect: the only legal value is the literal string - # "100-continue". Splitting on commas is harmless. Case insensitive. - # - out: List[bytes] = [] - for _, found_name, found_raw_value in headers._full_items: - if found_name == name: - found_raw_value = found_raw_value.lower() - for found_split_value in found_raw_value.split(b","): - found_split_value = found_split_value.strip() - if found_split_value: - out.append(found_split_value) - return out - - -def set_comma_header(headers: Headers, name: bytes, new_values: List[bytes]) -> Headers: - # The header name `name` is expected to be lower-case bytes. - # - # Note that when we store the header we use title casing for the header - # names, in order to match the conventional HTTP header style. - # - # Simply calling `.title()` is a blunt approach, but it's correct - # here given the cases where we're using `set_comma_header`... - # - # Connection, Content-Length, Transfer-Encoding. - new_headers: List[Tuple[bytes, bytes]] = [] - for found_raw_name, found_name, found_raw_value in headers._full_items: - if found_name != name: - new_headers.append((found_raw_name, found_raw_value)) - for new_value in new_values: - new_headers.append((name.title(), new_value)) - return normalize_and_validate(new_headers) - - -def has_expect_100_continue(request: "Request") -> bool: - # https://tools.ietf.org/html/rfc7231#section-5.1.1 - # "A server that receives a 100-continue expectation in an HTTP/1.0 request - # MUST ignore that expectation." - if request.http_version < b"1.1": - return False - expect = get_comma_header(request.headers, b"expect") - return b"100-continue" in expect diff --git a/venv/lib/python3.11/site-packages/h11/_readers.py b/venv/lib/python3.11/site-packages/h11/_readers.py deleted file mode 100755 index 576804c..0000000 --- a/venv/lib/python3.11/site-packages/h11/_readers.py +++ /dev/null @@ -1,250 +0,0 @@ -# Code to read HTTP data -# -# Strategy: each reader is a callable which takes a ReceiveBuffer object, and -# either: -# 1) consumes some of it and returns an Event -# 2) raises a LocalProtocolError (for consistency -- e.g. we call validate() -# and it might raise a LocalProtocolError, so simpler just to always use -# this) -# 3) returns None, meaning "I need more data" -# -# If they have a .read_eof attribute, then this will be called if an EOF is -# received -- but this is optional. Either way, the actual ConnectionClosed -# event will be generated afterwards. -# -# READERS is a dict describing how to pick a reader. It maps states to either: -# - a reader -# - or, for body readers, a dict of per-framing reader factories - -import re -from typing import Any, Callable, Dict, Iterable, NoReturn, Optional, Tuple, Type, Union - -from ._abnf import chunk_header, header_field, request_line, status_line -from ._events import Data, EndOfMessage, InformationalResponse, Request, Response -from ._receivebuffer import ReceiveBuffer -from ._state import ( - CLIENT, - CLOSED, - DONE, - IDLE, - MUST_CLOSE, - SEND_BODY, - SEND_RESPONSE, - SERVER, -) -from ._util import LocalProtocolError, RemoteProtocolError, Sentinel, validate - -__all__ = ["READERS"] - -header_field_re = re.compile(header_field.encode("ascii")) -obs_fold_re = re.compile(rb"[ \t]+") - - -def _obsolete_line_fold(lines: Iterable[bytes]) -> Iterable[bytes]: - it = iter(lines) - last: Optional[bytes] = None - for line in it: - match = obs_fold_re.match(line) - if match: - if last is None: - raise LocalProtocolError("continuation line at start of headers") - if not isinstance(last, bytearray): - # Cast to a mutable type, avoiding copy on append to ensure O(n) time - last = bytearray(last) - last += b" " - last += line[match.end() :] - else: - if last is not None: - yield last - last = line - if last is not None: - yield last - - -def _decode_header_lines( - lines: Iterable[bytes], -) -> Iterable[Tuple[bytes, bytes]]: - for line in _obsolete_line_fold(lines): - matches = validate(header_field_re, line, "illegal header line: {!r}", line) - yield (matches["field_name"], matches["field_value"]) - - -request_line_re = re.compile(request_line.encode("ascii")) - - -def maybe_read_from_IDLE_client(buf: ReceiveBuffer) -> Optional[Request]: - lines = buf.maybe_extract_lines() - if lines is None: - if buf.is_next_line_obviously_invalid_request_line(): - raise LocalProtocolError("illegal request line") - return None - if not lines: - raise LocalProtocolError("no request line received") - matches = validate( - request_line_re, lines[0], "illegal request line: {!r}", lines[0] - ) - return Request( - headers=list(_decode_header_lines(lines[1:])), _parsed=True, **matches - ) - - -status_line_re = re.compile(status_line.encode("ascii")) - - -def maybe_read_from_SEND_RESPONSE_server( - buf: ReceiveBuffer, -) -> Union[InformationalResponse, Response, None]: - lines = buf.maybe_extract_lines() - if lines is None: - if buf.is_next_line_obviously_invalid_request_line(): - raise LocalProtocolError("illegal request line") - return None - if not lines: - raise LocalProtocolError("no response line received") - matches = validate(status_line_re, lines[0], "illegal status line: {!r}", lines[0]) - http_version = ( - b"1.1" if matches["http_version"] is None else matches["http_version"] - ) - reason = b"" if matches["reason"] is None else matches["reason"] - status_code = int(matches["status_code"]) - class_: Union[Type[InformationalResponse], Type[Response]] = ( - InformationalResponse if status_code < 200 else Response - ) - return class_( - headers=list(_decode_header_lines(lines[1:])), - _parsed=True, - status_code=status_code, - reason=reason, - http_version=http_version, - ) - - -class ContentLengthReader: - def __init__(self, length: int) -> None: - self._length = length - self._remaining = length - - def __call__(self, buf: ReceiveBuffer) -> Union[Data, EndOfMessage, None]: - if self._remaining == 0: - return EndOfMessage() - data = buf.maybe_extract_at_most(self._remaining) - if data is None: - return None - self._remaining -= len(data) - return Data(data=data) - - def read_eof(self) -> NoReturn: - raise RemoteProtocolError( - "peer closed connection without sending complete message body " - "(received {} bytes, expected {})".format( - self._length - self._remaining, self._length - ) - ) - - -chunk_header_re = re.compile(chunk_header.encode("ascii")) - - -class ChunkedReader: - def __init__(self) -> None: - self._bytes_in_chunk = 0 - # After reading a chunk, we have to throw away the trailing \r\n. - # This tracks the bytes that we need to match and throw away. - self._bytes_to_discard = b"" - self._reading_trailer = False - - def __call__(self, buf: ReceiveBuffer) -> Union[Data, EndOfMessage, None]: - if self._reading_trailer: - lines = buf.maybe_extract_lines() - if lines is None: - return None - return EndOfMessage(headers=list(_decode_header_lines(lines))) - if self._bytes_to_discard: - data = buf.maybe_extract_at_most(len(self._bytes_to_discard)) - if data is None: - return None - if data != self._bytes_to_discard[: len(data)]: - raise LocalProtocolError( - f"malformed chunk footer: {data!r} (expected {self._bytes_to_discard!r})" - ) - self._bytes_to_discard = self._bytes_to_discard[len(data) :] - if self._bytes_to_discard: - return None - # else, fall through and read some more - assert self._bytes_to_discard == b"" - if self._bytes_in_chunk == 0: - # We need to refill our chunk count - chunk_header = buf.maybe_extract_next_line() - if chunk_header is None: - return None - matches = validate( - chunk_header_re, - chunk_header, - "illegal chunk header: {!r}", - chunk_header, - ) - # XX FIXME: we discard chunk extensions. Does anyone care? - self._bytes_in_chunk = int(matches["chunk_size"], base=16) - if self._bytes_in_chunk == 0: - self._reading_trailer = True - return self(buf) - chunk_start = True - else: - chunk_start = False - assert self._bytes_in_chunk > 0 - data = buf.maybe_extract_at_most(self._bytes_in_chunk) - if data is None: - return None - self._bytes_in_chunk -= len(data) - if self._bytes_in_chunk == 0: - self._bytes_to_discard = b"\r\n" - chunk_end = True - else: - chunk_end = False - return Data(data=data, chunk_start=chunk_start, chunk_end=chunk_end) - - def read_eof(self) -> NoReturn: - raise RemoteProtocolError( - "peer closed connection without sending complete message body " - "(incomplete chunked read)" - ) - - -class Http10Reader: - def __call__(self, buf: ReceiveBuffer) -> Optional[Data]: - data = buf.maybe_extract_at_most(999999999) - if data is None: - return None - return Data(data=data) - - def read_eof(self) -> EndOfMessage: - return EndOfMessage() - - -def expect_nothing(buf: ReceiveBuffer) -> None: - if buf: - raise LocalProtocolError("Got data when expecting EOF") - return None - - -ReadersType = Dict[ - Union[Type[Sentinel], Tuple[Type[Sentinel], Type[Sentinel]]], - Union[Callable[..., Any], Dict[str, Callable[..., Any]]], -] - -READERS: ReadersType = { - (CLIENT, IDLE): maybe_read_from_IDLE_client, - (SERVER, IDLE): maybe_read_from_SEND_RESPONSE_server, - (SERVER, SEND_RESPONSE): maybe_read_from_SEND_RESPONSE_server, - (CLIENT, DONE): expect_nothing, - (CLIENT, MUST_CLOSE): expect_nothing, - (CLIENT, CLOSED): expect_nothing, - (SERVER, DONE): expect_nothing, - (SERVER, MUST_CLOSE): expect_nothing, - (SERVER, CLOSED): expect_nothing, - SEND_BODY: { - "chunked": ChunkedReader, - "content-length": ContentLengthReader, - "http/1.0": Http10Reader, - }, -} diff --git a/venv/lib/python3.11/site-packages/h11/_receivebuffer.py b/venv/lib/python3.11/site-packages/h11/_receivebuffer.py deleted file mode 100755 index e5c4e08..0000000 --- a/venv/lib/python3.11/site-packages/h11/_receivebuffer.py +++ /dev/null @@ -1,153 +0,0 @@ -import re -import sys -from typing import List, Optional, Union - -__all__ = ["ReceiveBuffer"] - - -# Operations we want to support: -# - find next \r\n or \r\n\r\n (\n or \n\n are also acceptable), -# or wait until there is one -# - read at-most-N bytes -# Goals: -# - on average, do this fast -# - worst case, do this in O(n) where n is the number of bytes processed -# Plan: -# - store bytearray, offset, how far we've searched for a separator token -# - use the how-far-we've-searched data to avoid rescanning -# - while doing a stream of uninterrupted processing, advance offset instead -# of constantly copying -# WARNING: -# - I haven't benchmarked or profiled any of this yet. -# -# Note that starting in Python 3.4, deleting the initial n bytes from a -# bytearray is amortized O(n), thanks to some excellent work by Antoine -# Martin: -# -# https://bugs.python.org/issue19087 -# -# This means that if we only supported 3.4+, we could get rid of the code here -# involving self._start and self.compress, because it's doing exactly the same -# thing that bytearray now does internally. -# -# BUT unfortunately, we still support 2.7, and reading short segments out of a -# long buffer MUST be O(bytes read) to avoid DoS issues, so we can't actually -# delete this code. Yet: -# -# https://pythonclock.org/ -# -# (Two things to double-check first though: make sure PyPy also has the -# optimization, and benchmark to make sure it's a win, since we do have a -# slightly clever thing where we delay calling compress() until we've -# processed a whole event, which could in theory be slightly more efficient -# than the internal bytearray support.) -blank_line_regex = re.compile(b"\n\r?\n", re.MULTILINE) - - -class ReceiveBuffer: - def __init__(self) -> None: - self._data = bytearray() - self._next_line_search = 0 - self._multiple_lines_search = 0 - - def __iadd__(self, byteslike: Union[bytes, bytearray]) -> "ReceiveBuffer": - self._data += byteslike - return self - - def __bool__(self) -> bool: - return bool(len(self)) - - def __len__(self) -> int: - return len(self._data) - - # for @property unprocessed_data - def __bytes__(self) -> bytes: - return bytes(self._data) - - def _extract(self, count: int) -> bytearray: - # extracting an initial slice of the data buffer and return it - out = self._data[:count] - del self._data[:count] - - self._next_line_search = 0 - self._multiple_lines_search = 0 - - return out - - def maybe_extract_at_most(self, count: int) -> Optional[bytearray]: - """ - Extract a fixed number of bytes from the buffer. - """ - out = self._data[:count] - if not out: - return None - - return self._extract(count) - - def maybe_extract_next_line(self) -> Optional[bytearray]: - """ - Extract the first line, if it is completed in the buffer. - """ - # Only search in buffer space that we've not already looked at. - search_start_index = max(0, self._next_line_search - 1) - partial_idx = self._data.find(b"\r\n", search_start_index) - - if partial_idx == -1: - self._next_line_search = len(self._data) - return None - - # + 2 is to compensate len(b"\r\n") - idx = partial_idx + 2 - - return self._extract(idx) - - def maybe_extract_lines(self) -> Optional[List[bytearray]]: - """ - Extract everything up to the first blank line, and return a list of lines. - """ - # Handle the case where we have an immediate empty line. - if self._data[:1] == b"\n": - self._extract(1) - return [] - - if self._data[:2] == b"\r\n": - self._extract(2) - return [] - - # Only search in buffer space that we've not already looked at. - match = blank_line_regex.search(self._data, self._multiple_lines_search) - if match is None: - self._multiple_lines_search = max(0, len(self._data) - 2) - return None - - # Truncate the buffer and return it. - idx = match.span(0)[-1] - out = self._extract(idx) - lines = out.split(b"\n") - - for line in lines: - if line.endswith(b"\r"): - del line[-1] - - assert lines[-2] == lines[-1] == b"" - - del lines[-2:] - - return lines - - # In theory we should wait until `\r\n` before starting to validate - # incoming data. However it's interesting to detect (very) invalid data - # early given they might not even contain `\r\n` at all (hence only - # timeout will get rid of them). - # This is not a 100% effective detection but more of a cheap sanity check - # allowing for early abort in some useful cases. - # This is especially interesting when peer is messing up with HTTPS and - # sent us a TLS stream where we were expecting plain HTTP given all - # versions of TLS so far start handshake with a 0x16 message type code. - def is_next_line_obviously_invalid_request_line(self) -> bool: - try: - # HTTP header line must not contain non-printable characters - # and should not start with a space - return self._data[0] < 0x21 - except IndexError: - return False diff --git a/venv/lib/python3.11/site-packages/h11/_state.py b/venv/lib/python3.11/site-packages/h11/_state.py deleted file mode 100755 index 3ad444b..0000000 --- a/venv/lib/python3.11/site-packages/h11/_state.py +++ /dev/null @@ -1,365 +0,0 @@ -################################################################ -# The core state machine -################################################################ -# -# Rule 1: everything that affects the state machine and state transitions must -# live here in this file. As much as possible goes into the table-based -# representation, but for the bits that don't quite fit, the actual code and -# state must nonetheless live here. -# -# Rule 2: this file does not know about what role we're playing; it only knows -# about HTTP request/response cycles in the abstract. This ensures that we -# don't cheat and apply different rules to local and remote parties. -# -# -# Theory of operation -# =================== -# -# Possibly the simplest way to think about this is that we actually have 5 -# different state machines here. Yes, 5. These are: -# -# 1) The client state, with its complicated automaton (see the docs) -# 2) The server state, with its complicated automaton (see the docs) -# 3) The keep-alive state, with possible states {True, False} -# 4) The SWITCH_CONNECT state, with possible states {False, True} -# 5) The SWITCH_UPGRADE state, with possible states {False, True} -# -# For (3)-(5), the first state listed is the initial state. -# -# (1)-(3) are stored explicitly in member variables. The last -# two are stored implicitly in the pending_switch_proposals set as: -# (state of 4) == (_SWITCH_CONNECT in pending_switch_proposals) -# (state of 5) == (_SWITCH_UPGRADE in pending_switch_proposals) -# -# And each of these machines has two different kinds of transitions: -# -# a) Event-triggered -# b) State-triggered -# -# Event triggered is the obvious thing that you'd think it is: some event -# happens, and if it's the right event at the right time then a transition -# happens. But there are somewhat complicated rules for which machines can -# "see" which events. (As a rule of thumb, if a machine "sees" an event, this -# means two things: the event can affect the machine, and if the machine is -# not in a state where it expects that event then it's an error.) These rules -# are: -# -# 1) The client machine sees all h11.events objects emitted by the client. -# -# 2) The server machine sees all h11.events objects emitted by the server. -# -# It also sees the client's Request event. -# -# And sometimes, server events are annotated with a _SWITCH_* event. For -# example, we can have a (Response, _SWITCH_CONNECT) event, which is -# different from a regular Response event. -# -# 3) The keep-alive machine sees the process_keep_alive_disabled() event -# (which is derived from Request/Response events), and this event -# transitions it from True -> False, or from False -> False. There's no way -# to transition back. -# -# 4&5) The _SWITCH_* machines transition from False->True when we get a -# Request that proposes the relevant type of switch (via -# process_client_switch_proposals), and they go from True->False when we -# get a Response that has no _SWITCH_* annotation. -# -# So that's event-triggered transitions. -# -# State-triggered transitions are less standard. What they do here is couple -# the machines together. The way this works is, when certain *joint* -# configurations of states are achieved, then we automatically transition to a -# new *joint* state. So, for example, if we're ever in a joint state with -# -# client: DONE -# keep-alive: False -# -# then the client state immediately transitions to: -# -# client: MUST_CLOSE -# -# This is fundamentally different from an event-based transition, because it -# doesn't matter how we arrived at the {client: DONE, keep-alive: False} state -# -- maybe the client transitioned SEND_BODY -> DONE, or keep-alive -# transitioned True -> False. Either way, once this precondition is satisfied, -# this transition is immediately triggered. -# -# What if two conflicting state-based transitions get enabled at the same -# time? In practice there's only one case where this arises (client DONE -> -# MIGHT_SWITCH_PROTOCOL versus DONE -> MUST_CLOSE), and we resolve it by -# explicitly prioritizing the DONE -> MIGHT_SWITCH_PROTOCOL transition. -# -# Implementation -# -------------- -# -# The event-triggered transitions for the server and client machines are all -# stored explicitly in a table. Ditto for the state-triggered transitions that -# involve just the server and client state. -# -# The transitions for the other machines, and the state-triggered transitions -# that involve the other machines, are written out as explicit Python code. -# -# It'd be nice if there were some cleaner way to do all this. This isn't -# *too* terrible, but I feel like it could probably be better. -# -# WARNING -# ------- -# -# The script that generates the state machine diagrams for the docs knows how -# to read out the EVENT_TRIGGERED_TRANSITIONS and STATE_TRIGGERED_TRANSITIONS -# tables. But it can't automatically read the transitions that are written -# directly in Python code. So if you touch those, you need to also update the -# script to keep it in sync! -from typing import cast, Dict, Optional, Set, Tuple, Type, Union - -from ._events import * -from ._util import LocalProtocolError, Sentinel - -# Everything in __all__ gets re-exported as part of the h11 public API. -__all__ = [ - "CLIENT", - "SERVER", - "IDLE", - "SEND_RESPONSE", - "SEND_BODY", - "DONE", - "MUST_CLOSE", - "CLOSED", - "MIGHT_SWITCH_PROTOCOL", - "SWITCHED_PROTOCOL", - "ERROR", -] - - -class CLIENT(Sentinel, metaclass=Sentinel): - pass - - -class SERVER(Sentinel, metaclass=Sentinel): - pass - - -# States -class IDLE(Sentinel, metaclass=Sentinel): - pass - - -class SEND_RESPONSE(Sentinel, metaclass=Sentinel): - pass - - -class SEND_BODY(Sentinel, metaclass=Sentinel): - pass - - -class DONE(Sentinel, metaclass=Sentinel): - pass - - -class MUST_CLOSE(Sentinel, metaclass=Sentinel): - pass - - -class CLOSED(Sentinel, metaclass=Sentinel): - pass - - -class ERROR(Sentinel, metaclass=Sentinel): - pass - - -# Switch types -class MIGHT_SWITCH_PROTOCOL(Sentinel, metaclass=Sentinel): - pass - - -class SWITCHED_PROTOCOL(Sentinel, metaclass=Sentinel): - pass - - -class _SWITCH_UPGRADE(Sentinel, metaclass=Sentinel): - pass - - -class _SWITCH_CONNECT(Sentinel, metaclass=Sentinel): - pass - - -EventTransitionType = Dict[ - Type[Sentinel], - Dict[ - Type[Sentinel], - Dict[Union[Type[Event], Tuple[Type[Event], Type[Sentinel]]], Type[Sentinel]], - ], -] - -EVENT_TRIGGERED_TRANSITIONS: EventTransitionType = { - CLIENT: { - IDLE: {Request: SEND_BODY, ConnectionClosed: CLOSED}, - SEND_BODY: {Data: SEND_BODY, EndOfMessage: DONE}, - DONE: {ConnectionClosed: CLOSED}, - MUST_CLOSE: {ConnectionClosed: CLOSED}, - CLOSED: {ConnectionClosed: CLOSED}, - MIGHT_SWITCH_PROTOCOL: {}, - SWITCHED_PROTOCOL: {}, - ERROR: {}, - }, - SERVER: { - IDLE: { - ConnectionClosed: CLOSED, - Response: SEND_BODY, - # Special case: server sees client Request events, in this form - (Request, CLIENT): SEND_RESPONSE, - }, - SEND_RESPONSE: { - InformationalResponse: SEND_RESPONSE, - Response: SEND_BODY, - (InformationalResponse, _SWITCH_UPGRADE): SWITCHED_PROTOCOL, - (Response, _SWITCH_CONNECT): SWITCHED_PROTOCOL, - }, - SEND_BODY: {Data: SEND_BODY, EndOfMessage: DONE}, - DONE: {ConnectionClosed: CLOSED}, - MUST_CLOSE: {ConnectionClosed: CLOSED}, - CLOSED: {ConnectionClosed: CLOSED}, - SWITCHED_PROTOCOL: {}, - ERROR: {}, - }, -} - -StateTransitionType = Dict[ - Tuple[Type[Sentinel], Type[Sentinel]], Dict[Type[Sentinel], Type[Sentinel]] -] - -# NB: there are also some special-case state-triggered transitions hard-coded -# into _fire_state_triggered_transitions below. -STATE_TRIGGERED_TRANSITIONS: StateTransitionType = { - # (Client state, Server state) -> new states - # Protocol negotiation - (MIGHT_SWITCH_PROTOCOL, SWITCHED_PROTOCOL): {CLIENT: SWITCHED_PROTOCOL}, - # Socket shutdown - (CLOSED, DONE): {SERVER: MUST_CLOSE}, - (CLOSED, IDLE): {SERVER: MUST_CLOSE}, - (ERROR, DONE): {SERVER: MUST_CLOSE}, - (DONE, CLOSED): {CLIENT: MUST_CLOSE}, - (IDLE, CLOSED): {CLIENT: MUST_CLOSE}, - (DONE, ERROR): {CLIENT: MUST_CLOSE}, -} - - -class ConnectionState: - def __init__(self) -> None: - # Extra bits of state that don't quite fit into the state model. - - # If this is False then it enables the automatic DONE -> MUST_CLOSE - # transition. Don't set this directly; call .keep_alive_disabled() - self.keep_alive = True - - # This is a subset of {UPGRADE, CONNECT}, containing the proposals - # made by the client for switching protocols. - self.pending_switch_proposals: Set[Type[Sentinel]] = set() - - self.states: Dict[Type[Sentinel], Type[Sentinel]] = {CLIENT: IDLE, SERVER: IDLE} - - def process_error(self, role: Type[Sentinel]) -> None: - self.states[role] = ERROR - self._fire_state_triggered_transitions() - - def process_keep_alive_disabled(self) -> None: - self.keep_alive = False - self._fire_state_triggered_transitions() - - def process_client_switch_proposal(self, switch_event: Type[Sentinel]) -> None: - self.pending_switch_proposals.add(switch_event) - self._fire_state_triggered_transitions() - - def process_event( - self, - role: Type[Sentinel], - event_type: Type[Event], - server_switch_event: Optional[Type[Sentinel]] = None, - ) -> None: - _event_type: Union[Type[Event], Tuple[Type[Event], Type[Sentinel]]] = event_type - if server_switch_event is not None: - assert role is SERVER - if server_switch_event not in self.pending_switch_proposals: - raise LocalProtocolError( - "Received server _SWITCH_UPGRADE event without a pending proposal" - ) - _event_type = (event_type, server_switch_event) - if server_switch_event is None and _event_type is Response: - self.pending_switch_proposals = set() - self._fire_event_triggered_transitions(role, _event_type) - # Special case: the server state does get to see Request - # events. - if _event_type is Request: - assert role is CLIENT - self._fire_event_triggered_transitions(SERVER, (Request, CLIENT)) - self._fire_state_triggered_transitions() - - def _fire_event_triggered_transitions( - self, - role: Type[Sentinel], - event_type: Union[Type[Event], Tuple[Type[Event], Type[Sentinel]]], - ) -> None: - state = self.states[role] - try: - new_state = EVENT_TRIGGERED_TRANSITIONS[role][state][event_type] - except KeyError: - event_type = cast(Type[Event], event_type) - raise LocalProtocolError( - "can't handle event type {} when role={} and state={}".format( - event_type.__name__, role, self.states[role] - ) - ) from None - self.states[role] = new_state - - def _fire_state_triggered_transitions(self) -> None: - # We apply these rules repeatedly until converging on a fixed point - while True: - start_states = dict(self.states) - - # It could happen that both these special-case transitions are - # enabled at the same time: - # - # DONE -> MIGHT_SWITCH_PROTOCOL - # DONE -> MUST_CLOSE - # - # For example, this will always be true of a HTTP/1.0 client - # requesting CONNECT. If this happens, the protocol switch takes - # priority. From there the client will either go to - # SWITCHED_PROTOCOL, in which case it's none of our business when - # they close the connection, or else the server will deny the - # request, in which case the client will go back to DONE and then - # from there to MUST_CLOSE. - if self.pending_switch_proposals: - if self.states[CLIENT] is DONE: - self.states[CLIENT] = MIGHT_SWITCH_PROTOCOL - - if not self.pending_switch_proposals: - if self.states[CLIENT] is MIGHT_SWITCH_PROTOCOL: - self.states[CLIENT] = DONE - - if not self.keep_alive: - for role in (CLIENT, SERVER): - if self.states[role] is DONE: - self.states[role] = MUST_CLOSE - - # Tabular state-triggered transitions - joint_state = (self.states[CLIENT], self.states[SERVER]) - changes = STATE_TRIGGERED_TRANSITIONS.get(joint_state, {}) - self.states.update(changes) - - if self.states == start_states: - # Fixed point reached - return - - def start_next_cycle(self) -> None: - if self.states != {CLIENT: DONE, SERVER: DONE}: - raise LocalProtocolError( - f"not in a reusable state. self.states={self.states}" - ) - # Can't reach DONE/DONE with any of these active, but still, let's be - # sure. - assert self.keep_alive - assert not self.pending_switch_proposals - self.states = {CLIENT: IDLE, SERVER: IDLE} diff --git a/venv/lib/python3.11/site-packages/h11/_util.py b/venv/lib/python3.11/site-packages/h11/_util.py deleted file mode 100755 index 6718445..0000000 --- a/venv/lib/python3.11/site-packages/h11/_util.py +++ /dev/null @@ -1,135 +0,0 @@ -from typing import Any, Dict, NoReturn, Pattern, Tuple, Type, TypeVar, Union - -__all__ = [ - "ProtocolError", - "LocalProtocolError", - "RemoteProtocolError", - "validate", - "bytesify", -] - - -class ProtocolError(Exception): - """Exception indicating a violation of the HTTP/1.1 protocol. - - This as an abstract base class, with two concrete base classes: - :exc:`LocalProtocolError`, which indicates that you tried to do something - that HTTP/1.1 says is illegal, and :exc:`RemoteProtocolError`, which - indicates that the remote peer tried to do something that HTTP/1.1 says is - illegal. See :ref:`error-handling` for details. - - In addition to the normal :exc:`Exception` features, it has one attribute: - - .. attribute:: error_status_hint - - This gives a suggestion as to what status code a server might use if - this error occurred as part of a request. - - For a :exc:`RemoteProtocolError`, this is useful as a suggestion for - how you might want to respond to a misbehaving peer, if you're - implementing a server. - - For a :exc:`LocalProtocolError`, this can be taken as a suggestion for - how your peer might have responded to *you* if h11 had allowed you to - continue. - - The default is 400 Bad Request, a generic catch-all for protocol - violations. - - """ - - def __init__(self, msg: str, error_status_hint: int = 400) -> None: - if type(self) is ProtocolError: - raise TypeError("tried to directly instantiate ProtocolError") - Exception.__init__(self, msg) - self.error_status_hint = error_status_hint - - -# Strategy: there are a number of public APIs where a LocalProtocolError can -# be raised (send(), all the different event constructors, ...), and only one -# public API where RemoteProtocolError can be raised -# (receive_data()). Therefore we always raise LocalProtocolError internally, -# and then receive_data will translate this into a RemoteProtocolError. -# -# Internally: -# LocalProtocolError is the generic "ProtocolError". -# Externally: -# LocalProtocolError is for local errors and RemoteProtocolError is for -# remote errors. -class LocalProtocolError(ProtocolError): - def _reraise_as_remote_protocol_error(self) -> NoReturn: - # After catching a LocalProtocolError, use this method to re-raise it - # as a RemoteProtocolError. This method must be called from inside an - # except: block. - # - # An easy way to get an equivalent RemoteProtocolError is just to - # modify 'self' in place. - self.__class__ = RemoteProtocolError # type: ignore - # But the re-raising is somewhat non-trivial -- you might think that - # now that we've modified the in-flight exception object, that just - # doing 'raise' to re-raise it would be enough. But it turns out that - # this doesn't work, because Python tracks the exception type - # (exc_info[0]) separately from the exception object (exc_info[1]), - # and we only modified the latter. So we really do need to re-raise - # the new type explicitly. - # On py3, the traceback is part of the exception object, so our - # in-place modification preserved it and we can just re-raise: - raise self - - -class RemoteProtocolError(ProtocolError): - pass - - -def validate( - regex: Pattern[bytes], data: bytes, msg: str = "malformed data", *format_args: Any -) -> Dict[str, bytes]: - match = regex.fullmatch(data) - if not match: - if format_args: - msg = msg.format(*format_args) - raise LocalProtocolError(msg) - return match.groupdict() - - -# Sentinel values -# -# - Inherit identity-based comparison and hashing from object -# - Have a nice repr -# - Have a *bonus property*: type(sentinel) is sentinel -# -# The bonus property is useful if you want to take the return value from -# next_event() and do some sort of dispatch based on type(event). - -_T_Sentinel = TypeVar("_T_Sentinel", bound="Sentinel") - - -class Sentinel(type): - def __new__( - cls: Type[_T_Sentinel], - name: str, - bases: Tuple[type, ...], - namespace: Dict[str, Any], - **kwds: Any - ) -> _T_Sentinel: - assert bases == (Sentinel,) - v = super().__new__(cls, name, bases, namespace, **kwds) - v.__class__ = v # type: ignore - return v - - def __repr__(self) -> str: - return self.__name__ - - -# Used for methods, request targets, HTTP versions, header names, and header -# values. Accepts ascii-strings, or bytes/bytearray/memoryview/..., and always -# returns bytes. -def bytesify(s: Union[bytes, bytearray, memoryview, int, str]) -> bytes: - # Fast-path: - if type(s) is bytes: - return s - if isinstance(s, str): - s = s.encode("ascii") - if isinstance(s, int): - raise TypeError("expected bytes-like object, not int") - return bytes(s) diff --git a/venv/lib/python3.11/site-packages/h11/_version.py b/venv/lib/python3.11/site-packages/h11/_version.py deleted file mode 100755 index 76e7327..0000000 --- a/venv/lib/python3.11/site-packages/h11/_version.py +++ /dev/null @@ -1,16 +0,0 @@ -# This file must be kept very simple, because it is consumed from several -# places -- it is imported by h11/__init__.py, execfile'd by setup.py, etc. - -# We use a simple scheme: -# 1.0.0 -> 1.0.0+dev -> 1.1.0 -> 1.1.0+dev -# where the +dev versions are never released into the wild, they're just what -# we stick into the VCS in between releases. -# -# This is compatible with PEP 440: -# http://legacy.python.org/dev/peps/pep-0440/ -# via the use of the "local suffix" "+dev", which is disallowed on index -# servers and causes 1.0.0+dev to sort after plain 1.0.0, which is what we -# want. (Contrast with the special suffix 1.0.0.dev, which sorts *before* -# 1.0.0.) - -__version__ = "0.16.0" diff --git a/venv/lib/python3.11/site-packages/h11/_writers.py b/venv/lib/python3.11/site-packages/h11/_writers.py deleted file mode 100755 index 939cdb9..0000000 --- a/venv/lib/python3.11/site-packages/h11/_writers.py +++ /dev/null @@ -1,145 +0,0 @@ -# Code to read HTTP data -# -# Strategy: each writer takes an event + a write-some-bytes function, which is -# calls. -# -# WRITERS is a dict describing how to pick a reader. It maps states to either: -# - a writer -# - or, for body writers, a dict of framin-dependent writer factories - -from typing import Any, Callable, Dict, List, Tuple, Type, Union - -from ._events import Data, EndOfMessage, Event, InformationalResponse, Request, Response -from ._headers import Headers -from ._state import CLIENT, IDLE, SEND_BODY, SEND_RESPONSE, SERVER -from ._util import LocalProtocolError, Sentinel - -__all__ = ["WRITERS"] - -Writer = Callable[[bytes], Any] - - -def write_headers(headers: Headers, write: Writer) -> None: - # "Since the Host field-value is critical information for handling a - # request, a user agent SHOULD generate Host as the first header field - # following the request-line." - RFC 7230 - raw_items = headers._full_items - for raw_name, name, value in raw_items: - if name == b"host": - write(b"%s: %s\r\n" % (raw_name, value)) - for raw_name, name, value in raw_items: - if name != b"host": - write(b"%s: %s\r\n" % (raw_name, value)) - write(b"\r\n") - - -def write_request(request: Request, write: Writer) -> None: - if request.http_version != b"1.1": - raise LocalProtocolError("I only send HTTP/1.1") - write(b"%s %s HTTP/1.1\r\n" % (request.method, request.target)) - write_headers(request.headers, write) - - -# Shared between InformationalResponse and Response -def write_any_response( - response: Union[InformationalResponse, Response], write: Writer -) -> None: - if response.http_version != b"1.1": - raise LocalProtocolError("I only send HTTP/1.1") - status_bytes = str(response.status_code).encode("ascii") - # We don't bother sending ascii status messages like "OK"; they're - # optional and ignored by the protocol. (But the space after the numeric - # status code is mandatory.) - # - # XX FIXME: could at least make an effort to pull out the status message - # from stdlib's http.HTTPStatus table. Or maybe just steal their enums - # (either by import or copy/paste). We already accept them as status codes - # since they're of type IntEnum < int. - write(b"HTTP/1.1 %s %s\r\n" % (status_bytes, response.reason)) - write_headers(response.headers, write) - - -class BodyWriter: - def __call__(self, event: Event, write: Writer) -> None: - if type(event) is Data: - self.send_data(event.data, write) - elif type(event) is EndOfMessage: - self.send_eom(event.headers, write) - else: # pragma: no cover - assert False - - def send_data(self, data: bytes, write: Writer) -> None: - pass - - def send_eom(self, headers: Headers, write: Writer) -> None: - pass - - -# -# These are all careful not to do anything to 'data' except call len(data) and -# write(data). This allows us to transparently pass-through funny objects, -# like placeholder objects referring to files on disk that will be sent via -# sendfile(2). -# -class ContentLengthWriter(BodyWriter): - def __init__(self, length: int) -> None: - self._length = length - - def send_data(self, data: bytes, write: Writer) -> None: - self._length -= len(data) - if self._length < 0: - raise LocalProtocolError("Too much data for declared Content-Length") - write(data) - - def send_eom(self, headers: Headers, write: Writer) -> None: - if self._length != 0: - raise LocalProtocolError("Too little data for declared Content-Length") - if headers: - raise LocalProtocolError("Content-Length and trailers don't mix") - - -class ChunkedWriter(BodyWriter): - def send_data(self, data: bytes, write: Writer) -> None: - # if we encoded 0-length data in the naive way, it would look like an - # end-of-message. - if not data: - return - write(b"%x\r\n" % len(data)) - write(data) - write(b"\r\n") - - def send_eom(self, headers: Headers, write: Writer) -> None: - write(b"0\r\n") - write_headers(headers, write) - - -class Http10Writer(BodyWriter): - def send_data(self, data: bytes, write: Writer) -> None: - write(data) - - def send_eom(self, headers: Headers, write: Writer) -> None: - if headers: - raise LocalProtocolError("can't send trailers to HTTP/1.0 client") - # no need to close the socket ourselves, that will be taken care of by - # Connection: close machinery - - -WritersType = Dict[ - Union[Tuple[Type[Sentinel], Type[Sentinel]], Type[Sentinel]], - Union[ - Dict[str, Type[BodyWriter]], - Callable[[Union[InformationalResponse, Response], Writer], None], - Callable[[Request, Writer], None], - ], -] - -WRITERS: WritersType = { - (CLIENT, IDLE): write_request, - (SERVER, IDLE): write_any_response, - (SERVER, SEND_RESPONSE): write_any_response, - SEND_BODY: { - "chunked": ChunkedWriter, - "content-length": ContentLengthWriter, - "http/1.0": Http10Writer, - }, -} diff --git a/venv/lib/python3.11/site-packages/h11/py.typed b/venv/lib/python3.11/site-packages/h11/py.typed deleted file mode 100755 index f5642f7..0000000 --- a/venv/lib/python3.11/site-packages/h11/py.typed +++ /dev/null @@ -1 +0,0 @@ -Marker diff --git a/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/INSTALLER deleted file mode 100755 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/METADATA b/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/METADATA deleted file mode 100755 index 8056834..0000000 --- a/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/METADATA +++ /dev/null @@ -1,625 +0,0 @@ -Metadata-Version: 2.4 -Name: httpcore -Version: 1.0.9 -Summary: A minimal low-level HTTP client. -Project-URL: Documentation, https://www.encode.io/httpcore -Project-URL: Homepage, https://www.encode.io/httpcore/ -Project-URL: Source, https://github.com/encode/httpcore -Author-email: Tom Christie -License-Expression: BSD-3-Clause -License-File: LICENSE.md -Classifier: Development Status :: 3 - Alpha -Classifier: Environment :: Web Environment -Classifier: Framework :: AsyncIO -Classifier: Framework :: Trio -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Topic :: Internet :: WWW/HTTP -Requires-Python: >=3.8 -Requires-Dist: certifi -Requires-Dist: h11>=0.16 -Provides-Extra: asyncio -Requires-Dist: anyio<5.0,>=4.0; extra == 'asyncio' -Provides-Extra: http2 -Requires-Dist: h2<5,>=3; extra == 'http2' -Provides-Extra: socks -Requires-Dist: socksio==1.*; extra == 'socks' -Provides-Extra: trio -Requires-Dist: trio<1.0,>=0.22.0; extra == 'trio' -Description-Content-Type: text/markdown - -# HTTP Core - -[![Test Suite](https://github.com/encode/httpcore/workflows/Test%20Suite/badge.svg)](https://github.com/encode/httpcore/actions) -[![Package version](https://badge.fury.io/py/httpcore.svg)](https://pypi.org/project/httpcore/) - -> *Do one thing, and do it well.* - -The HTTP Core package provides a minimal low-level HTTP client, which does -one thing only. Sending HTTP requests. - -It does not provide any high level model abstractions over the API, -does not handle redirects, multipart uploads, building authentication headers, -transparent HTTP caching, URL parsing, session cookie handling, -content or charset decoding, handling JSON, environment based configuration -defaults, or any of that Jazz. - -Some things HTTP Core does do: - -* Sending HTTP requests. -* Thread-safe / task-safe connection pooling. -* HTTP(S) proxy & SOCKS proxy support. -* Supports HTTP/1.1 and HTTP/2. -* Provides both sync and async interfaces. -* Async backend support for `asyncio` and `trio`. - -## Requirements - -Python 3.8+ - -## Installation - -For HTTP/1.1 only support, install with: - -```shell -$ pip install httpcore -``` - -There are also a number of optional extras available... - -```shell -$ pip install httpcore['asyncio,trio,http2,socks'] -``` - -## Sending requests - -Send an HTTP request: - -```python -import httpcore - -response = httpcore.request("GET", "https://www.example.com/") - -print(response) -# -print(response.status) -# 200 -print(response.headers) -# [(b'Accept-Ranges', b'bytes'), (b'Age', b'557328'), (b'Cache-Control', b'max-age=604800'), ...] -print(response.content) -# b'\n\n\nExample Domain\n\n\n ...' -``` - -The top-level `httpcore.request()` function is provided for convenience. In practice whenever you're working with `httpcore` you'll want to use the connection pooling functionality that it provides. - -```python -import httpcore - -http = httpcore.ConnectionPool() -response = http.request("GET", "https://www.example.com/") -``` - -Once you're ready to get going, [head over to the documentation](https://www.encode.io/httpcore/). - -## Motivation - -You *probably* don't want to be using HTTP Core directly. It might make sense if -you're writing something like a proxy service in Python, and you just want -something at the lowest possible level, but more typically you'll want to use -a higher level client library, such as `httpx`. - -The motivation for `httpcore` is: - -* To provide a reusable low-level client library, that other packages can then build on top of. -* To provide a *really clear interface split* between the networking code and client logic, - so that each is easier to understand and reason about in isolation. - -## Dependencies - -The `httpcore` package has the following dependencies... - -* `h11` -* `certifi` - -And the following optional extras... - -* `anyio` - Required by `pip install httpcore['asyncio']`. -* `trio` - Required by `pip install httpcore['trio']`. -* `h2` - Required by `pip install httpcore['http2']`. -* `socksio` - Required by `pip install httpcore['socks']`. - -## Versioning - -We use [SEMVER for our versioning policy](https://semver.org/). - -For changes between package versions please see our [project changelog](CHANGELOG.md). - -We recommend pinning your requirements either the most current major version, or a more specific version range: - -```python -pip install 'httpcore==1.*' -``` -# Changelog - -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - -## Version 1.0.9 (April 24th, 2025) - -- Resolve https://github.com/advisories/GHSA-vqfr-h8mv-ghfj with h11 dependency update. (#1008) - -## Version 1.0.8 (April 11th, 2025) - -- Fix `AttributeError` when importing on Python 3.14. (#1005) - -## Version 1.0.7 (November 15th, 2024) - -- Support `proxy=…` configuration on `ConnectionPool()`. (#974) - -## Version 1.0.6 (October 1st, 2024) - -- Relax `trio` dependency pinning. (#956) -- Handle `trio` raising `NotImplementedError` on unsupported platforms. (#955) -- Handle mapping `ssl.SSLError` to `httpcore.ConnectError`. (#918) - -## 1.0.5 (March 27th, 2024) - -- Handle `EndOfStream` exception for anyio backend. (#899) -- Allow trio `0.25.*` series in package dependancies. (#903) - -## 1.0.4 (February 21st, 2024) - -- Add `target` request extension. (#888) -- Fix support for connection `Upgrade` and `CONNECT` when some data in the stream has been read. (#882) - -## 1.0.3 (February 13th, 2024) - -- Fix support for async cancellations. (#880) -- Fix trace extension when used with socks proxy. (#849) -- Fix SSL context for connections using the "wss" scheme (#869) - -## 1.0.2 (November 10th, 2023) - -- Fix `float("inf")` timeouts in `Event.wait` function. (#846) - -## 1.0.1 (November 3rd, 2023) - -- Fix pool timeout to account for the total time spent retrying. (#823) -- Raise a neater RuntimeError when the correct async deps are not installed. (#826) -- Add support for synchronous TLS-in-TLS streams. (#840) - -## 1.0.0 (October 6th, 2023) - -From version 1.0 our async support is now optional, as the package has minimal dependencies by default. - -For async support use either `pip install 'httpcore[asyncio]'` or `pip install 'httpcore[trio]'`. - -The project versioning policy is now explicitly governed by SEMVER. See https://semver.org/. - -- Async support becomes fully optional. (#809) -- Add support for Python 3.12. (#807) - -## 0.18.0 (September 8th, 2023) - -- Add support for HTTPS proxies. (#745, #786) -- Drop Python 3.7 support. (#727) -- Handle `sni_hostname` extension with SOCKS proxy. (#774) -- Handle HTTP/1.1 half-closed connections gracefully. (#641) -- Change the type of `Extensions` from `Mapping[Str, Any]` to `MutableMapping[Str, Any]`. (#762) - -## 0.17.3 (July 5th, 2023) - -- Support async cancellations, ensuring that the connection pool is left in a clean state when cancellations occur. (#726) -- The networking backend interface has [been added to the public API](https://www.encode.io/httpcore/network-backends). Some classes which were previously private implementation detail are now part of the top-level public API. (#699) -- Graceful handling of HTTP/2 GoAway frames, with requests being transparently retried on a new connection. (#730) -- Add exceptions when a synchronous `trace callback` is passed to an asynchronous request or an asynchronous `trace callback` is passed to a synchronous request. (#717) -- Drop Python 3.7 support. (#727) - -## 0.17.2 (May 23th, 2023) - -- Add `socket_options` argument to `ConnectionPool` and `HTTProxy` classes. (#668) -- Improve logging with per-module logger names. (#690) -- Add `sni_hostname` request extension. (#696) -- Resolve race condition during import of `anyio` package. (#692) -- Enable TCP_NODELAY for all synchronous sockets. (#651) - -## 0.17.1 (May 17th, 2023) - -- If 'retries' is set, then allow retries if an SSL handshake error occurs. (#669) -- Improve correctness of tracebacks on network exceptions, by raising properly chained exceptions. (#678) -- Prevent connection-hanging behaviour when HTTP/2 connections are closed by a server-sent 'GoAway' frame. (#679) -- Fix edge-case exception when removing requests from the connection pool. (#680) -- Fix pool timeout edge-case. (#688) - -## 0.17.0 (March 16th, 2023) - -- Add DEBUG level logging. (#648) -- Respect HTTP/2 max concurrent streams when settings updates are sent by server. (#652) -- Increase the allowable HTTP header size to 100kB. (#647) -- Add `retries` option to SOCKS proxy classes. (#643) - -## 0.16.3 (December 20th, 2022) - -- Allow `ws` and `wss` schemes. Allows us to properly support websocket upgrade connections. (#625) -- Forwarding HTTP proxies use a connection-per-remote-host. Required by some proxy implementations. (#637) -- Don't raise `RuntimeError` when closing a connection pool with active connections. Removes some error cases when cancellations are used. (#631) -- Lazy import `anyio`, so that it's no longer a hard dependancy, and isn't imported if unused. (#639) - -## 0.16.2 (November 25th, 2022) - -- Revert 'Fix async cancellation behaviour', which introduced race conditions. (#627) -- Raise `RuntimeError` if attempting to us UNIX domain sockets on Windows. (#619) - -## 0.16.1 (November 17th, 2022) - -- Fix HTTP/1.1 interim informational responses, such as "100 Continue". (#605) - -## 0.16.0 (October 11th, 2022) - -- Support HTTP/1.1 informational responses. (#581) -- Fix async cancellation behaviour. (#580) -- Support `h11` 0.14. (#579) - -## 0.15.0 (May 17th, 2022) - -- Drop Python 3.6 support (#535) -- Ensure HTTP proxy CONNECT requests include `timeout` configuration. (#506) -- Switch to explicit `typing.Optional` for type hints. (#513) -- For `trio` map OSError exceptions to `ConnectError`. (#543) - -## 0.14.7 (February 4th, 2022) - -- Requests which raise a PoolTimeout need to be removed from the pool queue. (#502) -- Fix AttributeError that happened when Socks5Connection were terminated. (#501) - -## 0.14.6 (February 1st, 2022) - -- Fix SOCKS support for `http://` URLs. (#492) -- Resolve race condition around exceptions during streaming a response. (#491) - -## 0.14.5 (January 18th, 2022) - -- SOCKS proxy support. (#478) -- Add proxy_auth argument to HTTPProxy. (#481) -- Improve error message on 'RemoteProtocolError' exception when server disconnects without sending a response. (#479) - -## 0.14.4 (January 5th, 2022) - -- Support HTTP/2 on HTTPS tunnelling proxies. (#468) -- Fix proxy headers missing on HTTP forwarding. (#456) -- Only instantiate SSL context if required. (#457) -- More robust HTTP/2 handling. (#253, #439, #440, #441) - -## 0.14.3 (November 17th, 2021) - -- Fix race condition when removing closed connections from the pool. (#437) - -## 0.14.2 (November 16th, 2021) - -- Failed connections no longer remain in the pool. (Pull #433) - -## 0.14.1 (November 12th, 2021) - -- `max_connections` becomes optional. (Pull #429) -- `certifi` is now included in the install dependancies. (Pull #428) -- `h2` is now strictly optional. (Pull #428) - -## 0.14.0 (November 11th, 2021) - -The 0.14 release is a complete reworking of `httpcore`, comprehensively addressing some underlying issues in the connection pooling, as well as substantially redesigning the API to be more user friendly. - -Some of the lower-level API design also makes the components more easily testable in isolation, and the package now has 100% test coverage. - -See [discussion #419](https://github.com/encode/httpcore/discussions/419) for a little more background. - -There's some other neat bits in there too, such as the "trace" extension, which gives a hook into inspecting the internal events that occur during the request/response cycle. This extension is needed for the HTTPX cli, in order to... - -* Log the point at which the connection is established, and the IP/port on which it is made. -* Determine if the outgoing request should log as HTTP/1.1 or HTTP/2, rather than having to assume it's HTTP/2 if the --http2 flag was passed. (Which may not actually be true.) -* Log SSL version info / certificate info. - -Note that `curio` support is not currently available in 0.14.0. If you're using `httpcore` with `curio` please get in touch, so we can assess if we ought to prioritize it as a feature or not. - -## 0.13.7 (September 13th, 2021) - -- Fix broken error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #403) - -## 0.13.6 (June 15th, 2021) - -### Fixed - -- Close sockets when read or write timeouts occur. (Pull #365) - -## 0.13.5 (June 14th, 2021) - -### Fixed - -- Resolved niggles with AnyIO EOF behaviours. (Pull #358, #362) - -## 0.13.4 (June 9th, 2021) - -### Added - -- Improved error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #354) - -### Fixed - -- Switched to `anyio` as the default backend implementation when running with `asyncio`. Resolves some awkward [TLS timeout issues](https://github.com/encode/httpx/discussions/1511). - -## 0.13.3 (May 6th, 2021) - -### Added - -- Support HTTP/2 prior knowledge, using `httpcore.SyncConnectionPool(http1=False)`. (Pull #333) - -### Fixed - -- Handle cases where environment does not provide `select.poll` support. (Pull #331) - -## 0.13.2 (April 29th, 2021) - -### Added - -- Improve error message for specific case of `RemoteProtocolError` where server disconnects without sending a response. (Pull #313) - -## 0.13.1 (April 28th, 2021) - -### Fixed - -- More resiliant testing for closed connections. (Pull #311) -- Don't raise exceptions on ungraceful connection closes. (Pull #310) - -## 0.13.0 (April 21st, 2021) - -The 0.13 release updates the core API in order to match the HTTPX Transport API, -introduced in HTTPX 0.18 onwards. - -An example of making requests with the new interface is: - -```python -with httpcore.SyncConnectionPool() as http: - status_code, headers, stream, extensions = http.handle_request( - method=b'GET', - url=(b'https', b'example.org', 443, b'/'), - headers=[(b'host', b'example.org'), (b'user-agent', b'httpcore')] - stream=httpcore.ByteStream(b''), - extensions={} - ) - body = stream.read() - print(status_code, body) -``` - -### Changed - -- The `.request()` method is now `handle_request()`. (Pull #296) -- The `.arequest()` method is now `.handle_async_request()`. (Pull #296) -- The `headers` argument is no longer optional. (Pull #296) -- The `stream` argument is no longer optional. (Pull #296) -- The `ext` argument is now named `extensions`, and is no longer optional. (Pull #296) -- The `"reason"` extension keyword is now named `"reason_phrase"`. (Pull #296) -- The `"reason_phrase"` and `"http_version"` extensions now use byte strings for their values. (Pull #296) -- The `httpcore.PlainByteStream()` class becomes `httpcore.ByteStream()`. (Pull #296) - -### Added - -- Streams now support a `.read()` interface. (Pull #296) - -### Fixed - -- Task cancellation no longer leaks connections from the connection pool. (Pull #305) - -## 0.12.3 (December 7th, 2020) - -### Fixed - -- Abort SSL connections on close rather than waiting for remote EOF when using `asyncio`. (Pull #167) -- Fix exception raised in case of connect timeouts when using the `anyio` backend. (Pull #236) -- Fix `Host` header precedence for `:authority` in HTTP/2. (Pull #241, #243) -- Handle extra edge case when detecting for socket readability when using `asyncio`. (Pull #242, #244) -- Fix `asyncio` SSL warning when using proxy tunneling. (Pull #249) - -## 0.12.2 (November 20th, 2020) - -### Fixed - -- Properly wrap connect errors on the asyncio backend. (Pull #235) -- Fix `ImportError` occurring on Python 3.9 when using the HTTP/1.1 sync client in a multithreaded context. (Pull #237) - -## 0.12.1 (November 7th, 2020) - -### Added - -- Add connect retries. (Pull #221) - -### Fixed - -- Tweak detection of dropped connections, resolving an issue with open files limits on Linux. (Pull #185) -- Avoid leaking connections when establishing an HTTP tunnel to a proxy has failed. (Pull #223) -- Properly wrap OS errors when using `trio`. (Pull #225) - -## 0.12.0 (October 6th, 2020) - -### Changed - -- HTTP header casing is now preserved, rather than always sent in lowercase. (#216 and python-hyper/h11#104) - -### Added - -- Add Python 3.9 to officially supported versions. - -### Fixed - -- Gracefully handle a stdlib asyncio bug when a connection is closed while it is in a paused-for-reading state. (#201) - -## 0.11.1 (September 28nd, 2020) - -### Fixed - -- Add await to async semaphore release() coroutine (#197) -- Drop incorrect curio classifier (#192) - -## 0.11.0 (September 22nd, 2020) - -The Transport API with 0.11.0 has a couple of significant changes. - -Firstly we've moved changed the request interface in order to allow extensions, which will later enable us to support features -such as trailing headers, HTTP/2 server push, and CONNECT/Upgrade connections. - -The interface changes from: - -```python -def request(method, url, headers, stream, timeout): - return (http_version, status_code, reason, headers, stream) -``` - -To instead including an optional dictionary of extensions on the request and response: - -```python -def request(method, url, headers, stream, ext): - return (status_code, headers, stream, ext) -``` - -Having an open-ended extensions point will allow us to add later support for various optional features, that wouldn't otherwise be supported without these API changes. - -In particular: - -* Trailing headers support. -* HTTP/2 Server Push -* sendfile. -* Exposing raw connection on CONNECT, Upgrade, HTTP/2 bi-di streaming. -* Exposing debug information out of the API, including template name, template context. - -Currently extensions are limited to: - -* request: `timeout` - Optional. Timeout dictionary. -* response: `http_version` - Optional. Include the HTTP version used on the response. -* response: `reason` - Optional. Include the reason phrase used on the response. Only valid with HTTP/1.*. - -See https://github.com/encode/httpx/issues/1274#issuecomment-694884553 for the history behind this. - -Secondly, the async version of `request` is now namespaced as `arequest`. - -This allows concrete transports to support both sync and async implementations on the same class. - -### Added - -- Add curio support. (Pull #168) -- Add anyio support, with `backend="anyio"`. (Pull #169) - -### Changed - -- Update the Transport API to use 'ext' for optional extensions. (Pull #190) -- Update the Transport API to use `.request` and `.arequest` so implementations can support both sync and async. (Pull #189) - -## 0.10.2 (August 20th, 2020) - -### Added - -- Added Unix Domain Socket support. (Pull #139) - -### Fixed - -- Always include the port on proxy CONNECT requests. (Pull #154) -- Fix `max_keepalive_connections` configuration. (Pull #153) -- Fixes behaviour in HTTP/1.1 where server disconnects can be used to signal the end of the response body. (Pull #164) - -## 0.10.1 (August 7th, 2020) - -- Include `max_keepalive_connections` on `AsyncHTTPProxy`/`SyncHTTPProxy` classes. - -## 0.10.0 (August 7th, 2020) - -The most notable change in the 0.10.0 release is that HTTP/2 support is now fully optional. - -Use either `pip install httpcore` for HTTP/1.1 support only, or `pip install httpcore[http2]` for HTTP/1.1 and HTTP/2 support. - -### Added - -- HTTP/2 support becomes optional. (Pull #121, #130) -- Add `local_address=...` support. (Pull #100, #134) -- Add `PlainByteStream`, `IteratorByteStream`, `AsyncIteratorByteStream`. The `AsyncByteSteam` and `SyncByteStream` classes are now pure interface classes. (#133) -- Add `LocalProtocolError`, `RemoteProtocolError` exceptions. (Pull #129) -- Add `UnsupportedProtocol` exception. (Pull #128) -- Add `.get_connection_info()` method. (Pull #102, #137) -- Add better TRACE logs. (Pull #101) - -### Changed - -- `max_keepalive` is deprecated in favour of `max_keepalive_connections`. (Pull #140) - -### Fixed - -- Improve handling of server disconnects. (Pull #112) - -## 0.9.1 (May 27th, 2020) - -### Fixed - -- Proper host resolution for sync case, including IPv6 support. (Pull #97) -- Close outstanding connections when connection pool is closed. (Pull #98) - -## 0.9.0 (May 21th, 2020) - -### Changed - -- URL port becomes an `Optional[int]` instead of `int`. (Pull #92) - -### Fixed - -- Honor HTTP/2 max concurrent streams settings. (Pull #89, #90) -- Remove incorrect debug log. (Pull #83) - -## 0.8.4 (May 11th, 2020) - -### Added - -- Logging via HTTPCORE_LOG_LEVEL and HTTPX_LOG_LEVEL environment variables -and TRACE level logging. (Pull #79) - -### Fixed - -- Reuse of connections on HTTP/2 in close concurrency situations. (Pull #81) - -## 0.8.3 (May 6rd, 2020) - -### Fixed - -- Include `Host` and `Accept` headers on proxy "CONNECT" requests. -- De-duplicate any headers also contained in proxy_headers. -- HTTP/2 flag not being passed down to proxy connections. - -## 0.8.2 (May 3rd, 2020) - -### Fixed - -- Fix connections using proxy forwarding requests not being added to the -connection pool properly. (Pull #70) - -## 0.8.1 (April 30th, 2020) - -### Changed - -- Allow inherintance of both `httpcore.AsyncByteStream`, `httpcore.SyncByteStream` without type conflicts. - -## 0.8.0 (April 30th, 2020) - -### Fixed - -- Fixed tunnel proxy support. - -### Added - -- New `TimeoutException` base class. - -## 0.7.0 (March 5th, 2020) - -- First integration with HTTPX. diff --git a/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/RECORD b/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/RECORD deleted file mode 100755 index 106f7a5..0000000 --- a/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/RECORD +++ /dev/null @@ -1,68 +0,0 @@ -httpcore-1.0.9.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -httpcore-1.0.9.dist-info/METADATA,sha256=_i1P2mGZEol4d54M8n88BFxTGGP83Zh-rMdPOhjUHCE,21529 -httpcore-1.0.9.dist-info/RECORD,, -httpcore-1.0.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87 -httpcore-1.0.9.dist-info/licenses/LICENSE.md,sha256=_ctZFUx0y6uhahEkL3dAvqnyPW_rVUeRfYxflKgDkqU,1518 -httpcore/__init__.py,sha256=9kT_kqChCCJUTHww24ZmR_ezcdbpRYWksD-gYNzkZP8,3445 -httpcore/__pycache__/__init__.cpython-311.pyc,, -httpcore/__pycache__/_api.cpython-311.pyc,, -httpcore/__pycache__/_exceptions.cpython-311.pyc,, -httpcore/__pycache__/_models.cpython-311.pyc,, -httpcore/__pycache__/_ssl.cpython-311.pyc,, -httpcore/__pycache__/_synchronization.cpython-311.pyc,, -httpcore/__pycache__/_trace.cpython-311.pyc,, -httpcore/__pycache__/_utils.cpython-311.pyc,, -httpcore/_api.py,sha256=unZmeDschBWCGCPCwkS3Wot9euK6bg_kKxLtGTxw214,3146 -httpcore/_async/__init__.py,sha256=EWdl2v4thnAHzJpqjU4h2a8DUiGAvNiWrkii9pfhTf0,1221 -httpcore/_async/__pycache__/__init__.cpython-311.pyc,, -httpcore/_async/__pycache__/connection.cpython-311.pyc,, -httpcore/_async/__pycache__/connection_pool.cpython-311.pyc,, -httpcore/_async/__pycache__/http11.cpython-311.pyc,, -httpcore/_async/__pycache__/http2.cpython-311.pyc,, -httpcore/_async/__pycache__/http_proxy.cpython-311.pyc,, -httpcore/_async/__pycache__/interfaces.cpython-311.pyc,, -httpcore/_async/__pycache__/socks_proxy.cpython-311.pyc,, -httpcore/_async/connection.py,sha256=6OcPXqMEfc0BU38_-iHUNDd1vKSTc2UVT09XqNb_BOk,8449 -httpcore/_async/connection_pool.py,sha256=DOIQ2s2ZCf9qfwxhzMprTPLqCL8OxGXiKF6qRHxvVyY,17307 -httpcore/_async/http11.py,sha256=-qM9bV7PjSQF5vxs37-eUXOIFwbIjPcZbNliuX9TtBw,13880 -httpcore/_async/http2.py,sha256=azX1fcmtXaIwjputFlZ4vd92J8xwjGOa9ax9QIv4394,23936 -httpcore/_async/http_proxy.py,sha256=2zVkrlv-Ds-rWGaqaXlrhEJiAQFPo23BT3Gq_sWoBXU,14701 -httpcore/_async/interfaces.py,sha256=jTiaWL83pgpGC9ziv90ZfwaKNMmHwmOalzaKiuTxATo,4455 -httpcore/_async/socks_proxy.py,sha256=lLKgLlggPfhFlqi0ODeBkOWvt9CghBBUyqsnsU1tx6Q,13841 -httpcore/_backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -httpcore/_backends/__pycache__/__init__.cpython-311.pyc,, -httpcore/_backends/__pycache__/anyio.cpython-311.pyc,, -httpcore/_backends/__pycache__/auto.cpython-311.pyc,, -httpcore/_backends/__pycache__/base.cpython-311.pyc,, -httpcore/_backends/__pycache__/mock.cpython-311.pyc,, -httpcore/_backends/__pycache__/sync.cpython-311.pyc,, -httpcore/_backends/__pycache__/trio.cpython-311.pyc,, -httpcore/_backends/anyio.py,sha256=x8PgEhXRC8bVqsdzk_YJx8Y6d9Tub06CuUSwnbmtqoY,5252 -httpcore/_backends/auto.py,sha256=zO136PKZmsaTDK-HRk84eA-MUg8_2wJf4NvmK432Aio,1662 -httpcore/_backends/base.py,sha256=aShgRdZnMmRhFWHetjumlM73f8Kz1YOAyCUP_4kHslA,3042 -httpcore/_backends/mock.py,sha256=er9T436uSe7NLrfiLa4x6Nuqg5ivQ693CxWYCWsgbH4,4077 -httpcore/_backends/sync.py,sha256=bhE4d9iK9Umxdsdsgm2EfKnXaBms2WggGYU-7jmUujU,7977 -httpcore/_backends/trio.py,sha256=LHu4_Mr5MswQmmT3yE4oLgf9b_JJfeVS4BjDxeJc7Ro,5996 -httpcore/_exceptions.py,sha256=looCKga3_YVYu3s-d3L9RMPRJyhsY7fiuuGxvkOD0c0,1184 -httpcore/_models.py,sha256=IO2CcXcdpovRcLTdGFGB6RyBZdEm2h_TOmoCc4rEKho,17623 -httpcore/_ssl.py,sha256=srqmSNU4iOUvWF-SrJvb8G_YEbHFELOXQOwdDIBTS9c,187 -httpcore/_sync/__init__.py,sha256=JBDIgXt5la1LCJ1sLQeKhjKFpLnpNr8Svs6z2ni3fgg,1141 -httpcore/_sync/__pycache__/__init__.cpython-311.pyc,, -httpcore/_sync/__pycache__/connection.cpython-311.pyc,, -httpcore/_sync/__pycache__/connection_pool.cpython-311.pyc,, -httpcore/_sync/__pycache__/http11.cpython-311.pyc,, -httpcore/_sync/__pycache__/http2.cpython-311.pyc,, -httpcore/_sync/__pycache__/http_proxy.cpython-311.pyc,, -httpcore/_sync/__pycache__/interfaces.cpython-311.pyc,, -httpcore/_sync/__pycache__/socks_proxy.cpython-311.pyc,, -httpcore/_sync/connection.py,sha256=9exGOb3PB-Mp2T1-sckSeL2t-tJ_9-NXomV8ihmWCgU,8238 -httpcore/_sync/connection_pool.py,sha256=a-T8LTsUxc7r0Ww1atfHSDoWPjQ0fA8Ul7S3-F0Mj70,16955 -httpcore/_sync/http11.py,sha256=IFobD1Md5JFlJGKWnh1_Q3epikUryI8qo09v8MiJIEA,13476 -httpcore/_sync/http2.py,sha256=AxU4yhcq68Bn5vqdJYtiXKYUj7nvhYbxz3v4rT4xnvA,23400 -httpcore/_sync/http_proxy.py,sha256=_al_6crKuEZu2wyvu493RZImJdBJnj5oGKNjLOJL2Zo,14463 -httpcore/_sync/interfaces.py,sha256=snXON42vUDHO5JBJvo8D4VWk2Wat44z2OXXHDrjbl94,4344 -httpcore/_sync/socks_proxy.py,sha256=zegZW9Snqj2_992DFJa8_CppOVBkVL4AgwduRkStakQ,13614 -httpcore/_synchronization.py,sha256=zSi13mAColBnknjZBknUC6hKNDQT4C6ijnezZ-r0T2s,9434 -httpcore/_trace.py,sha256=ck6ZoIzYTkdNAIfq5MGeKqBXDtqjOX-qfYwmZFbrGco,3952 -httpcore/_utils.py,sha256=_RLgXYOAYC350ikALV59GZ68IJrdocRZxPs9PjmzdFY,1537 -httpcore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/WHEEL b/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/WHEEL deleted file mode 100755 index 12228d4..0000000 --- a/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.27.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md b/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md deleted file mode 100755 index 311b2b5..0000000 --- a/venv/lib/python3.11/site-packages/httpcore-1.0.9.dist-info/licenses/LICENSE.md +++ /dev/null @@ -1,27 +0,0 @@ -Copyright © 2020, [Encode OSS Ltd](https://www.encode.io/). -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.11/site-packages/httpcore/__init__.py b/venv/lib/python3.11/site-packages/httpcore/__init__.py deleted file mode 100755 index 9a92dc4..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/__init__.py +++ /dev/null @@ -1,141 +0,0 @@ -from ._api import request, stream -from ._async import ( - AsyncConnectionInterface, - AsyncConnectionPool, - AsyncHTTP2Connection, - AsyncHTTP11Connection, - AsyncHTTPConnection, - AsyncHTTPProxy, - AsyncSOCKSProxy, -) -from ._backends.base import ( - SOCKET_OPTION, - AsyncNetworkBackend, - AsyncNetworkStream, - NetworkBackend, - NetworkStream, -) -from ._backends.mock import AsyncMockBackend, AsyncMockStream, MockBackend, MockStream -from ._backends.sync import SyncBackend -from ._exceptions import ( - ConnectError, - ConnectionNotAvailable, - ConnectTimeout, - LocalProtocolError, - NetworkError, - PoolTimeout, - ProtocolError, - ProxyError, - ReadError, - ReadTimeout, - RemoteProtocolError, - TimeoutException, - UnsupportedProtocol, - WriteError, - WriteTimeout, -) -from ._models import URL, Origin, Proxy, Request, Response -from ._ssl import default_ssl_context -from ._sync import ( - ConnectionInterface, - ConnectionPool, - HTTP2Connection, - HTTP11Connection, - HTTPConnection, - HTTPProxy, - SOCKSProxy, -) - -# The 'httpcore.AnyIOBackend' class is conditional on 'anyio' being installed. -try: - from ._backends.anyio import AnyIOBackend -except ImportError: # pragma: nocover - - class AnyIOBackend: # type: ignore - def __init__(self, *args, **kwargs): # type: ignore - msg = ( - "Attempted to use 'httpcore.AnyIOBackend' but 'anyio' is not installed." - ) - raise RuntimeError(msg) - - -# The 'httpcore.TrioBackend' class is conditional on 'trio' being installed. -try: - from ._backends.trio import TrioBackend -except ImportError: # pragma: nocover - - class TrioBackend: # type: ignore - def __init__(self, *args, **kwargs): # type: ignore - msg = "Attempted to use 'httpcore.TrioBackend' but 'trio' is not installed." - raise RuntimeError(msg) - - -__all__ = [ - # top-level requests - "request", - "stream", - # models - "Origin", - "URL", - "Request", - "Response", - "Proxy", - # async - "AsyncHTTPConnection", - "AsyncConnectionPool", - "AsyncHTTPProxy", - "AsyncHTTP11Connection", - "AsyncHTTP2Connection", - "AsyncConnectionInterface", - "AsyncSOCKSProxy", - # sync - "HTTPConnection", - "ConnectionPool", - "HTTPProxy", - "HTTP11Connection", - "HTTP2Connection", - "ConnectionInterface", - "SOCKSProxy", - # network backends, implementations - "SyncBackend", - "AnyIOBackend", - "TrioBackend", - # network backends, mock implementations - "AsyncMockBackend", - "AsyncMockStream", - "MockBackend", - "MockStream", - # network backends, interface - "AsyncNetworkStream", - "AsyncNetworkBackend", - "NetworkStream", - "NetworkBackend", - # util - "default_ssl_context", - "SOCKET_OPTION", - # exceptions - "ConnectionNotAvailable", - "ProxyError", - "ProtocolError", - "LocalProtocolError", - "RemoteProtocolError", - "UnsupportedProtocol", - "TimeoutException", - "PoolTimeout", - "ConnectTimeout", - "ReadTimeout", - "WriteTimeout", - "NetworkError", - "ConnectError", - "ReadError", - "WriteError", -] - -__version__ = "1.0.9" - - -__locals = locals() -for __name in __all__: - # Exclude SOCKET_OPTION, it causes AttributeError on Python 3.14 - if not __name.startswith(("__", "SOCKET_OPTION")): - setattr(__locals[__name], "__module__", "httpcore") # noqa diff --git a/venv/lib/python3.11/site-packages/httpcore/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index ccad2dbcaa88a897d9b955c1ef76eb10ebb97c26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3924 zcmdT`TW=dT7UoE!>*yBAc5Y6r#7 zWXHxXU@ZEO1^Up31zPM=u@6}Ued%xTFHnjA6$lh4(5JqsNDCN!Di24J-ucEAc! z6{|FaLo|%TG=d{Eila1!V>FKAa!ktX8%J&KRgWB3?7j*rtpJV;OA6Z9lLNr&(d&Eq^hg-_Ab_%t2H z!*m3X&@=c9J&VuMQ9LT=h*+=C0xr;V_#7R>WAr>ePsj1N?2B4OTEZn+k69OJ8JFor ze34$lm*{1DnNHvddIevhSMgN^#lY*hb&X!f*A-+R8AjyQ5yXTy0rUnkwGWY*cq-WX zT)h5+ufLCMbqzfZzK_-vsh_ka=@gziKtCn)(|h!%di7V3nfb4RZW{|o{B|2 z?<|GzYvjgl^w)EEnoNH-(-rqr%pgJP6;{YOC` zjhX$6s4(yyXchuI!pH}8;(9#ndW;yf5aCCr-F3S%>)1A_cvZ)~YkPz}Fe-%S_VnC$ z9EgNQ3?tno`lw&C4K(> z(%t#Fwjp!GTXWc>8Kd%u*e1_PwYG3kdc#wD#w2%j7gU~+N^d!p?lk`DAZgE`_4dYh zItmKc76nu7^$Tg9XghU>F^BPi9T(>uZ+g|JTE?Nyq1 z@^uq!JN=dhM0bWKcaMxqiu`f01!9Ak6y0l}`UO6^Ig7_@zJ;yr1k@Wiyees{hd zuu5lFz_+uJUiOK`Cx{@dmSkN#6B1m-qgpY}XLYl7pv=j7`y$&WttyjsO!q}XfTXnwiwOpa;diNJ#_3##d5jiil~p*#MUxah+FDdSkm>XUG;Rm zSX<}OPGh6L*YILTd{r##9uu&MzRA4T3Zi7@$1utbed<2X4!_6_Hxk1yMK78Ywu`xJ zgA!fmab2g5S+}5`(De`MhUNFL8)ED;#BPcYn*xAoGyC3?*{`!Fdjca_nq#*_Kbr;EVI3410Lb^T9st(&gRc)-g))PE!&HE?0A~PR z0Vn{B0>l8|e+z@ZH7p7c0SEzT040F)02cs?0OJ5-0A&Dh&(9KR^dV?w0dfGa)maKa z{9zJzKLBiJb`Br`a2VhOz#stJtt=048sHSbaeyNLLjWTHko0T-;3NQK=0>PoyimL@ zuH1mG`;$)#F^_h()?DE>S9POS-Jyqvbp!5V-)YH)7;X2xW03e9qGCxMtUvjkYq{Pr2mqbyqLph zOmYXDNV0eY_B*j$KM!O^$Q0;igrG&-8!{?9q)UTjh-K_$#AWPdKFCyn*z@!bA@U5B zdBC;16fQXbKI`EO_LWR(VU8|NSaJAhy1q)7EAAoD2wQMTyKqjmYhnMy;&E{zGtXVC zdJlQTC7$7VY|obYDLUmJX*bzlglTX^xT|6lw1SGFG|{QXL8TRlDuEXIBOn`wnSU>& zkn*n5K=1r=X`<1_?$QcmVEO+CIE|Fa272|^lqNdU*j@g>01m{Ik)}G{*jKijk!%Y^ z6mbT3K@EjOb3c3!vL6oUXoZCC_V#vbKzy6(SYu!DmkGf#T~LFt%zpSDWIr6x(FzG& zSSB;6iG1k5W~8;Dp!C3|)(WFU_Q{ohUHj6emd|XlmG1e7xCxO$rsVdMs#w!73nCua71sZ;Ta8WY1x^4 XaBD~b90|{ip{=p(EDCPjQUv}Chqd<9 diff --git a/venv/lib/python3.11/site-packages/httpcore/__pycache__/_api.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/__pycache__/_api.cpython-311.pyc deleted file mode 100755 index 6d9e9b4580935e3d4137319b174d05a5b7685076..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4087 zcmeHKO>7fK6rT0^Cvg&!kOm0hFf|}yHP}iKm6}4O2%-jxLPSg}jF7$YPGZCUxHD@U zORmHLRTURhsVY^~Lr+u)F1_@|0jc+<5(jHfNWGMsBdCO;9{S$wZr09^TA^MlvAceL z`{vD?H*em2Z|BFMp(KH;{q=X(&kqvvJH7;0%wv=nw}H7wbfPN;F_nU%ARjRzg^2uD z3#zW_Q6p-`3NbTYh?|K*!t5*bfu5?zjD9m&NCF>`cl>)*-=~k>ju!@43XS4er1k z({#r3%^DMK-z6q$AZ5@!b;htlNwryloH&KzQ!cCNI3k*1Jl7)uiCUYvbzA>=W zbeNzmDje>rb#82oz?ksfCFdAWo1i?ozh zq@}i^kCgkc-VgmX$FaN>xesGL48|o2StN(a6cN!zWL3RF8juTDK#Hpi>!WIUa4AXQ zT4a_ksAkc*e13s)_F0_?XA&5k4a9*u6$WqKl4O&zPpMRr|ACmErWMDjm2J+lzJ+7y zk7o1fNt(t6F`dgb8jUPl)y$f~vSr)Mr8AqRBs0TT>L#qGn3k{TnzxwKG!Gs~?>qrr zwz=<>bT&&NajIp_Fq#xrh}z4vBu6hzZkj@KrS!#x{JD$si|NuNyv)tcob|Yci;H=m zyBshx`7?7UgP}_4v$Gdw^RwwvcGDiDl;;JDI*&Q?LjsU~AvwS=QtWzVNs1|0S4w;Leh*H@kh2^VoS@Z@*RjZ59p_?&oPbvt=rF4Y5EoC@67_ zRxQW{Q^E`IWuvY$9de*2J2ux0b6~+1qPk=-dV@7Z&;?f5shZ5LJGjJB|B_7qu3Vh4 zKzpY}4A9C?jt4P51lyMHK_U?b!9}9Rd?v#C;l)k(!OFyU)pesaz&jBKb#$B3jk#RK zHd)Tpc-hXKw^!^FIjvU9-DK9yoKaoM)tZ2O)`{%YR8BxlkJq&F4Q+*qT##%dUBK#iEB*<&rv&wKEB;yoyWub5^;T^}<=ylpUfa>v!E4$8 z6slTOqrrAHH4CzWZvk>t3n3ivhiT@&KyU=Bpaz7noy~fC8LNccOrKVmMe8CcCMDl~ zrbL(PmISIvxnmJKLOk&*4$QzXD11ZEB_@q&b;rgX@8LZ-s%PoBW!kjsw4qrJb!@7Y z%S;F#1bj2nHY$mVT{m=Tig^%S7mSvI_?+IH5L7ZvKbG-p0M?vxrEc8-7zkAmyo!ET zQ1zqwrj!9-y(wi7g#UFZ<6{7yn?)<`?b=LY*P6xmgTC7r0D{0zYls0}`~dKLA|USq zBmM&N2i#D6=9I4L(-)h7>N7NQ_v)Ri+pAA%9I8(Wt4|8+OaDY?kfipt_a6Lm9`DW` z6iGP}s73t~P>Z@{VQa{FwP?GR3eI#$K-Q6ax%nD4?8HfvLC>8O#1sVJtBIL0^-=6} z?59Cs9!F=C{wInG?31X1d`$9V(V6kYlS2y7%%B(l6vk41WDFzMdzRrND8ur}_aYfZ zg6ELe?>&yaQ*N?YT&}~(fE9}zP7uURO7vTG;1k4+d*#_p6ir)ahTwQe;rI>X9kb8_ zcdRIyRvC@}!NIPGUpn%`NPd*KDc_=BsbtnXATOXVk!iHicM8nc4fY{F3Nkz{iC=+q zR7FwRB)!)AJR>7(!P6!~x8(hde6aRUPn%4w^*)^xIYiqh-)|o|))_jgK>qDU78DX0 ee5xGmB)fXNqd+cgC+jMSOrUP0r;Q(hIsFY!%SE98 diff --git a/venv/lib/python3.11/site-packages/httpcore/__pycache__/_exceptions.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/__pycache__/_exceptions.cpython-311.pyc deleted file mode 100755 index 7c167c16cba859264b3a4d00a32dd94fecdd519f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3803 zcmb7`&rcgi6vtAPLsa!ZC8VI9Xcdt}^bg3PhxR{kBo5X}ks|fd-W<_GlvCduvv%wS%exD2-@fnL z_nFz5+3}-L$WP!XZvHa6?IPrFys-|?fwMm*5%PejM5P&$C|_xUGCB+K@&UeF@m*b( zOOA?9OVyl&n~_9)3rt&x zXVQ1#xn<)n*DjnN8HwisGMrOVbIJ_M$L|_OF2!{g$9m;vL| zn|LCd-egi!vMiZ2{mEpOtMeK3gURIg^Gc?yJR$qY(Sv9rmT3iNAMe&GXVK+d8`ImZ z3!Z0?3&M~CQ1BZazPk-c=MaGAqgoP%oRB7%vB>qg z1`F&R1fUtKC1J=3>0qE5kj^6j&DB~Gh8&Q5I7|&N?_zZ{*K08ta)9xRL2AHx56h#O ztmR;6u+#LXxMr{=19n{4qL*`NZN_Z*0ybiFTvN+Arh6dMj8;~xC58{4%qkje%ev{k zW-whbxGpx{@+Kob`QqyXj>*HI$C!bF34Sy`|s^+Ckq!U(hsf|(}{0y*}t=lg# z`d?M@+LOeC8(qz2ZVfh@xpA%8%&p<3Gf&oMhL7sea((7eeJ`~3HJ#f2cGIa2s>b^3 es~*{_i}jgD^=jjC)0x4hGkfYYD>F;{!ulUMTEcq( diff --git a/venv/lib/python3.11/site-packages/httpcore/__pycache__/_models.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/__pycache__/_models.cpython-311.pyc deleted file mode 100755 index d7d437ef359727aa38b0f8a480d9c1230cb06f27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24537 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 JYh*BW_xUAlEJ#N=vI(_FY*s|AG&{sci02L(S6 ze}aEPrCR4NydsgS$>b$?+A(>Y)^Fn5BX0I2o=rw&N`8LTvk$fjJ?iYK| z0-qz2;KVRMkS>+B*81`z=6fWv;b8{gYj~y3&4$fZ#VDlV>%3Kfu7WY{ptK*Yccl8! T>ZTMtaaOw6?ji{Og^2$f{wk7o diff --git a/venv/lib/python3.11/site-packages/httpcore/__pycache__/_synchronization.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/__pycache__/_synchronization.cpython-311.pyc deleted file mode 100755 index f9dcd6aec2715f9bde6de79a3782c77e2293ce34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15821 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 W*WzC1Ke-MHzwtcm{H^$~^M3)^vtP9U diff --git a/venv/lib/python3.11/site-packages/httpcore/__pycache__/_trace.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/__pycache__/_trace.cpython-311.pyc deleted file mode 100755 index 2f0c5f52908b214fb3e42c0dd81c678083b34c6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5891 zcmd@YTWs6b^^zhb%aSeCvgO2a66R$`i6bSA+a!(aq>bHn&gQIjI;>7Rl@V!2j!dbS zRAzfJ=B~xy6$R!61sp8xppPJPkPQg-mHlM;Euy1U>gG3Mt}!L-lpuvrW|pN!fEAcMz1c@kEMmyE_RqTk0K!fUJd4 zTQpGEt6cK)f5DSzrFbTahqRm38AH`{R8HGBsTy{K;ilbTJDk;rHTiN*RbI+dJFuo4 zwm3BW;_ENlqM}|dPSRGS6?P<@z9#32svXv^eQI;&-kbb79pseZEF$Bp&h09YWkR?@M3 zQTQ-ejdw#8depvS>B8dB;?PQ`l{oz{appnd%%_1$;uS0LO3g=tEml)^%}?T8A65}LZo1MjV08?@@@Am2lq>T{sd}()QLvh}SG%Q;N6hY#mHpPC!A}+Q(1l&e<67SXO1z(Aq7qyd$Q1)*+9t@x(F7aj8V!b%Gp>x+A7$S}R z#`Dhmkr#?k@-vQza6Z?5xAqt%v5^7>kumm5_(y3w>^rygoe60+UzB93N<|&~qa;iE ztd_Y#^IE>BOIgiO=>%9P_|Ge|peuDMiW)}3egFRm3#gUx#P3>^jMTTpli}4??4ka0C`SJ_KNan9`V2{@8rqcmMVBIdji(C@Tk?+MTBR0sT&p zZi9+S0PFxTprB?9JCxPI1>}oH7D83<;%q@3rZi7!H)07>`K)G(;54Rn<_Hr3x(8`6 z&v*b)B95y{%bJpQf+V;%J20*4I`|k{z|g0o!ogkfVfUrLK{6NeTyz%<=rsTfq#BA? zq1|TaaCOgtTRY5M&p=r*oOwJrXzt>-~oPx+_!g-YA=R@?K7=RS+Xt;pW;@k*rE ziuBfq*wXe{e0PoKJHF3-;S)OBz9ax@M0l#L7AE27htJiBKiFH1b;4N7;TwZ17tI~V zpxjgL4_eQTn9sge?b@{zSPDGq>{_0=KI3rmQ{}Hyf1dhN?k_p$SEMluVCO}v^Wu_F z-MPo?Is~OW~3;eIpRUyZ~TLyReQlRA@0L#m{%b|Jj zh(g#X3g!yIp??iJ!V~GBSjAE1yXJyPbSXL20MiCGIh>mdBq!u7Br0`*qnq;xTyzBf z0*;r0TYw6~Q`q z%Itg&3@6&Y+y8HvtAx;+gE`ZMyKWgs4a&LbndcumH zFzW@a>m=LIu`bsZ;6!+Z_t3gN0Iz%y($OsLj5E9`^crN8Ui}Q2-txvj9C%572G#<-^wxm)mb`H+S_r<(^V$J8iX{Hp5$# z^^md9X8v7TbCe^roPQU+Q_wUC#Y^g69O!K1+G+=1`D6-(ilPhZU~f+E6Hn- z(#@6D2Jo*OeFcCc4sW1Z02bW0)=c*G zR#V4op{V$5jcft-KP5t<-w1jHu^m1<8bFjB?XMn6R*&}Af?*M|mn}ed8`5e72OG&S zs*SWjY+>=qz=o{~O$?Q=$L> diff --git a/venv/lib/python3.11/site-packages/httpcore/__pycache__/_utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/__pycache__/_utils.cpython-311.pyc deleted file mode 100755 index 2dedb359c9dc716c3ecbc0fbdc890d04d256afcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1413 zcmZ`(&ube;6rNeFR+44K5SJ*_4H;~3Dx7L@98w6SiF@b|6Wq}B5>XH<%}82%e`RK5 zqq3rEDO3g>)L^g)E$C9Usaon|{tUVJAQnstrH9@OrWc<&vx;Q7&{^%9Z{Ey)^S$?G z^kXVD1w}xd_ z#mXa)N&GDdGB8LQj^lEJo36vw1C_bO&9m2}B|JOqkdM|~hXfiWyh@!wEx4{#ghK(L z72-ey0C@UTc=v!08VZKatPeU9i_T$Jz}|RRhd%sL^C4C?LmyReWd_3bpV(Ai?Mx^gtrC22QuW3-g06_KH;xyA3mVkUc%O47AS1Y- z?czujTl@Uw6cX)|uz+a0LU@HxWT0VzZz6*s6BCD-$+QTC4S&dRMo z^<2x!Bmzwa;kZGB)mRYsEQ6O^Y6r105htG0Kx4!rMNVajsJv`JoRYH1I1zIXKYsAw zqxDRb%A*m)WUlfhEUtmfLM?##0D3Gc=45Ko*_vJvnsnQsMOR;Q%kGM9c%HsRoGsll z3%Xb171vqGE-&lMHXO6 z@$3Eg^&j5;_0GYa7q<@=?jJ4O?=O7#SNhs+y;JTyK2Q$cdjSvAcaPF{cczJW?0?>f&*7rVaPBr&{~T zw~5`v&b`*XzWVy9kP9+um_;hnMdcw5Q=ZX+seHav6%{4BipA+pGoI3&k IW5ON(1uEB4rvLx| diff --git a/venv/lib/python3.11/site-packages/httpcore/_api.py b/venv/lib/python3.11/site-packages/httpcore/_api.py deleted file mode 100755 index 38b961d..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_api.py +++ /dev/null @@ -1,94 +0,0 @@ -from __future__ import annotations - -import contextlib -import typing - -from ._models import URL, Extensions, HeaderTypes, Response -from ._sync.connection_pool import ConnectionPool - - -def request( - method: bytes | str, - url: URL | bytes | str, - *, - headers: HeaderTypes = None, - content: bytes | typing.Iterator[bytes] | None = None, - extensions: Extensions | None = None, -) -> Response: - """ - Sends an HTTP request, returning the response. - - ``` - response = httpcore.request("GET", "https://www.example.com/") - ``` - - Arguments: - method: The HTTP method for the request. Typically one of `"GET"`, - `"OPTIONS"`, `"HEAD"`, `"POST"`, `"PUT"`, `"PATCH"`, or `"DELETE"`. - url: The URL of the HTTP request. Either as an instance of `httpcore.URL`, - or as str/bytes. - headers: The HTTP request headers. Either as a dictionary of str/bytes, - or as a list of two-tuples of str/bytes. - content: The content of the request body. Either as bytes, - or as a bytes iterator. - extensions: A dictionary of optional extra information included on the request. - Possible keys include `"timeout"`. - - Returns: - An instance of `httpcore.Response`. - """ - with ConnectionPool() as pool: - return pool.request( - method=method, - url=url, - headers=headers, - content=content, - extensions=extensions, - ) - - -@contextlib.contextmanager -def stream( - method: bytes | str, - url: URL | bytes | str, - *, - headers: HeaderTypes = None, - content: bytes | typing.Iterator[bytes] | None = None, - extensions: Extensions | None = None, -) -> typing.Iterator[Response]: - """ - Sends an HTTP request, returning the response within a content manager. - - ``` - with httpcore.stream("GET", "https://www.example.com/") as response: - ... - ``` - - When using the `stream()` function, the body of the response will not be - automatically read. If you want to access the response body you should - either use `content = response.read()`, or `for chunk in response.iter_content()`. - - Arguments: - method: The HTTP method for the request. Typically one of `"GET"`, - `"OPTIONS"`, `"HEAD"`, `"POST"`, `"PUT"`, `"PATCH"`, or `"DELETE"`. - url: The URL of the HTTP request. Either as an instance of `httpcore.URL`, - or as str/bytes. - headers: The HTTP request headers. Either as a dictionary of str/bytes, - or as a list of two-tuples of str/bytes. - content: The content of the request body. Either as bytes, - or as a bytes iterator. - extensions: A dictionary of optional extra information included on the request. - Possible keys include `"timeout"`. - - Returns: - An instance of `httpcore.Response`. - """ - with ConnectionPool() as pool: - with pool.stream( - method=method, - url=url, - headers=headers, - content=content, - extensions=extensions, - ) as response: - yield response diff --git a/venv/lib/python3.11/site-packages/httpcore/_async/__init__.py b/venv/lib/python3.11/site-packages/httpcore/_async/__init__.py deleted file mode 100755 index 88dc7f0..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_async/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -from .connection import AsyncHTTPConnection -from .connection_pool import AsyncConnectionPool -from .http11 import AsyncHTTP11Connection -from .http_proxy import AsyncHTTPProxy -from .interfaces import AsyncConnectionInterface - -try: - from .http2 import AsyncHTTP2Connection -except ImportError: # pragma: nocover - - class AsyncHTTP2Connection: # type: ignore - def __init__(self, *args, **kwargs) -> None: # type: ignore - raise RuntimeError( - "Attempted to use http2 support, but the `h2` package is not " - "installed. Use 'pip install httpcore[http2]'." - ) - - -try: - from .socks_proxy import AsyncSOCKSProxy -except ImportError: # pragma: nocover - - class AsyncSOCKSProxy: # type: ignore - def __init__(self, *args, **kwargs) -> None: # type: ignore - raise RuntimeError( - "Attempted to use SOCKS support, but the `socksio` package is not " - "installed. Use 'pip install httpcore[socks]'." - ) - - -__all__ = [ - "AsyncHTTPConnection", - "AsyncConnectionPool", - "AsyncHTTPProxy", - "AsyncHTTP11Connection", - "AsyncHTTP2Connection", - "AsyncConnectionInterface", - "AsyncSOCKSProxy", -] diff --git a/venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 2c5728f03c1f01312539b062543dfffbaf90984b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1917 zcmb_c&2QX96n|rT*ZZBaNg<*ivIHWmTGniOjS!(iP>@1I%ArQcb?s@^#9xeOnMF5_vZJ;^WK|z(rng1 zw9zlW{`jW`@DC31Ryr0Ye+gk9Jn%>WA+ZQSSqYR-wNxpqffkmml9aWe9O{-X+N}B=h_r2ZsNR8XBKg&z z8Mds}IsBU7*H7_VFY`CSYy3{EIj^|^oz}lZtkEIa{A#)rxnJJCy?!%}BIlF?w2PekL7d zZP#DroQ4Ufp21^dkW!=1d9rMzgCvO=zi!+caD(@$aksyG*GL?9%h{xcpBhoj4L?e` z69m-j8s7=#QsO7MPP%bpM!%Q-epu=rkgW0TAmV;VKW8jv2WqCJG`OE>4%y^8t+>n1O%KOm=ubj&5{&Ju~$={pk4DQWMw1 zg-zSR6q~l~M?SahZnBeA^1<$v^HR~x%?%9Uy8`y$@AlQPLf-n6JX6*A)^iXr2DRCm z2rC>Y4A0QofrhRlC#1HW)oeSAy+MF-!?u4KIKkAy=8*#IqWG{j0wz*IT?ms81?&~i zSkbCtsaL?%3Gzi<&B@Jdd~@^b4Oxb-QBqg%Pvl-N*FPv#$G19x!qc{sok={ilEg;BL;8|nuAY3YRGCeXV2-0}DFruoXGb~jm zZcboj1iUk+8P!q3No$=8SGTpYtA+_yOyL(YtnU?7%tRtr3y^ww;aI6wS zMsRI-vX9{7;mJON&hTU(!3V>W{VZ#&RY_~4T^pY1MKQB|MD`UuEPsb;{Dq{Itc?q7hSJXeqih2m;RUHoX_UdKz I@DdUDA7OvvdjJ3c diff --git a/venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/connection.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/connection.cpython-311.pyc deleted file mode 100755 index 2faeb7f540a68e6061edba0f39e97186f53d9ef4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12312 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 diff --git a/venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/connection_pool.cpython-311.pyc deleted file mode 100755 index fa94b96d4da27a983aefc8eae837bbf4b507c0fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21613 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 X0bA>M(8)@WZtS~D-uKIdF&g?mu!E4r diff --git a/venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/http2.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/http2.cpython-311.pyc deleted file mode 100755 index 48b3a83f2eac4a3f71bef142bb2464a95f8056e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32785 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 diff --git a/venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/http_proxy.cpython-311.pyc deleted file mode 100755 index c30364b1604f99219d9b7df1f8670667c9728d1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18744 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 diff --git a/venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_async/__pycache__/socks_proxy.cpython-311.pyc deleted file mode 100755 index 398ee19d49f18b357daa267a830710d208cf5e95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17298 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 KzDEHv4gU-N(>z@O diff --git a/venv/lib/python3.11/site-packages/httpcore/_async/connection.py b/venv/lib/python3.11/site-packages/httpcore/_async/connection.py deleted file mode 100755 index b42581d..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_async/connection.py +++ /dev/null @@ -1,222 +0,0 @@ -from __future__ import annotations - -import itertools -import logging -import ssl -import types -import typing - -from .._backends.auto import AutoBackend -from .._backends.base import SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream -from .._exceptions import ConnectError, ConnectTimeout -from .._models import Origin, Request, Response -from .._ssl import default_ssl_context -from .._synchronization import AsyncLock -from .._trace import Trace -from .http11 import AsyncHTTP11Connection -from .interfaces import AsyncConnectionInterface - -RETRIES_BACKOFF_FACTOR = 0.5 # 0s, 0.5s, 1s, 2s, 4s, etc. - - -logger = logging.getLogger("httpcore.connection") - - -def exponential_backoff(factor: float) -> typing.Iterator[float]: - """ - Generate a geometric sequence that has a ratio of 2 and starts with 0. - - For example: - - `factor = 2`: `0, 2, 4, 8, 16, 32, 64, ...` - - `factor = 3`: `0, 3, 6, 12, 24, 48, 96, ...` - """ - yield 0 - for n in itertools.count(): - yield factor * 2**n - - -class AsyncHTTPConnection(AsyncConnectionInterface): - def __init__( - self, - origin: Origin, - ssl_context: ssl.SSLContext | None = None, - keepalive_expiry: float | None = None, - http1: bool = True, - http2: bool = False, - retries: int = 0, - local_address: str | None = None, - uds: str | None = None, - network_backend: AsyncNetworkBackend | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> None: - self._origin = origin - self._ssl_context = ssl_context - self._keepalive_expiry = keepalive_expiry - self._http1 = http1 - self._http2 = http2 - self._retries = retries - self._local_address = local_address - self._uds = uds - - self._network_backend: AsyncNetworkBackend = ( - AutoBackend() if network_backend is None else network_backend - ) - self._connection: AsyncConnectionInterface | None = None - self._connect_failed: bool = False - self._request_lock = AsyncLock() - self._socket_options = socket_options - - async def handle_async_request(self, request: Request) -> Response: - if not self.can_handle_request(request.url.origin): - raise RuntimeError( - f"Attempted to send request to {request.url.origin} on connection to {self._origin}" - ) - - try: - async with self._request_lock: - if self._connection is None: - stream = await self._connect(request) - - ssl_object = stream.get_extra_info("ssl_object") - http2_negotiated = ( - ssl_object is not None - and ssl_object.selected_alpn_protocol() == "h2" - ) - if http2_negotiated or (self._http2 and not self._http1): - from .http2 import AsyncHTTP2Connection - - self._connection = AsyncHTTP2Connection( - origin=self._origin, - stream=stream, - keepalive_expiry=self._keepalive_expiry, - ) - else: - self._connection = AsyncHTTP11Connection( - origin=self._origin, - stream=stream, - keepalive_expiry=self._keepalive_expiry, - ) - except BaseException as exc: - self._connect_failed = True - raise exc - - return await self._connection.handle_async_request(request) - - async def _connect(self, request: Request) -> AsyncNetworkStream: - timeouts = request.extensions.get("timeout", {}) - sni_hostname = request.extensions.get("sni_hostname", None) - timeout = timeouts.get("connect", None) - - retries_left = self._retries - delays = exponential_backoff(factor=RETRIES_BACKOFF_FACTOR) - - while True: - try: - if self._uds is None: - kwargs = { - "host": self._origin.host.decode("ascii"), - "port": self._origin.port, - "local_address": self._local_address, - "timeout": timeout, - "socket_options": self._socket_options, - } - async with Trace("connect_tcp", logger, request, kwargs) as trace: - stream = await self._network_backend.connect_tcp(**kwargs) - trace.return_value = stream - else: - kwargs = { - "path": self._uds, - "timeout": timeout, - "socket_options": self._socket_options, - } - async with Trace( - "connect_unix_socket", logger, request, kwargs - ) as trace: - stream = await self._network_backend.connect_unix_socket( - **kwargs - ) - trace.return_value = stream - - if self._origin.scheme in (b"https", b"wss"): - ssl_context = ( - default_ssl_context() - if self._ssl_context is None - else self._ssl_context - ) - alpn_protocols = ["http/1.1", "h2"] if self._http2 else ["http/1.1"] - ssl_context.set_alpn_protocols(alpn_protocols) - - kwargs = { - "ssl_context": ssl_context, - "server_hostname": sni_hostname - or self._origin.host.decode("ascii"), - "timeout": timeout, - } - async with Trace("start_tls", logger, request, kwargs) as trace: - stream = await stream.start_tls(**kwargs) - trace.return_value = stream - return stream - except (ConnectError, ConnectTimeout): - if retries_left <= 0: - raise - retries_left -= 1 - delay = next(delays) - async with Trace("retry", logger, request, kwargs) as trace: - await self._network_backend.sleep(delay) - - def can_handle_request(self, origin: Origin) -> bool: - return origin == self._origin - - async def aclose(self) -> None: - if self._connection is not None: - async with Trace("close", logger, None, {}): - await self._connection.aclose() - - def is_available(self) -> bool: - if self._connection is None: - # If HTTP/2 support is enabled, and the resulting connection could - # end up as HTTP/2 then we should indicate the connection as being - # available to service multiple requests. - return ( - self._http2 - and (self._origin.scheme == b"https" or not self._http1) - and not self._connect_failed - ) - return self._connection.is_available() - - def has_expired(self) -> bool: - if self._connection is None: - return self._connect_failed - return self._connection.has_expired() - - def is_idle(self) -> bool: - if self._connection is None: - return self._connect_failed - return self._connection.is_idle() - - def is_closed(self) -> bool: - if self._connection is None: - return self._connect_failed - return self._connection.is_closed() - - def info(self) -> str: - if self._connection is None: - return "CONNECTION FAILED" if self._connect_failed else "CONNECTING" - return self._connection.info() - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} [{self.info()}]>" - - # These context managers are not used in the standard flow, but are - # useful for testing or working with connection instances directly. - - async def __aenter__(self) -> AsyncHTTPConnection: - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - await self.aclose() diff --git a/venv/lib/python3.11/site-packages/httpcore/_async/connection_pool.py b/venv/lib/python3.11/site-packages/httpcore/_async/connection_pool.py deleted file mode 100755 index 96e973d..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_async/connection_pool.py +++ /dev/null @@ -1,420 +0,0 @@ -from __future__ import annotations - -import ssl -import sys -import types -import typing - -from .._backends.auto import AutoBackend -from .._backends.base import SOCKET_OPTION, AsyncNetworkBackend -from .._exceptions import ConnectionNotAvailable, UnsupportedProtocol -from .._models import Origin, Proxy, Request, Response -from .._synchronization import AsyncEvent, AsyncShieldCancellation, AsyncThreadLock -from .connection import AsyncHTTPConnection -from .interfaces import AsyncConnectionInterface, AsyncRequestInterface - - -class AsyncPoolRequest: - def __init__(self, request: Request) -> None: - self.request = request - self.connection: AsyncConnectionInterface | None = None - self._connection_acquired = AsyncEvent() - - def assign_to_connection(self, connection: AsyncConnectionInterface | None) -> None: - self.connection = connection - self._connection_acquired.set() - - def clear_connection(self) -> None: - self.connection = None - self._connection_acquired = AsyncEvent() - - async def wait_for_connection( - self, timeout: float | None = None - ) -> AsyncConnectionInterface: - if self.connection is None: - await self._connection_acquired.wait(timeout=timeout) - assert self.connection is not None - return self.connection - - def is_queued(self) -> bool: - return self.connection is None - - -class AsyncConnectionPool(AsyncRequestInterface): - """ - A connection pool for making HTTP requests. - """ - - def __init__( - self, - ssl_context: ssl.SSLContext | None = None, - proxy: Proxy | None = None, - max_connections: int | None = 10, - max_keepalive_connections: int | None = None, - keepalive_expiry: float | None = None, - http1: bool = True, - http2: bool = False, - retries: int = 0, - local_address: str | None = None, - uds: str | None = None, - network_backend: AsyncNetworkBackend | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> None: - """ - A connection pool for making HTTP requests. - - Parameters: - ssl_context: An SSL context to use for verifying connections. - If not specified, the default `httpcore.default_ssl_context()` - will be used. - max_connections: The maximum number of concurrent HTTP connections that - the pool should allow. Any attempt to send a request on a pool that - would exceed this amount will block until a connection is available. - max_keepalive_connections: The maximum number of idle HTTP connections - that will be maintained in the pool. - keepalive_expiry: The duration in seconds that an idle HTTP connection - may be maintained for before being expired from the pool. - http1: A boolean indicating if HTTP/1.1 requests should be supported - by the connection pool. Defaults to True. - http2: A boolean indicating if HTTP/2 requests should be supported by - the connection pool. Defaults to False. - retries: The maximum number of retries when trying to establish a - connection. - local_address: Local address to connect from. Can also be used to connect - using a particular address family. Using `local_address="0.0.0.0"` - will connect using an `AF_INET` address (IPv4), while using - `local_address="::"` will connect using an `AF_INET6` address (IPv6). - uds: Path to a Unix Domain Socket to use instead of TCP sockets. - network_backend: A backend instance to use for handling network I/O. - socket_options: Socket options that have to be included - in the TCP socket when the connection was established. - """ - self._ssl_context = ssl_context - self._proxy = proxy - self._max_connections = ( - sys.maxsize if max_connections is None else max_connections - ) - self._max_keepalive_connections = ( - sys.maxsize - if max_keepalive_connections is None - else max_keepalive_connections - ) - self._max_keepalive_connections = min( - self._max_connections, self._max_keepalive_connections - ) - - self._keepalive_expiry = keepalive_expiry - self._http1 = http1 - self._http2 = http2 - self._retries = retries - self._local_address = local_address - self._uds = uds - - self._network_backend = ( - AutoBackend() if network_backend is None else network_backend - ) - self._socket_options = socket_options - - # The mutable state on a connection pool is the queue of incoming requests, - # and the set of connections that are servicing those requests. - self._connections: list[AsyncConnectionInterface] = [] - self._requests: list[AsyncPoolRequest] = [] - - # We only mutate the state of the connection pool within an 'optional_thread_lock' - # context. This holds a threading lock unless we're running in async mode, - # in which case it is a no-op. - self._optional_thread_lock = AsyncThreadLock() - - def create_connection(self, origin: Origin) -> AsyncConnectionInterface: - if self._proxy is not None: - if self._proxy.url.scheme in (b"socks5", b"socks5h"): - from .socks_proxy import AsyncSocks5Connection - - return AsyncSocks5Connection( - proxy_origin=self._proxy.url.origin, - proxy_auth=self._proxy.auth, - remote_origin=origin, - ssl_context=self._ssl_context, - keepalive_expiry=self._keepalive_expiry, - http1=self._http1, - http2=self._http2, - network_backend=self._network_backend, - ) - elif origin.scheme == b"http": - from .http_proxy import AsyncForwardHTTPConnection - - return AsyncForwardHTTPConnection( - proxy_origin=self._proxy.url.origin, - proxy_headers=self._proxy.headers, - proxy_ssl_context=self._proxy.ssl_context, - remote_origin=origin, - keepalive_expiry=self._keepalive_expiry, - network_backend=self._network_backend, - ) - from .http_proxy import AsyncTunnelHTTPConnection - - return AsyncTunnelHTTPConnection( - proxy_origin=self._proxy.url.origin, - proxy_headers=self._proxy.headers, - proxy_ssl_context=self._proxy.ssl_context, - remote_origin=origin, - ssl_context=self._ssl_context, - keepalive_expiry=self._keepalive_expiry, - http1=self._http1, - http2=self._http2, - network_backend=self._network_backend, - ) - - return AsyncHTTPConnection( - origin=origin, - ssl_context=self._ssl_context, - keepalive_expiry=self._keepalive_expiry, - http1=self._http1, - http2=self._http2, - retries=self._retries, - local_address=self._local_address, - uds=self._uds, - network_backend=self._network_backend, - socket_options=self._socket_options, - ) - - @property - def connections(self) -> list[AsyncConnectionInterface]: - """ - Return a list of the connections currently in the pool. - - For example: - - ```python - >>> pool.connections - [ - , - , - , - ] - ``` - """ - return list(self._connections) - - async def handle_async_request(self, request: Request) -> Response: - """ - Send an HTTP request, and return an HTTP response. - - This is the core implementation that is called into by `.request()` or `.stream()`. - """ - scheme = request.url.scheme.decode() - if scheme == "": - raise UnsupportedProtocol( - "Request URL is missing an 'http://' or 'https://' protocol." - ) - if scheme not in ("http", "https", "ws", "wss"): - raise UnsupportedProtocol( - f"Request URL has an unsupported protocol '{scheme}://'." - ) - - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("pool", None) - - with self._optional_thread_lock: - # Add the incoming request to our request queue. - pool_request = AsyncPoolRequest(request) - self._requests.append(pool_request) - - try: - while True: - with self._optional_thread_lock: - # Assign incoming requests to available connections, - # closing or creating new connections as required. - closing = self._assign_requests_to_connections() - await self._close_connections(closing) - - # Wait until this request has an assigned connection. - connection = await pool_request.wait_for_connection(timeout=timeout) - - try: - # Send the request on the assigned connection. - response = await connection.handle_async_request( - pool_request.request - ) - except ConnectionNotAvailable: - # In some cases a connection may initially be available to - # handle a request, but then become unavailable. - # - # In this case we clear the connection and try again. - pool_request.clear_connection() - else: - break # pragma: nocover - - except BaseException as exc: - with self._optional_thread_lock: - # For any exception or cancellation we remove the request from - # the queue, and then re-assign requests to connections. - self._requests.remove(pool_request) - closing = self._assign_requests_to_connections() - - await self._close_connections(closing) - raise exc from None - - # Return the response. Note that in this case we still have to manage - # the point at which the response is closed. - assert isinstance(response.stream, typing.AsyncIterable) - return Response( - status=response.status, - headers=response.headers, - content=PoolByteStream( - stream=response.stream, pool_request=pool_request, pool=self - ), - extensions=response.extensions, - ) - - def _assign_requests_to_connections(self) -> list[AsyncConnectionInterface]: - """ - Manage the state of the connection pool, assigning incoming - requests to connections as available. - - Called whenever a new request is added or removed from the pool. - - Any closing connections are returned, allowing the I/O for closing - those connections to be handled seperately. - """ - closing_connections = [] - - # First we handle cleaning up any connections that are closed, - # have expired their keep-alive, or surplus idle connections. - for connection in list(self._connections): - if connection.is_closed(): - # log: "removing closed connection" - self._connections.remove(connection) - elif connection.has_expired(): - # log: "closing expired connection" - self._connections.remove(connection) - closing_connections.append(connection) - elif ( - connection.is_idle() - and len([connection.is_idle() for connection in self._connections]) - > self._max_keepalive_connections - ): - # log: "closing idle connection" - self._connections.remove(connection) - closing_connections.append(connection) - - # Assign queued requests to connections. - queued_requests = [request for request in self._requests if request.is_queued()] - for pool_request in queued_requests: - origin = pool_request.request.url.origin - available_connections = [ - connection - for connection in self._connections - if connection.can_handle_request(origin) and connection.is_available() - ] - idle_connections = [ - connection for connection in self._connections if connection.is_idle() - ] - - # There are three cases for how we may be able to handle the request: - # - # 1. There is an existing connection that can handle the request. - # 2. We can create a new connection to handle the request. - # 3. We can close an idle connection and then create a new connection - # to handle the request. - if available_connections: - # log: "reusing existing connection" - connection = available_connections[0] - pool_request.assign_to_connection(connection) - elif len(self._connections) < self._max_connections: - # log: "creating new connection" - connection = self.create_connection(origin) - self._connections.append(connection) - pool_request.assign_to_connection(connection) - elif idle_connections: - # log: "closing idle connection" - connection = idle_connections[0] - self._connections.remove(connection) - closing_connections.append(connection) - # log: "creating new connection" - connection = self.create_connection(origin) - self._connections.append(connection) - pool_request.assign_to_connection(connection) - - return closing_connections - - async def _close_connections(self, closing: list[AsyncConnectionInterface]) -> None: - # Close connections which have been removed from the pool. - with AsyncShieldCancellation(): - for connection in closing: - await connection.aclose() - - async def aclose(self) -> None: - # Explicitly close the connection pool. - # Clears all existing requests and connections. - with self._optional_thread_lock: - closing_connections = list(self._connections) - self._connections = [] - await self._close_connections(closing_connections) - - async def __aenter__(self) -> AsyncConnectionPool: - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - await self.aclose() - - def __repr__(self) -> str: - class_name = self.__class__.__name__ - with self._optional_thread_lock: - request_is_queued = [request.is_queued() for request in self._requests] - connection_is_idle = [ - connection.is_idle() for connection in self._connections - ] - - num_active_requests = request_is_queued.count(False) - num_queued_requests = request_is_queued.count(True) - num_active_connections = connection_is_idle.count(False) - num_idle_connections = connection_is_idle.count(True) - - requests_info = ( - f"Requests: {num_active_requests} active, {num_queued_requests} queued" - ) - connection_info = ( - f"Connections: {num_active_connections} active, {num_idle_connections} idle" - ) - - return f"<{class_name} [{requests_info} | {connection_info}]>" - - -class PoolByteStream: - def __init__( - self, - stream: typing.AsyncIterable[bytes], - pool_request: AsyncPoolRequest, - pool: AsyncConnectionPool, - ) -> None: - self._stream = stream - self._pool_request = pool_request - self._pool = pool - self._closed = False - - async def __aiter__(self) -> typing.AsyncIterator[bytes]: - try: - async for part in self._stream: - yield part - except BaseException as exc: - await self.aclose() - raise exc from None - - async def aclose(self) -> None: - if not self._closed: - self._closed = True - with AsyncShieldCancellation(): - if hasattr(self._stream, "aclose"): - await self._stream.aclose() - - with self._pool._optional_thread_lock: - self._pool._requests.remove(self._pool_request) - closing = self._pool._assign_requests_to_connections() - - await self._pool._close_connections(closing) diff --git a/venv/lib/python3.11/site-packages/httpcore/_async/http11.py b/venv/lib/python3.11/site-packages/httpcore/_async/http11.py deleted file mode 100755 index e6d6d70..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_async/http11.py +++ /dev/null @@ -1,379 +0,0 @@ -from __future__ import annotations - -import enum -import logging -import ssl -import time -import types -import typing - -import h11 - -from .._backends.base import AsyncNetworkStream -from .._exceptions import ( - ConnectionNotAvailable, - LocalProtocolError, - RemoteProtocolError, - WriteError, - map_exceptions, -) -from .._models import Origin, Request, Response -from .._synchronization import AsyncLock, AsyncShieldCancellation -from .._trace import Trace -from .interfaces import AsyncConnectionInterface - -logger = logging.getLogger("httpcore.http11") - - -# A subset of `h11.Event` types supported by `_send_event` -H11SendEvent = typing.Union[ - h11.Request, - h11.Data, - h11.EndOfMessage, -] - - -class HTTPConnectionState(enum.IntEnum): - NEW = 0 - ACTIVE = 1 - IDLE = 2 - CLOSED = 3 - - -class AsyncHTTP11Connection(AsyncConnectionInterface): - READ_NUM_BYTES = 64 * 1024 - MAX_INCOMPLETE_EVENT_SIZE = 100 * 1024 - - def __init__( - self, - origin: Origin, - stream: AsyncNetworkStream, - keepalive_expiry: float | None = None, - ) -> None: - self._origin = origin - self._network_stream = stream - self._keepalive_expiry: float | None = keepalive_expiry - self._expire_at: float | None = None - self._state = HTTPConnectionState.NEW - self._state_lock = AsyncLock() - self._request_count = 0 - self._h11_state = h11.Connection( - our_role=h11.CLIENT, - max_incomplete_event_size=self.MAX_INCOMPLETE_EVENT_SIZE, - ) - - async def handle_async_request(self, request: Request) -> Response: - if not self.can_handle_request(request.url.origin): - raise RuntimeError( - f"Attempted to send request to {request.url.origin} on connection " - f"to {self._origin}" - ) - - async with self._state_lock: - if self._state in (HTTPConnectionState.NEW, HTTPConnectionState.IDLE): - self._request_count += 1 - self._state = HTTPConnectionState.ACTIVE - self._expire_at = None - else: - raise ConnectionNotAvailable() - - try: - kwargs = {"request": request} - try: - async with Trace( - "send_request_headers", logger, request, kwargs - ) as trace: - await self._send_request_headers(**kwargs) - async with Trace("send_request_body", logger, request, kwargs) as trace: - await self._send_request_body(**kwargs) - except WriteError: - # If we get a write error while we're writing the request, - # then we supress this error and move on to attempting to - # read the response. Servers can sometimes close the request - # pre-emptively and then respond with a well formed HTTP - # error response. - pass - - async with Trace( - "receive_response_headers", logger, request, kwargs - ) as trace: - ( - http_version, - status, - reason_phrase, - headers, - trailing_data, - ) = await self._receive_response_headers(**kwargs) - trace.return_value = ( - http_version, - status, - reason_phrase, - headers, - ) - - network_stream = self._network_stream - - # CONNECT or Upgrade request - if (status == 101) or ( - (request.method == b"CONNECT") and (200 <= status < 300) - ): - network_stream = AsyncHTTP11UpgradeStream(network_stream, trailing_data) - - return Response( - status=status, - headers=headers, - content=HTTP11ConnectionByteStream(self, request), - extensions={ - "http_version": http_version, - "reason_phrase": reason_phrase, - "network_stream": network_stream, - }, - ) - except BaseException as exc: - with AsyncShieldCancellation(): - async with Trace("response_closed", logger, request) as trace: - await self._response_closed() - raise exc - - # Sending the request... - - async def _send_request_headers(self, request: Request) -> None: - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("write", None) - - with map_exceptions({h11.LocalProtocolError: LocalProtocolError}): - event = h11.Request( - method=request.method, - target=request.url.target, - headers=request.headers, - ) - await self._send_event(event, timeout=timeout) - - async def _send_request_body(self, request: Request) -> None: - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("write", None) - - assert isinstance(request.stream, typing.AsyncIterable) - async for chunk in request.stream: - event = h11.Data(data=chunk) - await self._send_event(event, timeout=timeout) - - await self._send_event(h11.EndOfMessage(), timeout=timeout) - - async def _send_event(self, event: h11.Event, timeout: float | None = None) -> None: - bytes_to_send = self._h11_state.send(event) - if bytes_to_send is not None: - await self._network_stream.write(bytes_to_send, timeout=timeout) - - # Receiving the response... - - async def _receive_response_headers( - self, request: Request - ) -> tuple[bytes, int, bytes, list[tuple[bytes, bytes]], bytes]: - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("read", None) - - while True: - event = await self._receive_event(timeout=timeout) - if isinstance(event, h11.Response): - break - if ( - isinstance(event, h11.InformationalResponse) - and event.status_code == 101 - ): - break - - http_version = b"HTTP/" + event.http_version - - # h11 version 0.11+ supports a `raw_items` interface to get the - # raw header casing, rather than the enforced lowercase headers. - headers = event.headers.raw_items() - - trailing_data, _ = self._h11_state.trailing_data - - return http_version, event.status_code, event.reason, headers, trailing_data - - async def _receive_response_body( - self, request: Request - ) -> typing.AsyncIterator[bytes]: - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("read", None) - - while True: - event = await self._receive_event(timeout=timeout) - if isinstance(event, h11.Data): - yield bytes(event.data) - elif isinstance(event, (h11.EndOfMessage, h11.PAUSED)): - break - - async def _receive_event( - self, timeout: float | None = None - ) -> h11.Event | type[h11.PAUSED]: - while True: - with map_exceptions({h11.RemoteProtocolError: RemoteProtocolError}): - event = self._h11_state.next_event() - - if event is h11.NEED_DATA: - data = await self._network_stream.read( - self.READ_NUM_BYTES, timeout=timeout - ) - - # If we feed this case through h11 we'll raise an exception like: - # - # httpcore.RemoteProtocolError: can't handle event type - # ConnectionClosed when role=SERVER and state=SEND_RESPONSE - # - # Which is accurate, but not very informative from an end-user - # perspective. Instead we handle this case distinctly and treat - # it as a ConnectError. - if data == b"" and self._h11_state.their_state == h11.SEND_RESPONSE: - msg = "Server disconnected without sending a response." - raise RemoteProtocolError(msg) - - self._h11_state.receive_data(data) - else: - # mypy fails to narrow the type in the above if statement above - return event # type: ignore[return-value] - - async def _response_closed(self) -> None: - async with self._state_lock: - if ( - self._h11_state.our_state is h11.DONE - and self._h11_state.their_state is h11.DONE - ): - self._state = HTTPConnectionState.IDLE - self._h11_state.start_next_cycle() - if self._keepalive_expiry is not None: - now = time.monotonic() - self._expire_at = now + self._keepalive_expiry - else: - await self.aclose() - - # Once the connection is no longer required... - - async def aclose(self) -> None: - # Note that this method unilaterally closes the connection, and does - # not have any kind of locking in place around it. - self._state = HTTPConnectionState.CLOSED - await self._network_stream.aclose() - - # The AsyncConnectionInterface methods provide information about the state of - # the connection, allowing for a connection pooling implementation to - # determine when to reuse and when to close the connection... - - def can_handle_request(self, origin: Origin) -> bool: - return origin == self._origin - - def is_available(self) -> bool: - # Note that HTTP/1.1 connections in the "NEW" state are not treated as - # being "available". The control flow which created the connection will - # be able to send an outgoing request, but the connection will not be - # acquired from the connection pool for any other request. - return self._state == HTTPConnectionState.IDLE - - def has_expired(self) -> bool: - now = time.monotonic() - keepalive_expired = self._expire_at is not None and now > self._expire_at - - # If the HTTP connection is idle but the socket is readable, then the - # only valid state is that the socket is about to return b"", indicating - # a server-initiated disconnect. - server_disconnected = ( - self._state == HTTPConnectionState.IDLE - and self._network_stream.get_extra_info("is_readable") - ) - - return keepalive_expired or server_disconnected - - def is_idle(self) -> bool: - return self._state == HTTPConnectionState.IDLE - - def is_closed(self) -> bool: - return self._state == HTTPConnectionState.CLOSED - - def info(self) -> str: - origin = str(self._origin) - return ( - f"{origin!r}, HTTP/1.1, {self._state.name}, " - f"Request Count: {self._request_count}" - ) - - def __repr__(self) -> str: - class_name = self.__class__.__name__ - origin = str(self._origin) - return ( - f"<{class_name} [{origin!r}, {self._state.name}, " - f"Request Count: {self._request_count}]>" - ) - - # These context managers are not used in the standard flow, but are - # useful for testing or working with connection instances directly. - - async def __aenter__(self) -> AsyncHTTP11Connection: - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - await self.aclose() - - -class HTTP11ConnectionByteStream: - def __init__(self, connection: AsyncHTTP11Connection, request: Request) -> None: - self._connection = connection - self._request = request - self._closed = False - - async def __aiter__(self) -> typing.AsyncIterator[bytes]: - kwargs = {"request": self._request} - try: - async with Trace("receive_response_body", logger, self._request, kwargs): - async for chunk in self._connection._receive_response_body(**kwargs): - yield chunk - except BaseException as exc: - # If we get an exception while streaming the response, - # we want to close the response (and possibly the connection) - # before raising that exception. - with AsyncShieldCancellation(): - await self.aclose() - raise exc - - async def aclose(self) -> None: - if not self._closed: - self._closed = True - async with Trace("response_closed", logger, self._request): - await self._connection._response_closed() - - -class AsyncHTTP11UpgradeStream(AsyncNetworkStream): - def __init__(self, stream: AsyncNetworkStream, leading_data: bytes) -> None: - self._stream = stream - self._leading_data = leading_data - - async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: - if self._leading_data: - buffer = self._leading_data[:max_bytes] - self._leading_data = self._leading_data[max_bytes:] - return buffer - else: - return await self._stream.read(max_bytes, timeout) - - async def write(self, buffer: bytes, timeout: float | None = None) -> None: - await self._stream.write(buffer, timeout) - - async def aclose(self) -> None: - await self._stream.aclose() - - async def start_tls( - self, - ssl_context: ssl.SSLContext, - server_hostname: str | None = None, - timeout: float | None = None, - ) -> AsyncNetworkStream: - return await self._stream.start_tls(ssl_context, server_hostname, timeout) - - def get_extra_info(self, info: str) -> typing.Any: - return self._stream.get_extra_info(info) diff --git a/venv/lib/python3.11/site-packages/httpcore/_async/http2.py b/venv/lib/python3.11/site-packages/httpcore/_async/http2.py deleted file mode 100755 index dbd0bee..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_async/http2.py +++ /dev/null @@ -1,592 +0,0 @@ -from __future__ import annotations - -import enum -import logging -import time -import types -import typing - -import h2.config -import h2.connection -import h2.events -import h2.exceptions -import h2.settings - -from .._backends.base import AsyncNetworkStream -from .._exceptions import ( - ConnectionNotAvailable, - LocalProtocolError, - RemoteProtocolError, -) -from .._models import Origin, Request, Response -from .._synchronization import AsyncLock, AsyncSemaphore, AsyncShieldCancellation -from .._trace import Trace -from .interfaces import AsyncConnectionInterface - -logger = logging.getLogger("httpcore.http2") - - -def has_body_headers(request: Request) -> bool: - return any( - k.lower() == b"content-length" or k.lower() == b"transfer-encoding" - for k, v in request.headers - ) - - -class HTTPConnectionState(enum.IntEnum): - ACTIVE = 1 - IDLE = 2 - CLOSED = 3 - - -class AsyncHTTP2Connection(AsyncConnectionInterface): - READ_NUM_BYTES = 64 * 1024 - CONFIG = h2.config.H2Configuration(validate_inbound_headers=False) - - def __init__( - self, - origin: Origin, - stream: AsyncNetworkStream, - keepalive_expiry: float | None = None, - ): - self._origin = origin - self._network_stream = stream - self._keepalive_expiry: float | None = keepalive_expiry - self._h2_state = h2.connection.H2Connection(config=self.CONFIG) - self._state = HTTPConnectionState.IDLE - self._expire_at: float | None = None - self._request_count = 0 - self._init_lock = AsyncLock() - self._state_lock = AsyncLock() - self._read_lock = AsyncLock() - self._write_lock = AsyncLock() - self._sent_connection_init = False - self._used_all_stream_ids = False - self._connection_error = False - - # Mapping from stream ID to response stream events. - self._events: dict[ - int, - list[ - h2.events.ResponseReceived - | h2.events.DataReceived - | h2.events.StreamEnded - | h2.events.StreamReset, - ], - ] = {} - - # Connection terminated events are stored as state since - # we need to handle them for all streams. - self._connection_terminated: h2.events.ConnectionTerminated | None = None - - self._read_exception: Exception | None = None - self._write_exception: Exception | None = None - - async def handle_async_request(self, request: Request) -> Response: - if not self.can_handle_request(request.url.origin): - # This cannot occur in normal operation, since the connection pool - # will only send requests on connections that handle them. - # It's in place simply for resilience as a guard against incorrect - # usage, for anyone working directly with httpcore connections. - raise RuntimeError( - f"Attempted to send request to {request.url.origin} on connection " - f"to {self._origin}" - ) - - async with self._state_lock: - if self._state in (HTTPConnectionState.ACTIVE, HTTPConnectionState.IDLE): - self._request_count += 1 - self._expire_at = None - self._state = HTTPConnectionState.ACTIVE - else: - raise ConnectionNotAvailable() - - async with self._init_lock: - if not self._sent_connection_init: - try: - sci_kwargs = {"request": request} - async with Trace( - "send_connection_init", logger, request, sci_kwargs - ): - await self._send_connection_init(**sci_kwargs) - except BaseException as exc: - with AsyncShieldCancellation(): - await self.aclose() - raise exc - - self._sent_connection_init = True - - # Initially start with just 1 until the remote server provides - # its max_concurrent_streams value - self._max_streams = 1 - - local_settings_max_streams = ( - self._h2_state.local_settings.max_concurrent_streams - ) - self._max_streams_semaphore = AsyncSemaphore(local_settings_max_streams) - - for _ in range(local_settings_max_streams - self._max_streams): - await self._max_streams_semaphore.acquire() - - await self._max_streams_semaphore.acquire() - - try: - stream_id = self._h2_state.get_next_available_stream_id() - self._events[stream_id] = [] - except h2.exceptions.NoAvailableStreamIDError: # pragma: nocover - self._used_all_stream_ids = True - self._request_count -= 1 - raise ConnectionNotAvailable() - - try: - kwargs = {"request": request, "stream_id": stream_id} - async with Trace("send_request_headers", logger, request, kwargs): - await self._send_request_headers(request=request, stream_id=stream_id) - async with Trace("send_request_body", logger, request, kwargs): - await self._send_request_body(request=request, stream_id=stream_id) - async with Trace( - "receive_response_headers", logger, request, kwargs - ) as trace: - status, headers = await self._receive_response( - request=request, stream_id=stream_id - ) - trace.return_value = (status, headers) - - return Response( - status=status, - headers=headers, - content=HTTP2ConnectionByteStream(self, request, stream_id=stream_id), - extensions={ - "http_version": b"HTTP/2", - "network_stream": self._network_stream, - "stream_id": stream_id, - }, - ) - except BaseException as exc: # noqa: PIE786 - with AsyncShieldCancellation(): - kwargs = {"stream_id": stream_id} - async with Trace("response_closed", logger, request, kwargs): - await self._response_closed(stream_id=stream_id) - - if isinstance(exc, h2.exceptions.ProtocolError): - # One case where h2 can raise a protocol error is when a - # closed frame has been seen by the state machine. - # - # This happens when one stream is reading, and encounters - # a GOAWAY event. Other flows of control may then raise - # a protocol error at any point they interact with the 'h2_state'. - # - # In this case we'll have stored the event, and should raise - # it as a RemoteProtocolError. - if self._connection_terminated: # pragma: nocover - raise RemoteProtocolError(self._connection_terminated) - # If h2 raises a protocol error in some other state then we - # must somehow have made a protocol violation. - raise LocalProtocolError(exc) # pragma: nocover - - raise exc - - async def _send_connection_init(self, request: Request) -> None: - """ - The HTTP/2 connection requires some initial setup before we can start - using individual request/response streams on it. - """ - # Need to set these manually here instead of manipulating via - # __setitem__() otherwise the H2Connection will emit SettingsUpdate - # frames in addition to sending the undesired defaults. - self._h2_state.local_settings = h2.settings.Settings( - client=True, - initial_values={ - # Disable PUSH_PROMISE frames from the server since we don't do anything - # with them for now. Maybe when we support caching? - h2.settings.SettingCodes.ENABLE_PUSH: 0, - # These two are taken from h2 for safe defaults - h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: 100, - h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE: 65536, - }, - ) - - # Some websites (*cough* Yahoo *cough*) balk at this setting being - # present in the initial handshake since it's not defined in the original - # RFC despite the RFC mandating ignoring settings you don't know about. - del self._h2_state.local_settings[ - h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL - ] - - self._h2_state.initiate_connection() - self._h2_state.increment_flow_control_window(2**24) - await self._write_outgoing_data(request) - - # Sending the request... - - async def _send_request_headers(self, request: Request, stream_id: int) -> None: - """ - Send the request headers to a given stream ID. - """ - end_stream = not has_body_headers(request) - - # In HTTP/2 the ':authority' pseudo-header is used instead of 'Host'. - # In order to gracefully handle HTTP/1.1 and HTTP/2 we always require - # HTTP/1.1 style headers, and map them appropriately if we end up on - # an HTTP/2 connection. - authority = [v for k, v in request.headers if k.lower() == b"host"][0] - - headers = [ - (b":method", request.method), - (b":authority", authority), - (b":scheme", request.url.scheme), - (b":path", request.url.target), - ] + [ - (k.lower(), v) - for k, v in request.headers - if k.lower() - not in ( - b"host", - b"transfer-encoding", - ) - ] - - self._h2_state.send_headers(stream_id, headers, end_stream=end_stream) - self._h2_state.increment_flow_control_window(2**24, stream_id=stream_id) - await self._write_outgoing_data(request) - - async def _send_request_body(self, request: Request, stream_id: int) -> None: - """ - Iterate over the request body sending it to a given stream ID. - """ - if not has_body_headers(request): - return - - assert isinstance(request.stream, typing.AsyncIterable) - async for data in request.stream: - await self._send_stream_data(request, stream_id, data) - await self._send_end_stream(request, stream_id) - - async def _send_stream_data( - self, request: Request, stream_id: int, data: bytes - ) -> None: - """ - Send a single chunk of data in one or more data frames. - """ - while data: - max_flow = await self._wait_for_outgoing_flow(request, stream_id) - chunk_size = min(len(data), max_flow) - chunk, data = data[:chunk_size], data[chunk_size:] - self._h2_state.send_data(stream_id, chunk) - await self._write_outgoing_data(request) - - async def _send_end_stream(self, request: Request, stream_id: int) -> None: - """ - Send an empty data frame on on a given stream ID with the END_STREAM flag set. - """ - self._h2_state.end_stream(stream_id) - await self._write_outgoing_data(request) - - # Receiving the response... - - async def _receive_response( - self, request: Request, stream_id: int - ) -> tuple[int, list[tuple[bytes, bytes]]]: - """ - Return the response status code and headers for a given stream ID. - """ - while True: - event = await self._receive_stream_event(request, stream_id) - if isinstance(event, h2.events.ResponseReceived): - break - - status_code = 200 - headers = [] - assert event.headers is not None - for k, v in event.headers: - if k == b":status": - status_code = int(v.decode("ascii", errors="ignore")) - elif not k.startswith(b":"): - headers.append((k, v)) - - return (status_code, headers) - - async def _receive_response_body( - self, request: Request, stream_id: int - ) -> typing.AsyncIterator[bytes]: - """ - Iterator that returns the bytes of the response body for a given stream ID. - """ - while True: - event = await self._receive_stream_event(request, stream_id) - if isinstance(event, h2.events.DataReceived): - assert event.flow_controlled_length is not None - assert event.data is not None - amount = event.flow_controlled_length - self._h2_state.acknowledge_received_data(amount, stream_id) - await self._write_outgoing_data(request) - yield event.data - elif isinstance(event, h2.events.StreamEnded): - break - - async def _receive_stream_event( - self, request: Request, stream_id: int - ) -> h2.events.ResponseReceived | h2.events.DataReceived | h2.events.StreamEnded: - """ - Return the next available event for a given stream ID. - - Will read more data from the network if required. - """ - while not self._events.get(stream_id): - await self._receive_events(request, stream_id) - event = self._events[stream_id].pop(0) - if isinstance(event, h2.events.StreamReset): - raise RemoteProtocolError(event) - return event - - async def _receive_events( - self, request: Request, stream_id: int | None = None - ) -> None: - """ - Read some data from the network until we see one or more events - for a given stream ID. - """ - async with self._read_lock: - if self._connection_terminated is not None: - last_stream_id = self._connection_terminated.last_stream_id - if stream_id and last_stream_id and stream_id > last_stream_id: - self._request_count -= 1 - raise ConnectionNotAvailable() - raise RemoteProtocolError(self._connection_terminated) - - # This conditional is a bit icky. We don't want to block reading if we've - # actually got an event to return for a given stream. We need to do that - # check *within* the atomic read lock. Though it also need to be optional, - # because when we call it from `_wait_for_outgoing_flow` we *do* want to - # block until we've available flow control, event when we have events - # pending for the stream ID we're attempting to send on. - if stream_id is None or not self._events.get(stream_id): - events = await self._read_incoming_data(request) - for event in events: - if isinstance(event, h2.events.RemoteSettingsChanged): - async with Trace( - "receive_remote_settings", logger, request - ) as trace: - await self._receive_remote_settings_change(event) - trace.return_value = event - - elif isinstance( - event, - ( - h2.events.ResponseReceived, - h2.events.DataReceived, - h2.events.StreamEnded, - h2.events.StreamReset, - ), - ): - if event.stream_id in self._events: - self._events[event.stream_id].append(event) - - elif isinstance(event, h2.events.ConnectionTerminated): - self._connection_terminated = event - - await self._write_outgoing_data(request) - - async def _receive_remote_settings_change( - self, event: h2.events.RemoteSettingsChanged - ) -> None: - max_concurrent_streams = event.changed_settings.get( - h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS - ) - if max_concurrent_streams: - new_max_streams = min( - max_concurrent_streams.new_value, - self._h2_state.local_settings.max_concurrent_streams, - ) - if new_max_streams and new_max_streams != self._max_streams: - while new_max_streams > self._max_streams: - await self._max_streams_semaphore.release() - self._max_streams += 1 - while new_max_streams < self._max_streams: - await self._max_streams_semaphore.acquire() - self._max_streams -= 1 - - async def _response_closed(self, stream_id: int) -> None: - await self._max_streams_semaphore.release() - del self._events[stream_id] - async with self._state_lock: - if self._connection_terminated and not self._events: - await self.aclose() - - elif self._state == HTTPConnectionState.ACTIVE and not self._events: - self._state = HTTPConnectionState.IDLE - if self._keepalive_expiry is not None: - now = time.monotonic() - self._expire_at = now + self._keepalive_expiry - if self._used_all_stream_ids: # pragma: nocover - await self.aclose() - - async def aclose(self) -> None: - # Note that this method unilaterally closes the connection, and does - # not have any kind of locking in place around it. - self._h2_state.close_connection() - self._state = HTTPConnectionState.CLOSED - await self._network_stream.aclose() - - # Wrappers around network read/write operations... - - async def _read_incoming_data(self, request: Request) -> list[h2.events.Event]: - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("read", None) - - if self._read_exception is not None: - raise self._read_exception # pragma: nocover - - try: - data = await self._network_stream.read(self.READ_NUM_BYTES, timeout) - if data == b"": - raise RemoteProtocolError("Server disconnected") - except Exception as exc: - # If we get a network error we should: - # - # 1. Save the exception and just raise it immediately on any future reads. - # (For example, this means that a single read timeout or disconnect will - # immediately close all pending streams. Without requiring multiple - # sequential timeouts.) - # 2. Mark the connection as errored, so that we don't accept any other - # incoming requests. - self._read_exception = exc - self._connection_error = True - raise exc - - events: list[h2.events.Event] = self._h2_state.receive_data(data) - - return events - - async def _write_outgoing_data(self, request: Request) -> None: - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("write", None) - - async with self._write_lock: - data_to_send = self._h2_state.data_to_send() - - if self._write_exception is not None: - raise self._write_exception # pragma: nocover - - try: - await self._network_stream.write(data_to_send, timeout) - except Exception as exc: # pragma: nocover - # If we get a network error we should: - # - # 1. Save the exception and just raise it immediately on any future write. - # (For example, this means that a single write timeout or disconnect will - # immediately close all pending streams. Without requiring multiple - # sequential timeouts.) - # 2. Mark the connection as errored, so that we don't accept any other - # incoming requests. - self._write_exception = exc - self._connection_error = True - raise exc - - # Flow control... - - async def _wait_for_outgoing_flow(self, request: Request, stream_id: int) -> int: - """ - Returns the maximum allowable outgoing flow for a given stream. - - If the allowable flow is zero, then waits on the network until - WindowUpdated frames have increased the flow rate. - https://tools.ietf.org/html/rfc7540#section-6.9 - """ - local_flow: int = self._h2_state.local_flow_control_window(stream_id) - max_frame_size: int = self._h2_state.max_outbound_frame_size - flow = min(local_flow, max_frame_size) - while flow == 0: - await self._receive_events(request) - local_flow = self._h2_state.local_flow_control_window(stream_id) - max_frame_size = self._h2_state.max_outbound_frame_size - flow = min(local_flow, max_frame_size) - return flow - - # Interface for connection pooling... - - def can_handle_request(self, origin: Origin) -> bool: - return origin == self._origin - - def is_available(self) -> bool: - return ( - self._state != HTTPConnectionState.CLOSED - and not self._connection_error - and not self._used_all_stream_ids - and not ( - self._h2_state.state_machine.state - == h2.connection.ConnectionState.CLOSED - ) - ) - - def has_expired(self) -> bool: - now = time.monotonic() - return self._expire_at is not None and now > self._expire_at - - def is_idle(self) -> bool: - return self._state == HTTPConnectionState.IDLE - - def is_closed(self) -> bool: - return self._state == HTTPConnectionState.CLOSED - - def info(self) -> str: - origin = str(self._origin) - return ( - f"{origin!r}, HTTP/2, {self._state.name}, " - f"Request Count: {self._request_count}" - ) - - def __repr__(self) -> str: - class_name = self.__class__.__name__ - origin = str(self._origin) - return ( - f"<{class_name} [{origin!r}, {self._state.name}, " - f"Request Count: {self._request_count}]>" - ) - - # These context managers are not used in the standard flow, but are - # useful for testing or working with connection instances directly. - - async def __aenter__(self) -> AsyncHTTP2Connection: - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - await self.aclose() - - -class HTTP2ConnectionByteStream: - def __init__( - self, connection: AsyncHTTP2Connection, request: Request, stream_id: int - ) -> None: - self._connection = connection - self._request = request - self._stream_id = stream_id - self._closed = False - - async def __aiter__(self) -> typing.AsyncIterator[bytes]: - kwargs = {"request": self._request, "stream_id": self._stream_id} - try: - async with Trace("receive_response_body", logger, self._request, kwargs): - async for chunk in self._connection._receive_response_body( - request=self._request, stream_id=self._stream_id - ): - yield chunk - except BaseException as exc: - # If we get an exception while streaming the response, - # we want to close the response (and possibly the connection) - # before raising that exception. - with AsyncShieldCancellation(): - await self.aclose() - raise exc - - async def aclose(self) -> None: - if not self._closed: - self._closed = True - kwargs = {"stream_id": self._stream_id} - async with Trace("response_closed", logger, self._request, kwargs): - await self._connection._response_closed(stream_id=self._stream_id) diff --git a/venv/lib/python3.11/site-packages/httpcore/_async/http_proxy.py b/venv/lib/python3.11/site-packages/httpcore/_async/http_proxy.py deleted file mode 100755 index cc9d920..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_async/http_proxy.py +++ /dev/null @@ -1,367 +0,0 @@ -from __future__ import annotations - -import base64 -import logging -import ssl -import typing - -from .._backends.base import SOCKET_OPTION, AsyncNetworkBackend -from .._exceptions import ProxyError -from .._models import ( - URL, - Origin, - Request, - Response, - enforce_bytes, - enforce_headers, - enforce_url, -) -from .._ssl import default_ssl_context -from .._synchronization import AsyncLock -from .._trace import Trace -from .connection import AsyncHTTPConnection -from .connection_pool import AsyncConnectionPool -from .http11 import AsyncHTTP11Connection -from .interfaces import AsyncConnectionInterface - -ByteOrStr = typing.Union[bytes, str] -HeadersAsSequence = typing.Sequence[typing.Tuple[ByteOrStr, ByteOrStr]] -HeadersAsMapping = typing.Mapping[ByteOrStr, ByteOrStr] - - -logger = logging.getLogger("httpcore.proxy") - - -def merge_headers( - default_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, - override_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, -) -> list[tuple[bytes, bytes]]: - """ - Append default_headers and override_headers, de-duplicating if a key exists - in both cases. - """ - default_headers = [] if default_headers is None else list(default_headers) - override_headers = [] if override_headers is None else list(override_headers) - has_override = set(key.lower() for key, value in override_headers) - default_headers = [ - (key, value) - for key, value in default_headers - if key.lower() not in has_override - ] - return default_headers + override_headers - - -class AsyncHTTPProxy(AsyncConnectionPool): # pragma: nocover - """ - A connection pool that sends requests via an HTTP proxy. - """ - - def __init__( - self, - proxy_url: URL | bytes | str, - proxy_auth: tuple[bytes | str, bytes | str] | None = None, - proxy_headers: HeadersAsMapping | HeadersAsSequence | None = None, - ssl_context: ssl.SSLContext | None = None, - proxy_ssl_context: ssl.SSLContext | None = None, - max_connections: int | None = 10, - max_keepalive_connections: int | None = None, - keepalive_expiry: float | None = None, - http1: bool = True, - http2: bool = False, - retries: int = 0, - local_address: str | None = None, - uds: str | None = None, - network_backend: AsyncNetworkBackend | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> None: - """ - A connection pool for making HTTP requests. - - Parameters: - proxy_url: The URL to use when connecting to the proxy server. - For example `"http://127.0.0.1:8080/"`. - proxy_auth: Any proxy authentication as a two-tuple of - (username, password). May be either bytes or ascii-only str. - proxy_headers: Any HTTP headers to use for the proxy requests. - For example `{"Proxy-Authorization": "Basic :"}`. - ssl_context: An SSL context to use for verifying connections. - If not specified, the default `httpcore.default_ssl_context()` - will be used. - proxy_ssl_context: The same as `ssl_context`, but for a proxy server rather than a remote origin. - max_connections: The maximum number of concurrent HTTP connections that - the pool should allow. Any attempt to send a request on a pool that - would exceed this amount will block until a connection is available. - max_keepalive_connections: The maximum number of idle HTTP connections - that will be maintained in the pool. - keepalive_expiry: The duration in seconds that an idle HTTP connection - may be maintained for before being expired from the pool. - http1: A boolean indicating if HTTP/1.1 requests should be supported - by the connection pool. Defaults to True. - http2: A boolean indicating if HTTP/2 requests should be supported by - the connection pool. Defaults to False. - retries: The maximum number of retries when trying to establish - a connection. - local_address: Local address to connect from. Can also be used to - connect using a particular address family. Using - `local_address="0.0.0.0"` will connect using an `AF_INET` address - (IPv4), while using `local_address="::"` will connect using an - `AF_INET6` address (IPv6). - uds: Path to a Unix Domain Socket to use instead of TCP sockets. - network_backend: A backend instance to use for handling network I/O. - """ - super().__init__( - ssl_context=ssl_context, - max_connections=max_connections, - max_keepalive_connections=max_keepalive_connections, - keepalive_expiry=keepalive_expiry, - http1=http1, - http2=http2, - network_backend=network_backend, - retries=retries, - local_address=local_address, - uds=uds, - socket_options=socket_options, - ) - - self._proxy_url = enforce_url(proxy_url, name="proxy_url") - if ( - self._proxy_url.scheme == b"http" and proxy_ssl_context is not None - ): # pragma: no cover - raise RuntimeError( - "The `proxy_ssl_context` argument is not allowed for the http scheme" - ) - - self._ssl_context = ssl_context - self._proxy_ssl_context = proxy_ssl_context - self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") - if proxy_auth is not None: - username = enforce_bytes(proxy_auth[0], name="proxy_auth") - password = enforce_bytes(proxy_auth[1], name="proxy_auth") - userpass = username + b":" + password - authorization = b"Basic " + base64.b64encode(userpass) - self._proxy_headers = [ - (b"Proxy-Authorization", authorization) - ] + self._proxy_headers - - def create_connection(self, origin: Origin) -> AsyncConnectionInterface: - if origin.scheme == b"http": - return AsyncForwardHTTPConnection( - proxy_origin=self._proxy_url.origin, - proxy_headers=self._proxy_headers, - remote_origin=origin, - keepalive_expiry=self._keepalive_expiry, - network_backend=self._network_backend, - proxy_ssl_context=self._proxy_ssl_context, - ) - return AsyncTunnelHTTPConnection( - proxy_origin=self._proxy_url.origin, - proxy_headers=self._proxy_headers, - remote_origin=origin, - ssl_context=self._ssl_context, - proxy_ssl_context=self._proxy_ssl_context, - keepalive_expiry=self._keepalive_expiry, - http1=self._http1, - http2=self._http2, - network_backend=self._network_backend, - ) - - -class AsyncForwardHTTPConnection(AsyncConnectionInterface): - def __init__( - self, - proxy_origin: Origin, - remote_origin: Origin, - proxy_headers: HeadersAsMapping | HeadersAsSequence | None = None, - keepalive_expiry: float | None = None, - network_backend: AsyncNetworkBackend | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - proxy_ssl_context: ssl.SSLContext | None = None, - ) -> None: - self._connection = AsyncHTTPConnection( - origin=proxy_origin, - keepalive_expiry=keepalive_expiry, - network_backend=network_backend, - socket_options=socket_options, - ssl_context=proxy_ssl_context, - ) - self._proxy_origin = proxy_origin - self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") - self._remote_origin = remote_origin - - async def handle_async_request(self, request: Request) -> Response: - headers = merge_headers(self._proxy_headers, request.headers) - url = URL( - scheme=self._proxy_origin.scheme, - host=self._proxy_origin.host, - port=self._proxy_origin.port, - target=bytes(request.url), - ) - proxy_request = Request( - method=request.method, - url=url, - headers=headers, - content=request.stream, - extensions=request.extensions, - ) - return await self._connection.handle_async_request(proxy_request) - - def can_handle_request(self, origin: Origin) -> bool: - return origin == self._remote_origin - - async def aclose(self) -> None: - await self._connection.aclose() - - def info(self) -> str: - return self._connection.info() - - def is_available(self) -> bool: - return self._connection.is_available() - - def has_expired(self) -> bool: - return self._connection.has_expired() - - def is_idle(self) -> bool: - return self._connection.is_idle() - - def is_closed(self) -> bool: - return self._connection.is_closed() - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} [{self.info()}]>" - - -class AsyncTunnelHTTPConnection(AsyncConnectionInterface): - def __init__( - self, - proxy_origin: Origin, - remote_origin: Origin, - ssl_context: ssl.SSLContext | None = None, - proxy_ssl_context: ssl.SSLContext | None = None, - proxy_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, - keepalive_expiry: float | None = None, - http1: bool = True, - http2: bool = False, - network_backend: AsyncNetworkBackend | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> None: - self._connection: AsyncConnectionInterface = AsyncHTTPConnection( - origin=proxy_origin, - keepalive_expiry=keepalive_expiry, - network_backend=network_backend, - socket_options=socket_options, - ssl_context=proxy_ssl_context, - ) - self._proxy_origin = proxy_origin - self._remote_origin = remote_origin - self._ssl_context = ssl_context - self._proxy_ssl_context = proxy_ssl_context - self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") - self._keepalive_expiry = keepalive_expiry - self._http1 = http1 - self._http2 = http2 - self._connect_lock = AsyncLock() - self._connected = False - - async def handle_async_request(self, request: Request) -> Response: - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("connect", None) - - async with self._connect_lock: - if not self._connected: - target = b"%b:%d" % (self._remote_origin.host, self._remote_origin.port) - - connect_url = URL( - scheme=self._proxy_origin.scheme, - host=self._proxy_origin.host, - port=self._proxy_origin.port, - target=target, - ) - connect_headers = merge_headers( - [(b"Host", target), (b"Accept", b"*/*")], self._proxy_headers - ) - connect_request = Request( - method=b"CONNECT", - url=connect_url, - headers=connect_headers, - extensions=request.extensions, - ) - connect_response = await self._connection.handle_async_request( - connect_request - ) - - if connect_response.status < 200 or connect_response.status > 299: - reason_bytes = connect_response.extensions.get("reason_phrase", b"") - reason_str = reason_bytes.decode("ascii", errors="ignore") - msg = "%d %s" % (connect_response.status, reason_str) - await self._connection.aclose() - raise ProxyError(msg) - - stream = connect_response.extensions["network_stream"] - - # Upgrade the stream to SSL - ssl_context = ( - default_ssl_context() - if self._ssl_context is None - else self._ssl_context - ) - alpn_protocols = ["http/1.1", "h2"] if self._http2 else ["http/1.1"] - ssl_context.set_alpn_protocols(alpn_protocols) - - kwargs = { - "ssl_context": ssl_context, - "server_hostname": self._remote_origin.host.decode("ascii"), - "timeout": timeout, - } - async with Trace("start_tls", logger, request, kwargs) as trace: - stream = await stream.start_tls(**kwargs) - trace.return_value = stream - - # Determine if we should be using HTTP/1.1 or HTTP/2 - ssl_object = stream.get_extra_info("ssl_object") - http2_negotiated = ( - ssl_object is not None - and ssl_object.selected_alpn_protocol() == "h2" - ) - - # Create the HTTP/1.1 or HTTP/2 connection - if http2_negotiated or (self._http2 and not self._http1): - from .http2 import AsyncHTTP2Connection - - self._connection = AsyncHTTP2Connection( - origin=self._remote_origin, - stream=stream, - keepalive_expiry=self._keepalive_expiry, - ) - else: - self._connection = AsyncHTTP11Connection( - origin=self._remote_origin, - stream=stream, - keepalive_expiry=self._keepalive_expiry, - ) - - self._connected = True - return await self._connection.handle_async_request(request) - - def can_handle_request(self, origin: Origin) -> bool: - return origin == self._remote_origin - - async def aclose(self) -> None: - await self._connection.aclose() - - def info(self) -> str: - return self._connection.info() - - def is_available(self) -> bool: - return self._connection.is_available() - - def has_expired(self) -> bool: - return self._connection.has_expired() - - def is_idle(self) -> bool: - return self._connection.is_idle() - - def is_closed(self) -> bool: - return self._connection.is_closed() - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} [{self.info()}]>" diff --git a/venv/lib/python3.11/site-packages/httpcore/_async/interfaces.py b/venv/lib/python3.11/site-packages/httpcore/_async/interfaces.py deleted file mode 100755 index 361583b..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_async/interfaces.py +++ /dev/null @@ -1,137 +0,0 @@ -from __future__ import annotations - -import contextlib -import typing - -from .._models import ( - URL, - Extensions, - HeaderTypes, - Origin, - Request, - Response, - enforce_bytes, - enforce_headers, - enforce_url, - include_request_headers, -) - - -class AsyncRequestInterface: - async def request( - self, - method: bytes | str, - url: URL | bytes | str, - *, - headers: HeaderTypes = None, - content: bytes | typing.AsyncIterator[bytes] | None = None, - extensions: Extensions | None = None, - ) -> Response: - # Strict type checking on our parameters. - method = enforce_bytes(method, name="method") - url = enforce_url(url, name="url") - headers = enforce_headers(headers, name="headers") - - # Include Host header, and optionally Content-Length or Transfer-Encoding. - headers = include_request_headers(headers, url=url, content=content) - - request = Request( - method=method, - url=url, - headers=headers, - content=content, - extensions=extensions, - ) - response = await self.handle_async_request(request) - try: - await response.aread() - finally: - await response.aclose() - return response - - @contextlib.asynccontextmanager - async def stream( - self, - method: bytes | str, - url: URL | bytes | str, - *, - headers: HeaderTypes = None, - content: bytes | typing.AsyncIterator[bytes] | None = None, - extensions: Extensions | None = None, - ) -> typing.AsyncIterator[Response]: - # Strict type checking on our parameters. - method = enforce_bytes(method, name="method") - url = enforce_url(url, name="url") - headers = enforce_headers(headers, name="headers") - - # Include Host header, and optionally Content-Length or Transfer-Encoding. - headers = include_request_headers(headers, url=url, content=content) - - request = Request( - method=method, - url=url, - headers=headers, - content=content, - extensions=extensions, - ) - response = await self.handle_async_request(request) - try: - yield response - finally: - await response.aclose() - - async def handle_async_request(self, request: Request) -> Response: - raise NotImplementedError() # pragma: nocover - - -class AsyncConnectionInterface(AsyncRequestInterface): - async def aclose(self) -> None: - raise NotImplementedError() # pragma: nocover - - def info(self) -> str: - raise NotImplementedError() # pragma: nocover - - def can_handle_request(self, origin: Origin) -> bool: - raise NotImplementedError() # pragma: nocover - - def is_available(self) -> bool: - """ - Return `True` if the connection is currently able to accept an - outgoing request. - - An HTTP/1.1 connection will only be available if it is currently idle. - - An HTTP/2 connection will be available so long as the stream ID space is - not yet exhausted, and the connection is not in an error state. - - While the connection is being established we may not yet know if it is going - to result in an HTTP/1.1 or HTTP/2 connection. The connection should be - treated as being available, but might ultimately raise `NewConnectionRequired` - required exceptions if multiple requests are attempted over a connection - that ends up being established as HTTP/1.1. - """ - raise NotImplementedError() # pragma: nocover - - def has_expired(self) -> bool: - """ - Return `True` if the connection is in a state where it should be closed. - - This either means that the connection is idle and it has passed the - expiry time on its keep-alive, or that server has sent an EOF. - """ - raise NotImplementedError() # pragma: nocover - - def is_idle(self) -> bool: - """ - Return `True` if the connection is currently idle. - """ - raise NotImplementedError() # pragma: nocover - - def is_closed(self) -> bool: - """ - Return `True` if the connection has been closed. - - Used when a response is closed to determine if the connection may be - returned to the connection pool or not. - """ - raise NotImplementedError() # pragma: nocover diff --git a/venv/lib/python3.11/site-packages/httpcore/_async/socks_proxy.py b/venv/lib/python3.11/site-packages/httpcore/_async/socks_proxy.py deleted file mode 100755 index b363f55..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_async/socks_proxy.py +++ /dev/null @@ -1,341 +0,0 @@ -from __future__ import annotations - -import logging -import ssl - -import socksio - -from .._backends.auto import AutoBackend -from .._backends.base import AsyncNetworkBackend, AsyncNetworkStream -from .._exceptions import ConnectionNotAvailable, ProxyError -from .._models import URL, Origin, Request, Response, enforce_bytes, enforce_url -from .._ssl import default_ssl_context -from .._synchronization import AsyncLock -from .._trace import Trace -from .connection_pool import AsyncConnectionPool -from .http11 import AsyncHTTP11Connection -from .interfaces import AsyncConnectionInterface - -logger = logging.getLogger("httpcore.socks") - - -AUTH_METHODS = { - b"\x00": "NO AUTHENTICATION REQUIRED", - b"\x01": "GSSAPI", - b"\x02": "USERNAME/PASSWORD", - b"\xff": "NO ACCEPTABLE METHODS", -} - -REPLY_CODES = { - b"\x00": "Succeeded", - b"\x01": "General SOCKS server failure", - b"\x02": "Connection not allowed by ruleset", - b"\x03": "Network unreachable", - b"\x04": "Host unreachable", - b"\x05": "Connection refused", - b"\x06": "TTL expired", - b"\x07": "Command not supported", - b"\x08": "Address type not supported", -} - - -async def _init_socks5_connection( - stream: AsyncNetworkStream, - *, - host: bytes, - port: int, - auth: tuple[bytes, bytes] | None = None, -) -> None: - conn = socksio.socks5.SOCKS5Connection() - - # Auth method request - auth_method = ( - socksio.socks5.SOCKS5AuthMethod.NO_AUTH_REQUIRED - if auth is None - else socksio.socks5.SOCKS5AuthMethod.USERNAME_PASSWORD - ) - conn.send(socksio.socks5.SOCKS5AuthMethodsRequest([auth_method])) - outgoing_bytes = conn.data_to_send() - await stream.write(outgoing_bytes) - - # Auth method response - incoming_bytes = await stream.read(max_bytes=4096) - response = conn.receive_data(incoming_bytes) - assert isinstance(response, socksio.socks5.SOCKS5AuthReply) - if response.method != auth_method: - requested = AUTH_METHODS.get(auth_method, "UNKNOWN") - responded = AUTH_METHODS.get(response.method, "UNKNOWN") - raise ProxyError( - f"Requested {requested} from proxy server, but got {responded}." - ) - - if response.method == socksio.socks5.SOCKS5AuthMethod.USERNAME_PASSWORD: - # Username/password request - assert auth is not None - username, password = auth - conn.send(socksio.socks5.SOCKS5UsernamePasswordRequest(username, password)) - outgoing_bytes = conn.data_to_send() - await stream.write(outgoing_bytes) - - # Username/password response - incoming_bytes = await stream.read(max_bytes=4096) - response = conn.receive_data(incoming_bytes) - assert isinstance(response, socksio.socks5.SOCKS5UsernamePasswordReply) - if not response.success: - raise ProxyError("Invalid username/password") - - # Connect request - conn.send( - socksio.socks5.SOCKS5CommandRequest.from_address( - socksio.socks5.SOCKS5Command.CONNECT, (host, port) - ) - ) - outgoing_bytes = conn.data_to_send() - await stream.write(outgoing_bytes) - - # Connect response - incoming_bytes = await stream.read(max_bytes=4096) - response = conn.receive_data(incoming_bytes) - assert isinstance(response, socksio.socks5.SOCKS5Reply) - if response.reply_code != socksio.socks5.SOCKS5ReplyCode.SUCCEEDED: - reply_code = REPLY_CODES.get(response.reply_code, "UNKOWN") - raise ProxyError(f"Proxy Server could not connect: {reply_code}.") - - -class AsyncSOCKSProxy(AsyncConnectionPool): # pragma: nocover - """ - A connection pool that sends requests via an HTTP proxy. - """ - - def __init__( - self, - proxy_url: URL | bytes | str, - proxy_auth: tuple[bytes | str, bytes | str] | None = None, - ssl_context: ssl.SSLContext | None = None, - max_connections: int | None = 10, - max_keepalive_connections: int | None = None, - keepalive_expiry: float | None = None, - http1: bool = True, - http2: bool = False, - retries: int = 0, - network_backend: AsyncNetworkBackend | None = None, - ) -> None: - """ - A connection pool for making HTTP requests. - - Parameters: - proxy_url: The URL to use when connecting to the proxy server. - For example `"http://127.0.0.1:8080/"`. - ssl_context: An SSL context to use for verifying connections. - If not specified, the default `httpcore.default_ssl_context()` - will be used. - max_connections: The maximum number of concurrent HTTP connections that - the pool should allow. Any attempt to send a request on a pool that - would exceed this amount will block until a connection is available. - max_keepalive_connections: The maximum number of idle HTTP connections - that will be maintained in the pool. - keepalive_expiry: The duration in seconds that an idle HTTP connection - may be maintained for before being expired from the pool. - http1: A boolean indicating if HTTP/1.1 requests should be supported - by the connection pool. Defaults to True. - http2: A boolean indicating if HTTP/2 requests should be supported by - the connection pool. Defaults to False. - retries: The maximum number of retries when trying to establish - a connection. - local_address: Local address to connect from. Can also be used to - connect using a particular address family. Using - `local_address="0.0.0.0"` will connect using an `AF_INET` address - (IPv4), while using `local_address="::"` will connect using an - `AF_INET6` address (IPv6). - uds: Path to a Unix Domain Socket to use instead of TCP sockets. - network_backend: A backend instance to use for handling network I/O. - """ - super().__init__( - ssl_context=ssl_context, - max_connections=max_connections, - max_keepalive_connections=max_keepalive_connections, - keepalive_expiry=keepalive_expiry, - http1=http1, - http2=http2, - network_backend=network_backend, - retries=retries, - ) - self._ssl_context = ssl_context - self._proxy_url = enforce_url(proxy_url, name="proxy_url") - if proxy_auth is not None: - username, password = proxy_auth - username_bytes = enforce_bytes(username, name="proxy_auth") - password_bytes = enforce_bytes(password, name="proxy_auth") - self._proxy_auth: tuple[bytes, bytes] | None = ( - username_bytes, - password_bytes, - ) - else: - self._proxy_auth = None - - def create_connection(self, origin: Origin) -> AsyncConnectionInterface: - return AsyncSocks5Connection( - proxy_origin=self._proxy_url.origin, - remote_origin=origin, - proxy_auth=self._proxy_auth, - ssl_context=self._ssl_context, - keepalive_expiry=self._keepalive_expiry, - http1=self._http1, - http2=self._http2, - network_backend=self._network_backend, - ) - - -class AsyncSocks5Connection(AsyncConnectionInterface): - def __init__( - self, - proxy_origin: Origin, - remote_origin: Origin, - proxy_auth: tuple[bytes, bytes] | None = None, - ssl_context: ssl.SSLContext | None = None, - keepalive_expiry: float | None = None, - http1: bool = True, - http2: bool = False, - network_backend: AsyncNetworkBackend | None = None, - ) -> None: - self._proxy_origin = proxy_origin - self._remote_origin = remote_origin - self._proxy_auth = proxy_auth - self._ssl_context = ssl_context - self._keepalive_expiry = keepalive_expiry - self._http1 = http1 - self._http2 = http2 - - self._network_backend: AsyncNetworkBackend = ( - AutoBackend() if network_backend is None else network_backend - ) - self._connect_lock = AsyncLock() - self._connection: AsyncConnectionInterface | None = None - self._connect_failed = False - - async def handle_async_request(self, request: Request) -> Response: - timeouts = request.extensions.get("timeout", {}) - sni_hostname = request.extensions.get("sni_hostname", None) - timeout = timeouts.get("connect", None) - - async with self._connect_lock: - if self._connection is None: - try: - # Connect to the proxy - kwargs = { - "host": self._proxy_origin.host.decode("ascii"), - "port": self._proxy_origin.port, - "timeout": timeout, - } - async with Trace("connect_tcp", logger, request, kwargs) as trace: - stream = await self._network_backend.connect_tcp(**kwargs) - trace.return_value = stream - - # Connect to the remote host using socks5 - kwargs = { - "stream": stream, - "host": self._remote_origin.host.decode("ascii"), - "port": self._remote_origin.port, - "auth": self._proxy_auth, - } - async with Trace( - "setup_socks5_connection", logger, request, kwargs - ) as trace: - await _init_socks5_connection(**kwargs) - trace.return_value = stream - - # Upgrade the stream to SSL - if self._remote_origin.scheme == b"https": - ssl_context = ( - default_ssl_context() - if self._ssl_context is None - else self._ssl_context - ) - alpn_protocols = ( - ["http/1.1", "h2"] if self._http2 else ["http/1.1"] - ) - ssl_context.set_alpn_protocols(alpn_protocols) - - kwargs = { - "ssl_context": ssl_context, - "server_hostname": sni_hostname - or self._remote_origin.host.decode("ascii"), - "timeout": timeout, - } - async with Trace("start_tls", logger, request, kwargs) as trace: - stream = await stream.start_tls(**kwargs) - trace.return_value = stream - - # Determine if we should be using HTTP/1.1 or HTTP/2 - ssl_object = stream.get_extra_info("ssl_object") - http2_negotiated = ( - ssl_object is not None - and ssl_object.selected_alpn_protocol() == "h2" - ) - - # Create the HTTP/1.1 or HTTP/2 connection - if http2_negotiated or ( - self._http2 and not self._http1 - ): # pragma: nocover - from .http2 import AsyncHTTP2Connection - - self._connection = AsyncHTTP2Connection( - origin=self._remote_origin, - stream=stream, - keepalive_expiry=self._keepalive_expiry, - ) - else: - self._connection = AsyncHTTP11Connection( - origin=self._remote_origin, - stream=stream, - keepalive_expiry=self._keepalive_expiry, - ) - except Exception as exc: - self._connect_failed = True - raise exc - elif not self._connection.is_available(): # pragma: nocover - raise ConnectionNotAvailable() - - return await self._connection.handle_async_request(request) - - def can_handle_request(self, origin: Origin) -> bool: - return origin == self._remote_origin - - async def aclose(self) -> None: - if self._connection is not None: - await self._connection.aclose() - - def is_available(self) -> bool: - if self._connection is None: # pragma: nocover - # If HTTP/2 support is enabled, and the resulting connection could - # end up as HTTP/2 then we should indicate the connection as being - # available to service multiple requests. - return ( - self._http2 - and (self._remote_origin.scheme == b"https" or not self._http1) - and not self._connect_failed - ) - return self._connection.is_available() - - def has_expired(self) -> bool: - if self._connection is None: # pragma: nocover - return self._connect_failed - return self._connection.has_expired() - - def is_idle(self) -> bool: - if self._connection is None: # pragma: nocover - return self._connect_failed - return self._connection.is_idle() - - def is_closed(self) -> bool: - if self._connection is None: # pragma: nocover - return self._connect_failed - return self._connection.is_closed() - - def info(self) -> str: - if self._connection is None: # pragma: nocover - return "CONNECTION FAILED" if self._connect_failed else "CONNECTING" - return self._connection.info() - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} [{self.info()}]>" diff --git a/venv/lib/python3.11/site-packages/httpcore/_backends/__init__.py b/venv/lib/python3.11/site-packages/httpcore/_backends/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index fd7a835e411dc69ceec9416adbef1ff7e43a652a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmZ3^%ge<81UIJ4$^y}kK?DpiLK&agfQ;!3DGb33nv8xc8H$*I{LdiCUt#(g`MIh3 zxrs%|`TAb@>G{U`i3J7vWvO{(`Z<|N`URCG8Tom}dWMGj#hE3kx&?{J*@@|?#rhc~ zB?Za(MXCDnNkF00yp&@7`1s7c%#!$cy@JYL95%W6DWy57c15f}Yd{Vu<_8iVm>C%v MKQO?EB4(f%019?86#xJL diff --git a/venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/anyio.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/anyio.cpython-311.pyc deleted file mode 100755 index 9027ab307e9433b801715a0360e271be621ae959..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9565 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 diff --git a/venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/auto.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/auto.cpython-311.pyc deleted file mode 100755 index 6737842bb7f8b7652e21836887dc0de1ef23e1d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2873 zcmcIm%Wo4$7@vLk8NWzshY(s!+Ca7tZv%y1Pz8O6QY5D$h=WnI+ISaiuy@_rF~zAt zsYt6HIUo`BM5QWim8zmr{}3mNgtZbzPoYPPsktm(rG?V5Vo&?@Q@h95K5#hZOh3% z6TQJ?zDlWSF->=BR$eO=7pP8a&jg&6-00lwhZjG-tj&IQ`NC}09XW?eS(ANX)0-dY z`J1L?xWm1JbBvmLIgclHTH79B`wWacBqqrT1_8fPhO{i_q!7W!7&Z1AiDh3-=5J%h z0b>~6e8#wu1TDWIgC_^wp>tJccMkSblU1qZ%30eo^JsCW$spV#MA-fngo{LgV_DC9 z9m2c{{;y#Scym5r-LMg|3S(>S8A9#|b-@sCa$P#g(;=3nJ0ga@F81rziH2wMW{^1o z+CEI!9f@m8|Dp{m6o1wYY76by%8V9m3asJzy9_UF=OLYub5`xbZ09}T1`4{PGe#+r ziY5^DA;bY(pKjG)r(uv4*_9o$bj=O4Pw~`n%0c7P&~`4V1-opjWu4}2^;7%0eNxpc z74?>B-BN)gYNf^swskTyGow01W=>bYVEwx3s0GF0k*L}YTt3ax?_HBj7@9qSY6|;&&-+-kw zjW7WK1N%|t$ zxKnyL)gm0`Q&GEWK=Mnj6-%vTamLC`UBy^QvC*X1vJa9YT??6yx_Z;XZjZ z9>P%sw9EMlV5$4G#IO%O1^tjFhbNnFO*PMc)QZM^K*Iqrg*u=R3ZcRPNQu4^K;XgP zS%)?$Vf5@;6@KP`XA~*x`n}JFo6zvLSb^GBagqO~{^x{k=&(X}r9*{Ko`vbuToA OC!gc+ive@o%)bCJhLITn diff --git a/venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/base.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/base.cpython-311.pyc deleted file mode 100755 index b4613f302599509819c5a611f66878bc1cf02a74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5311 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 Ru;-}N-Y3GtHYVU>^B=aqQ{(^u diff --git a/venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/sync.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_backends/__pycache__/sync.cpython-311.pyc deleted file mode 100755 index 1a937d7f6ef86825e71d70d7d37242fee1d8e873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12713 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 JHb`SL`9FRjOg;br diff --git a/venv/lib/python3.11/site-packages/httpcore/_backends/anyio.py b/venv/lib/python3.11/site-packages/httpcore/_backends/anyio.py deleted file mode 100755 index a140095..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_backends/anyio.py +++ /dev/null @@ -1,146 +0,0 @@ -from __future__ import annotations - -import ssl -import typing - -import anyio - -from .._exceptions import ( - ConnectError, - ConnectTimeout, - ReadError, - ReadTimeout, - WriteError, - WriteTimeout, - map_exceptions, -) -from .._utils import is_socket_readable -from .base import SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream - - -class AnyIOStream(AsyncNetworkStream): - def __init__(self, stream: anyio.abc.ByteStream) -> None: - self._stream = stream - - async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: - exc_map = { - TimeoutError: ReadTimeout, - anyio.BrokenResourceError: ReadError, - anyio.ClosedResourceError: ReadError, - anyio.EndOfStream: ReadError, - } - with map_exceptions(exc_map): - with anyio.fail_after(timeout): - try: - return await self._stream.receive(max_bytes=max_bytes) - except anyio.EndOfStream: # pragma: nocover - return b"" - - async def write(self, buffer: bytes, timeout: float | None = None) -> None: - if not buffer: - return - - exc_map = { - TimeoutError: WriteTimeout, - anyio.BrokenResourceError: WriteError, - anyio.ClosedResourceError: WriteError, - } - with map_exceptions(exc_map): - with anyio.fail_after(timeout): - await self._stream.send(item=buffer) - - async def aclose(self) -> None: - await self._stream.aclose() - - async def start_tls( - self, - ssl_context: ssl.SSLContext, - server_hostname: str | None = None, - timeout: float | None = None, - ) -> AsyncNetworkStream: - exc_map = { - TimeoutError: ConnectTimeout, - anyio.BrokenResourceError: ConnectError, - anyio.EndOfStream: ConnectError, - ssl.SSLError: ConnectError, - } - with map_exceptions(exc_map): - try: - with anyio.fail_after(timeout): - ssl_stream = await anyio.streams.tls.TLSStream.wrap( - self._stream, - ssl_context=ssl_context, - hostname=server_hostname, - standard_compatible=False, - server_side=False, - ) - except Exception as exc: # pragma: nocover - await self.aclose() - raise exc - return AnyIOStream(ssl_stream) - - def get_extra_info(self, info: str) -> typing.Any: - if info == "ssl_object": - return self._stream.extra(anyio.streams.tls.TLSAttribute.ssl_object, None) - if info == "client_addr": - return self._stream.extra(anyio.abc.SocketAttribute.local_address, None) - if info == "server_addr": - return self._stream.extra(anyio.abc.SocketAttribute.remote_address, None) - if info == "socket": - return self._stream.extra(anyio.abc.SocketAttribute.raw_socket, None) - if info == "is_readable": - sock = self._stream.extra(anyio.abc.SocketAttribute.raw_socket, None) - return is_socket_readable(sock) - return None - - -class AnyIOBackend(AsyncNetworkBackend): - async def connect_tcp( - self, - host: str, - port: int, - timeout: float | None = None, - local_address: str | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> AsyncNetworkStream: # pragma: nocover - if socket_options is None: - socket_options = [] - exc_map = { - TimeoutError: ConnectTimeout, - OSError: ConnectError, - anyio.BrokenResourceError: ConnectError, - } - with map_exceptions(exc_map): - with anyio.fail_after(timeout): - stream: anyio.abc.ByteStream = await anyio.connect_tcp( - remote_host=host, - remote_port=port, - local_host=local_address, - ) - # By default TCP sockets opened in `asyncio` include TCP_NODELAY. - for option in socket_options: - stream._raw_socket.setsockopt(*option) # type: ignore[attr-defined] # pragma: no cover - return AnyIOStream(stream) - - async def connect_unix_socket( - self, - path: str, - timeout: float | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> AsyncNetworkStream: # pragma: nocover - if socket_options is None: - socket_options = [] - exc_map = { - TimeoutError: ConnectTimeout, - OSError: ConnectError, - anyio.BrokenResourceError: ConnectError, - } - with map_exceptions(exc_map): - with anyio.fail_after(timeout): - stream: anyio.abc.ByteStream = await anyio.connect_unix(path) - for option in socket_options: - stream._raw_socket.setsockopt(*option) # type: ignore[attr-defined] # pragma: no cover - return AnyIOStream(stream) - - async def sleep(self, seconds: float) -> None: - await anyio.sleep(seconds) # pragma: nocover diff --git a/venv/lib/python3.11/site-packages/httpcore/_backends/auto.py b/venv/lib/python3.11/site-packages/httpcore/_backends/auto.py deleted file mode 100755 index 49f0e69..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_backends/auto.py +++ /dev/null @@ -1,52 +0,0 @@ -from __future__ import annotations - -import typing - -from .._synchronization import current_async_library -from .base import SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream - - -class AutoBackend(AsyncNetworkBackend): - async def _init_backend(self) -> None: - if not (hasattr(self, "_backend")): - backend = current_async_library() - if backend == "trio": - from .trio import TrioBackend - - self._backend: AsyncNetworkBackend = TrioBackend() - else: - from .anyio import AnyIOBackend - - self._backend = AnyIOBackend() - - async def connect_tcp( - self, - host: str, - port: int, - timeout: float | None = None, - local_address: str | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> AsyncNetworkStream: - await self._init_backend() - return await self._backend.connect_tcp( - host, - port, - timeout=timeout, - local_address=local_address, - socket_options=socket_options, - ) - - async def connect_unix_socket( - self, - path: str, - timeout: float | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> AsyncNetworkStream: # pragma: nocover - await self._init_backend() - return await self._backend.connect_unix_socket( - path, timeout=timeout, socket_options=socket_options - ) - - async def sleep(self, seconds: float) -> None: # pragma: nocover - await self._init_backend() - return await self._backend.sleep(seconds) diff --git a/venv/lib/python3.11/site-packages/httpcore/_backends/base.py b/venv/lib/python3.11/site-packages/httpcore/_backends/base.py deleted file mode 100755 index cf55c8b..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_backends/base.py +++ /dev/null @@ -1,101 +0,0 @@ -from __future__ import annotations - -import ssl -import time -import typing - -SOCKET_OPTION = typing.Union[ - typing.Tuple[int, int, int], - typing.Tuple[int, int, typing.Union[bytes, bytearray]], - typing.Tuple[int, int, None, int], -] - - -class NetworkStream: - def read(self, max_bytes: int, timeout: float | None = None) -> bytes: - raise NotImplementedError() # pragma: nocover - - def write(self, buffer: bytes, timeout: float | None = None) -> None: - raise NotImplementedError() # pragma: nocover - - def close(self) -> None: - raise NotImplementedError() # pragma: nocover - - def start_tls( - self, - ssl_context: ssl.SSLContext, - server_hostname: str | None = None, - timeout: float | None = None, - ) -> NetworkStream: - raise NotImplementedError() # pragma: nocover - - def get_extra_info(self, info: str) -> typing.Any: - return None # pragma: nocover - - -class NetworkBackend: - def connect_tcp( - self, - host: str, - port: int, - timeout: float | None = None, - local_address: str | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> NetworkStream: - raise NotImplementedError() # pragma: nocover - - def connect_unix_socket( - self, - path: str, - timeout: float | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> NetworkStream: - raise NotImplementedError() # pragma: nocover - - def sleep(self, seconds: float) -> None: - time.sleep(seconds) # pragma: nocover - - -class AsyncNetworkStream: - async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: - raise NotImplementedError() # pragma: nocover - - async def write(self, buffer: bytes, timeout: float | None = None) -> None: - raise NotImplementedError() # pragma: nocover - - async def aclose(self) -> None: - raise NotImplementedError() # pragma: nocover - - async def start_tls( - self, - ssl_context: ssl.SSLContext, - server_hostname: str | None = None, - timeout: float | None = None, - ) -> AsyncNetworkStream: - raise NotImplementedError() # pragma: nocover - - def get_extra_info(self, info: str) -> typing.Any: - return None # pragma: nocover - - -class AsyncNetworkBackend: - async def connect_tcp( - self, - host: str, - port: int, - timeout: float | None = None, - local_address: str | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> AsyncNetworkStream: - raise NotImplementedError() # pragma: nocover - - async def connect_unix_socket( - self, - path: str, - timeout: float | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> AsyncNetworkStream: - raise NotImplementedError() # pragma: nocover - - async def sleep(self, seconds: float) -> None: - raise NotImplementedError() # pragma: nocover diff --git a/venv/lib/python3.11/site-packages/httpcore/_backends/mock.py b/venv/lib/python3.11/site-packages/httpcore/_backends/mock.py deleted file mode 100755 index 9b6edca..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_backends/mock.py +++ /dev/null @@ -1,143 +0,0 @@ -from __future__ import annotations - -import ssl -import typing - -from .._exceptions import ReadError -from .base import ( - SOCKET_OPTION, - AsyncNetworkBackend, - AsyncNetworkStream, - NetworkBackend, - NetworkStream, -) - - -class MockSSLObject: - def __init__(self, http2: bool): - self._http2 = http2 - - def selected_alpn_protocol(self) -> str: - return "h2" if self._http2 else "http/1.1" - - -class MockStream(NetworkStream): - def __init__(self, buffer: list[bytes], http2: bool = False) -> None: - self._buffer = buffer - self._http2 = http2 - self._closed = False - - def read(self, max_bytes: int, timeout: float | None = None) -> bytes: - if self._closed: - raise ReadError("Connection closed") - if not self._buffer: - return b"" - return self._buffer.pop(0) - - def write(self, buffer: bytes, timeout: float | None = None) -> None: - pass - - def close(self) -> None: - self._closed = True - - def start_tls( - self, - ssl_context: ssl.SSLContext, - server_hostname: str | None = None, - timeout: float | None = None, - ) -> NetworkStream: - return self - - def get_extra_info(self, info: str) -> typing.Any: - return MockSSLObject(http2=self._http2) if info == "ssl_object" else None - - def __repr__(self) -> str: - return "" - - -class MockBackend(NetworkBackend): - def __init__(self, buffer: list[bytes], http2: bool = False) -> None: - self._buffer = buffer - self._http2 = http2 - - def connect_tcp( - self, - host: str, - port: int, - timeout: float | None = None, - local_address: str | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> NetworkStream: - return MockStream(list(self._buffer), http2=self._http2) - - def connect_unix_socket( - self, - path: str, - timeout: float | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> NetworkStream: - return MockStream(list(self._buffer), http2=self._http2) - - def sleep(self, seconds: float) -> None: - pass - - -class AsyncMockStream(AsyncNetworkStream): - def __init__(self, buffer: list[bytes], http2: bool = False) -> None: - self._buffer = buffer - self._http2 = http2 - self._closed = False - - async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: - if self._closed: - raise ReadError("Connection closed") - if not self._buffer: - return b"" - return self._buffer.pop(0) - - async def write(self, buffer: bytes, timeout: float | None = None) -> None: - pass - - async def aclose(self) -> None: - self._closed = True - - async def start_tls( - self, - ssl_context: ssl.SSLContext, - server_hostname: str | None = None, - timeout: float | None = None, - ) -> AsyncNetworkStream: - return self - - def get_extra_info(self, info: str) -> typing.Any: - return MockSSLObject(http2=self._http2) if info == "ssl_object" else None - - def __repr__(self) -> str: - return "" - - -class AsyncMockBackend(AsyncNetworkBackend): - def __init__(self, buffer: list[bytes], http2: bool = False) -> None: - self._buffer = buffer - self._http2 = http2 - - async def connect_tcp( - self, - host: str, - port: int, - timeout: float | None = None, - local_address: str | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> AsyncNetworkStream: - return AsyncMockStream(list(self._buffer), http2=self._http2) - - async def connect_unix_socket( - self, - path: str, - timeout: float | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> AsyncNetworkStream: - return AsyncMockStream(list(self._buffer), http2=self._http2) - - async def sleep(self, seconds: float) -> None: - pass diff --git a/venv/lib/python3.11/site-packages/httpcore/_backends/sync.py b/venv/lib/python3.11/site-packages/httpcore/_backends/sync.py deleted file mode 100755 index 4018a09..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_backends/sync.py +++ /dev/null @@ -1,241 +0,0 @@ -from __future__ import annotations - -import functools -import socket -import ssl -import sys -import typing - -from .._exceptions import ( - ConnectError, - ConnectTimeout, - ExceptionMapping, - ReadError, - ReadTimeout, - WriteError, - WriteTimeout, - map_exceptions, -) -from .._utils import is_socket_readable -from .base import SOCKET_OPTION, NetworkBackend, NetworkStream - - -class TLSinTLSStream(NetworkStream): # pragma: no cover - """ - Because the standard `SSLContext.wrap_socket` method does - not work for `SSLSocket` objects, we need this class - to implement TLS stream using an underlying `SSLObject` - instance in order to support TLS on top of TLS. - """ - - # Defined in RFC 8449 - TLS_RECORD_SIZE = 16384 - - def __init__( - self, - sock: socket.socket, - ssl_context: ssl.SSLContext, - server_hostname: str | None = None, - timeout: float | None = None, - ): - self._sock = sock - self._incoming = ssl.MemoryBIO() - self._outgoing = ssl.MemoryBIO() - - self.ssl_obj = ssl_context.wrap_bio( - incoming=self._incoming, - outgoing=self._outgoing, - server_hostname=server_hostname, - ) - - self._sock.settimeout(timeout) - self._perform_io(self.ssl_obj.do_handshake) - - def _perform_io( - self, - func: typing.Callable[..., typing.Any], - ) -> typing.Any: - ret = None - - while True: - errno = None - try: - ret = func() - except (ssl.SSLWantReadError, ssl.SSLWantWriteError) as e: - errno = e.errno - - self._sock.sendall(self._outgoing.read()) - - if errno == ssl.SSL_ERROR_WANT_READ: - buf = self._sock.recv(self.TLS_RECORD_SIZE) - - if buf: - self._incoming.write(buf) - else: - self._incoming.write_eof() - if errno is None: - return ret - - def read(self, max_bytes: int, timeout: float | None = None) -> bytes: - exc_map: ExceptionMapping = {socket.timeout: ReadTimeout, OSError: ReadError} - with map_exceptions(exc_map): - self._sock.settimeout(timeout) - return typing.cast( - bytes, self._perform_io(functools.partial(self.ssl_obj.read, max_bytes)) - ) - - def write(self, buffer: bytes, timeout: float | None = None) -> None: - exc_map: ExceptionMapping = {socket.timeout: WriteTimeout, OSError: WriteError} - with map_exceptions(exc_map): - self._sock.settimeout(timeout) - while buffer: - nsent = self._perform_io(functools.partial(self.ssl_obj.write, buffer)) - buffer = buffer[nsent:] - - def close(self) -> None: - self._sock.close() - - def start_tls( - self, - ssl_context: ssl.SSLContext, - server_hostname: str | None = None, - timeout: float | None = None, - ) -> NetworkStream: - raise NotImplementedError() - - def get_extra_info(self, info: str) -> typing.Any: - if info == "ssl_object": - return self.ssl_obj - if info == "client_addr": - return self._sock.getsockname() - if info == "server_addr": - return self._sock.getpeername() - if info == "socket": - return self._sock - if info == "is_readable": - return is_socket_readable(self._sock) - return None - - -class SyncStream(NetworkStream): - def __init__(self, sock: socket.socket) -> None: - self._sock = sock - - def read(self, max_bytes: int, timeout: float | None = None) -> bytes: - exc_map: ExceptionMapping = {socket.timeout: ReadTimeout, OSError: ReadError} - with map_exceptions(exc_map): - self._sock.settimeout(timeout) - return self._sock.recv(max_bytes) - - def write(self, buffer: bytes, timeout: float | None = None) -> None: - if not buffer: - return - - exc_map: ExceptionMapping = {socket.timeout: WriteTimeout, OSError: WriteError} - with map_exceptions(exc_map): - while buffer: - self._sock.settimeout(timeout) - n = self._sock.send(buffer) - buffer = buffer[n:] - - def close(self) -> None: - self._sock.close() - - def start_tls( - self, - ssl_context: ssl.SSLContext, - server_hostname: str | None = None, - timeout: float | None = None, - ) -> NetworkStream: - exc_map: ExceptionMapping = { - socket.timeout: ConnectTimeout, - OSError: ConnectError, - } - with map_exceptions(exc_map): - try: - if isinstance(self._sock, ssl.SSLSocket): # pragma: no cover - # If the underlying socket has already been upgraded - # to the TLS layer (i.e. is an instance of SSLSocket), - # we need some additional smarts to support TLS-in-TLS. - return TLSinTLSStream( - self._sock, ssl_context, server_hostname, timeout - ) - else: - self._sock.settimeout(timeout) - sock = ssl_context.wrap_socket( - self._sock, server_hostname=server_hostname - ) - except Exception as exc: # pragma: nocover - self.close() - raise exc - return SyncStream(sock) - - def get_extra_info(self, info: str) -> typing.Any: - if info == "ssl_object" and isinstance(self._sock, ssl.SSLSocket): - return self._sock._sslobj # type: ignore - if info == "client_addr": - return self._sock.getsockname() - if info == "server_addr": - return self._sock.getpeername() - if info == "socket": - return self._sock - if info == "is_readable": - return is_socket_readable(self._sock) - return None - - -class SyncBackend(NetworkBackend): - def connect_tcp( - self, - host: str, - port: int, - timeout: float | None = None, - local_address: str | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> NetworkStream: - # Note that we automatically include `TCP_NODELAY` - # in addition to any other custom socket options. - if socket_options is None: - socket_options = [] # pragma: no cover - address = (host, port) - source_address = None if local_address is None else (local_address, 0) - exc_map: ExceptionMapping = { - socket.timeout: ConnectTimeout, - OSError: ConnectError, - } - - with map_exceptions(exc_map): - sock = socket.create_connection( - address, - timeout, - source_address=source_address, - ) - for option in socket_options: - sock.setsockopt(*option) # pragma: no cover - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - return SyncStream(sock) - - def connect_unix_socket( - self, - path: str, - timeout: float | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> NetworkStream: # pragma: nocover - if sys.platform == "win32": - raise RuntimeError( - "Attempted to connect to a UNIX socket on a Windows system." - ) - if socket_options is None: - socket_options = [] - - exc_map: ExceptionMapping = { - socket.timeout: ConnectTimeout, - OSError: ConnectError, - } - with map_exceptions(exc_map): - sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - for option in socket_options: - sock.setsockopt(*option) - sock.settimeout(timeout) - sock.connect(path) - return SyncStream(sock) diff --git a/venv/lib/python3.11/site-packages/httpcore/_backends/trio.py b/venv/lib/python3.11/site-packages/httpcore/_backends/trio.py deleted file mode 100755 index 6f53f5f..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_backends/trio.py +++ /dev/null @@ -1,159 +0,0 @@ -from __future__ import annotations - -import ssl -import typing - -import trio - -from .._exceptions import ( - ConnectError, - ConnectTimeout, - ExceptionMapping, - ReadError, - ReadTimeout, - WriteError, - WriteTimeout, - map_exceptions, -) -from .base import SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream - - -class TrioStream(AsyncNetworkStream): - def __init__(self, stream: trio.abc.Stream) -> None: - self._stream = stream - - async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: - timeout_or_inf = float("inf") if timeout is None else timeout - exc_map: ExceptionMapping = { - trio.TooSlowError: ReadTimeout, - trio.BrokenResourceError: ReadError, - trio.ClosedResourceError: ReadError, - } - with map_exceptions(exc_map): - with trio.fail_after(timeout_or_inf): - data: bytes = await self._stream.receive_some(max_bytes=max_bytes) - return data - - async def write(self, buffer: bytes, timeout: float | None = None) -> None: - if not buffer: - return - - timeout_or_inf = float("inf") if timeout is None else timeout - exc_map: ExceptionMapping = { - trio.TooSlowError: WriteTimeout, - trio.BrokenResourceError: WriteError, - trio.ClosedResourceError: WriteError, - } - with map_exceptions(exc_map): - with trio.fail_after(timeout_or_inf): - await self._stream.send_all(data=buffer) - - async def aclose(self) -> None: - await self._stream.aclose() - - async def start_tls( - self, - ssl_context: ssl.SSLContext, - server_hostname: str | None = None, - timeout: float | None = None, - ) -> AsyncNetworkStream: - timeout_or_inf = float("inf") if timeout is None else timeout - exc_map: ExceptionMapping = { - trio.TooSlowError: ConnectTimeout, - trio.BrokenResourceError: ConnectError, - } - ssl_stream = trio.SSLStream( - self._stream, - ssl_context=ssl_context, - server_hostname=server_hostname, - https_compatible=True, - server_side=False, - ) - with map_exceptions(exc_map): - try: - with trio.fail_after(timeout_or_inf): - await ssl_stream.do_handshake() - except Exception as exc: # pragma: nocover - await self.aclose() - raise exc - return TrioStream(ssl_stream) - - def get_extra_info(self, info: str) -> typing.Any: - if info == "ssl_object" and isinstance(self._stream, trio.SSLStream): - # Type checkers cannot see `_ssl_object` attribute because trio._ssl.SSLStream uses __getattr__/__setattr__. - # Tracked at https://github.com/python-trio/trio/issues/542 - return self._stream._ssl_object # type: ignore[attr-defined] - if info == "client_addr": - return self._get_socket_stream().socket.getsockname() - if info == "server_addr": - return self._get_socket_stream().socket.getpeername() - if info == "socket": - stream = self._stream - while isinstance(stream, trio.SSLStream): - stream = stream.transport_stream - assert isinstance(stream, trio.SocketStream) - return stream.socket - if info == "is_readable": - socket = self.get_extra_info("socket") - return socket.is_readable() - return None - - def _get_socket_stream(self) -> trio.SocketStream: - stream = self._stream - while isinstance(stream, trio.SSLStream): - stream = stream.transport_stream - assert isinstance(stream, trio.SocketStream) - return stream - - -class TrioBackend(AsyncNetworkBackend): - async def connect_tcp( - self, - host: str, - port: int, - timeout: float | None = None, - local_address: str | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> AsyncNetworkStream: - # By default for TCP sockets, trio enables TCP_NODELAY. - # https://trio.readthedocs.io/en/stable/reference-io.html#trio.SocketStream - if socket_options is None: - socket_options = [] # pragma: no cover - timeout_or_inf = float("inf") if timeout is None else timeout - exc_map: ExceptionMapping = { - trio.TooSlowError: ConnectTimeout, - trio.BrokenResourceError: ConnectError, - OSError: ConnectError, - } - with map_exceptions(exc_map): - with trio.fail_after(timeout_or_inf): - stream: trio.abc.Stream = await trio.open_tcp_stream( - host=host, port=port, local_address=local_address - ) - for option in socket_options: - stream.setsockopt(*option) # type: ignore[attr-defined] # pragma: no cover - return TrioStream(stream) - - async def connect_unix_socket( - self, - path: str, - timeout: float | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> AsyncNetworkStream: # pragma: nocover - if socket_options is None: - socket_options = [] - timeout_or_inf = float("inf") if timeout is None else timeout - exc_map: ExceptionMapping = { - trio.TooSlowError: ConnectTimeout, - trio.BrokenResourceError: ConnectError, - OSError: ConnectError, - } - with map_exceptions(exc_map): - with trio.fail_after(timeout_or_inf): - stream: trio.abc.Stream = await trio.open_unix_socket(path) - for option in socket_options: - stream.setsockopt(*option) # type: ignore[attr-defined] # pragma: no cover - return TrioStream(stream) - - async def sleep(self, seconds: float) -> None: - await trio.sleep(seconds) # pragma: nocover diff --git a/venv/lib/python3.11/site-packages/httpcore/_exceptions.py b/venv/lib/python3.11/site-packages/httpcore/_exceptions.py deleted file mode 100755 index bc28d44..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_exceptions.py +++ /dev/null @@ -1,81 +0,0 @@ -import contextlib -import typing - -ExceptionMapping = typing.Mapping[typing.Type[Exception], typing.Type[Exception]] - - -@contextlib.contextmanager -def map_exceptions(map: ExceptionMapping) -> typing.Iterator[None]: - try: - yield - except Exception as exc: # noqa: PIE786 - for from_exc, to_exc in map.items(): - if isinstance(exc, from_exc): - raise to_exc(exc) from exc - raise # pragma: nocover - - -class ConnectionNotAvailable(Exception): - pass - - -class ProxyError(Exception): - pass - - -class UnsupportedProtocol(Exception): - pass - - -class ProtocolError(Exception): - pass - - -class RemoteProtocolError(ProtocolError): - pass - - -class LocalProtocolError(ProtocolError): - pass - - -# Timeout errors - - -class TimeoutException(Exception): - pass - - -class PoolTimeout(TimeoutException): - pass - - -class ConnectTimeout(TimeoutException): - pass - - -class ReadTimeout(TimeoutException): - pass - - -class WriteTimeout(TimeoutException): - pass - - -# Network errors - - -class NetworkError(Exception): - pass - - -class ConnectError(NetworkError): - pass - - -class ReadError(NetworkError): - pass - - -class WriteError(NetworkError): - pass diff --git a/venv/lib/python3.11/site-packages/httpcore/_models.py b/venv/lib/python3.11/site-packages/httpcore/_models.py deleted file mode 100755 index 8a65f13..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_models.py +++ /dev/null @@ -1,516 +0,0 @@ -from __future__ import annotations - -import base64 -import ssl -import typing -import urllib.parse - -# Functions for typechecking... - - -ByteOrStr = typing.Union[bytes, str] -HeadersAsSequence = typing.Sequence[typing.Tuple[ByteOrStr, ByteOrStr]] -HeadersAsMapping = typing.Mapping[ByteOrStr, ByteOrStr] -HeaderTypes = typing.Union[HeadersAsSequence, HeadersAsMapping, None] - -Extensions = typing.MutableMapping[str, typing.Any] - - -def enforce_bytes(value: bytes | str, *, name: str) -> bytes: - """ - Any arguments that are ultimately represented as bytes can be specified - either as bytes or as strings. - - However we enforce that any string arguments must only contain characters in - the plain ASCII range. chr(0)...chr(127). If you need to use characters - outside that range then be precise, and use a byte-wise argument. - """ - if isinstance(value, str): - try: - return value.encode("ascii") - except UnicodeEncodeError: - raise TypeError(f"{name} strings may not include unicode characters.") - elif isinstance(value, bytes): - return value - - seen_type = type(value).__name__ - raise TypeError(f"{name} must be bytes or str, but got {seen_type}.") - - -def enforce_url(value: URL | bytes | str, *, name: str) -> URL: - """ - Type check for URL parameters. - """ - if isinstance(value, (bytes, str)): - return URL(value) - elif isinstance(value, URL): - return value - - seen_type = type(value).__name__ - raise TypeError(f"{name} must be a URL, bytes, or str, but got {seen_type}.") - - -def enforce_headers( - value: HeadersAsMapping | HeadersAsSequence | None = None, *, name: str -) -> list[tuple[bytes, bytes]]: - """ - Convienence function that ensure all items in request or response headers - are either bytes or strings in the plain ASCII range. - """ - if value is None: - return [] - elif isinstance(value, typing.Mapping): - return [ - ( - enforce_bytes(k, name="header name"), - enforce_bytes(v, name="header value"), - ) - for k, v in value.items() - ] - elif isinstance(value, typing.Sequence): - return [ - ( - enforce_bytes(k, name="header name"), - enforce_bytes(v, name="header value"), - ) - for k, v in value - ] - - seen_type = type(value).__name__ - raise TypeError( - f"{name} must be a mapping or sequence of two-tuples, but got {seen_type}." - ) - - -def enforce_stream( - value: bytes | typing.Iterable[bytes] | typing.AsyncIterable[bytes] | None, - *, - name: str, -) -> typing.Iterable[bytes] | typing.AsyncIterable[bytes]: - if value is None: - return ByteStream(b"") - elif isinstance(value, bytes): - return ByteStream(value) - return value - - -# * https://tools.ietf.org/html/rfc3986#section-3.2.3 -# * https://url.spec.whatwg.org/#url-miscellaneous -# * https://url.spec.whatwg.org/#scheme-state -DEFAULT_PORTS = { - b"ftp": 21, - b"http": 80, - b"https": 443, - b"ws": 80, - b"wss": 443, -} - - -def include_request_headers( - headers: list[tuple[bytes, bytes]], - *, - url: "URL", - content: None | bytes | typing.Iterable[bytes] | typing.AsyncIterable[bytes], -) -> list[tuple[bytes, bytes]]: - headers_set = set(k.lower() for k, v in headers) - - if b"host" not in headers_set: - default_port = DEFAULT_PORTS.get(url.scheme) - if url.port is None or url.port == default_port: - header_value = url.host - else: - header_value = b"%b:%d" % (url.host, url.port) - headers = [(b"Host", header_value)] + headers - - if ( - content is not None - and b"content-length" not in headers_set - and b"transfer-encoding" not in headers_set - ): - if isinstance(content, bytes): - content_length = str(len(content)).encode("ascii") - headers += [(b"Content-Length", content_length)] - else: - headers += [(b"Transfer-Encoding", b"chunked")] # pragma: nocover - - return headers - - -# Interfaces for byte streams... - - -class ByteStream: - """ - A container for non-streaming content, and that supports both sync and async - stream iteration. - """ - - def __init__(self, content: bytes) -> None: - self._content = content - - def __iter__(self) -> typing.Iterator[bytes]: - yield self._content - - async def __aiter__(self) -> typing.AsyncIterator[bytes]: - yield self._content - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} [{len(self._content)} bytes]>" - - -class Origin: - def __init__(self, scheme: bytes, host: bytes, port: int) -> None: - self.scheme = scheme - self.host = host - self.port = port - - def __eq__(self, other: typing.Any) -> bool: - return ( - isinstance(other, Origin) - and self.scheme == other.scheme - and self.host == other.host - and self.port == other.port - ) - - def __str__(self) -> str: - scheme = self.scheme.decode("ascii") - host = self.host.decode("ascii") - port = str(self.port) - return f"{scheme}://{host}:{port}" - - -class URL: - """ - Represents the URL against which an HTTP request may be made. - - The URL may either be specified as a plain string, for convienence: - - ```python - url = httpcore.URL("https://www.example.com/") - ``` - - Or be constructed with explicitily pre-parsed components: - - ```python - url = httpcore.URL(scheme=b'https', host=b'www.example.com', port=None, target=b'/') - ``` - - Using this second more explicit style allows integrations that are using - `httpcore` to pass through URLs that have already been parsed in order to use - libraries such as `rfc-3986` rather than relying on the stdlib. It also ensures - that URL parsing is treated identically at both the networking level and at any - higher layers of abstraction. - - The four components are important here, as they allow the URL to be precisely - specified in a pre-parsed format. They also allow certain types of request to - be created that could not otherwise be expressed. - - For example, an HTTP request to `http://www.example.com/` forwarded via a proxy - at `http://localhost:8080`... - - ```python - # Constructs an HTTP request with a complete URL as the target: - # GET https://www.example.com/ HTTP/1.1 - url = httpcore.URL( - scheme=b'http', - host=b'localhost', - port=8080, - target=b'https://www.example.com/' - ) - request = httpcore.Request( - method="GET", - url=url - ) - ``` - - Another example is constructing an `OPTIONS *` request... - - ```python - # Constructs an 'OPTIONS *' HTTP request: - # OPTIONS * HTTP/1.1 - url = httpcore.URL(scheme=b'https', host=b'www.example.com', target=b'*') - request = httpcore.Request(method="OPTIONS", url=url) - ``` - - This kind of request is not possible to formulate with a URL string, - because the `/` delimiter is always used to demark the target from the - host/port portion of the URL. - - For convenience, string-like arguments may be specified either as strings or - as bytes. However, once a request is being issue over-the-wire, the URL - components are always ultimately required to be a bytewise representation. - - In order to avoid any ambiguity over character encodings, when strings are used - as arguments, they must be strictly limited to the ASCII range `chr(0)`-`chr(127)`. - If you require a bytewise representation that is outside this range you must - handle the character encoding directly, and pass a bytes instance. - """ - - def __init__( - self, - url: bytes | str = "", - *, - scheme: bytes | str = b"", - host: bytes | str = b"", - port: int | None = None, - target: bytes | str = b"", - ) -> None: - """ - Parameters: - url: The complete URL as a string or bytes. - scheme: The URL scheme as a string or bytes. - Typically either `"http"` or `"https"`. - host: The URL host as a string or bytes. Such as `"www.example.com"`. - port: The port to connect to. Either an integer or `None`. - target: The target of the HTTP request. Such as `"/items?search=red"`. - """ - if url: - parsed = urllib.parse.urlparse(enforce_bytes(url, name="url")) - self.scheme = parsed.scheme - self.host = parsed.hostname or b"" - self.port = parsed.port - self.target = (parsed.path or b"/") + ( - b"?" + parsed.query if parsed.query else b"" - ) - else: - self.scheme = enforce_bytes(scheme, name="scheme") - self.host = enforce_bytes(host, name="host") - self.port = port - self.target = enforce_bytes(target, name="target") - - @property - def origin(self) -> Origin: - default_port = { - b"http": 80, - b"https": 443, - b"ws": 80, - b"wss": 443, - b"socks5": 1080, - b"socks5h": 1080, - }[self.scheme] - return Origin( - scheme=self.scheme, host=self.host, port=self.port or default_port - ) - - def __eq__(self, other: typing.Any) -> bool: - return ( - isinstance(other, URL) - and other.scheme == self.scheme - and other.host == self.host - and other.port == self.port - and other.target == self.target - ) - - def __bytes__(self) -> bytes: - if self.port is None: - return b"%b://%b%b" % (self.scheme, self.host, self.target) - return b"%b://%b:%d%b" % (self.scheme, self.host, self.port, self.target) - - def __repr__(self) -> str: - return ( - f"{self.__class__.__name__}(scheme={self.scheme!r}, " - f"host={self.host!r}, port={self.port!r}, target={self.target!r})" - ) - - -class Request: - """ - An HTTP request. - """ - - def __init__( - self, - method: bytes | str, - url: URL | bytes | str, - *, - headers: HeaderTypes = None, - content: bytes - | typing.Iterable[bytes] - | typing.AsyncIterable[bytes] - | None = None, - extensions: Extensions | None = None, - ) -> None: - """ - Parameters: - method: The HTTP request method, either as a string or bytes. - For example: `GET`. - url: The request URL, either as a `URL` instance, or as a string or bytes. - For example: `"https://www.example.com".` - headers: The HTTP request headers. - content: The content of the request body. - extensions: A dictionary of optional extra information included on - the request. Possible keys include `"timeout"`, and `"trace"`. - """ - self.method: bytes = enforce_bytes(method, name="method") - self.url: URL = enforce_url(url, name="url") - self.headers: list[tuple[bytes, bytes]] = enforce_headers( - headers, name="headers" - ) - self.stream: typing.Iterable[bytes] | typing.AsyncIterable[bytes] = ( - enforce_stream(content, name="content") - ) - self.extensions = {} if extensions is None else extensions - - if "target" in self.extensions: - self.url = URL( - scheme=self.url.scheme, - host=self.url.host, - port=self.url.port, - target=self.extensions["target"], - ) - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} [{self.method!r}]>" - - -class Response: - """ - An HTTP response. - """ - - def __init__( - self, - status: int, - *, - headers: HeaderTypes = None, - content: bytes - | typing.Iterable[bytes] - | typing.AsyncIterable[bytes] - | None = None, - extensions: Extensions | None = None, - ) -> None: - """ - Parameters: - status: The HTTP status code of the response. For example `200`. - headers: The HTTP response headers. - content: The content of the response body. - extensions: A dictionary of optional extra information included on - the responseself.Possible keys include `"http_version"`, - `"reason_phrase"`, and `"network_stream"`. - """ - self.status: int = status - self.headers: list[tuple[bytes, bytes]] = enforce_headers( - headers, name="headers" - ) - self.stream: typing.Iterable[bytes] | typing.AsyncIterable[bytes] = ( - enforce_stream(content, name="content") - ) - self.extensions = {} if extensions is None else extensions - - self._stream_consumed = False - - @property - def content(self) -> bytes: - if not hasattr(self, "_content"): - if isinstance(self.stream, typing.Iterable): - raise RuntimeError( - "Attempted to access 'response.content' on a streaming response. " - "Call 'response.read()' first." - ) - else: - raise RuntimeError( - "Attempted to access 'response.content' on a streaming response. " - "Call 'await response.aread()' first." - ) - return self._content - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} [{self.status}]>" - - # Sync interface... - - def read(self) -> bytes: - if not isinstance(self.stream, typing.Iterable): # pragma: nocover - raise RuntimeError( - "Attempted to read an asynchronous response using 'response.read()'. " - "You should use 'await response.aread()' instead." - ) - if not hasattr(self, "_content"): - self._content = b"".join([part for part in self.iter_stream()]) - return self._content - - def iter_stream(self) -> typing.Iterator[bytes]: - if not isinstance(self.stream, typing.Iterable): # pragma: nocover - raise RuntimeError( - "Attempted to stream an asynchronous response using 'for ... in " - "response.iter_stream()'. " - "You should use 'async for ... in response.aiter_stream()' instead." - ) - if self._stream_consumed: - raise RuntimeError( - "Attempted to call 'for ... in response.iter_stream()' more than once." - ) - self._stream_consumed = True - for chunk in self.stream: - yield chunk - - def close(self) -> None: - if not isinstance(self.stream, typing.Iterable): # pragma: nocover - raise RuntimeError( - "Attempted to close an asynchronous response using 'response.close()'. " - "You should use 'await response.aclose()' instead." - ) - if hasattr(self.stream, "close"): - self.stream.close() - - # Async interface... - - async def aread(self) -> bytes: - if not isinstance(self.stream, typing.AsyncIterable): # pragma: nocover - raise RuntimeError( - "Attempted to read an synchronous response using " - "'await response.aread()'. " - "You should use 'response.read()' instead." - ) - if not hasattr(self, "_content"): - self._content = b"".join([part async for part in self.aiter_stream()]) - return self._content - - async def aiter_stream(self) -> typing.AsyncIterator[bytes]: - if not isinstance(self.stream, typing.AsyncIterable): # pragma: nocover - raise RuntimeError( - "Attempted to stream an synchronous response using 'async for ... in " - "response.aiter_stream()'. " - "You should use 'for ... in response.iter_stream()' instead." - ) - if self._stream_consumed: - raise RuntimeError( - "Attempted to call 'async for ... in response.aiter_stream()' " - "more than once." - ) - self._stream_consumed = True - async for chunk in self.stream: - yield chunk - - async def aclose(self) -> None: - if not isinstance(self.stream, typing.AsyncIterable): # pragma: nocover - raise RuntimeError( - "Attempted to close a synchronous response using " - "'await response.aclose()'. " - "You should use 'response.close()' instead." - ) - if hasattr(self.stream, "aclose"): - await self.stream.aclose() - - -class Proxy: - def __init__( - self, - url: URL | bytes | str, - auth: tuple[bytes | str, bytes | str] | None = None, - headers: HeadersAsMapping | HeadersAsSequence | None = None, - ssl_context: ssl.SSLContext | None = None, - ): - self.url = enforce_url(url, name="url") - self.headers = enforce_headers(headers, name="headers") - self.ssl_context = ssl_context - - if auth is not None: - username = enforce_bytes(auth[0], name="auth") - password = enforce_bytes(auth[1], name="auth") - userpass = username + b":" + password - authorization = b"Basic " + base64.b64encode(userpass) - self.auth: tuple[bytes, bytes] | None = (username, password) - self.headers = [(b"Proxy-Authorization", authorization)] + self.headers - else: - self.auth = None diff --git a/venv/lib/python3.11/site-packages/httpcore/_ssl.py b/venv/lib/python3.11/site-packages/httpcore/_ssl.py deleted file mode 100755 index c99c5a6..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_ssl.py +++ /dev/null @@ -1,9 +0,0 @@ -import ssl - -import certifi - - -def default_ssl_context() -> ssl.SSLContext: - context = ssl.create_default_context() - context.load_verify_locations(certifi.where()) - return context diff --git a/venv/lib/python3.11/site-packages/httpcore/_sync/__init__.py b/venv/lib/python3.11/site-packages/httpcore/_sync/__init__.py deleted file mode 100755 index b476d76..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_sync/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -from .connection import HTTPConnection -from .connection_pool import ConnectionPool -from .http11 import HTTP11Connection -from .http_proxy import HTTPProxy -from .interfaces import ConnectionInterface - -try: - from .http2 import HTTP2Connection -except ImportError: # pragma: nocover - - class HTTP2Connection: # type: ignore - def __init__(self, *args, **kwargs) -> None: # type: ignore - raise RuntimeError( - "Attempted to use http2 support, but the `h2` package is not " - "installed. Use 'pip install httpcore[http2]'." - ) - - -try: - from .socks_proxy import SOCKSProxy -except ImportError: # pragma: nocover - - class SOCKSProxy: # type: ignore - def __init__(self, *args, **kwargs) -> None: # type: ignore - raise RuntimeError( - "Attempted to use SOCKS support, but the `socksio` package is not " - "installed. Use 'pip install httpcore[socks]'." - ) - - -__all__ = [ - "HTTPConnection", - "ConnectionPool", - "HTTPProxy", - "HTTP11Connection", - "HTTP2Connection", - "ConnectionInterface", - "SOCKSProxy", -] diff --git a/venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index f97db1f566cd2000af7e56ffe842649c6d956516..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1871 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 diff --git a/venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/connection_pool.cpython-311.pyc deleted file mode 100755 index 01db5ccfd485e03e0a6ece355d26a297204fabf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20921 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 diff --git a/venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/interfaces.cpython-311.pyc deleted file mode 100755 index d068c2147efec56ce9d940790c9ee43bf62ad2e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5973 zcmd@YO>Y~=b(TvmDT<;bQn4h*j>necgsM%(PTeAgW2CM>Q=2YqrD++Y^olzcH|Fj# zvrEY$Xut@3V2uK~6mU@VppzTHKIA8)IRrUMh0qEM7zj`lXf6c}Ie?*4-<##GNRviX zHz*2pmwY=r@6DSx?`z)dABTqG1g`bp{r-a|BZT}7U;HcLHKdIuH0~0OXi|k3QbCfi z9jb&1A@P(8vLjA$Wh#0oKEpfF&>3vpwxFlZzS31g@*WF!koiG;{m zqD5{KO}Q5$S(>EMu+K6xm&oNbFd}guAY*)F&^*P;iqnFu-HD)_*>@u^fK*ro5W?r*+ zi4|uT9iSZcU&~@R@bNopyyA}QW~oxsSdn{tifyWrC#eSm_07QhUBXB~(g>(b5_jki zvi5>Dd|N5VEc`*6mVk-_><(@8wsH@~-VeAI6m47^yB#h>H3?KP;f}Nya^7?pzowR0 zJ|nwPU*>4Zf_~F+<7`VIiou++rELz1h0+GK9q!7os?AZ*9lUq+^HG?ZM-ij|Y`*N{ zoW-hc&SlTTtg2)2_eB5uFgS0SjHi)ybjt|seplhlsd1B|%awe);uB|pr?gR)P*n~< z|7w6j9)!BR?&jfcyPmhMP)*ECp{{BVdej57u%&SkKMq0BJ;*lujDI-EC?K={h9zsR((R z&YYauHthnrA^(ajNR8+fvK-CxF<=X!6gE|Z@g49YES?E@ZM1nNB8aw-!V`pvGci7h zLxvC}5F`Xw0&*P zpY)j4M8%8pYl zS)ApH_M%zJ>3-PQ+3F&nf+^|~Pe)X?Ez1jlwZ8&zi+npqQhPp`|Mc9-=+V{Dqidr_ zo65uF0r&p5GtI6rLGiP}@i)G=HK?THj|hOr2%6DWl8jCKHGSaE=>tm(tLfZY zI@gS~Lh``w^~Bi67w=sB&86R7YF_#pUh;SHtBGA}iCrt=_oR8Qr|Zd+_2Kd6u#G1B z(`#cVC&?F+J5J{0&B>?3+Ru*f_e3k`O4@iE{Q74^`ag)+Uy!@7>uoo3HFAZBnA}#J z`!UIPfju(OXT}tN3GkdE*bAU5BKXVD<0_EKnQGL>dwkeK{1AtI3E&@agB$Po-*MyA z&SoC(J}wN7+~12m2R;%$nIK;zcAVTNiwG9^rxa8auv%=3-31lcy}NYh(vPHNDZeba z>AdBfH>wq8z~;%c)0|rza^gN1E~c=NBc(#=!YcJWJsR)Me^+3@24=@w&?w{+IQGv>yMMcfmL zMK@k78kSarTwZh&#o~uGwc=sKNH;EOj2jN5T{qco8>$J}mh)FpNL2bV;aO~>mvSgG zJ%F2!eFwm;;BF-d-M{|Eo9nM0Yz^;@Oti?ezzL#^tVLex8n7#}yG44zBbg|BkT!(4 z<5FaQi#!8(Vxoj4_yXaER1&%{?o0e*vL!zoIQgyb%sAEyJRANL(^WH#76|+~MruPR0v*r9v$exXv=F&Z~Mwa0dx=r+Zc%3cWu3j`VQrVq{yiVu3)a zEtcf%Q1tvMYD2ZgV1__IIOWkr=1_K{tk!Hu$OmC%S|3Fqp>6__Lh`XVoNQF5Q?hr< zI_jrKfwK%X1Lr|lp>CI%Mi&@0)J5vgeBHDbQ1{--g(3s#K;2NJ)++wgfi6J+(eBhk zmd8~Bw$iB;9M z!45zeNXKqeb-qZ!0T=`*Ol;HZj8zY*6@8u^q~Ldgx6L>j51H7I9xyCUUpn($#ux

ZOGe_kf?Q)ho~i-Ip9UH!#=i)$kr9X=NO zJ{R`+wikwWn`O-G^`&>vA;9U-1O4-{$jErO23N7D#^A$@p_|~9JsSq*wT^V-eUkBp zJ>`v6*lN+6APat%*9?H(JfE-ceui2-^hcmrei{K57OHH$sp zqd3t)A=+`CLyFfB97aG997pgLf|CeNAvlZRJOVrbc_p5xM1O>@2;POiy#%165)Jh! z5tZ%sjbM%04faQ|uN$Po*w+mb-6Y*3JmFE~%qUjo*J|)V4JvakLl-{+z*W3Myc@-` zomFfeL6m|3KPP!A#cwp?_~4y3#m5`*83)fOUWG1{)2*=0*m3VDaDrb1IxH*gIKY-H zNzyvmx6=LlnvAaazjZQnOWdvSpcHD6|329DmL!3)`@=_~|8XbwOy~&G_kxw3(~q$G KaUYzp&%XeQu7$q< diff --git a/venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpcore/_sync/__pycache__/socks_proxy.cpython-311.pyc deleted file mode 100755 index 8855114e25011f27f38cf5d29a5e34a8f97f3116..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16275 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 typing.Iterator[float]: - """ - Generate a geometric sequence that has a ratio of 2 and starts with 0. - - For example: - - `factor = 2`: `0, 2, 4, 8, 16, 32, 64, ...` - - `factor = 3`: `0, 3, 6, 12, 24, 48, 96, ...` - """ - yield 0 - for n in itertools.count(): - yield factor * 2**n - - -class HTTPConnection(ConnectionInterface): - def __init__( - self, - origin: Origin, - ssl_context: ssl.SSLContext | None = None, - keepalive_expiry: float | None = None, - http1: bool = True, - http2: bool = False, - retries: int = 0, - local_address: str | None = None, - uds: str | None = None, - network_backend: NetworkBackend | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> None: - self._origin = origin - self._ssl_context = ssl_context - self._keepalive_expiry = keepalive_expiry - self._http1 = http1 - self._http2 = http2 - self._retries = retries - self._local_address = local_address - self._uds = uds - - self._network_backend: NetworkBackend = ( - SyncBackend() if network_backend is None else network_backend - ) - self._connection: ConnectionInterface | None = None - self._connect_failed: bool = False - self._request_lock = Lock() - self._socket_options = socket_options - - def handle_request(self, request: Request) -> Response: - if not self.can_handle_request(request.url.origin): - raise RuntimeError( - f"Attempted to send request to {request.url.origin} on connection to {self._origin}" - ) - - try: - with self._request_lock: - if self._connection is None: - stream = self._connect(request) - - ssl_object = stream.get_extra_info("ssl_object") - http2_negotiated = ( - ssl_object is not None - and ssl_object.selected_alpn_protocol() == "h2" - ) - if http2_negotiated or (self._http2 and not self._http1): - from .http2 import HTTP2Connection - - self._connection = HTTP2Connection( - origin=self._origin, - stream=stream, - keepalive_expiry=self._keepalive_expiry, - ) - else: - self._connection = HTTP11Connection( - origin=self._origin, - stream=stream, - keepalive_expiry=self._keepalive_expiry, - ) - except BaseException as exc: - self._connect_failed = True - raise exc - - return self._connection.handle_request(request) - - def _connect(self, request: Request) -> NetworkStream: - timeouts = request.extensions.get("timeout", {}) - sni_hostname = request.extensions.get("sni_hostname", None) - timeout = timeouts.get("connect", None) - - retries_left = self._retries - delays = exponential_backoff(factor=RETRIES_BACKOFF_FACTOR) - - while True: - try: - if self._uds is None: - kwargs = { - "host": self._origin.host.decode("ascii"), - "port": self._origin.port, - "local_address": self._local_address, - "timeout": timeout, - "socket_options": self._socket_options, - } - with Trace("connect_tcp", logger, request, kwargs) as trace: - stream = self._network_backend.connect_tcp(**kwargs) - trace.return_value = stream - else: - kwargs = { - "path": self._uds, - "timeout": timeout, - "socket_options": self._socket_options, - } - with Trace( - "connect_unix_socket", logger, request, kwargs - ) as trace: - stream = self._network_backend.connect_unix_socket( - **kwargs - ) - trace.return_value = stream - - if self._origin.scheme in (b"https", b"wss"): - ssl_context = ( - default_ssl_context() - if self._ssl_context is None - else self._ssl_context - ) - alpn_protocols = ["http/1.1", "h2"] if self._http2 else ["http/1.1"] - ssl_context.set_alpn_protocols(alpn_protocols) - - kwargs = { - "ssl_context": ssl_context, - "server_hostname": sni_hostname - or self._origin.host.decode("ascii"), - "timeout": timeout, - } - with Trace("start_tls", logger, request, kwargs) as trace: - stream = stream.start_tls(**kwargs) - trace.return_value = stream - return stream - except (ConnectError, ConnectTimeout): - if retries_left <= 0: - raise - retries_left -= 1 - delay = next(delays) - with Trace("retry", logger, request, kwargs) as trace: - self._network_backend.sleep(delay) - - def can_handle_request(self, origin: Origin) -> bool: - return origin == self._origin - - def close(self) -> None: - if self._connection is not None: - with Trace("close", logger, None, {}): - self._connection.close() - - def is_available(self) -> bool: - if self._connection is None: - # If HTTP/2 support is enabled, and the resulting connection could - # end up as HTTP/2 then we should indicate the connection as being - # available to service multiple requests. - return ( - self._http2 - and (self._origin.scheme == b"https" or not self._http1) - and not self._connect_failed - ) - return self._connection.is_available() - - def has_expired(self) -> bool: - if self._connection is None: - return self._connect_failed - return self._connection.has_expired() - - def is_idle(self) -> bool: - if self._connection is None: - return self._connect_failed - return self._connection.is_idle() - - def is_closed(self) -> bool: - if self._connection is None: - return self._connect_failed - return self._connection.is_closed() - - def info(self) -> str: - if self._connection is None: - return "CONNECTION FAILED" if self._connect_failed else "CONNECTING" - return self._connection.info() - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} [{self.info()}]>" - - # These context managers are not used in the standard flow, but are - # useful for testing or working with connection instances directly. - - def __enter__(self) -> HTTPConnection: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - self.close() diff --git a/venv/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py b/venv/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py deleted file mode 100755 index 9ccfa53..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_sync/connection_pool.py +++ /dev/null @@ -1,420 +0,0 @@ -from __future__ import annotations - -import ssl -import sys -import types -import typing - -from .._backends.sync import SyncBackend -from .._backends.base import SOCKET_OPTION, NetworkBackend -from .._exceptions import ConnectionNotAvailable, UnsupportedProtocol -from .._models import Origin, Proxy, Request, Response -from .._synchronization import Event, ShieldCancellation, ThreadLock -from .connection import HTTPConnection -from .interfaces import ConnectionInterface, RequestInterface - - -class PoolRequest: - def __init__(self, request: Request) -> None: - self.request = request - self.connection: ConnectionInterface | None = None - self._connection_acquired = Event() - - def assign_to_connection(self, connection: ConnectionInterface | None) -> None: - self.connection = connection - self._connection_acquired.set() - - def clear_connection(self) -> None: - self.connection = None - self._connection_acquired = Event() - - def wait_for_connection( - self, timeout: float | None = None - ) -> ConnectionInterface: - if self.connection is None: - self._connection_acquired.wait(timeout=timeout) - assert self.connection is not None - return self.connection - - def is_queued(self) -> bool: - return self.connection is None - - -class ConnectionPool(RequestInterface): - """ - A connection pool for making HTTP requests. - """ - - def __init__( - self, - ssl_context: ssl.SSLContext | None = None, - proxy: Proxy | None = None, - max_connections: int | None = 10, - max_keepalive_connections: int | None = None, - keepalive_expiry: float | None = None, - http1: bool = True, - http2: bool = False, - retries: int = 0, - local_address: str | None = None, - uds: str | None = None, - network_backend: NetworkBackend | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> None: - """ - A connection pool for making HTTP requests. - - Parameters: - ssl_context: An SSL context to use for verifying connections. - If not specified, the default `httpcore.default_ssl_context()` - will be used. - max_connections: The maximum number of concurrent HTTP connections that - the pool should allow. Any attempt to send a request on a pool that - would exceed this amount will block until a connection is available. - max_keepalive_connections: The maximum number of idle HTTP connections - that will be maintained in the pool. - keepalive_expiry: The duration in seconds that an idle HTTP connection - may be maintained for before being expired from the pool. - http1: A boolean indicating if HTTP/1.1 requests should be supported - by the connection pool. Defaults to True. - http2: A boolean indicating if HTTP/2 requests should be supported by - the connection pool. Defaults to False. - retries: The maximum number of retries when trying to establish a - connection. - local_address: Local address to connect from. Can also be used to connect - using a particular address family. Using `local_address="0.0.0.0"` - will connect using an `AF_INET` address (IPv4), while using - `local_address="::"` will connect using an `AF_INET6` address (IPv6). - uds: Path to a Unix Domain Socket to use instead of TCP sockets. - network_backend: A backend instance to use for handling network I/O. - socket_options: Socket options that have to be included - in the TCP socket when the connection was established. - """ - self._ssl_context = ssl_context - self._proxy = proxy - self._max_connections = ( - sys.maxsize if max_connections is None else max_connections - ) - self._max_keepalive_connections = ( - sys.maxsize - if max_keepalive_connections is None - else max_keepalive_connections - ) - self._max_keepalive_connections = min( - self._max_connections, self._max_keepalive_connections - ) - - self._keepalive_expiry = keepalive_expiry - self._http1 = http1 - self._http2 = http2 - self._retries = retries - self._local_address = local_address - self._uds = uds - - self._network_backend = ( - SyncBackend() if network_backend is None else network_backend - ) - self._socket_options = socket_options - - # The mutable state on a connection pool is the queue of incoming requests, - # and the set of connections that are servicing those requests. - self._connections: list[ConnectionInterface] = [] - self._requests: list[PoolRequest] = [] - - # We only mutate the state of the connection pool within an 'optional_thread_lock' - # context. This holds a threading lock unless we're running in async mode, - # in which case it is a no-op. - self._optional_thread_lock = ThreadLock() - - def create_connection(self, origin: Origin) -> ConnectionInterface: - if self._proxy is not None: - if self._proxy.url.scheme in (b"socks5", b"socks5h"): - from .socks_proxy import Socks5Connection - - return Socks5Connection( - proxy_origin=self._proxy.url.origin, - proxy_auth=self._proxy.auth, - remote_origin=origin, - ssl_context=self._ssl_context, - keepalive_expiry=self._keepalive_expiry, - http1=self._http1, - http2=self._http2, - network_backend=self._network_backend, - ) - elif origin.scheme == b"http": - from .http_proxy import ForwardHTTPConnection - - return ForwardHTTPConnection( - proxy_origin=self._proxy.url.origin, - proxy_headers=self._proxy.headers, - proxy_ssl_context=self._proxy.ssl_context, - remote_origin=origin, - keepalive_expiry=self._keepalive_expiry, - network_backend=self._network_backend, - ) - from .http_proxy import TunnelHTTPConnection - - return TunnelHTTPConnection( - proxy_origin=self._proxy.url.origin, - proxy_headers=self._proxy.headers, - proxy_ssl_context=self._proxy.ssl_context, - remote_origin=origin, - ssl_context=self._ssl_context, - keepalive_expiry=self._keepalive_expiry, - http1=self._http1, - http2=self._http2, - network_backend=self._network_backend, - ) - - return HTTPConnection( - origin=origin, - ssl_context=self._ssl_context, - keepalive_expiry=self._keepalive_expiry, - http1=self._http1, - http2=self._http2, - retries=self._retries, - local_address=self._local_address, - uds=self._uds, - network_backend=self._network_backend, - socket_options=self._socket_options, - ) - - @property - def connections(self) -> list[ConnectionInterface]: - """ - Return a list of the connections currently in the pool. - - For example: - - ```python - >>> pool.connections - [ - , - , - , - ] - ``` - """ - return list(self._connections) - - def handle_request(self, request: Request) -> Response: - """ - Send an HTTP request, and return an HTTP response. - - This is the core implementation that is called into by `.request()` or `.stream()`. - """ - scheme = request.url.scheme.decode() - if scheme == "": - raise UnsupportedProtocol( - "Request URL is missing an 'http://' or 'https://' protocol." - ) - if scheme not in ("http", "https", "ws", "wss"): - raise UnsupportedProtocol( - f"Request URL has an unsupported protocol '{scheme}://'." - ) - - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("pool", None) - - with self._optional_thread_lock: - # Add the incoming request to our request queue. - pool_request = PoolRequest(request) - self._requests.append(pool_request) - - try: - while True: - with self._optional_thread_lock: - # Assign incoming requests to available connections, - # closing or creating new connections as required. - closing = self._assign_requests_to_connections() - self._close_connections(closing) - - # Wait until this request has an assigned connection. - connection = pool_request.wait_for_connection(timeout=timeout) - - try: - # Send the request on the assigned connection. - response = connection.handle_request( - pool_request.request - ) - except ConnectionNotAvailable: - # In some cases a connection may initially be available to - # handle a request, but then become unavailable. - # - # In this case we clear the connection and try again. - pool_request.clear_connection() - else: - break # pragma: nocover - - except BaseException as exc: - with self._optional_thread_lock: - # For any exception or cancellation we remove the request from - # the queue, and then re-assign requests to connections. - self._requests.remove(pool_request) - closing = self._assign_requests_to_connections() - - self._close_connections(closing) - raise exc from None - - # Return the response. Note that in this case we still have to manage - # the point at which the response is closed. - assert isinstance(response.stream, typing.Iterable) - return Response( - status=response.status, - headers=response.headers, - content=PoolByteStream( - stream=response.stream, pool_request=pool_request, pool=self - ), - extensions=response.extensions, - ) - - def _assign_requests_to_connections(self) -> list[ConnectionInterface]: - """ - Manage the state of the connection pool, assigning incoming - requests to connections as available. - - Called whenever a new request is added or removed from the pool. - - Any closing connections are returned, allowing the I/O for closing - those connections to be handled seperately. - """ - closing_connections = [] - - # First we handle cleaning up any connections that are closed, - # have expired their keep-alive, or surplus idle connections. - for connection in list(self._connections): - if connection.is_closed(): - # log: "removing closed connection" - self._connections.remove(connection) - elif connection.has_expired(): - # log: "closing expired connection" - self._connections.remove(connection) - closing_connections.append(connection) - elif ( - connection.is_idle() - and len([connection.is_idle() for connection in self._connections]) - > self._max_keepalive_connections - ): - # log: "closing idle connection" - self._connections.remove(connection) - closing_connections.append(connection) - - # Assign queued requests to connections. - queued_requests = [request for request in self._requests if request.is_queued()] - for pool_request in queued_requests: - origin = pool_request.request.url.origin - available_connections = [ - connection - for connection in self._connections - if connection.can_handle_request(origin) and connection.is_available() - ] - idle_connections = [ - connection for connection in self._connections if connection.is_idle() - ] - - # There are three cases for how we may be able to handle the request: - # - # 1. There is an existing connection that can handle the request. - # 2. We can create a new connection to handle the request. - # 3. We can close an idle connection and then create a new connection - # to handle the request. - if available_connections: - # log: "reusing existing connection" - connection = available_connections[0] - pool_request.assign_to_connection(connection) - elif len(self._connections) < self._max_connections: - # log: "creating new connection" - connection = self.create_connection(origin) - self._connections.append(connection) - pool_request.assign_to_connection(connection) - elif idle_connections: - # log: "closing idle connection" - connection = idle_connections[0] - self._connections.remove(connection) - closing_connections.append(connection) - # log: "creating new connection" - connection = self.create_connection(origin) - self._connections.append(connection) - pool_request.assign_to_connection(connection) - - return closing_connections - - def _close_connections(self, closing: list[ConnectionInterface]) -> None: - # Close connections which have been removed from the pool. - with ShieldCancellation(): - for connection in closing: - connection.close() - - def close(self) -> None: - # Explicitly close the connection pool. - # Clears all existing requests and connections. - with self._optional_thread_lock: - closing_connections = list(self._connections) - self._connections = [] - self._close_connections(closing_connections) - - def __enter__(self) -> ConnectionPool: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - self.close() - - def __repr__(self) -> str: - class_name = self.__class__.__name__ - with self._optional_thread_lock: - request_is_queued = [request.is_queued() for request in self._requests] - connection_is_idle = [ - connection.is_idle() for connection in self._connections - ] - - num_active_requests = request_is_queued.count(False) - num_queued_requests = request_is_queued.count(True) - num_active_connections = connection_is_idle.count(False) - num_idle_connections = connection_is_idle.count(True) - - requests_info = ( - f"Requests: {num_active_requests} active, {num_queued_requests} queued" - ) - connection_info = ( - f"Connections: {num_active_connections} active, {num_idle_connections} idle" - ) - - return f"<{class_name} [{requests_info} | {connection_info}]>" - - -class PoolByteStream: - def __init__( - self, - stream: typing.Iterable[bytes], - pool_request: PoolRequest, - pool: ConnectionPool, - ) -> None: - self._stream = stream - self._pool_request = pool_request - self._pool = pool - self._closed = False - - def __iter__(self) -> typing.Iterator[bytes]: - try: - for part in self._stream: - yield part - except BaseException as exc: - self.close() - raise exc from None - - def close(self) -> None: - if not self._closed: - self._closed = True - with ShieldCancellation(): - if hasattr(self._stream, "close"): - self._stream.close() - - with self._pool._optional_thread_lock: - self._pool._requests.remove(self._pool_request) - closing = self._pool._assign_requests_to_connections() - - self._pool._close_connections(closing) diff --git a/venv/lib/python3.11/site-packages/httpcore/_sync/http11.py b/venv/lib/python3.11/site-packages/httpcore/_sync/http11.py deleted file mode 100755 index ebd3a97..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_sync/http11.py +++ /dev/null @@ -1,379 +0,0 @@ -from __future__ import annotations - -import enum -import logging -import ssl -import time -import types -import typing - -import h11 - -from .._backends.base import NetworkStream -from .._exceptions import ( - ConnectionNotAvailable, - LocalProtocolError, - RemoteProtocolError, - WriteError, - map_exceptions, -) -from .._models import Origin, Request, Response -from .._synchronization import Lock, ShieldCancellation -from .._trace import Trace -from .interfaces import ConnectionInterface - -logger = logging.getLogger("httpcore.http11") - - -# A subset of `h11.Event` types supported by `_send_event` -H11SendEvent = typing.Union[ - h11.Request, - h11.Data, - h11.EndOfMessage, -] - - -class HTTPConnectionState(enum.IntEnum): - NEW = 0 - ACTIVE = 1 - IDLE = 2 - CLOSED = 3 - - -class HTTP11Connection(ConnectionInterface): - READ_NUM_BYTES = 64 * 1024 - MAX_INCOMPLETE_EVENT_SIZE = 100 * 1024 - - def __init__( - self, - origin: Origin, - stream: NetworkStream, - keepalive_expiry: float | None = None, - ) -> None: - self._origin = origin - self._network_stream = stream - self._keepalive_expiry: float | None = keepalive_expiry - self._expire_at: float | None = None - self._state = HTTPConnectionState.NEW - self._state_lock = Lock() - self._request_count = 0 - self._h11_state = h11.Connection( - our_role=h11.CLIENT, - max_incomplete_event_size=self.MAX_INCOMPLETE_EVENT_SIZE, - ) - - def handle_request(self, request: Request) -> Response: - if not self.can_handle_request(request.url.origin): - raise RuntimeError( - f"Attempted to send request to {request.url.origin} on connection " - f"to {self._origin}" - ) - - with self._state_lock: - if self._state in (HTTPConnectionState.NEW, HTTPConnectionState.IDLE): - self._request_count += 1 - self._state = HTTPConnectionState.ACTIVE - self._expire_at = None - else: - raise ConnectionNotAvailable() - - try: - kwargs = {"request": request} - try: - with Trace( - "send_request_headers", logger, request, kwargs - ) as trace: - self._send_request_headers(**kwargs) - with Trace("send_request_body", logger, request, kwargs) as trace: - self._send_request_body(**kwargs) - except WriteError: - # If we get a write error while we're writing the request, - # then we supress this error and move on to attempting to - # read the response. Servers can sometimes close the request - # pre-emptively and then respond with a well formed HTTP - # error response. - pass - - with Trace( - "receive_response_headers", logger, request, kwargs - ) as trace: - ( - http_version, - status, - reason_phrase, - headers, - trailing_data, - ) = self._receive_response_headers(**kwargs) - trace.return_value = ( - http_version, - status, - reason_phrase, - headers, - ) - - network_stream = self._network_stream - - # CONNECT or Upgrade request - if (status == 101) or ( - (request.method == b"CONNECT") and (200 <= status < 300) - ): - network_stream = HTTP11UpgradeStream(network_stream, trailing_data) - - return Response( - status=status, - headers=headers, - content=HTTP11ConnectionByteStream(self, request), - extensions={ - "http_version": http_version, - "reason_phrase": reason_phrase, - "network_stream": network_stream, - }, - ) - except BaseException as exc: - with ShieldCancellation(): - with Trace("response_closed", logger, request) as trace: - self._response_closed() - raise exc - - # Sending the request... - - def _send_request_headers(self, request: Request) -> None: - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("write", None) - - with map_exceptions({h11.LocalProtocolError: LocalProtocolError}): - event = h11.Request( - method=request.method, - target=request.url.target, - headers=request.headers, - ) - self._send_event(event, timeout=timeout) - - def _send_request_body(self, request: Request) -> None: - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("write", None) - - assert isinstance(request.stream, typing.Iterable) - for chunk in request.stream: - event = h11.Data(data=chunk) - self._send_event(event, timeout=timeout) - - self._send_event(h11.EndOfMessage(), timeout=timeout) - - def _send_event(self, event: h11.Event, timeout: float | None = None) -> None: - bytes_to_send = self._h11_state.send(event) - if bytes_to_send is not None: - self._network_stream.write(bytes_to_send, timeout=timeout) - - # Receiving the response... - - def _receive_response_headers( - self, request: Request - ) -> tuple[bytes, int, bytes, list[tuple[bytes, bytes]], bytes]: - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("read", None) - - while True: - event = self._receive_event(timeout=timeout) - if isinstance(event, h11.Response): - break - if ( - isinstance(event, h11.InformationalResponse) - and event.status_code == 101 - ): - break - - http_version = b"HTTP/" + event.http_version - - # h11 version 0.11+ supports a `raw_items` interface to get the - # raw header casing, rather than the enforced lowercase headers. - headers = event.headers.raw_items() - - trailing_data, _ = self._h11_state.trailing_data - - return http_version, event.status_code, event.reason, headers, trailing_data - - def _receive_response_body( - self, request: Request - ) -> typing.Iterator[bytes]: - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("read", None) - - while True: - event = self._receive_event(timeout=timeout) - if isinstance(event, h11.Data): - yield bytes(event.data) - elif isinstance(event, (h11.EndOfMessage, h11.PAUSED)): - break - - def _receive_event( - self, timeout: float | None = None - ) -> h11.Event | type[h11.PAUSED]: - while True: - with map_exceptions({h11.RemoteProtocolError: RemoteProtocolError}): - event = self._h11_state.next_event() - - if event is h11.NEED_DATA: - data = self._network_stream.read( - self.READ_NUM_BYTES, timeout=timeout - ) - - # If we feed this case through h11 we'll raise an exception like: - # - # httpcore.RemoteProtocolError: can't handle event type - # ConnectionClosed when role=SERVER and state=SEND_RESPONSE - # - # Which is accurate, but not very informative from an end-user - # perspective. Instead we handle this case distinctly and treat - # it as a ConnectError. - if data == b"" and self._h11_state.their_state == h11.SEND_RESPONSE: - msg = "Server disconnected without sending a response." - raise RemoteProtocolError(msg) - - self._h11_state.receive_data(data) - else: - # mypy fails to narrow the type in the above if statement above - return event # type: ignore[return-value] - - def _response_closed(self) -> None: - with self._state_lock: - if ( - self._h11_state.our_state is h11.DONE - and self._h11_state.their_state is h11.DONE - ): - self._state = HTTPConnectionState.IDLE - self._h11_state.start_next_cycle() - if self._keepalive_expiry is not None: - now = time.monotonic() - self._expire_at = now + self._keepalive_expiry - else: - self.close() - - # Once the connection is no longer required... - - def close(self) -> None: - # Note that this method unilaterally closes the connection, and does - # not have any kind of locking in place around it. - self._state = HTTPConnectionState.CLOSED - self._network_stream.close() - - # The ConnectionInterface methods provide information about the state of - # the connection, allowing for a connection pooling implementation to - # determine when to reuse and when to close the connection... - - def can_handle_request(self, origin: Origin) -> bool: - return origin == self._origin - - def is_available(self) -> bool: - # Note that HTTP/1.1 connections in the "NEW" state are not treated as - # being "available". The control flow which created the connection will - # be able to send an outgoing request, but the connection will not be - # acquired from the connection pool for any other request. - return self._state == HTTPConnectionState.IDLE - - def has_expired(self) -> bool: - now = time.monotonic() - keepalive_expired = self._expire_at is not None and now > self._expire_at - - # If the HTTP connection is idle but the socket is readable, then the - # only valid state is that the socket is about to return b"", indicating - # a server-initiated disconnect. - server_disconnected = ( - self._state == HTTPConnectionState.IDLE - and self._network_stream.get_extra_info("is_readable") - ) - - return keepalive_expired or server_disconnected - - def is_idle(self) -> bool: - return self._state == HTTPConnectionState.IDLE - - def is_closed(self) -> bool: - return self._state == HTTPConnectionState.CLOSED - - def info(self) -> str: - origin = str(self._origin) - return ( - f"{origin!r}, HTTP/1.1, {self._state.name}, " - f"Request Count: {self._request_count}" - ) - - def __repr__(self) -> str: - class_name = self.__class__.__name__ - origin = str(self._origin) - return ( - f"<{class_name} [{origin!r}, {self._state.name}, " - f"Request Count: {self._request_count}]>" - ) - - # These context managers are not used in the standard flow, but are - # useful for testing or working with connection instances directly. - - def __enter__(self) -> HTTP11Connection: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - self.close() - - -class HTTP11ConnectionByteStream: - def __init__(self, connection: HTTP11Connection, request: Request) -> None: - self._connection = connection - self._request = request - self._closed = False - - def __iter__(self) -> typing.Iterator[bytes]: - kwargs = {"request": self._request} - try: - with Trace("receive_response_body", logger, self._request, kwargs): - for chunk in self._connection._receive_response_body(**kwargs): - yield chunk - except BaseException as exc: - # If we get an exception while streaming the response, - # we want to close the response (and possibly the connection) - # before raising that exception. - with ShieldCancellation(): - self.close() - raise exc - - def close(self) -> None: - if not self._closed: - self._closed = True - with Trace("response_closed", logger, self._request): - self._connection._response_closed() - - -class HTTP11UpgradeStream(NetworkStream): - def __init__(self, stream: NetworkStream, leading_data: bytes) -> None: - self._stream = stream - self._leading_data = leading_data - - def read(self, max_bytes: int, timeout: float | None = None) -> bytes: - if self._leading_data: - buffer = self._leading_data[:max_bytes] - self._leading_data = self._leading_data[max_bytes:] - return buffer - else: - return self._stream.read(max_bytes, timeout) - - def write(self, buffer: bytes, timeout: float | None = None) -> None: - self._stream.write(buffer, timeout) - - def close(self) -> None: - self._stream.close() - - def start_tls( - self, - ssl_context: ssl.SSLContext, - server_hostname: str | None = None, - timeout: float | None = None, - ) -> NetworkStream: - return self._stream.start_tls(ssl_context, server_hostname, timeout) - - def get_extra_info(self, info: str) -> typing.Any: - return self._stream.get_extra_info(info) diff --git a/venv/lib/python3.11/site-packages/httpcore/_sync/http2.py b/venv/lib/python3.11/site-packages/httpcore/_sync/http2.py deleted file mode 100755 index ddcc189..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_sync/http2.py +++ /dev/null @@ -1,592 +0,0 @@ -from __future__ import annotations - -import enum -import logging -import time -import types -import typing - -import h2.config -import h2.connection -import h2.events -import h2.exceptions -import h2.settings - -from .._backends.base import NetworkStream -from .._exceptions import ( - ConnectionNotAvailable, - LocalProtocolError, - RemoteProtocolError, -) -from .._models import Origin, Request, Response -from .._synchronization import Lock, Semaphore, ShieldCancellation -from .._trace import Trace -from .interfaces import ConnectionInterface - -logger = logging.getLogger("httpcore.http2") - - -def has_body_headers(request: Request) -> bool: - return any( - k.lower() == b"content-length" or k.lower() == b"transfer-encoding" - for k, v in request.headers - ) - - -class HTTPConnectionState(enum.IntEnum): - ACTIVE = 1 - IDLE = 2 - CLOSED = 3 - - -class HTTP2Connection(ConnectionInterface): - READ_NUM_BYTES = 64 * 1024 - CONFIG = h2.config.H2Configuration(validate_inbound_headers=False) - - def __init__( - self, - origin: Origin, - stream: NetworkStream, - keepalive_expiry: float | None = None, - ): - self._origin = origin - self._network_stream = stream - self._keepalive_expiry: float | None = keepalive_expiry - self._h2_state = h2.connection.H2Connection(config=self.CONFIG) - self._state = HTTPConnectionState.IDLE - self._expire_at: float | None = None - self._request_count = 0 - self._init_lock = Lock() - self._state_lock = Lock() - self._read_lock = Lock() - self._write_lock = Lock() - self._sent_connection_init = False - self._used_all_stream_ids = False - self._connection_error = False - - # Mapping from stream ID to response stream events. - self._events: dict[ - int, - list[ - h2.events.ResponseReceived - | h2.events.DataReceived - | h2.events.StreamEnded - | h2.events.StreamReset, - ], - ] = {} - - # Connection terminated events are stored as state since - # we need to handle them for all streams. - self._connection_terminated: h2.events.ConnectionTerminated | None = None - - self._read_exception: Exception | None = None - self._write_exception: Exception | None = None - - def handle_request(self, request: Request) -> Response: - if not self.can_handle_request(request.url.origin): - # This cannot occur in normal operation, since the connection pool - # will only send requests on connections that handle them. - # It's in place simply for resilience as a guard against incorrect - # usage, for anyone working directly with httpcore connections. - raise RuntimeError( - f"Attempted to send request to {request.url.origin} on connection " - f"to {self._origin}" - ) - - with self._state_lock: - if self._state in (HTTPConnectionState.ACTIVE, HTTPConnectionState.IDLE): - self._request_count += 1 - self._expire_at = None - self._state = HTTPConnectionState.ACTIVE - else: - raise ConnectionNotAvailable() - - with self._init_lock: - if not self._sent_connection_init: - try: - sci_kwargs = {"request": request} - with Trace( - "send_connection_init", logger, request, sci_kwargs - ): - self._send_connection_init(**sci_kwargs) - except BaseException as exc: - with ShieldCancellation(): - self.close() - raise exc - - self._sent_connection_init = True - - # Initially start with just 1 until the remote server provides - # its max_concurrent_streams value - self._max_streams = 1 - - local_settings_max_streams = ( - self._h2_state.local_settings.max_concurrent_streams - ) - self._max_streams_semaphore = Semaphore(local_settings_max_streams) - - for _ in range(local_settings_max_streams - self._max_streams): - self._max_streams_semaphore.acquire() - - self._max_streams_semaphore.acquire() - - try: - stream_id = self._h2_state.get_next_available_stream_id() - self._events[stream_id] = [] - except h2.exceptions.NoAvailableStreamIDError: # pragma: nocover - self._used_all_stream_ids = True - self._request_count -= 1 - raise ConnectionNotAvailable() - - try: - kwargs = {"request": request, "stream_id": stream_id} - with Trace("send_request_headers", logger, request, kwargs): - self._send_request_headers(request=request, stream_id=stream_id) - with Trace("send_request_body", logger, request, kwargs): - self._send_request_body(request=request, stream_id=stream_id) - with Trace( - "receive_response_headers", logger, request, kwargs - ) as trace: - status, headers = self._receive_response( - request=request, stream_id=stream_id - ) - trace.return_value = (status, headers) - - return Response( - status=status, - headers=headers, - content=HTTP2ConnectionByteStream(self, request, stream_id=stream_id), - extensions={ - "http_version": b"HTTP/2", - "network_stream": self._network_stream, - "stream_id": stream_id, - }, - ) - except BaseException as exc: # noqa: PIE786 - with ShieldCancellation(): - kwargs = {"stream_id": stream_id} - with Trace("response_closed", logger, request, kwargs): - self._response_closed(stream_id=stream_id) - - if isinstance(exc, h2.exceptions.ProtocolError): - # One case where h2 can raise a protocol error is when a - # closed frame has been seen by the state machine. - # - # This happens when one stream is reading, and encounters - # a GOAWAY event. Other flows of control may then raise - # a protocol error at any point they interact with the 'h2_state'. - # - # In this case we'll have stored the event, and should raise - # it as a RemoteProtocolError. - if self._connection_terminated: # pragma: nocover - raise RemoteProtocolError(self._connection_terminated) - # If h2 raises a protocol error in some other state then we - # must somehow have made a protocol violation. - raise LocalProtocolError(exc) # pragma: nocover - - raise exc - - def _send_connection_init(self, request: Request) -> None: - """ - The HTTP/2 connection requires some initial setup before we can start - using individual request/response streams on it. - """ - # Need to set these manually here instead of manipulating via - # __setitem__() otherwise the H2Connection will emit SettingsUpdate - # frames in addition to sending the undesired defaults. - self._h2_state.local_settings = h2.settings.Settings( - client=True, - initial_values={ - # Disable PUSH_PROMISE frames from the server since we don't do anything - # with them for now. Maybe when we support caching? - h2.settings.SettingCodes.ENABLE_PUSH: 0, - # These two are taken from h2 for safe defaults - h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: 100, - h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE: 65536, - }, - ) - - # Some websites (*cough* Yahoo *cough*) balk at this setting being - # present in the initial handshake since it's not defined in the original - # RFC despite the RFC mandating ignoring settings you don't know about. - del self._h2_state.local_settings[ - h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL - ] - - self._h2_state.initiate_connection() - self._h2_state.increment_flow_control_window(2**24) - self._write_outgoing_data(request) - - # Sending the request... - - def _send_request_headers(self, request: Request, stream_id: int) -> None: - """ - Send the request headers to a given stream ID. - """ - end_stream = not has_body_headers(request) - - # In HTTP/2 the ':authority' pseudo-header is used instead of 'Host'. - # In order to gracefully handle HTTP/1.1 and HTTP/2 we always require - # HTTP/1.1 style headers, and map them appropriately if we end up on - # an HTTP/2 connection. - authority = [v for k, v in request.headers if k.lower() == b"host"][0] - - headers = [ - (b":method", request.method), - (b":authority", authority), - (b":scheme", request.url.scheme), - (b":path", request.url.target), - ] + [ - (k.lower(), v) - for k, v in request.headers - if k.lower() - not in ( - b"host", - b"transfer-encoding", - ) - ] - - self._h2_state.send_headers(stream_id, headers, end_stream=end_stream) - self._h2_state.increment_flow_control_window(2**24, stream_id=stream_id) - self._write_outgoing_data(request) - - def _send_request_body(self, request: Request, stream_id: int) -> None: - """ - Iterate over the request body sending it to a given stream ID. - """ - if not has_body_headers(request): - return - - assert isinstance(request.stream, typing.Iterable) - for data in request.stream: - self._send_stream_data(request, stream_id, data) - self._send_end_stream(request, stream_id) - - def _send_stream_data( - self, request: Request, stream_id: int, data: bytes - ) -> None: - """ - Send a single chunk of data in one or more data frames. - """ - while data: - max_flow = self._wait_for_outgoing_flow(request, stream_id) - chunk_size = min(len(data), max_flow) - chunk, data = data[:chunk_size], data[chunk_size:] - self._h2_state.send_data(stream_id, chunk) - self._write_outgoing_data(request) - - def _send_end_stream(self, request: Request, stream_id: int) -> None: - """ - Send an empty data frame on on a given stream ID with the END_STREAM flag set. - """ - self._h2_state.end_stream(stream_id) - self._write_outgoing_data(request) - - # Receiving the response... - - def _receive_response( - self, request: Request, stream_id: int - ) -> tuple[int, list[tuple[bytes, bytes]]]: - """ - Return the response status code and headers for a given stream ID. - """ - while True: - event = self._receive_stream_event(request, stream_id) - if isinstance(event, h2.events.ResponseReceived): - break - - status_code = 200 - headers = [] - assert event.headers is not None - for k, v in event.headers: - if k == b":status": - status_code = int(v.decode("ascii", errors="ignore")) - elif not k.startswith(b":"): - headers.append((k, v)) - - return (status_code, headers) - - def _receive_response_body( - self, request: Request, stream_id: int - ) -> typing.Iterator[bytes]: - """ - Iterator that returns the bytes of the response body for a given stream ID. - """ - while True: - event = self._receive_stream_event(request, stream_id) - if isinstance(event, h2.events.DataReceived): - assert event.flow_controlled_length is not None - assert event.data is not None - amount = event.flow_controlled_length - self._h2_state.acknowledge_received_data(amount, stream_id) - self._write_outgoing_data(request) - yield event.data - elif isinstance(event, h2.events.StreamEnded): - break - - def _receive_stream_event( - self, request: Request, stream_id: int - ) -> h2.events.ResponseReceived | h2.events.DataReceived | h2.events.StreamEnded: - """ - Return the next available event for a given stream ID. - - Will read more data from the network if required. - """ - while not self._events.get(stream_id): - self._receive_events(request, stream_id) - event = self._events[stream_id].pop(0) - if isinstance(event, h2.events.StreamReset): - raise RemoteProtocolError(event) - return event - - def _receive_events( - self, request: Request, stream_id: int | None = None - ) -> None: - """ - Read some data from the network until we see one or more events - for a given stream ID. - """ - with self._read_lock: - if self._connection_terminated is not None: - last_stream_id = self._connection_terminated.last_stream_id - if stream_id and last_stream_id and stream_id > last_stream_id: - self._request_count -= 1 - raise ConnectionNotAvailable() - raise RemoteProtocolError(self._connection_terminated) - - # This conditional is a bit icky. We don't want to block reading if we've - # actually got an event to return for a given stream. We need to do that - # check *within* the atomic read lock. Though it also need to be optional, - # because when we call it from `_wait_for_outgoing_flow` we *do* want to - # block until we've available flow control, event when we have events - # pending for the stream ID we're attempting to send on. - if stream_id is None or not self._events.get(stream_id): - events = self._read_incoming_data(request) - for event in events: - if isinstance(event, h2.events.RemoteSettingsChanged): - with Trace( - "receive_remote_settings", logger, request - ) as trace: - self._receive_remote_settings_change(event) - trace.return_value = event - - elif isinstance( - event, - ( - h2.events.ResponseReceived, - h2.events.DataReceived, - h2.events.StreamEnded, - h2.events.StreamReset, - ), - ): - if event.stream_id in self._events: - self._events[event.stream_id].append(event) - - elif isinstance(event, h2.events.ConnectionTerminated): - self._connection_terminated = event - - self._write_outgoing_data(request) - - def _receive_remote_settings_change( - self, event: h2.events.RemoteSettingsChanged - ) -> None: - max_concurrent_streams = event.changed_settings.get( - h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS - ) - if max_concurrent_streams: - new_max_streams = min( - max_concurrent_streams.new_value, - self._h2_state.local_settings.max_concurrent_streams, - ) - if new_max_streams and new_max_streams != self._max_streams: - while new_max_streams > self._max_streams: - self._max_streams_semaphore.release() - self._max_streams += 1 - while new_max_streams < self._max_streams: - self._max_streams_semaphore.acquire() - self._max_streams -= 1 - - def _response_closed(self, stream_id: int) -> None: - self._max_streams_semaphore.release() - del self._events[stream_id] - with self._state_lock: - if self._connection_terminated and not self._events: - self.close() - - elif self._state == HTTPConnectionState.ACTIVE and not self._events: - self._state = HTTPConnectionState.IDLE - if self._keepalive_expiry is not None: - now = time.monotonic() - self._expire_at = now + self._keepalive_expiry - if self._used_all_stream_ids: # pragma: nocover - self.close() - - def close(self) -> None: - # Note that this method unilaterally closes the connection, and does - # not have any kind of locking in place around it. - self._h2_state.close_connection() - self._state = HTTPConnectionState.CLOSED - self._network_stream.close() - - # Wrappers around network read/write operations... - - def _read_incoming_data(self, request: Request) -> list[h2.events.Event]: - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("read", None) - - if self._read_exception is not None: - raise self._read_exception # pragma: nocover - - try: - data = self._network_stream.read(self.READ_NUM_BYTES, timeout) - if data == b"": - raise RemoteProtocolError("Server disconnected") - except Exception as exc: - # If we get a network error we should: - # - # 1. Save the exception and just raise it immediately on any future reads. - # (For example, this means that a single read timeout or disconnect will - # immediately close all pending streams. Without requiring multiple - # sequential timeouts.) - # 2. Mark the connection as errored, so that we don't accept any other - # incoming requests. - self._read_exception = exc - self._connection_error = True - raise exc - - events: list[h2.events.Event] = self._h2_state.receive_data(data) - - return events - - def _write_outgoing_data(self, request: Request) -> None: - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("write", None) - - with self._write_lock: - data_to_send = self._h2_state.data_to_send() - - if self._write_exception is not None: - raise self._write_exception # pragma: nocover - - try: - self._network_stream.write(data_to_send, timeout) - except Exception as exc: # pragma: nocover - # If we get a network error we should: - # - # 1. Save the exception and just raise it immediately on any future write. - # (For example, this means that a single write timeout or disconnect will - # immediately close all pending streams. Without requiring multiple - # sequential timeouts.) - # 2. Mark the connection as errored, so that we don't accept any other - # incoming requests. - self._write_exception = exc - self._connection_error = True - raise exc - - # Flow control... - - def _wait_for_outgoing_flow(self, request: Request, stream_id: int) -> int: - """ - Returns the maximum allowable outgoing flow for a given stream. - - If the allowable flow is zero, then waits on the network until - WindowUpdated frames have increased the flow rate. - https://tools.ietf.org/html/rfc7540#section-6.9 - """ - local_flow: int = self._h2_state.local_flow_control_window(stream_id) - max_frame_size: int = self._h2_state.max_outbound_frame_size - flow = min(local_flow, max_frame_size) - while flow == 0: - self._receive_events(request) - local_flow = self._h2_state.local_flow_control_window(stream_id) - max_frame_size = self._h2_state.max_outbound_frame_size - flow = min(local_flow, max_frame_size) - return flow - - # Interface for connection pooling... - - def can_handle_request(self, origin: Origin) -> bool: - return origin == self._origin - - def is_available(self) -> bool: - return ( - self._state != HTTPConnectionState.CLOSED - and not self._connection_error - and not self._used_all_stream_ids - and not ( - self._h2_state.state_machine.state - == h2.connection.ConnectionState.CLOSED - ) - ) - - def has_expired(self) -> bool: - now = time.monotonic() - return self._expire_at is not None and now > self._expire_at - - def is_idle(self) -> bool: - return self._state == HTTPConnectionState.IDLE - - def is_closed(self) -> bool: - return self._state == HTTPConnectionState.CLOSED - - def info(self) -> str: - origin = str(self._origin) - return ( - f"{origin!r}, HTTP/2, {self._state.name}, " - f"Request Count: {self._request_count}" - ) - - def __repr__(self) -> str: - class_name = self.__class__.__name__ - origin = str(self._origin) - return ( - f"<{class_name} [{origin!r}, {self._state.name}, " - f"Request Count: {self._request_count}]>" - ) - - # These context managers are not used in the standard flow, but are - # useful for testing or working with connection instances directly. - - def __enter__(self) -> HTTP2Connection: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - self.close() - - -class HTTP2ConnectionByteStream: - def __init__( - self, connection: HTTP2Connection, request: Request, stream_id: int - ) -> None: - self._connection = connection - self._request = request - self._stream_id = stream_id - self._closed = False - - def __iter__(self) -> typing.Iterator[bytes]: - kwargs = {"request": self._request, "stream_id": self._stream_id} - try: - with Trace("receive_response_body", logger, self._request, kwargs): - for chunk in self._connection._receive_response_body( - request=self._request, stream_id=self._stream_id - ): - yield chunk - except BaseException as exc: - # If we get an exception while streaming the response, - # we want to close the response (and possibly the connection) - # before raising that exception. - with ShieldCancellation(): - self.close() - raise exc - - def close(self) -> None: - if not self._closed: - self._closed = True - kwargs = {"stream_id": self._stream_id} - with Trace("response_closed", logger, self._request, kwargs): - self._connection._response_closed(stream_id=self._stream_id) diff --git a/venv/lib/python3.11/site-packages/httpcore/_sync/http_proxy.py b/venv/lib/python3.11/site-packages/httpcore/_sync/http_proxy.py deleted file mode 100755 index ecca88f..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_sync/http_proxy.py +++ /dev/null @@ -1,367 +0,0 @@ -from __future__ import annotations - -import base64 -import logging -import ssl -import typing - -from .._backends.base import SOCKET_OPTION, NetworkBackend -from .._exceptions import ProxyError -from .._models import ( - URL, - Origin, - Request, - Response, - enforce_bytes, - enforce_headers, - enforce_url, -) -from .._ssl import default_ssl_context -from .._synchronization import Lock -from .._trace import Trace -from .connection import HTTPConnection -from .connection_pool import ConnectionPool -from .http11 import HTTP11Connection -from .interfaces import ConnectionInterface - -ByteOrStr = typing.Union[bytes, str] -HeadersAsSequence = typing.Sequence[typing.Tuple[ByteOrStr, ByteOrStr]] -HeadersAsMapping = typing.Mapping[ByteOrStr, ByteOrStr] - - -logger = logging.getLogger("httpcore.proxy") - - -def merge_headers( - default_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, - override_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, -) -> list[tuple[bytes, bytes]]: - """ - Append default_headers and override_headers, de-duplicating if a key exists - in both cases. - """ - default_headers = [] if default_headers is None else list(default_headers) - override_headers = [] if override_headers is None else list(override_headers) - has_override = set(key.lower() for key, value in override_headers) - default_headers = [ - (key, value) - for key, value in default_headers - if key.lower() not in has_override - ] - return default_headers + override_headers - - -class HTTPProxy(ConnectionPool): # pragma: nocover - """ - A connection pool that sends requests via an HTTP proxy. - """ - - def __init__( - self, - proxy_url: URL | bytes | str, - proxy_auth: tuple[bytes | str, bytes | str] | None = None, - proxy_headers: HeadersAsMapping | HeadersAsSequence | None = None, - ssl_context: ssl.SSLContext | None = None, - proxy_ssl_context: ssl.SSLContext | None = None, - max_connections: int | None = 10, - max_keepalive_connections: int | None = None, - keepalive_expiry: float | None = None, - http1: bool = True, - http2: bool = False, - retries: int = 0, - local_address: str | None = None, - uds: str | None = None, - network_backend: NetworkBackend | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> None: - """ - A connection pool for making HTTP requests. - - Parameters: - proxy_url: The URL to use when connecting to the proxy server. - For example `"http://127.0.0.1:8080/"`. - proxy_auth: Any proxy authentication as a two-tuple of - (username, password). May be either bytes or ascii-only str. - proxy_headers: Any HTTP headers to use for the proxy requests. - For example `{"Proxy-Authorization": "Basic :"}`. - ssl_context: An SSL context to use for verifying connections. - If not specified, the default `httpcore.default_ssl_context()` - will be used. - proxy_ssl_context: The same as `ssl_context`, but for a proxy server rather than a remote origin. - max_connections: The maximum number of concurrent HTTP connections that - the pool should allow. Any attempt to send a request on a pool that - would exceed this amount will block until a connection is available. - max_keepalive_connections: The maximum number of idle HTTP connections - that will be maintained in the pool. - keepalive_expiry: The duration in seconds that an idle HTTP connection - may be maintained for before being expired from the pool. - http1: A boolean indicating if HTTP/1.1 requests should be supported - by the connection pool. Defaults to True. - http2: A boolean indicating if HTTP/2 requests should be supported by - the connection pool. Defaults to False. - retries: The maximum number of retries when trying to establish - a connection. - local_address: Local address to connect from. Can also be used to - connect using a particular address family. Using - `local_address="0.0.0.0"` will connect using an `AF_INET` address - (IPv4), while using `local_address="::"` will connect using an - `AF_INET6` address (IPv6). - uds: Path to a Unix Domain Socket to use instead of TCP sockets. - network_backend: A backend instance to use for handling network I/O. - """ - super().__init__( - ssl_context=ssl_context, - max_connections=max_connections, - max_keepalive_connections=max_keepalive_connections, - keepalive_expiry=keepalive_expiry, - http1=http1, - http2=http2, - network_backend=network_backend, - retries=retries, - local_address=local_address, - uds=uds, - socket_options=socket_options, - ) - - self._proxy_url = enforce_url(proxy_url, name="proxy_url") - if ( - self._proxy_url.scheme == b"http" and proxy_ssl_context is not None - ): # pragma: no cover - raise RuntimeError( - "The `proxy_ssl_context` argument is not allowed for the http scheme" - ) - - self._ssl_context = ssl_context - self._proxy_ssl_context = proxy_ssl_context - self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") - if proxy_auth is not None: - username = enforce_bytes(proxy_auth[0], name="proxy_auth") - password = enforce_bytes(proxy_auth[1], name="proxy_auth") - userpass = username + b":" + password - authorization = b"Basic " + base64.b64encode(userpass) - self._proxy_headers = [ - (b"Proxy-Authorization", authorization) - ] + self._proxy_headers - - def create_connection(self, origin: Origin) -> ConnectionInterface: - if origin.scheme == b"http": - return ForwardHTTPConnection( - proxy_origin=self._proxy_url.origin, - proxy_headers=self._proxy_headers, - remote_origin=origin, - keepalive_expiry=self._keepalive_expiry, - network_backend=self._network_backend, - proxy_ssl_context=self._proxy_ssl_context, - ) - return TunnelHTTPConnection( - proxy_origin=self._proxy_url.origin, - proxy_headers=self._proxy_headers, - remote_origin=origin, - ssl_context=self._ssl_context, - proxy_ssl_context=self._proxy_ssl_context, - keepalive_expiry=self._keepalive_expiry, - http1=self._http1, - http2=self._http2, - network_backend=self._network_backend, - ) - - -class ForwardHTTPConnection(ConnectionInterface): - def __init__( - self, - proxy_origin: Origin, - remote_origin: Origin, - proxy_headers: HeadersAsMapping | HeadersAsSequence | None = None, - keepalive_expiry: float | None = None, - network_backend: NetworkBackend | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - proxy_ssl_context: ssl.SSLContext | None = None, - ) -> None: - self._connection = HTTPConnection( - origin=proxy_origin, - keepalive_expiry=keepalive_expiry, - network_backend=network_backend, - socket_options=socket_options, - ssl_context=proxy_ssl_context, - ) - self._proxy_origin = proxy_origin - self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") - self._remote_origin = remote_origin - - def handle_request(self, request: Request) -> Response: - headers = merge_headers(self._proxy_headers, request.headers) - url = URL( - scheme=self._proxy_origin.scheme, - host=self._proxy_origin.host, - port=self._proxy_origin.port, - target=bytes(request.url), - ) - proxy_request = Request( - method=request.method, - url=url, - headers=headers, - content=request.stream, - extensions=request.extensions, - ) - return self._connection.handle_request(proxy_request) - - def can_handle_request(self, origin: Origin) -> bool: - return origin == self._remote_origin - - def close(self) -> None: - self._connection.close() - - def info(self) -> str: - return self._connection.info() - - def is_available(self) -> bool: - return self._connection.is_available() - - def has_expired(self) -> bool: - return self._connection.has_expired() - - def is_idle(self) -> bool: - return self._connection.is_idle() - - def is_closed(self) -> bool: - return self._connection.is_closed() - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} [{self.info()}]>" - - -class TunnelHTTPConnection(ConnectionInterface): - def __init__( - self, - proxy_origin: Origin, - remote_origin: Origin, - ssl_context: ssl.SSLContext | None = None, - proxy_ssl_context: ssl.SSLContext | None = None, - proxy_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, - keepalive_expiry: float | None = None, - http1: bool = True, - http2: bool = False, - network_backend: NetworkBackend | None = None, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> None: - self._connection: ConnectionInterface = HTTPConnection( - origin=proxy_origin, - keepalive_expiry=keepalive_expiry, - network_backend=network_backend, - socket_options=socket_options, - ssl_context=proxy_ssl_context, - ) - self._proxy_origin = proxy_origin - self._remote_origin = remote_origin - self._ssl_context = ssl_context - self._proxy_ssl_context = proxy_ssl_context - self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") - self._keepalive_expiry = keepalive_expiry - self._http1 = http1 - self._http2 = http2 - self._connect_lock = Lock() - self._connected = False - - def handle_request(self, request: Request) -> Response: - timeouts = request.extensions.get("timeout", {}) - timeout = timeouts.get("connect", None) - - with self._connect_lock: - if not self._connected: - target = b"%b:%d" % (self._remote_origin.host, self._remote_origin.port) - - connect_url = URL( - scheme=self._proxy_origin.scheme, - host=self._proxy_origin.host, - port=self._proxy_origin.port, - target=target, - ) - connect_headers = merge_headers( - [(b"Host", target), (b"Accept", b"*/*")], self._proxy_headers - ) - connect_request = Request( - method=b"CONNECT", - url=connect_url, - headers=connect_headers, - extensions=request.extensions, - ) - connect_response = self._connection.handle_request( - connect_request - ) - - if connect_response.status < 200 or connect_response.status > 299: - reason_bytes = connect_response.extensions.get("reason_phrase", b"") - reason_str = reason_bytes.decode("ascii", errors="ignore") - msg = "%d %s" % (connect_response.status, reason_str) - self._connection.close() - raise ProxyError(msg) - - stream = connect_response.extensions["network_stream"] - - # Upgrade the stream to SSL - ssl_context = ( - default_ssl_context() - if self._ssl_context is None - else self._ssl_context - ) - alpn_protocols = ["http/1.1", "h2"] if self._http2 else ["http/1.1"] - ssl_context.set_alpn_protocols(alpn_protocols) - - kwargs = { - "ssl_context": ssl_context, - "server_hostname": self._remote_origin.host.decode("ascii"), - "timeout": timeout, - } - with Trace("start_tls", logger, request, kwargs) as trace: - stream = stream.start_tls(**kwargs) - trace.return_value = stream - - # Determine if we should be using HTTP/1.1 or HTTP/2 - ssl_object = stream.get_extra_info("ssl_object") - http2_negotiated = ( - ssl_object is not None - and ssl_object.selected_alpn_protocol() == "h2" - ) - - # Create the HTTP/1.1 or HTTP/2 connection - if http2_negotiated or (self._http2 and not self._http1): - from .http2 import HTTP2Connection - - self._connection = HTTP2Connection( - origin=self._remote_origin, - stream=stream, - keepalive_expiry=self._keepalive_expiry, - ) - else: - self._connection = HTTP11Connection( - origin=self._remote_origin, - stream=stream, - keepalive_expiry=self._keepalive_expiry, - ) - - self._connected = True - return self._connection.handle_request(request) - - def can_handle_request(self, origin: Origin) -> bool: - return origin == self._remote_origin - - def close(self) -> None: - self._connection.close() - - def info(self) -> str: - return self._connection.info() - - def is_available(self) -> bool: - return self._connection.is_available() - - def has_expired(self) -> bool: - return self._connection.has_expired() - - def is_idle(self) -> bool: - return self._connection.is_idle() - - def is_closed(self) -> bool: - return self._connection.is_closed() - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} [{self.info()}]>" diff --git a/venv/lib/python3.11/site-packages/httpcore/_sync/interfaces.py b/venv/lib/python3.11/site-packages/httpcore/_sync/interfaces.py deleted file mode 100755 index e673d4c..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_sync/interfaces.py +++ /dev/null @@ -1,137 +0,0 @@ -from __future__ import annotations - -import contextlib -import typing - -from .._models import ( - URL, - Extensions, - HeaderTypes, - Origin, - Request, - Response, - enforce_bytes, - enforce_headers, - enforce_url, - include_request_headers, -) - - -class RequestInterface: - def request( - self, - method: bytes | str, - url: URL | bytes | str, - *, - headers: HeaderTypes = None, - content: bytes | typing.Iterator[bytes] | None = None, - extensions: Extensions | None = None, - ) -> Response: - # Strict type checking on our parameters. - method = enforce_bytes(method, name="method") - url = enforce_url(url, name="url") - headers = enforce_headers(headers, name="headers") - - # Include Host header, and optionally Content-Length or Transfer-Encoding. - headers = include_request_headers(headers, url=url, content=content) - - request = Request( - method=method, - url=url, - headers=headers, - content=content, - extensions=extensions, - ) - response = self.handle_request(request) - try: - response.read() - finally: - response.close() - return response - - @contextlib.contextmanager - def stream( - self, - method: bytes | str, - url: URL | bytes | str, - *, - headers: HeaderTypes = None, - content: bytes | typing.Iterator[bytes] | None = None, - extensions: Extensions | None = None, - ) -> typing.Iterator[Response]: - # Strict type checking on our parameters. - method = enforce_bytes(method, name="method") - url = enforce_url(url, name="url") - headers = enforce_headers(headers, name="headers") - - # Include Host header, and optionally Content-Length or Transfer-Encoding. - headers = include_request_headers(headers, url=url, content=content) - - request = Request( - method=method, - url=url, - headers=headers, - content=content, - extensions=extensions, - ) - response = self.handle_request(request) - try: - yield response - finally: - response.close() - - def handle_request(self, request: Request) -> Response: - raise NotImplementedError() # pragma: nocover - - -class ConnectionInterface(RequestInterface): - def close(self) -> None: - raise NotImplementedError() # pragma: nocover - - def info(self) -> str: - raise NotImplementedError() # pragma: nocover - - def can_handle_request(self, origin: Origin) -> bool: - raise NotImplementedError() # pragma: nocover - - def is_available(self) -> bool: - """ - Return `True` if the connection is currently able to accept an - outgoing request. - - An HTTP/1.1 connection will only be available if it is currently idle. - - An HTTP/2 connection will be available so long as the stream ID space is - not yet exhausted, and the connection is not in an error state. - - While the connection is being established we may not yet know if it is going - to result in an HTTP/1.1 or HTTP/2 connection. The connection should be - treated as being available, but might ultimately raise `NewConnectionRequired` - required exceptions if multiple requests are attempted over a connection - that ends up being established as HTTP/1.1. - """ - raise NotImplementedError() # pragma: nocover - - def has_expired(self) -> bool: - """ - Return `True` if the connection is in a state where it should be closed. - - This either means that the connection is idle and it has passed the - expiry time on its keep-alive, or that server has sent an EOF. - """ - raise NotImplementedError() # pragma: nocover - - def is_idle(self) -> bool: - """ - Return `True` if the connection is currently idle. - """ - raise NotImplementedError() # pragma: nocover - - def is_closed(self) -> bool: - """ - Return `True` if the connection has been closed. - - Used when a response is closed to determine if the connection may be - returned to the connection pool or not. - """ - raise NotImplementedError() # pragma: nocover diff --git a/venv/lib/python3.11/site-packages/httpcore/_sync/socks_proxy.py b/venv/lib/python3.11/site-packages/httpcore/_sync/socks_proxy.py deleted file mode 100755 index 0ca96dd..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_sync/socks_proxy.py +++ /dev/null @@ -1,341 +0,0 @@ -from __future__ import annotations - -import logging -import ssl - -import socksio - -from .._backends.sync import SyncBackend -from .._backends.base import NetworkBackend, NetworkStream -from .._exceptions import ConnectionNotAvailable, ProxyError -from .._models import URL, Origin, Request, Response, enforce_bytes, enforce_url -from .._ssl import default_ssl_context -from .._synchronization import Lock -from .._trace import Trace -from .connection_pool import ConnectionPool -from .http11 import HTTP11Connection -from .interfaces import ConnectionInterface - -logger = logging.getLogger("httpcore.socks") - - -AUTH_METHODS = { - b"\x00": "NO AUTHENTICATION REQUIRED", - b"\x01": "GSSAPI", - b"\x02": "USERNAME/PASSWORD", - b"\xff": "NO ACCEPTABLE METHODS", -} - -REPLY_CODES = { - b"\x00": "Succeeded", - b"\x01": "General SOCKS server failure", - b"\x02": "Connection not allowed by ruleset", - b"\x03": "Network unreachable", - b"\x04": "Host unreachable", - b"\x05": "Connection refused", - b"\x06": "TTL expired", - b"\x07": "Command not supported", - b"\x08": "Address type not supported", -} - - -def _init_socks5_connection( - stream: NetworkStream, - *, - host: bytes, - port: int, - auth: tuple[bytes, bytes] | None = None, -) -> None: - conn = socksio.socks5.SOCKS5Connection() - - # Auth method request - auth_method = ( - socksio.socks5.SOCKS5AuthMethod.NO_AUTH_REQUIRED - if auth is None - else socksio.socks5.SOCKS5AuthMethod.USERNAME_PASSWORD - ) - conn.send(socksio.socks5.SOCKS5AuthMethodsRequest([auth_method])) - outgoing_bytes = conn.data_to_send() - stream.write(outgoing_bytes) - - # Auth method response - incoming_bytes = stream.read(max_bytes=4096) - response = conn.receive_data(incoming_bytes) - assert isinstance(response, socksio.socks5.SOCKS5AuthReply) - if response.method != auth_method: - requested = AUTH_METHODS.get(auth_method, "UNKNOWN") - responded = AUTH_METHODS.get(response.method, "UNKNOWN") - raise ProxyError( - f"Requested {requested} from proxy server, but got {responded}." - ) - - if response.method == socksio.socks5.SOCKS5AuthMethod.USERNAME_PASSWORD: - # Username/password request - assert auth is not None - username, password = auth - conn.send(socksio.socks5.SOCKS5UsernamePasswordRequest(username, password)) - outgoing_bytes = conn.data_to_send() - stream.write(outgoing_bytes) - - # Username/password response - incoming_bytes = stream.read(max_bytes=4096) - response = conn.receive_data(incoming_bytes) - assert isinstance(response, socksio.socks5.SOCKS5UsernamePasswordReply) - if not response.success: - raise ProxyError("Invalid username/password") - - # Connect request - conn.send( - socksio.socks5.SOCKS5CommandRequest.from_address( - socksio.socks5.SOCKS5Command.CONNECT, (host, port) - ) - ) - outgoing_bytes = conn.data_to_send() - stream.write(outgoing_bytes) - - # Connect response - incoming_bytes = stream.read(max_bytes=4096) - response = conn.receive_data(incoming_bytes) - assert isinstance(response, socksio.socks5.SOCKS5Reply) - if response.reply_code != socksio.socks5.SOCKS5ReplyCode.SUCCEEDED: - reply_code = REPLY_CODES.get(response.reply_code, "UNKOWN") - raise ProxyError(f"Proxy Server could not connect: {reply_code}.") - - -class SOCKSProxy(ConnectionPool): # pragma: nocover - """ - A connection pool that sends requests via an HTTP proxy. - """ - - def __init__( - self, - proxy_url: URL | bytes | str, - proxy_auth: tuple[bytes | str, bytes | str] | None = None, - ssl_context: ssl.SSLContext | None = None, - max_connections: int | None = 10, - max_keepalive_connections: int | None = None, - keepalive_expiry: float | None = None, - http1: bool = True, - http2: bool = False, - retries: int = 0, - network_backend: NetworkBackend | None = None, - ) -> None: - """ - A connection pool for making HTTP requests. - - Parameters: - proxy_url: The URL to use when connecting to the proxy server. - For example `"http://127.0.0.1:8080/"`. - ssl_context: An SSL context to use for verifying connections. - If not specified, the default `httpcore.default_ssl_context()` - will be used. - max_connections: The maximum number of concurrent HTTP connections that - the pool should allow. Any attempt to send a request on a pool that - would exceed this amount will block until a connection is available. - max_keepalive_connections: The maximum number of idle HTTP connections - that will be maintained in the pool. - keepalive_expiry: The duration in seconds that an idle HTTP connection - may be maintained for before being expired from the pool. - http1: A boolean indicating if HTTP/1.1 requests should be supported - by the connection pool. Defaults to True. - http2: A boolean indicating if HTTP/2 requests should be supported by - the connection pool. Defaults to False. - retries: The maximum number of retries when trying to establish - a connection. - local_address: Local address to connect from. Can also be used to - connect using a particular address family. Using - `local_address="0.0.0.0"` will connect using an `AF_INET` address - (IPv4), while using `local_address="::"` will connect using an - `AF_INET6` address (IPv6). - uds: Path to a Unix Domain Socket to use instead of TCP sockets. - network_backend: A backend instance to use for handling network I/O. - """ - super().__init__( - ssl_context=ssl_context, - max_connections=max_connections, - max_keepalive_connections=max_keepalive_connections, - keepalive_expiry=keepalive_expiry, - http1=http1, - http2=http2, - network_backend=network_backend, - retries=retries, - ) - self._ssl_context = ssl_context - self._proxy_url = enforce_url(proxy_url, name="proxy_url") - if proxy_auth is not None: - username, password = proxy_auth - username_bytes = enforce_bytes(username, name="proxy_auth") - password_bytes = enforce_bytes(password, name="proxy_auth") - self._proxy_auth: tuple[bytes, bytes] | None = ( - username_bytes, - password_bytes, - ) - else: - self._proxy_auth = None - - def create_connection(self, origin: Origin) -> ConnectionInterface: - return Socks5Connection( - proxy_origin=self._proxy_url.origin, - remote_origin=origin, - proxy_auth=self._proxy_auth, - ssl_context=self._ssl_context, - keepalive_expiry=self._keepalive_expiry, - http1=self._http1, - http2=self._http2, - network_backend=self._network_backend, - ) - - -class Socks5Connection(ConnectionInterface): - def __init__( - self, - proxy_origin: Origin, - remote_origin: Origin, - proxy_auth: tuple[bytes, bytes] | None = None, - ssl_context: ssl.SSLContext | None = None, - keepalive_expiry: float | None = None, - http1: bool = True, - http2: bool = False, - network_backend: NetworkBackend | None = None, - ) -> None: - self._proxy_origin = proxy_origin - self._remote_origin = remote_origin - self._proxy_auth = proxy_auth - self._ssl_context = ssl_context - self._keepalive_expiry = keepalive_expiry - self._http1 = http1 - self._http2 = http2 - - self._network_backend: NetworkBackend = ( - SyncBackend() if network_backend is None else network_backend - ) - self._connect_lock = Lock() - self._connection: ConnectionInterface | None = None - self._connect_failed = False - - def handle_request(self, request: Request) -> Response: - timeouts = request.extensions.get("timeout", {}) - sni_hostname = request.extensions.get("sni_hostname", None) - timeout = timeouts.get("connect", None) - - with self._connect_lock: - if self._connection is None: - try: - # Connect to the proxy - kwargs = { - "host": self._proxy_origin.host.decode("ascii"), - "port": self._proxy_origin.port, - "timeout": timeout, - } - with Trace("connect_tcp", logger, request, kwargs) as trace: - stream = self._network_backend.connect_tcp(**kwargs) - trace.return_value = stream - - # Connect to the remote host using socks5 - kwargs = { - "stream": stream, - "host": self._remote_origin.host.decode("ascii"), - "port": self._remote_origin.port, - "auth": self._proxy_auth, - } - with Trace( - "setup_socks5_connection", logger, request, kwargs - ) as trace: - _init_socks5_connection(**kwargs) - trace.return_value = stream - - # Upgrade the stream to SSL - if self._remote_origin.scheme == b"https": - ssl_context = ( - default_ssl_context() - if self._ssl_context is None - else self._ssl_context - ) - alpn_protocols = ( - ["http/1.1", "h2"] if self._http2 else ["http/1.1"] - ) - ssl_context.set_alpn_protocols(alpn_protocols) - - kwargs = { - "ssl_context": ssl_context, - "server_hostname": sni_hostname - or self._remote_origin.host.decode("ascii"), - "timeout": timeout, - } - with Trace("start_tls", logger, request, kwargs) as trace: - stream = stream.start_tls(**kwargs) - trace.return_value = stream - - # Determine if we should be using HTTP/1.1 or HTTP/2 - ssl_object = stream.get_extra_info("ssl_object") - http2_negotiated = ( - ssl_object is not None - and ssl_object.selected_alpn_protocol() == "h2" - ) - - # Create the HTTP/1.1 or HTTP/2 connection - if http2_negotiated or ( - self._http2 and not self._http1 - ): # pragma: nocover - from .http2 import HTTP2Connection - - self._connection = HTTP2Connection( - origin=self._remote_origin, - stream=stream, - keepalive_expiry=self._keepalive_expiry, - ) - else: - self._connection = HTTP11Connection( - origin=self._remote_origin, - stream=stream, - keepalive_expiry=self._keepalive_expiry, - ) - except Exception as exc: - self._connect_failed = True - raise exc - elif not self._connection.is_available(): # pragma: nocover - raise ConnectionNotAvailable() - - return self._connection.handle_request(request) - - def can_handle_request(self, origin: Origin) -> bool: - return origin == self._remote_origin - - def close(self) -> None: - if self._connection is not None: - self._connection.close() - - def is_available(self) -> bool: - if self._connection is None: # pragma: nocover - # If HTTP/2 support is enabled, and the resulting connection could - # end up as HTTP/2 then we should indicate the connection as being - # available to service multiple requests. - return ( - self._http2 - and (self._remote_origin.scheme == b"https" or not self._http1) - and not self._connect_failed - ) - return self._connection.is_available() - - def has_expired(self) -> bool: - if self._connection is None: # pragma: nocover - return self._connect_failed - return self._connection.has_expired() - - def is_idle(self) -> bool: - if self._connection is None: # pragma: nocover - return self._connect_failed - return self._connection.is_idle() - - def is_closed(self) -> bool: - if self._connection is None: # pragma: nocover - return self._connect_failed - return self._connection.is_closed() - - def info(self) -> str: - if self._connection is None: # pragma: nocover - return "CONNECTION FAILED" if self._connect_failed else "CONNECTING" - return self._connection.info() - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} [{self.info()}]>" diff --git a/venv/lib/python3.11/site-packages/httpcore/_synchronization.py b/venv/lib/python3.11/site-packages/httpcore/_synchronization.py deleted file mode 100755 index 2ecc9e9..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_synchronization.py +++ /dev/null @@ -1,318 +0,0 @@ -from __future__ import annotations - -import threading -import types - -from ._exceptions import ExceptionMapping, PoolTimeout, map_exceptions - -# Our async synchronization primatives use either 'anyio' or 'trio' depending -# on if they're running under asyncio or trio. - -try: - import trio -except (ImportError, NotImplementedError): # pragma: nocover - trio = None # type: ignore - -try: - import anyio -except ImportError: # pragma: nocover - anyio = None # type: ignore - - -def current_async_library() -> str: - # Determine if we're running under trio or asyncio. - # See https://sniffio.readthedocs.io/en/latest/ - try: - import sniffio - except ImportError: # pragma: nocover - environment = "asyncio" - else: - environment = sniffio.current_async_library() - - if environment not in ("asyncio", "trio"): # pragma: nocover - raise RuntimeError("Running under an unsupported async environment.") - - if environment == "asyncio" and anyio is None: # pragma: nocover - raise RuntimeError( - "Running with asyncio requires installation of 'httpcore[asyncio]'." - ) - - if environment == "trio" and trio is None: # pragma: nocover - raise RuntimeError( - "Running with trio requires installation of 'httpcore[trio]'." - ) - - return environment - - -class AsyncLock: - """ - This is a standard lock. - - In the sync case `Lock` provides thread locking. - In the async case `AsyncLock` provides async locking. - """ - - def __init__(self) -> None: - self._backend = "" - - def setup(self) -> None: - """ - Detect if we're running under 'asyncio' or 'trio' and create - a lock with the correct implementation. - """ - self._backend = current_async_library() - if self._backend == "trio": - self._trio_lock = trio.Lock() - elif self._backend == "asyncio": - self._anyio_lock = anyio.Lock() - - async def __aenter__(self) -> AsyncLock: - if not self._backend: - self.setup() - - if self._backend == "trio": - await self._trio_lock.acquire() - elif self._backend == "asyncio": - await self._anyio_lock.acquire() - - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - if self._backend == "trio": - self._trio_lock.release() - elif self._backend == "asyncio": - self._anyio_lock.release() - - -class AsyncThreadLock: - """ - This is a threading-only lock for no-I/O contexts. - - In the sync case `ThreadLock` provides thread locking. - In the async case `AsyncThreadLock` is a no-op. - """ - - def __enter__(self) -> AsyncThreadLock: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - pass - - -class AsyncEvent: - def __init__(self) -> None: - self._backend = "" - - def setup(self) -> None: - """ - Detect if we're running under 'asyncio' or 'trio' and create - a lock with the correct implementation. - """ - self._backend = current_async_library() - if self._backend == "trio": - self._trio_event = trio.Event() - elif self._backend == "asyncio": - self._anyio_event = anyio.Event() - - def set(self) -> None: - if not self._backend: - self.setup() - - if self._backend == "trio": - self._trio_event.set() - elif self._backend == "asyncio": - self._anyio_event.set() - - async def wait(self, timeout: float | None = None) -> None: - if not self._backend: - self.setup() - - if self._backend == "trio": - trio_exc_map: ExceptionMapping = {trio.TooSlowError: PoolTimeout} - timeout_or_inf = float("inf") if timeout is None else timeout - with map_exceptions(trio_exc_map): - with trio.fail_after(timeout_or_inf): - await self._trio_event.wait() - elif self._backend == "asyncio": - anyio_exc_map: ExceptionMapping = {TimeoutError: PoolTimeout} - with map_exceptions(anyio_exc_map): - with anyio.fail_after(timeout): - await self._anyio_event.wait() - - -class AsyncSemaphore: - def __init__(self, bound: int) -> None: - self._bound = bound - self._backend = "" - - def setup(self) -> None: - """ - Detect if we're running under 'asyncio' or 'trio' and create - a semaphore with the correct implementation. - """ - self._backend = current_async_library() - if self._backend == "trio": - self._trio_semaphore = trio.Semaphore( - initial_value=self._bound, max_value=self._bound - ) - elif self._backend == "asyncio": - self._anyio_semaphore = anyio.Semaphore( - initial_value=self._bound, max_value=self._bound - ) - - async def acquire(self) -> None: - if not self._backend: - self.setup() - - if self._backend == "trio": - await self._trio_semaphore.acquire() - elif self._backend == "asyncio": - await self._anyio_semaphore.acquire() - - async def release(self) -> None: - if self._backend == "trio": - self._trio_semaphore.release() - elif self._backend == "asyncio": - self._anyio_semaphore.release() - - -class AsyncShieldCancellation: - # For certain portions of our codebase where we're dealing with - # closing connections during exception handling we want to shield - # the operation from being cancelled. - # - # with AsyncShieldCancellation(): - # ... # clean-up operations, shielded from cancellation. - - def __init__(self) -> None: - """ - Detect if we're running under 'asyncio' or 'trio' and create - a shielded scope with the correct implementation. - """ - self._backend = current_async_library() - - if self._backend == "trio": - self._trio_shield = trio.CancelScope(shield=True) - elif self._backend == "asyncio": - self._anyio_shield = anyio.CancelScope(shield=True) - - def __enter__(self) -> AsyncShieldCancellation: - if self._backend == "trio": - self._trio_shield.__enter__() - elif self._backend == "asyncio": - self._anyio_shield.__enter__() - return self - - def __exit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - if self._backend == "trio": - self._trio_shield.__exit__(exc_type, exc_value, traceback) - elif self._backend == "asyncio": - self._anyio_shield.__exit__(exc_type, exc_value, traceback) - - -# Our thread-based synchronization primitives... - - -class Lock: - """ - This is a standard lock. - - In the sync case `Lock` provides thread locking. - In the async case `AsyncLock` provides async locking. - """ - - def __init__(self) -> None: - self._lock = threading.Lock() - - def __enter__(self) -> Lock: - self._lock.acquire() - return self - - def __exit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - self._lock.release() - - -class ThreadLock: - """ - This is a threading-only lock for no-I/O contexts. - - In the sync case `ThreadLock` provides thread locking. - In the async case `AsyncThreadLock` is a no-op. - """ - - def __init__(self) -> None: - self._lock = threading.Lock() - - def __enter__(self) -> ThreadLock: - self._lock.acquire() - return self - - def __exit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - self._lock.release() - - -class Event: - def __init__(self) -> None: - self._event = threading.Event() - - def set(self) -> None: - self._event.set() - - def wait(self, timeout: float | None = None) -> None: - if timeout == float("inf"): # pragma: no cover - timeout = None - if not self._event.wait(timeout=timeout): - raise PoolTimeout() # pragma: nocover - - -class Semaphore: - def __init__(self, bound: int) -> None: - self._semaphore = threading.Semaphore(value=bound) - - def acquire(self) -> None: - self._semaphore.acquire() - - def release(self) -> None: - self._semaphore.release() - - -class ShieldCancellation: - # Thread-synchronous codebases don't support cancellation semantics. - # We have this class because we need to mirror the async and sync - # cases within our package, but it's just a no-op. - def __enter__(self) -> ShieldCancellation: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - pass diff --git a/venv/lib/python3.11/site-packages/httpcore/_trace.py b/venv/lib/python3.11/site-packages/httpcore/_trace.py deleted file mode 100755 index 5f1cd7c..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_trace.py +++ /dev/null @@ -1,107 +0,0 @@ -from __future__ import annotations - -import inspect -import logging -import types -import typing - -from ._models import Request - - -class Trace: - def __init__( - self, - name: str, - logger: logging.Logger, - request: Request | None = None, - kwargs: dict[str, typing.Any] | None = None, - ) -> None: - self.name = name - self.logger = logger - self.trace_extension = ( - None if request is None else request.extensions.get("trace") - ) - self.debug = self.logger.isEnabledFor(logging.DEBUG) - self.kwargs = kwargs or {} - self.return_value: typing.Any = None - self.should_trace = self.debug or self.trace_extension is not None - self.prefix = self.logger.name.split(".")[-1] - - def trace(self, name: str, info: dict[str, typing.Any]) -> None: - if self.trace_extension is not None: - prefix_and_name = f"{self.prefix}.{name}" - ret = self.trace_extension(prefix_and_name, info) - if inspect.iscoroutine(ret): # pragma: no cover - raise TypeError( - "If you are using a synchronous interface, " - "the callback of the `trace` extension should " - "be a normal function instead of an asynchronous function." - ) - - if self.debug: - if not info or "return_value" in info and info["return_value"] is None: - message = name - else: - args = " ".join([f"{key}={value!r}" for key, value in info.items()]) - message = f"{name} {args}" - self.logger.debug(message) - - def __enter__(self) -> Trace: - if self.should_trace: - info = self.kwargs - self.trace(f"{self.name}.started", info) - return self - - def __exit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - if self.should_trace: - if exc_value is None: - info = {"return_value": self.return_value} - self.trace(f"{self.name}.complete", info) - else: - info = {"exception": exc_value} - self.trace(f"{self.name}.failed", info) - - async def atrace(self, name: str, info: dict[str, typing.Any]) -> None: - if self.trace_extension is not None: - prefix_and_name = f"{self.prefix}.{name}" - coro = self.trace_extension(prefix_and_name, info) - if not inspect.iscoroutine(coro): # pragma: no cover - raise TypeError( - "If you're using an asynchronous interface, " - "the callback of the `trace` extension should " - "be an asynchronous function rather than a normal function." - ) - await coro - - if self.debug: - if not info or "return_value" in info and info["return_value"] is None: - message = name - else: - args = " ".join([f"{key}={value!r}" for key, value in info.items()]) - message = f"{name} {args}" - self.logger.debug(message) - - async def __aenter__(self) -> Trace: - if self.should_trace: - info = self.kwargs - await self.atrace(f"{self.name}.started", info) - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: types.TracebackType | None = None, - ) -> None: - if self.should_trace: - if exc_value is None: - info = {"return_value": self.return_value} - await self.atrace(f"{self.name}.complete", info) - else: - info = {"exception": exc_value} - await self.atrace(f"{self.name}.failed", info) diff --git a/venv/lib/python3.11/site-packages/httpcore/_utils.py b/venv/lib/python3.11/site-packages/httpcore/_utils.py deleted file mode 100755 index c44ff93..0000000 --- a/venv/lib/python3.11/site-packages/httpcore/_utils.py +++ /dev/null @@ -1,37 +0,0 @@ -from __future__ import annotations - -import select -import socket -import sys - - -def is_socket_readable(sock: socket.socket | None) -> bool: - """ - Return whether a socket, as identifed by its file descriptor, is readable. - "A socket is readable" means that the read buffer isn't empty, i.e. that calling - .recv() on it would immediately return some data. - """ - # NOTE: we want check for readability without actually attempting to read, because - # we don't want to block forever if it's not readable. - - # In the case that the socket no longer exists, or cannot return a file - # descriptor, we treat it as being readable, as if it the next read operation - # on it is ready to return the terminating `b""`. - sock_fd = None if sock is None else sock.fileno() - if sock_fd is None or sock_fd < 0: # pragma: nocover - return True - - # The implementation below was stolen from: - # https://github.com/python-trio/trio/blob/20ee2b1b7376db637435d80e266212a35837ddcc/trio/_socket.py#L471-L478 - # See also: https://github.com/encode/httpcore/pull/193#issuecomment-703129316 - - # Use select.select on Windows, and when poll is unavailable and select.poll - # everywhere else. (E.g. When eventlet is in use. See #327) - if ( - sys.platform == "win32" or getattr(select, "poll", None) is None - ): # pragma: nocover - rready, _, _ = select.select([sock_fd], [], [], 0) - return bool(rready) - p = select.poll() - p.register(sock_fd, select.POLLIN) - return bool(p.poll(0)) diff --git a/venv/lib/python3.11/site-packages/httpcore/py.typed b/venv/lib/python3.11/site-packages/httpcore/py.typed deleted file mode 100755 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/INSTALLER deleted file mode 100755 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/METADATA b/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/METADATA deleted file mode 100755 index b0d2b19..0000000 --- a/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/METADATA +++ /dev/null @@ -1,203 +0,0 @@ -Metadata-Version: 2.3 -Name: httpx -Version: 0.28.1 -Summary: The next generation HTTP client. -Project-URL: Changelog, https://github.com/encode/httpx/blob/master/CHANGELOG.md -Project-URL: Documentation, https://www.python-httpx.org -Project-URL: Homepage, https://github.com/encode/httpx -Project-URL: Source, https://github.com/encode/httpx -Author-email: Tom Christie -License: BSD-3-Clause -Classifier: Development Status :: 4 - Beta -Classifier: Environment :: Web Environment -Classifier: Framework :: AsyncIO -Classifier: Framework :: Trio -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Topic :: Internet :: WWW/HTTP -Requires-Python: >=3.8 -Requires-Dist: anyio -Requires-Dist: certifi -Requires-Dist: httpcore==1.* -Requires-Dist: idna -Provides-Extra: brotli -Requires-Dist: brotli; (platform_python_implementation == 'CPython') and extra == 'brotli' -Requires-Dist: brotlicffi; (platform_python_implementation != 'CPython') and extra == 'brotli' -Provides-Extra: cli -Requires-Dist: click==8.*; extra == 'cli' -Requires-Dist: pygments==2.*; extra == 'cli' -Requires-Dist: rich<14,>=10; extra == 'cli' -Provides-Extra: http2 -Requires-Dist: h2<5,>=3; extra == 'http2' -Provides-Extra: socks -Requires-Dist: socksio==1.*; extra == 'socks' -Provides-Extra: zstd -Requires-Dist: zstandard>=0.18.0; extra == 'zstd' -Description-Content-Type: text/markdown - -

- HTTPX -

- -

HTTPX - A next-generation HTTP client for Python.

- -

- - Test Suite - - - Package version - -

- -HTTPX is a fully featured HTTP client library for Python 3. It includes **an integrated command line client**, has support for both **HTTP/1.1 and HTTP/2**, and provides both **sync and async APIs**. - ---- - -Install HTTPX using pip: - -```shell -$ pip install httpx -``` - -Now, let's get started: - -```pycon ->>> import httpx ->>> r = httpx.get('https://www.example.org/') ->>> r - ->>> r.status_code -200 ->>> r.headers['content-type'] -'text/html; charset=UTF-8' ->>> r.text -'\n\n\nExample Domain...' -``` - -Or, using the command-line client. - -```shell -$ pip install 'httpx[cli]' # The command line client is an optional dependency. -``` - -Which now allows us to use HTTPX directly from the command-line... - -

- httpx --help -

- -Sending a request... - -

- httpx http://httpbin.org/json -

- -## Features - -HTTPX builds on the well-established usability of `requests`, and gives you: - -* A broadly [requests-compatible API](https://www.python-httpx.org/compatibility/). -* An integrated command-line client. -* HTTP/1.1 [and HTTP/2 support](https://www.python-httpx.org/http2/). -* Standard synchronous interface, but with [async support if you need it](https://www.python-httpx.org/async/). -* Ability to make requests directly to [WSGI applications](https://www.python-httpx.org/advanced/transports/#wsgi-transport) or [ASGI applications](https://www.python-httpx.org/advanced/transports/#asgi-transport). -* Strict timeouts everywhere. -* Fully type annotated. -* 100% test coverage. - -Plus all the standard features of `requests`... - -* International Domains and URLs -* Keep-Alive & Connection Pooling -* Sessions with Cookie Persistence -* Browser-style SSL Verification -* Basic/Digest Authentication -* Elegant Key/Value Cookies -* Automatic Decompression -* Automatic Content Decoding -* Unicode Response Bodies -* Multipart File Uploads -* HTTP(S) Proxy Support -* Connection Timeouts -* Streaming Downloads -* .netrc Support -* Chunked Requests - -## Installation - -Install with pip: - -```shell -$ pip install httpx -``` - -Or, to include the optional HTTP/2 support, use: - -```shell -$ pip install httpx[http2] -``` - -HTTPX requires Python 3.8+. - -## Documentation - -Project documentation is available at [https://www.python-httpx.org/](https://www.python-httpx.org/). - -For a run-through of all the basics, head over to the [QuickStart](https://www.python-httpx.org/quickstart/). - -For more advanced topics, see the [Advanced Usage](https://www.python-httpx.org/advanced/) section, the [async support](https://www.python-httpx.org/async/) section, or the [HTTP/2](https://www.python-httpx.org/http2/) section. - -The [Developer Interface](https://www.python-httpx.org/api/) provides a comprehensive API reference. - -To find out about tools that integrate with HTTPX, see [Third Party Packages](https://www.python-httpx.org/third_party_packages/). - -## Contribute - -If you want to contribute with HTTPX check out the [Contributing Guide](https://www.python-httpx.org/contributing/) to learn how to start. - -## Dependencies - -The HTTPX project relies on these excellent libraries: - -* `httpcore` - The underlying transport implementation for `httpx`. - * `h11` - HTTP/1.1 support. -* `certifi` - SSL certificates. -* `idna` - Internationalized domain name support. -* `sniffio` - Async library autodetection. - -As well as these optional installs: - -* `h2` - HTTP/2 support. *(Optional, with `httpx[http2]`)* -* `socksio` - SOCKS proxy support. *(Optional, with `httpx[socks]`)* -* `rich` - Rich terminal support. *(Optional, with `httpx[cli]`)* -* `click` - Command line client support. *(Optional, with `httpx[cli]`)* -* `brotli` or `brotlicffi` - Decoding for "brotli" compressed responses. *(Optional, with `httpx[brotli]`)* -* `zstandard` - Decoding for "zstd" compressed responses. *(Optional, with `httpx[zstd]`)* - -A huge amount of credit is due to `requests` for the API layout that -much of this work follows, as well as to `urllib3` for plenty of design -inspiration around the lower-level networking details. - ---- - -

HTTPX is BSD licensed code.
Designed & crafted with care.

— 🦋 —

- -## Release Information - -### Fixed - -* Reintroduced supposedly-private `URLTypes` shortcut. (#2673) - - ---- - -[Full changelog](https://github.com/encode/httpx/blob/master/CHANGELOG.md) diff --git a/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/RECORD b/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/RECORD deleted file mode 100755 index 2b427fc..0000000 --- a/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/RECORD +++ /dev/null @@ -1,54 +0,0 @@ -../../../bin/httpx,sha256=xrYuYlq3O4kKFFET3sVVeXinAIougySZhXfYYNoBCfU,174 -httpx-0.28.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -httpx-0.28.1.dist-info/METADATA,sha256=_rubD48-gNV8gZnDBPNcQzboWB0dGNeYPJJ2a4J5OyU,7052 -httpx-0.28.1.dist-info/RECORD,, -httpx-0.28.1.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87 -httpx-0.28.1.dist-info/entry_points.txt,sha256=2lVkdQmxLA1pNMgSN2eV89o90HCZezhmNwsy6ryKDSA,37 -httpx-0.28.1.dist-info/licenses/LICENSE.md,sha256=TsWdVE8StfU5o6cW_TIaxYzNgDC0ZSIfLIgCAM3yjY0,1508 -httpx/__init__.py,sha256=CsaZe6yZj0rHg6322AWKWHGTMVr9txgEfD5P3_Rrz60,2171 -httpx/__pycache__/__init__.cpython-311.pyc,, -httpx/__pycache__/__version__.cpython-311.pyc,, -httpx/__pycache__/_api.cpython-311.pyc,, -httpx/__pycache__/_auth.cpython-311.pyc,, -httpx/__pycache__/_client.cpython-311.pyc,, -httpx/__pycache__/_config.cpython-311.pyc,, -httpx/__pycache__/_content.cpython-311.pyc,, -httpx/__pycache__/_decoders.cpython-311.pyc,, -httpx/__pycache__/_exceptions.cpython-311.pyc,, -httpx/__pycache__/_main.cpython-311.pyc,, -httpx/__pycache__/_models.cpython-311.pyc,, -httpx/__pycache__/_multipart.cpython-311.pyc,, -httpx/__pycache__/_status_codes.cpython-311.pyc,, -httpx/__pycache__/_types.cpython-311.pyc,, -httpx/__pycache__/_urlparse.cpython-311.pyc,, -httpx/__pycache__/_urls.cpython-311.pyc,, -httpx/__pycache__/_utils.cpython-311.pyc,, -httpx/__version__.py,sha256=LoUyYeOXTieGzuP_64UL0wxdtxjuu_QbOvE7NOg-IqU,108 -httpx/_api.py,sha256=r_Zgs4jIpcPJLqK5dbbSayqo_iVMKFaxZCd-oOHxLEs,11743 -httpx/_auth.py,sha256=Yr3QwaUSK17rGYx-7j-FdicFIzz4Y9FFV-1F4-7RXX4,11891 -httpx/_client.py,sha256=xD-UG67-WMkeltAAOeGGj-cZ2RRTAm19sWRxlFY7_40,65714 -httpx/_config.py,sha256=pPp2U-wicfcKsF-KYRE1LYdt3e6ERGeIoXZ8Gjo3LWc,8547 -httpx/_content.py,sha256=LGGzrJTR3OvN4Mb1GVVNLXkXJH-6oKlwAttO9p5w_yg,8161 -httpx/_decoders.py,sha256=p0dX8I0NEHexs3UGp4SsZutiMhsXrrWl6-GnqVb0iKM,12041 -httpx/_exceptions.py,sha256=bxW7fxzgVMAdNTbwT0Vnq04gJDW1_gI_GFiQPuMyjL0,8527 -httpx/_main.py,sha256=Cg9GMabiTT_swaDfUgIRitSwxLRMSwUDOm7LdSGqlA4,15626 -httpx/_models.py,sha256=4__Guyv1gLxuZChwim8kfQNiIOcJ9acreFOSurvZfms,44700 -httpx/_multipart.py,sha256=KOHEZZl6oohg9mPaKyyu345qq1rJLg35TUG3YAzXB3Y,9843 -httpx/_status_codes.py,sha256=DYn-2ufBgMeXy5s8x3_TB7wjAuAAMewTakPrm5rXEsc,5639 -httpx/_transports/__init__.py,sha256=GbUoBSAOp7z-l-9j5YhMhR3DMIcn6FVLhj072O3Nnno,275 -httpx/_transports/__pycache__/__init__.cpython-311.pyc,, -httpx/_transports/__pycache__/asgi.cpython-311.pyc,, -httpx/_transports/__pycache__/base.cpython-311.pyc,, -httpx/_transports/__pycache__/default.cpython-311.pyc,, -httpx/_transports/__pycache__/mock.cpython-311.pyc,, -httpx/_transports/__pycache__/wsgi.cpython-311.pyc,, -httpx/_transports/asgi.py,sha256=HRfiDYMPt4wQH2gFgHZg4c-i3sblo6bL5GTqcET-xz8,5501 -httpx/_transports/base.py,sha256=kZS_VMbViYfF570pogUCJ1bulz-ybfL51Pqs9yktebU,2523 -httpx/_transports/default.py,sha256=AzeaRUyVwCccTyyNJexDf0n1dFfzzydpdIQgvw7PLnk,13983 -httpx/_transports/mock.py,sha256=PTo0d567RITXxGrki6kN7_67wwAxfwiMDcuXJiZCjEo,1232 -httpx/_transports/wsgi.py,sha256=NcPX3Xap_EwCFZWO_OaSyQNuInCYx1QMNbO8GAei6jY,4825 -httpx/_types.py,sha256=Jyh41GQq7AOev8IOWKDAg7zCbvHAfufmW5g_PiTtErY,2965 -httpx/_urlparse.py,sha256=ZAmH47ONfkxrrj-PPYhGeiHjb6AjKCS-ANWIN4OL_KY,18546 -httpx/_urls.py,sha256=dX99VR1DSOHpgo9Aq7PzYO4FKdxqKjwyNp8grf8dHN0,21550 -httpx/_utils.py,sha256=_TVeqAKvxJkKHdz7dFeb4s0LZqQXgeFkXSgfiHBK_1o,8285 -httpx/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/WHEEL b/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/WHEEL deleted file mode 100755 index 21aaa72..0000000 --- a/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.26.3 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/entry_points.txt b/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/entry_points.txt deleted file mode 100755 index 8ae9600..0000000 --- a/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -httpx = httpx:main diff --git a/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md b/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md deleted file mode 100755 index ab79d16..0000000 --- a/venv/lib/python3.11/site-packages/httpx-0.28.1.dist-info/licenses/LICENSE.md +++ /dev/null @@ -1,12 +0,0 @@ -Copyright © 2019, [Encode OSS Ltd](https://www.encode.io/). -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -* Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.11/site-packages/httpx/__init__.py b/venv/lib/python3.11/site-packages/httpx/__init__.py deleted file mode 100755 index e9addde..0000000 --- a/venv/lib/python3.11/site-packages/httpx/__init__.py +++ /dev/null @@ -1,105 +0,0 @@ -from .__version__ import __description__, __title__, __version__ -from ._api import * -from ._auth import * -from ._client import * -from ._config import * -from ._content import * -from ._exceptions import * -from ._models import * -from ._status_codes import * -from ._transports import * -from ._types import * -from ._urls import * - -try: - from ._main import main -except ImportError: # pragma: no cover - - def main() -> None: # type: ignore - import sys - - print( - "The httpx command line client could not run because the required " - "dependencies were not installed.\nMake sure you've installed " - "everything with: pip install 'httpx[cli]'" - ) - sys.exit(1) - - -__all__ = [ - "__description__", - "__title__", - "__version__", - "ASGITransport", - "AsyncBaseTransport", - "AsyncByteStream", - "AsyncClient", - "AsyncHTTPTransport", - "Auth", - "BaseTransport", - "BasicAuth", - "ByteStream", - "Client", - "CloseError", - "codes", - "ConnectError", - "ConnectTimeout", - "CookieConflict", - "Cookies", - "create_ssl_context", - "DecodingError", - "delete", - "DigestAuth", - "get", - "head", - "Headers", - "HTTPError", - "HTTPStatusError", - "HTTPTransport", - "InvalidURL", - "Limits", - "LocalProtocolError", - "main", - "MockTransport", - "NetRCAuth", - "NetworkError", - "options", - "patch", - "PoolTimeout", - "post", - "ProtocolError", - "Proxy", - "ProxyError", - "put", - "QueryParams", - "ReadError", - "ReadTimeout", - "RemoteProtocolError", - "request", - "Request", - "RequestError", - "RequestNotRead", - "Response", - "ResponseNotRead", - "stream", - "StreamClosed", - "StreamConsumed", - "StreamError", - "SyncByteStream", - "Timeout", - "TimeoutException", - "TooManyRedirects", - "TransportError", - "UnsupportedProtocol", - "URL", - "USE_CLIENT_DEFAULT", - "WriteError", - "WriteTimeout", - "WSGITransport", -] - - -__locals = locals() -for __name in __all__: - if not __name.startswith("__"): - setattr(__locals[__name], "__module__", "httpx") # noqa diff --git a/venv/lib/python3.11/site-packages/httpx/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 5ffcf504dc07008329f6fffd10a9bc56c2626dac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2373 zcmZ`4O>Y}Tbk<+H-nHYzNmEgJSQVry1!`55AVmmBlavOfQE(ip8dan1?hr58-C1VG zNz8|o1BVnN(ZJgp$~9deMPc*s}Uil1xeeAGsYl;ym9E5U^n7gJnH zv6^Bn#pM+1DK=7ENpZD>%2H$A8}n=Jnu3DbONflWjF<`*4X5-~p3%g0cuZ@i3N1?TziU4-9K?8eu{9keemu9e94F=LCZ9mBvUVB zBIJ}EeLoMo;7f*r?!4j@*U(Jmkvut*7d4C>64}fRxl03#MHyr6a*qIMV7x_G6w7B6 zp_~Iy@GUnGB}RCc1uJ%@SYl~Kevdx{0C86w>Z7+-&==@_4z@otoc#ZH zItcDvSa~G3ezxE05VOO1xMSMX_pQJ&JvShx?YSi2AnSUL8BlJrZeZRbw$+V@$>9tm zpLShF9Md5o2^31YcnLM&xqxT4>pu)&_|hv8e{eZs2l^&xbvx zg2EWorTRAj?4p5I-_zyqZ>>7a<*Kv)y)e>2clQqtWVXtK<-ma3b^t7sAftOXW8R zJZ6Vjj!>@xgh~-*=~r^3CdoB!@otm|s-r&ZOTm`qxz2iXS(KJt-{o+VWoldADx;j* z)QgYBZz-zRsJ(d{uks4v&H4Bi6(F}M+e~bzG%jPAYZkXV!dRu$%K}gcX#}2)s24?G zcX~pPQKBRtLbQwzx{%|m7PEYCs|o%ki-sgKjgw8{Q%*)Ts4Pz;{ zLb=o>v?hUE3L+wE8I>)Sq9lPTNg~BB?ufCJgEL*9IKoKyRQsCD$K!NSv%8L`#Nv)k z;vk9f7Nys$pw}c0bOamXKXw%2MA_szmtVAx^bT^#$`N{WAIOgR%TAdm3CZsqJXW?6-8{x zDp7IL<0Jv8>~07x$y#VF1}2$z5v+p&;zgp0p{GF_!ZukY2Ig7$MxumyF9cx`cNuIg zV%gr4oHLeu>3QOhiZQfBxOd5uDH?%MoKhu>1Ivfn04t0~vLOmJB4CoUpAf6b)-eX) ziS}0F@!PBetn7Rd0XWPniZVd&_MbloXtJNp0h;P(bAYD%*&L-$_E92sdu$| p(+A_`{a1fhA8NA)+H7B&JscLZvyps;UrO(wU(0hw{x@9#_#dfz?}-2a diff --git a/venv/lib/python3.11/site-packages/httpx/__pycache__/__version__.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/__pycache__/__version__.cpython-311.pyc deleted file mode 100755 index ea064c638d2949500f8c58376b46074e93fb0f7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305 zcmZ3^%ge<81UIM5%E|%Kk3k$5V1zP03jrC^8B!Rc7*ZIc7*m*{m{OR788lgLv1XK% z6jW5{I4b0&R+K2Dr{<*=C6;97=P7uEgajxg=VYelmFOs>barmgJu*uC&Da}c>E8+wi4)SfW1d#Z^%*e=igGac5^M;T^1OE*^u?B7sEMf;r F0ssJBT2TN1 diff --git a/venv/lib/python3.11/site-packages/httpx/__pycache__/_api.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/__pycache__/_api.cpython-311.pyc deleted file mode 100755 index 5166ed5d337fd27960d7c9c86814c7f910524a60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9703 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 diff --git a/venv/lib/python3.11/site-packages/httpx/__pycache__/_auth.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/__pycache__/_auth.cpython-311.pyc deleted file mode 100755 index a4a7fcb725b477c9a8325542fdae21928ef13060..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17045 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 UM&;$dW?OIZr|;gy6Jvh=KN+biZ~y=R diff --git a/venv/lib/python3.11/site-packages/httpx/__pycache__/_config.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/__pycache__/_config.cpython-311.pyc deleted file mode 100755 index 1891f15626d17e475def5a78117e145cc6e22360..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11502 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 KwCXoq=>H2qGbADa diff --git a/venv/lib/python3.11/site-packages/httpx/__pycache__/_content.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/__pycache__/_content.cpython-311.pyc deleted file mode 100755 index dbc709c2bf8c4da9a16e2be973d51bec36c29515..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11939 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 Iv3W)EKLky?1^@s6 diff --git a/venv/lib/python3.11/site-packages/httpx/__pycache__/_main.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/__pycache__/_main.cpython-311.pyc deleted file mode 100755 index bb3dbed872a69d13b2bd1b9d35cc138c7c4287a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23047 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 VnBK>8FNW~ib9}ZEtU7G!`QO(np9BB^ diff --git a/venv/lib/python3.11/site-packages/httpx/__pycache__/_models.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/__pycache__/_models.cpython-311.pyc deleted file mode 100755 index 6feea88510cbb3d8ebd0ba7ebba80558fe6c6492..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66368 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 M8Ea#kxH9wn2PgeOSpWb4 diff --git a/venv/lib/python3.11/site-packages/httpx/__pycache__/_multipart.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/__pycache__/_multipart.cpython-311.pyc deleted file mode 100755 index 442dfe598876112e3d9c6e999626227beaa13eff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15614 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 DFGD&4 diff --git a/venv/lib/python3.11/site-packages/httpx/__pycache__/_status_codes.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/__pycache__/_status_codes.cpython-311.pyc deleted file mode 100755 index 28d24700e51cf93869175b3b2530f6d3c5b7748e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7548 zcmd5h`)?b`dCQ01Z&8xvhpe?N>nxuwS(I$aI_DCKTv2-_cNuaipQb4G)|{2RXNt?) zUD>kWB1GW=ZgD`I^cuVABT1WF;wD9Z=%3I6eYd>efU*l5aA<$>Zwj2Y?zL$9eX}cy zlFk7Pq(NzFIP-nqeD9h0X8irGu67PS|MbB(-)$Mb53L7CILIYA8h!vHJ@jFS<9-N#-iI{lO$qLor$}><(_8c=z4=|A zGsk_qZI`O?_d^)`unvG(?RxWv0f51u_t`HYz`cKoHs!d9=4XhW2)G?usbo5uW0)ly zhAm>r5lWjIZd1Xex?S+OupeK~!1F%`?vFX0BLT{hAPtZZ{W8tc)(1@_OmnpDK^QD) zrV4F;5ZMaGI-Y^cpHOvAA*COz^CUByo14e55YSbyzdaai}sUl8X-M& zfb`Nq(np6#KRrSsbeIg#qhydCBSZ8!IYLj6VLC#N(v##E9VN#pPfpNNWQ3k3C+Qh7 zO2-IK&yrJgoSdewku&rh8KV>AEIm)g>FeY*dV!py7s&*jB!=IIy6Rr)4bpkE|!&@Yi|G)BHa z7s;D6PQFMJo8xmpD=2_@@twecC*KD)Imv32`t=sMGJbZGEL~EA0!8^Bfe$6Zv&AUcv zozE`CZC*@uuUJ~iUehf;W0{Uw zFpK;-RB38@a(dzdvN4OgquYG+%Jdbc#vZFHm*+1p@G(ja%wny`Gh2K$m zR~Pt%UUW2GFM+kFwozj94v@}Xot_6Z(K*7FqnB)4Ct$3_-_UO+Vk`SpyF5LAVEX0x z+2{hlXq1?U1`dwtGdM5-+ye44y0xK|^peA8b!u38!8t$%27t-TXJv3T5XQ|CsORvK zzHT}OThA{sDLOYd3-0pF-Lr~cva}8Tu4&yqAZzaO?4_R_sTJKqzwl8%X3>cQETS_} z5XpkgD;Vv#xwfY3e8%(?w;82L*F`OM8lG19*34H4$SpIN+K9iDPuYf}Uo2~d+uFKrPu+5y^463Jv4DL=W&6rx`JUASjJLbIp|8*h0NLlDsc@fk z_kH#DZ`^)z=E>$q-Df}UKKn3K8#?|l^nS;ugZR^4>*;^k{v2qzLZgq+X6DQD&;egI z;O=wp)<^r##~f#M1NlVI>VO~S0XPQ3wq9JbaSCrmphdqy2vv1YYc@OsIJ*}b(7LDp z(d-8czy6i?zfx^IX$=6dP>%@=>XDXU@R)1cuU}xlR(sm!xHFuCbN$a4XN3dYDpVLb z?k=|#TIKErCW4aH0{Dp#+t0lSwy$6s3YKMBPlHw;pqX(t>csn2^{wlU>h1BWm#N!F zyr>*PjKeg09-0cb6ArZveG(adGWfM?A6)x5GG6T*fALAr(H$<(Hni8&B7={jkD@yv zfWCO~!tR90zZx0hzR^Aw`oq9j$PM2#&Eh^E)gyQsXrYb@+z%9jTfy5bc4iaxd!=9@ z7~tUi3T=z^ohHi`m(9PUSeyDgY>S@W+S+%dUEtqY(uy`apQGxx5Y#6up8RJTzj)n&~1CWx9$KRGK*6%a{uQ>&AgIP z7r-9lt1maI1B|l#b9TG0Zq+X6jbE5qv#(^A_1)rgb{mWy)DW*^rG-b8HHi(6 z&7pm#6|D54*Ikbu8)uNbzS!XSItc)`70W=Qw5d-7pXmVDj^yqdPT>|-EV~7k4Y)NV zZU+diWIzIF9mzYqvW68uz;g`Ag7S4h{}pyy;&50vI)(9H$K~(R+R&$h7=tM6`%$DB5sry~YUH>~c}(&EjxJaxSD94y)WFQp1 zzJ+XN5Yn&c8&ITb7Aol#_JEpYsKYfs=!@yG-La@qpnq>uw;dq=8j!o4`I6?jd7BCR zI`ZhvX!ka}Tf=*saBV$OlN;h6?W*^;-z(PwNmi$|E9%cR4ow z8;I&=FcxadStDR6V}tykczV<|bP3+W=>&x>hs_ z2>2!f!b!7)ynlzyO6jF_=T;-P-$i&N1Gga)%5=Qy@k^RfWNQ8%;)Zu6380O0k5^2S zPifXVGW~rd81M-$=Ch)QH8J&#Zy|ChU$QsLc!huzNJDfqUV+;wps^6&9`)w}GOLx= zb>^oWq`19i_)hr_()9~lWw@`gDq&B*KR{Hc_}T`q@s6&QO|<%Z2#ll++sg#xTn{pq zgWCi7QrTOgD1rCPf{EV;q}!Y_3%8l^KS0_(&lhm3E$bx+bODp@DPr2t4{Tin2 zn=h|h8r2)U`y)gQ?(;5c<45w3nFwT*)=HSXEE#d({0U-qox?A~0)#vKlA#x=y)OWN zhIAv4wRa$9%pAx`|FV{4uMEJ=!s=;z5Z<743or6Hd^@msR>Xp=e?=ZWn2h2EEMH7@ z=74`gI9nx2*q!cbX!^e+EP@PRh4T$^0r!IO@o5|K@;?xMj9vD3ue2yEx0@C)^)n9i0n$4W*NfdK$bA={~Muf z17Yt2lmY(-fuoY{;D!8UOH7&wcy)iXcXPuV9xML6y9^fG>_PyJWqrKiz(tVV@)+&U zfZ}~@BIUNi^$eZ`;KJChsv9QVEMmV?Ro~mxiarMJM${~*D!bNMM_{7cQ7CG*y}@=A z>p1Fh3Y)Xo;3dy`9h)g^rlEn&K$a9y$_s8JcSBU-%c7K2Gg(=Y<8mqoCskIC3%MLX z-3}p^O|7axq2#PNoZJ%63Nb}Uz;P6h3mNQw5^kvCy zmt++s3XWrdue)Q3HpSXL2ZsXCxDolhyEngcfZoZA~qfw07?niVo~7Dd77qULkZ z>1BkOl%U3!Wf9bM`_l4?kWe!M$dy1=Y84I=IWHyLwwxfSva&2>-A+kX)U=!smqcLF z2CUHVw^!YMMM#5;SQdpP#HeZJt;v-D$9E_A{j7AmJ%X{L|uxBDUdq6%LZjAtEwW)YATjZ z3huxz1~zXGEJHR7<)vIc3C+sGgFr70dDKpnRXlM@`=YSKT%= zfMu-Po6jV(v4pVafx&$qKp8AXeK-d)2IJ16nyZ_mE<^GOSru|6mB=-CX9VKD0xo1~ zL5$Uukc1?LT+PW+&K-o+B4j0i=BFc7j?IqUXdjKwtMEM^H&Q;R2p$iqc78$RkYDXrk;Q>YovxcW|Fnp;R9;|f^SA<$GUlBbz);k)lhKFjb z1?tGz%JoJjjHH2X@O(w`B{O+Ula8TE!V~W)J^E%fe4=*zN;N!O8(FA^kJZLg)$kcl zNUa}5c!VBF*RjfyuOO4;sefX=8b0cSz3I$g&~fA{VwiaJjL(aWPc2r%Cu=9KRl~=9 z`OG!UD~t)K0blkuB29GQdAha<@4;}MTKMMUhIROVH!F-?I8ot0PXK}W>xS{>=eEH8 zNOSNR**lTlCalpd_N;p#_djdB<{i~4+heK9q#2n50gLfus_{T1a@@w!}1Btum*w@?x-Xm3h+ew#y>{JejFM5 hC^8ODhd&6xzr@qFAGLiHj(!}5gupK<>P=+s`d`hH_$2@U diff --git a/venv/lib/python3.11/site-packages/httpx/__pycache__/_types.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/__pycache__/_types.cpython-311.pyc deleted file mode 100755 index 0d3b05f828284c6410b4700b91c8ca38a99ad2fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4652 zcmdT`O>7(25#C+y^8a6=Wm&RCnUW>?hpa6taRdLrQDjSwCApS`xZ66!iu)+h=5pn? zOUDurglK&b3LkiI5TeL|2P37C9CXwn2OWFd!yecL3JB<>xzUhLId$GHB`zr&O?vB+ z{5WrB-n@A;^WN;=0s$`t&p%%M_3_s}iuxBB96T^KpS>naQQuG^#Zw|JG6h;b$GYXnEZ^1ueyF;sO$CP%>XiIZko94%0#Q~_Uq&e68XC#{@`p$_g@GuKCAVMPbxW3ynV z`ExKYV$SW1E2*3gPDj)|Vt9oX!*-q+>9Bj=vWa|XwCy``*+=$0@)v%ke#)#4r`-cS z{SMx5z%FZF6)LDB8vI4jxM*f-$mZ!qyXB)&$g54;zVrX4d$g+Uaj?_;CGd=#!%H2$ zSQX#FYx`~2{(&>Nrt*jiM=l zZzJV>u)c=kBFg29c{MK=m3U6Zag{K$t0?;>~lA3fFF3WMnaLph=L>P$s#FV0fx?}17UBmag62j~E1T07j zJ^}Xd06+>KCuARiV+3LZNV0G*fDtnH`tiDo7FCP{$p|jO-rM6WC>=hI7PXfG;u{K4 zJPnP95ozQ=w#z-oh|CL?=R{6q;om7bAZ1Q`5+)f=jMNe?X32&R9%42Dzr7KFPbnHq zt2Vhve+Q%Q4>^CLlg#|a*$1mAK9GiETOa{;H;d!Bd^F4X-HrC87e+Y7xK&LwRKpa zIFY(|F|EL&7uJOA6JZ4@=~Y!-d!Eja(o<4v>xTQlsg1tQSf&mHk6=NCWar=TDO3Lp z4mbQ)-a43&cb@`iQjEvD2V!czBTmFm601EY0Q7ts!pdy?#T#!ui>2jkK~SLJ<5{5? zm!Bbw^CF6?t9j)hKB^qYsDK0o#f9Q}yol5y0T-=>=sklo;CIX~gO6U;TpE)E|@i~8S=$RNx%x8IR>V$%Va zkrp3bLRY z?6NEujKDpdm!KIxL!St$V7Q?xktVH}kv2l@{$z3upVi4)1FOGT1AnXUStGC63@zF- zg|ONpNw2iXV5=2Q$#CC;SE2i@%j$p;Jzz{f2L*+^E*QSnB-2;lt$YC;XnV-Ovg~gu z5sqR+S|ghk$RWHAWHQzrV-`(kA^q&WYF%B|@qGv;xx|%V1!~La1!Y820Ng2ejDtV_O5S(y`;VW`@UICCl%?h#;Qtfsvg^7 zwV}&;|D+!Npd8rsg)6bDqjEy`4VK-z(Y^*7X|TS{sYjFvB$8o-WhpUGv zhni6;)Z1VKmieB|8J&$0db%>Xc~@uq8?1kGsWJi1TzQ$%*^}0IvN~G1st4jaJKXfJ zTw>qh3^8S2GYrNmv(@$bNL|^Qsz3iBwLP+3+FAU2V&~zHU+Et$XuS)1@Lt)sOBMyo zFBXWWFSl*^tU(aGh0hPENnmAK|f|RFL*Eq&NVrP3++4DFjMw7y;QKLGFeSj zztDQl=z+1ax8aXe5|vVQv6iSleDzhGt7o?+wjFgzAHS+auj>A5WzVi3B51{Asp8eW z1J$M4M4hXBq@PS_-jvR!i9h+xKU9-iAfdA(4c1GR^~16OrtE3@sc2tCsZQ6f)TdwH z*qYlJ)i2LzeKUGwwj69k`>GDGI8$GGy|DFYXHuV>)sD~V(L3c(BQ|JxrpL}`RCG5O zt7NMal~p}B1aW}9d|WBLnyr>#_6o)vXff zC$~S>KfJ4_=Cs(H9-1%vcY6n_Q?;JzjNS`}IkM{;)J{R9(q&iE>7(Hl;wZc&y#2Od T&`m?@I0|nGZ~q+vvz`10o5fRI diff --git a/venv/lib/python3.11/site-packages/httpx/__pycache__/_urlparse.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/__pycache__/_urlparse.cpython-311.pyc deleted file mode 100755 index 784bb370318616da8e859cf80ccd002521caee86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20276 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 XdRhVo7j85a1su{y+jnN~S1Fq-7g44K6TCaLL6k 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

{@y^L1dE^$ zlx1ZMp{06`xT2mLVP8ehl@Nh*4;+il9Z?N7ykCdsHyd8-`c*u*#XW*4;6&^~NS9}6 zXwB%Ht7C)86KTC$WsIvi_-lmZMMHbLbLXwjoj2{7&PTGHkI>NW&3g8x-Fq1r7-}i* ze^3B%PK01$s>6fkK?!)UG#ngiA`cI9@W?Xo*m0|K$Bhe_&VAX=eFTsFSu}C)#wH5p4Q80D*~}YqNx_N)<~Vb{!tFY1E-RI=#$oxgC;pp3 z5H+?4!kBqg?*_%@njOBV>C4V2jzO4~i-Y5)k7ac@1;n@qhR|`7P|fqf4V;aIqg}op zteK2;GNsW}tt_d2oT*qBn$Kx;kL`owlwTRLQt^IAt_oh*ZUvZNswfy9wj?my91zWI z6hI6Ei?UJ*2Nl8fL*yGJBzY7`nSQ7orY~LQ->*FNshz2vSNi7TZ|r_+_d8?nufH~S zz3aWMA5L7I$Tak48wx~FWh2V6u*L>)89bZDe^LsZpA6PnKd^n6L#b- z)KZ>w>9r)w@LfSx-&(B&HsY|WHd$JnHE%QpsyO>0obE-HC7FXhkV-|e5@{tk7 z-;aza-3atoaN5QsPvU2}_({T!lGmWD!)LBMI0d^_B^JX?cj}FcPndBU9K8k3 z&a54q2Cz#AWb6HD4}^yPYmf0ax$b^O2=2GXr=Y|;p&bv>Uf8FFs+~>@owO_m24(#N zj1prigb3y!mihC`ax_qDQ2d1a~2mwdNRYy#{iwXM@v-f}-RA zic^k~!|+pr&+pDvj>T~3muUvooEs-&NXk}o4)WzHNWhdCI7?=CaP)tb3Qdv23<;@u zkbyKI$c{!O%Cy#fmryx@_)EfFcS~CTExMa#J@j|iUHfYFE7j@7K*rsZb@!y*J&Sd% zx9c|Es@u3&8!nwf8@+*w=k zkpSmoa+U;Vc?H7}2z0b}fO%d^&8EXB%)VVADz4D-tgM2A^^5sC;rDBP;^=k%(4~fEvHgZ)I$$DJ8mdSU9oCrCSbV50yeSuYG)TtJZO#)PXTQ#-c4Q89V4Csyez)LxfTZ_ zG{=aifYmI%#@V?f=#CLj0TPRMI(HC!xMRdq0Eb_VvxD+;$B3r@J^voc&mAM40(ky% z=TqX6kavwFET~ay17P4J7{D0~_G zVkh4Fa|9J!(XvH$<1!D29Kc;Qj$xW6T+KNB3(y9*OeTQyAjeX*I`K=WV@k>txV#@ z!lhlMkk=TqU7{f0SlvQ9t6bfjbFg!zjrmP=I-I3y=3#}a0j)0F_?@+VJD-VvQz_!jgK*t7-=H>JUj9YV?yi{PDL4GYD&nM zV77yO9IC0hbD_}W$Y>-OJ;!gIQY|x$um+5tc&{Ix*9Dwn6;7^VXQGMY7cJ%+1$_Q@ zZI>INCm@Cc^*AD76`KG#TVQKWJeLzMSae(WD;^=@K>JGj5?y(!pc;o21CQX=9Bg{- z3*=M&A+g9*{v{#Ze31XHd#}}98=PNv<@mz7H@^JVmyHO{^pJdD=^zaY>!1RU*1`Ve zI{2XKBgJDu?*hO?Au5fF0MB+EJeo4-Z8Rb023+?W1#tO^3c0pC5c}dTu&3{oykoKDK1H zrSp{X5( z8tK<;m+Lj?Dx?gD7;+UaoCBbG=MVs(p-Ai=l0yW1gDx*WT5s!PNP`wF`CL z)ZlBbITvrihwJdptRBj)9>S=abMS^$=j^zzj;keE6E~oAc4R_vz?XB5&=lq7PkxFb zbXBfXR0THawA)*9E*u&QMPyPuwa4i5b`Je_eron`*JYueMb zn^TU|GjnCBvW4enop&p1XZK!ta$)Ly^@D@gBAM1b+15R?d+%)7dDHo`smzvx*)0dt z-Y=#OzJBC8M;4kgUVql>Pka5p*gkvkPV>5j&YS(|<^!4L1KH*SvqP7koW&oV>UCau zAyd6MTaDAkYjCQUQKlQKezN9v@1wVRAI*BK{RF&OdwGZhQT=y#8w)*UrDU@y51{cSqK{bP;Yb;Iq}?pv+hnbttIHGq^YHAvY)=Zafu^oBF!x$niOg8gCA

b7|dP(HPl+W$46m!^F(k$$YkWprj}0 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 T&hcy$IF}~SWd1alQq}uE;67^f diff --git a/venv/lib/python3.11/site-packages/httpx/__version__.py b/venv/lib/python3.11/site-packages/httpx/__version__.py deleted file mode 100755 index 801bfac..0000000 --- a/venv/lib/python3.11/site-packages/httpx/__version__.py +++ /dev/null @@ -1,3 +0,0 @@ -__title__ = "httpx" -__description__ = "A next generation HTTP client, for Python 3." -__version__ = "0.28.1" diff --git a/venv/lib/python3.11/site-packages/httpx/_api.py b/venv/lib/python3.11/site-packages/httpx/_api.py deleted file mode 100755 index c3cda1e..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_api.py +++ /dev/null @@ -1,438 +0,0 @@ -from __future__ import annotations - -import typing -from contextlib import contextmanager - -from ._client import Client -from ._config import DEFAULT_TIMEOUT_CONFIG -from ._models import Response -from ._types import ( - AuthTypes, - CookieTypes, - HeaderTypes, - ProxyTypes, - QueryParamTypes, - RequestContent, - RequestData, - RequestFiles, - TimeoutTypes, -) -from ._urls import URL - -if typing.TYPE_CHECKING: - import ssl # pragma: no cover - - -__all__ = [ - "delete", - "get", - "head", - "options", - "patch", - "post", - "put", - "request", - "stream", -] - - -def request( - method: str, - url: URL | str, - *, - params: QueryParamTypes | None = None, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | None = None, - proxy: ProxyTypes | None = None, - timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, - follow_redirects: bool = False, - verify: ssl.SSLContext | str | bool = True, - trust_env: bool = True, -) -> Response: - """ - Sends an HTTP request. - - **Parameters:** - - * **method** - HTTP method for the new `Request` object: `GET`, `OPTIONS`, - `HEAD`, `POST`, `PUT`, `PATCH`, or `DELETE`. - * **url** - URL for the new `Request` object. - * **params** - *(optional)* Query parameters to include in the URL, as a - string, dictionary, or sequence of two-tuples. - * **content** - *(optional)* Binary content to include in the body of the - request, as bytes or a byte iterator. - * **data** - *(optional)* Form data to include in the body of the request, - as a dictionary. - * **files** - *(optional)* A dictionary of upload files to include in the - body of the request. - * **json** - *(optional)* A JSON serializable object to include in the body - of the request. - * **headers** - *(optional)* Dictionary of HTTP headers to include in the - request. - * **cookies** - *(optional)* Dictionary of Cookie items to include in the - request. - * **auth** - *(optional)* An authentication class to use when sending the - request. - * **proxy** - *(optional)* A proxy URL where all the traffic should be routed. - * **timeout** - *(optional)* The timeout configuration to use when sending - the request. - * **follow_redirects** - *(optional)* Enables or disables HTTP redirects. - * **verify** - *(optional)* Either `True` to use an SSL context with the - default CA bundle, `False` to disable verification, or an instance of - `ssl.SSLContext` to use a custom context. - * **trust_env** - *(optional)* Enables or disables usage of environment - variables for configuration. - - **Returns:** `Response` - - Usage: - - ``` - >>> import httpx - >>> response = httpx.request('GET', 'https://httpbin.org/get') - >>> response - - ``` - """ - with Client( - cookies=cookies, - proxy=proxy, - verify=verify, - timeout=timeout, - trust_env=trust_env, - ) as client: - return client.request( - method=method, - url=url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - auth=auth, - follow_redirects=follow_redirects, - ) - - -@contextmanager -def stream( - method: str, - url: URL | str, - *, - params: QueryParamTypes | None = None, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | None = None, - proxy: ProxyTypes | None = None, - timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, - follow_redirects: bool = False, - verify: ssl.SSLContext | str | bool = True, - trust_env: bool = True, -) -> typing.Iterator[Response]: - """ - Alternative to `httpx.request()` that streams the response body - instead of loading it into memory at once. - - **Parameters**: See `httpx.request`. - - See also: [Streaming Responses][0] - - [0]: /quickstart#streaming-responses - """ - with Client( - cookies=cookies, - proxy=proxy, - verify=verify, - timeout=timeout, - trust_env=trust_env, - ) as client: - with client.stream( - method=method, - url=url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - auth=auth, - follow_redirects=follow_redirects, - ) as response: - yield response - - -def get( - url: URL | str, - *, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | None = None, - proxy: ProxyTypes | None = None, - follow_redirects: bool = False, - verify: ssl.SSLContext | str | bool = True, - timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, - trust_env: bool = True, -) -> Response: - """ - Sends a `GET` request. - - **Parameters**: See `httpx.request`. - - Note that the `data`, `files`, `json` and `content` parameters are not available - on this function, as `GET` requests should not include a request body. - """ - return request( - "GET", - url, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - proxy=proxy, - follow_redirects=follow_redirects, - verify=verify, - timeout=timeout, - trust_env=trust_env, - ) - - -def options( - url: URL | str, - *, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | None = None, - proxy: ProxyTypes | None = None, - follow_redirects: bool = False, - verify: ssl.SSLContext | str | bool = True, - timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, - trust_env: bool = True, -) -> Response: - """ - Sends an `OPTIONS` request. - - **Parameters**: See `httpx.request`. - - Note that the `data`, `files`, `json` and `content` parameters are not available - on this function, as `OPTIONS` requests should not include a request body. - """ - return request( - "OPTIONS", - url, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - proxy=proxy, - follow_redirects=follow_redirects, - verify=verify, - timeout=timeout, - trust_env=trust_env, - ) - - -def head( - url: URL | str, - *, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | None = None, - proxy: ProxyTypes | None = None, - follow_redirects: bool = False, - verify: ssl.SSLContext | str | bool = True, - timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, - trust_env: bool = True, -) -> Response: - """ - Sends a `HEAD` request. - - **Parameters**: See `httpx.request`. - - Note that the `data`, `files`, `json` and `content` parameters are not available - on this function, as `HEAD` requests should not include a request body. - """ - return request( - "HEAD", - url, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - proxy=proxy, - follow_redirects=follow_redirects, - verify=verify, - timeout=timeout, - trust_env=trust_env, - ) - - -def post( - url: URL | str, - *, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | None = None, - proxy: ProxyTypes | None = None, - follow_redirects: bool = False, - verify: ssl.SSLContext | str | bool = True, - timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, - trust_env: bool = True, -) -> Response: - """ - Sends a `POST` request. - - **Parameters**: See `httpx.request`. - """ - return request( - "POST", - url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - proxy=proxy, - follow_redirects=follow_redirects, - verify=verify, - timeout=timeout, - trust_env=trust_env, - ) - - -def put( - url: URL | str, - *, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | None = None, - proxy: ProxyTypes | None = None, - follow_redirects: bool = False, - verify: ssl.SSLContext | str | bool = True, - timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, - trust_env: bool = True, -) -> Response: - """ - Sends a `PUT` request. - - **Parameters**: See `httpx.request`. - """ - return request( - "PUT", - url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - proxy=proxy, - follow_redirects=follow_redirects, - verify=verify, - timeout=timeout, - trust_env=trust_env, - ) - - -def patch( - url: URL | str, - *, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | None = None, - proxy: ProxyTypes | None = None, - follow_redirects: bool = False, - verify: ssl.SSLContext | str | bool = True, - timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, - trust_env: bool = True, -) -> Response: - """ - Sends a `PATCH` request. - - **Parameters**: See `httpx.request`. - """ - return request( - "PATCH", - url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - proxy=proxy, - follow_redirects=follow_redirects, - verify=verify, - timeout=timeout, - trust_env=trust_env, - ) - - -def delete( - url: URL | str, - *, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | None = None, - proxy: ProxyTypes | None = None, - follow_redirects: bool = False, - timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, - verify: ssl.SSLContext | str | bool = True, - trust_env: bool = True, -) -> Response: - """ - Sends a `DELETE` request. - - **Parameters**: See `httpx.request`. - - Note that the `data`, `files`, `json` and `content` parameters are not available - on this function, as `DELETE` requests should not include a request body. - """ - return request( - "DELETE", - url, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - proxy=proxy, - follow_redirects=follow_redirects, - verify=verify, - timeout=timeout, - trust_env=trust_env, - ) diff --git a/venv/lib/python3.11/site-packages/httpx/_auth.py b/venv/lib/python3.11/site-packages/httpx/_auth.py deleted file mode 100755 index b03971a..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_auth.py +++ /dev/null @@ -1,348 +0,0 @@ -from __future__ import annotations - -import hashlib -import os -import re -import time -import typing -from base64 import b64encode -from urllib.request import parse_http_list - -from ._exceptions import ProtocolError -from ._models import Cookies, Request, Response -from ._utils import to_bytes, to_str, unquote - -if typing.TYPE_CHECKING: # pragma: no cover - from hashlib import _Hash - - -__all__ = ["Auth", "BasicAuth", "DigestAuth", "NetRCAuth"] - - -class Auth: - """ - Base class for all authentication schemes. - - To implement a custom authentication scheme, subclass `Auth` and override - the `.auth_flow()` method. - - If the authentication scheme does I/O such as disk access or network calls, or uses - synchronization primitives such as locks, you should override `.sync_auth_flow()` - and/or `.async_auth_flow()` instead of `.auth_flow()` to provide specialized - implementations that will be used by `Client` and `AsyncClient` respectively. - """ - - requires_request_body = False - requires_response_body = False - - def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: - """ - Execute the authentication flow. - - To dispatch a request, `yield` it: - - ``` - yield request - ``` - - The client will `.send()` the response back into the flow generator. You can - access it like so: - - ``` - response = yield request - ``` - - A `return` (or reaching the end of the generator) will result in the - client returning the last response obtained from the server. - - You can dispatch as many requests as is necessary. - """ - yield request - - def sync_auth_flow( - self, request: Request - ) -> typing.Generator[Request, Response, None]: - """ - Execute the authentication flow synchronously. - - By default, this defers to `.auth_flow()`. You should override this method - when the authentication scheme does I/O and/or uses concurrency primitives. - """ - if self.requires_request_body: - request.read() - - flow = self.auth_flow(request) - request = next(flow) - - while True: - response = yield request - if self.requires_response_body: - response.read() - - try: - request = flow.send(response) - except StopIteration: - break - - async def async_auth_flow( - self, request: Request - ) -> typing.AsyncGenerator[Request, Response]: - """ - Execute the authentication flow asynchronously. - - By default, this defers to `.auth_flow()`. You should override this method - when the authentication scheme does I/O and/or uses concurrency primitives. - """ - if self.requires_request_body: - await request.aread() - - flow = self.auth_flow(request) - request = next(flow) - - while True: - response = yield request - if self.requires_response_body: - await response.aread() - - try: - request = flow.send(response) - except StopIteration: - break - - -class FunctionAuth(Auth): - """ - Allows the 'auth' argument to be passed as a simple callable function, - that takes the request, and returns a new, modified request. - """ - - def __init__(self, func: typing.Callable[[Request], Request]) -> None: - self._func = func - - def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: - yield self._func(request) - - -class BasicAuth(Auth): - """ - Allows the 'auth' argument to be passed as a (username, password) pair, - and uses HTTP Basic authentication. - """ - - def __init__(self, username: str | bytes, password: str | bytes) -> None: - self._auth_header = self._build_auth_header(username, password) - - def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: - request.headers["Authorization"] = self._auth_header - yield request - - def _build_auth_header(self, username: str | bytes, password: str | bytes) -> str: - userpass = b":".join((to_bytes(username), to_bytes(password))) - token = b64encode(userpass).decode() - return f"Basic {token}" - - -class NetRCAuth(Auth): - """ - Use a 'netrc' file to lookup basic auth credentials based on the url host. - """ - - def __init__(self, file: str | None = None) -> None: - # Lazily import 'netrc'. - # There's no need for us to load this module unless 'NetRCAuth' is being used. - import netrc - - self._netrc_info = netrc.netrc(file) - - def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: - auth_info = self._netrc_info.authenticators(request.url.host) - if auth_info is None or not auth_info[2]: - # The netrc file did not have authentication credentials for this host. - yield request - else: - # Build a basic auth header with credentials from the netrc file. - request.headers["Authorization"] = self._build_auth_header( - username=auth_info[0], password=auth_info[2] - ) - yield request - - def _build_auth_header(self, username: str | bytes, password: str | bytes) -> str: - userpass = b":".join((to_bytes(username), to_bytes(password))) - token = b64encode(userpass).decode() - return f"Basic {token}" - - -class DigestAuth(Auth): - _ALGORITHM_TO_HASH_FUNCTION: dict[str, typing.Callable[[bytes], _Hash]] = { - "MD5": hashlib.md5, - "MD5-SESS": hashlib.md5, - "SHA": hashlib.sha1, - "SHA-SESS": hashlib.sha1, - "SHA-256": hashlib.sha256, - "SHA-256-SESS": hashlib.sha256, - "SHA-512": hashlib.sha512, - "SHA-512-SESS": hashlib.sha512, - } - - def __init__(self, username: str | bytes, password: str | bytes) -> None: - self._username = to_bytes(username) - self._password = to_bytes(password) - self._last_challenge: _DigestAuthChallenge | None = None - self._nonce_count = 1 - - def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: - if self._last_challenge: - request.headers["Authorization"] = self._build_auth_header( - request, self._last_challenge - ) - - response = yield request - - if response.status_code != 401 or "www-authenticate" not in response.headers: - # If the response is not a 401 then we don't - # need to build an authenticated request. - return - - for auth_header in response.headers.get_list("www-authenticate"): - if auth_header.lower().startswith("digest "): - break - else: - # If the response does not include a 'WWW-Authenticate: Digest ...' - # header, then we don't need to build an authenticated request. - return - - self._last_challenge = self._parse_challenge(request, response, auth_header) - self._nonce_count = 1 - - request.headers["Authorization"] = self._build_auth_header( - request, self._last_challenge - ) - if response.cookies: - Cookies(response.cookies).set_cookie_header(request=request) - yield request - - def _parse_challenge( - self, request: Request, response: Response, auth_header: str - ) -> _DigestAuthChallenge: - """ - Returns a challenge from a Digest WWW-Authenticate header. - These take the form of: - `Digest realm="realm@host.com",qop="auth,auth-int",nonce="abc",opaque="xyz"` - """ - scheme, _, fields = auth_header.partition(" ") - - # This method should only ever have been called with a Digest auth header. - assert scheme.lower() == "digest" - - header_dict: dict[str, str] = {} - for field in parse_http_list(fields): - key, value = field.strip().split("=", 1) - header_dict[key] = unquote(value) - - try: - realm = header_dict["realm"].encode() - nonce = header_dict["nonce"].encode() - algorithm = header_dict.get("algorithm", "MD5") - opaque = header_dict["opaque"].encode() if "opaque" in header_dict else None - qop = header_dict["qop"].encode() if "qop" in header_dict else None - return _DigestAuthChallenge( - realm=realm, nonce=nonce, algorithm=algorithm, opaque=opaque, qop=qop - ) - except KeyError as exc: - message = "Malformed Digest WWW-Authenticate header" - raise ProtocolError(message, request=request) from exc - - def _build_auth_header( - self, request: Request, challenge: _DigestAuthChallenge - ) -> str: - hash_func = self._ALGORITHM_TO_HASH_FUNCTION[challenge.algorithm.upper()] - - def digest(data: bytes) -> bytes: - return hash_func(data).hexdigest().encode() - - A1 = b":".join((self._username, challenge.realm, self._password)) - - path = request.url.raw_path - A2 = b":".join((request.method.encode(), path)) - # TODO: implement auth-int - HA2 = digest(A2) - - nc_value = b"%08x" % self._nonce_count - cnonce = self._get_client_nonce(self._nonce_count, challenge.nonce) - self._nonce_count += 1 - - HA1 = digest(A1) - if challenge.algorithm.lower().endswith("-sess"): - HA1 = digest(b":".join((HA1, challenge.nonce, cnonce))) - - qop = self._resolve_qop(challenge.qop, request=request) - if qop is None: - # Following RFC 2069 - digest_data = [HA1, challenge.nonce, HA2] - else: - # Following RFC 2617/7616 - digest_data = [HA1, challenge.nonce, nc_value, cnonce, qop, HA2] - - format_args = { - "username": self._username, - "realm": challenge.realm, - "nonce": challenge.nonce, - "uri": path, - "response": digest(b":".join(digest_data)), - "algorithm": challenge.algorithm.encode(), - } - if challenge.opaque: - format_args["opaque"] = challenge.opaque - if qop: - format_args["qop"] = b"auth" - format_args["nc"] = nc_value - format_args["cnonce"] = cnonce - - return "Digest " + self._get_header_value(format_args) - - def _get_client_nonce(self, nonce_count: int, nonce: bytes) -> bytes: - s = str(nonce_count).encode() - s += nonce - s += time.ctime().encode() - s += os.urandom(8) - - return hashlib.sha1(s).hexdigest()[:16].encode() - - def _get_header_value(self, header_fields: dict[str, bytes]) -> str: - NON_QUOTED_FIELDS = ("algorithm", "qop", "nc") - QUOTED_TEMPLATE = '{}="{}"' - NON_QUOTED_TEMPLATE = "{}={}" - - header_value = "" - for i, (field, value) in enumerate(header_fields.items()): - if i > 0: - header_value += ", " - template = ( - QUOTED_TEMPLATE - if field not in NON_QUOTED_FIELDS - else NON_QUOTED_TEMPLATE - ) - header_value += template.format(field, to_str(value)) - - return header_value - - def _resolve_qop(self, qop: bytes | None, request: Request) -> bytes | None: - if qop is None: - return None - qops = re.split(b", ?", qop) - if b"auth" in qops: - return b"auth" - - if qops == [b"auth-int"]: - raise NotImplementedError("Digest auth-int support is not yet implemented") - - message = f'Unexpected qop value "{qop!r}" in digest auth' - raise ProtocolError(message, request=request) - - -class _DigestAuthChallenge(typing.NamedTuple): - realm: bytes - nonce: bytes - algorithm: str - opaque: bytes | None - qop: bytes | None diff --git a/venv/lib/python3.11/site-packages/httpx/_client.py b/venv/lib/python3.11/site-packages/httpx/_client.py deleted file mode 100755 index 2249231..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_client.py +++ /dev/null @@ -1,2019 +0,0 @@ -from __future__ import annotations - -import datetime -import enum -import logging -import time -import typing -import warnings -from contextlib import asynccontextmanager, contextmanager -from types import TracebackType - -from .__version__ import __version__ -from ._auth import Auth, BasicAuth, FunctionAuth -from ._config import ( - DEFAULT_LIMITS, - DEFAULT_MAX_REDIRECTS, - DEFAULT_TIMEOUT_CONFIG, - Limits, - Proxy, - Timeout, -) -from ._decoders import SUPPORTED_DECODERS -from ._exceptions import ( - InvalidURL, - RemoteProtocolError, - TooManyRedirects, - request_context, -) -from ._models import Cookies, Headers, Request, Response -from ._status_codes import codes -from ._transports.base import AsyncBaseTransport, BaseTransport -from ._transports.default import AsyncHTTPTransport, HTTPTransport -from ._types import ( - AsyncByteStream, - AuthTypes, - CertTypes, - CookieTypes, - HeaderTypes, - ProxyTypes, - QueryParamTypes, - RequestContent, - RequestData, - RequestExtensions, - RequestFiles, - SyncByteStream, - TimeoutTypes, -) -from ._urls import URL, QueryParams -from ._utils import URLPattern, get_environment_proxies - -if typing.TYPE_CHECKING: - import ssl # pragma: no cover - -__all__ = ["USE_CLIENT_DEFAULT", "AsyncClient", "Client"] - -# The type annotation for @classmethod and context managers here follows PEP 484 -# https://www.python.org/dev/peps/pep-0484/#annotating-instance-and-class-methods -T = typing.TypeVar("T", bound="Client") -U = typing.TypeVar("U", bound="AsyncClient") - - -def _is_https_redirect(url: URL, location: URL) -> bool: - """ - Return 'True' if 'location' is a HTTPS upgrade of 'url' - """ - if url.host != location.host: - return False - - return ( - url.scheme == "http" - and _port_or_default(url) == 80 - and location.scheme == "https" - and _port_or_default(location) == 443 - ) - - -def _port_or_default(url: URL) -> int | None: - if url.port is not None: - return url.port - return {"http": 80, "https": 443}.get(url.scheme) - - -def _same_origin(url: URL, other: URL) -> bool: - """ - Return 'True' if the given URLs share the same origin. - """ - return ( - url.scheme == other.scheme - and url.host == other.host - and _port_or_default(url) == _port_or_default(other) - ) - - -class UseClientDefault: - """ - For some parameters such as `auth=...` and `timeout=...` we need to be able - to indicate the default "unset" state, in a way that is distinctly different - to using `None`. - - The default "unset" state indicates that whatever default is set on the - client should be used. This is different to setting `None`, which - explicitly disables the parameter, possibly overriding a client default. - - For example we use `timeout=USE_CLIENT_DEFAULT` in the `request()` signature. - Omitting the `timeout` parameter will send a request using whatever default - timeout has been configured on the client. Including `timeout=None` will - ensure no timeout is used. - - Note that user code shouldn't need to use the `USE_CLIENT_DEFAULT` constant, - but it is used internally when a parameter is not included. - """ - - -USE_CLIENT_DEFAULT = UseClientDefault() - - -logger = logging.getLogger("httpx") - -USER_AGENT = f"python-httpx/{__version__}" -ACCEPT_ENCODING = ", ".join( - [key for key in SUPPORTED_DECODERS.keys() if key != "identity"] -) - - -class ClientState(enum.Enum): - # UNOPENED: - # The client has been instantiated, but has not been used to send a request, - # or been opened by entering the context of a `with` block. - UNOPENED = 1 - # OPENED: - # The client has either sent a request, or is within a `with` block. - OPENED = 2 - # CLOSED: - # The client has either exited the `with` block, or `close()` has - # been called explicitly. - CLOSED = 3 - - -class BoundSyncStream(SyncByteStream): - """ - A byte stream that is bound to a given response instance, and that - ensures the `response.elapsed` is set once the response is closed. - """ - - def __init__( - self, stream: SyncByteStream, response: Response, start: float - ) -> None: - self._stream = stream - self._response = response - self._start = start - - def __iter__(self) -> typing.Iterator[bytes]: - for chunk in self._stream: - yield chunk - - def close(self) -> None: - elapsed = time.perf_counter() - self._start - self._response.elapsed = datetime.timedelta(seconds=elapsed) - self._stream.close() - - -class BoundAsyncStream(AsyncByteStream): - """ - An async byte stream that is bound to a given response instance, and that - ensures the `response.elapsed` is set once the response is closed. - """ - - def __init__( - self, stream: AsyncByteStream, response: Response, start: float - ) -> None: - self._stream = stream - self._response = response - self._start = start - - async def __aiter__(self) -> typing.AsyncIterator[bytes]: - async for chunk in self._stream: - yield chunk - - async def aclose(self) -> None: - elapsed = time.perf_counter() - self._start - self._response.elapsed = datetime.timedelta(seconds=elapsed) - await self._stream.aclose() - - -EventHook = typing.Callable[..., typing.Any] - - -class BaseClient: - def __init__( - self, - *, - auth: AuthTypes | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, - follow_redirects: bool = False, - max_redirects: int = DEFAULT_MAX_REDIRECTS, - event_hooks: None | (typing.Mapping[str, list[EventHook]]) = None, - base_url: URL | str = "", - trust_env: bool = True, - default_encoding: str | typing.Callable[[bytes], str] = "utf-8", - ) -> None: - event_hooks = {} if event_hooks is None else event_hooks - - self._base_url = self._enforce_trailing_slash(URL(base_url)) - - self._auth = self._build_auth(auth) - self._params = QueryParams(params) - self.headers = Headers(headers) - self._cookies = Cookies(cookies) - self._timeout = Timeout(timeout) - self.follow_redirects = follow_redirects - self.max_redirects = max_redirects - self._event_hooks = { - "request": list(event_hooks.get("request", [])), - "response": list(event_hooks.get("response", [])), - } - self._trust_env = trust_env - self._default_encoding = default_encoding - self._state = ClientState.UNOPENED - - @property - def is_closed(self) -> bool: - """ - Check if the client being closed - """ - return self._state == ClientState.CLOSED - - @property - def trust_env(self) -> bool: - return self._trust_env - - def _enforce_trailing_slash(self, url: URL) -> URL: - if url.raw_path.endswith(b"/"): - return url - return url.copy_with(raw_path=url.raw_path + b"/") - - def _get_proxy_map( - self, proxy: ProxyTypes | None, allow_env_proxies: bool - ) -> dict[str, Proxy | None]: - if proxy is None: - if allow_env_proxies: - return { - key: None if url is None else Proxy(url=url) - for key, url in get_environment_proxies().items() - } - return {} - else: - proxy = Proxy(url=proxy) if isinstance(proxy, (str, URL)) else proxy - return {"all://": proxy} - - @property - def timeout(self) -> Timeout: - return self._timeout - - @timeout.setter - def timeout(self, timeout: TimeoutTypes) -> None: - self._timeout = Timeout(timeout) - - @property - def event_hooks(self) -> dict[str, list[EventHook]]: - return self._event_hooks - - @event_hooks.setter - def event_hooks(self, event_hooks: dict[str, list[EventHook]]) -> None: - self._event_hooks = { - "request": list(event_hooks.get("request", [])), - "response": list(event_hooks.get("response", [])), - } - - @property - def auth(self) -> Auth | None: - """ - Authentication class used when none is passed at the request-level. - - See also [Authentication][0]. - - [0]: /quickstart/#authentication - """ - return self._auth - - @auth.setter - def auth(self, auth: AuthTypes) -> None: - self._auth = self._build_auth(auth) - - @property - def base_url(self) -> URL: - """ - Base URL to use when sending requests with relative URLs. - """ - return self._base_url - - @base_url.setter - def base_url(self, url: URL | str) -> None: - self._base_url = self._enforce_trailing_slash(URL(url)) - - @property - def headers(self) -> Headers: - """ - HTTP headers to include when sending requests. - """ - return self._headers - - @headers.setter - def headers(self, headers: HeaderTypes) -> None: - client_headers = Headers( - { - b"Accept": b"*/*", - b"Accept-Encoding": ACCEPT_ENCODING.encode("ascii"), - b"Connection": b"keep-alive", - b"User-Agent": USER_AGENT.encode("ascii"), - } - ) - client_headers.update(headers) - self._headers = client_headers - - @property - def cookies(self) -> Cookies: - """ - Cookie values to include when sending requests. - """ - return self._cookies - - @cookies.setter - def cookies(self, cookies: CookieTypes) -> None: - self._cookies = Cookies(cookies) - - @property - def params(self) -> QueryParams: - """ - Query parameters to include in the URL when sending requests. - """ - return self._params - - @params.setter - def params(self, params: QueryParamTypes) -> None: - self._params = QueryParams(params) - - def build_request( - self, - method: str, - url: URL | str, - *, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Request: - """ - Build and return a request instance. - - * The `params`, `headers` and `cookies` arguments - are merged with any values set on the client. - * The `url` argument is merged with any `base_url` set on the client. - - See also: [Request instances][0] - - [0]: /advanced/clients/#request-instances - """ - url = self._merge_url(url) - headers = self._merge_headers(headers) - cookies = self._merge_cookies(cookies) - params = self._merge_queryparams(params) - extensions = {} if extensions is None else extensions - if "timeout" not in extensions: - timeout = ( - self.timeout - if isinstance(timeout, UseClientDefault) - else Timeout(timeout) - ) - extensions = dict(**extensions, timeout=timeout.as_dict()) - return Request( - method, - url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - cookies=cookies, - extensions=extensions, - ) - - def _merge_url(self, url: URL | str) -> URL: - """ - Merge a URL argument together with any 'base_url' on the client, - to create the URL used for the outgoing request. - """ - merge_url = URL(url) - if merge_url.is_relative_url: - # To merge URLs we always append to the base URL. To get this - # behaviour correct we always ensure the base URL ends in a '/' - # separator, and strip any leading '/' from the merge URL. - # - # So, eg... - # - # >>> client = Client(base_url="https://www.example.com/subpath") - # >>> client.base_url - # URL('https://www.example.com/subpath/') - # >>> client.build_request("GET", "/path").url - # URL('https://www.example.com/subpath/path') - merge_raw_path = self.base_url.raw_path + merge_url.raw_path.lstrip(b"/") - return self.base_url.copy_with(raw_path=merge_raw_path) - return merge_url - - def _merge_cookies(self, cookies: CookieTypes | None = None) -> CookieTypes | None: - """ - Merge a cookies argument together with any cookies on the client, - to create the cookies used for the outgoing request. - """ - if cookies or self.cookies: - merged_cookies = Cookies(self.cookies) - merged_cookies.update(cookies) - return merged_cookies - return cookies - - def _merge_headers(self, headers: HeaderTypes | None = None) -> HeaderTypes | None: - """ - Merge a headers argument together with any headers on the client, - to create the headers used for the outgoing request. - """ - merged_headers = Headers(self.headers) - merged_headers.update(headers) - return merged_headers - - def _merge_queryparams( - self, params: QueryParamTypes | None = None - ) -> QueryParamTypes | None: - """ - Merge a queryparams argument together with any queryparams on the client, - to create the queryparams used for the outgoing request. - """ - if params or self.params: - merged_queryparams = QueryParams(self.params) - return merged_queryparams.merge(params) - return params - - def _build_auth(self, auth: AuthTypes | None) -> Auth | None: - if auth is None: - return None - elif isinstance(auth, tuple): - return BasicAuth(username=auth[0], password=auth[1]) - elif isinstance(auth, Auth): - return auth - elif callable(auth): - return FunctionAuth(func=auth) - else: - raise TypeError(f'Invalid "auth" argument: {auth!r}') - - def _build_request_auth( - self, - request: Request, - auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, - ) -> Auth: - auth = ( - self._auth if isinstance(auth, UseClientDefault) else self._build_auth(auth) - ) - - if auth is not None: - return auth - - username, password = request.url.username, request.url.password - if username or password: - return BasicAuth(username=username, password=password) - - return Auth() - - def _build_redirect_request(self, request: Request, response: Response) -> Request: - """ - Given a request and a redirect response, return a new request that - should be used to effect the redirect. - """ - method = self._redirect_method(request, response) - url = self._redirect_url(request, response) - headers = self._redirect_headers(request, url, method) - stream = self._redirect_stream(request, method) - cookies = Cookies(self.cookies) - return Request( - method=method, - url=url, - headers=headers, - cookies=cookies, - stream=stream, - extensions=request.extensions, - ) - - def _redirect_method(self, request: Request, response: Response) -> str: - """ - When being redirected we may want to change the method of the request - based on certain specs or browser behavior. - """ - method = request.method - - # https://tools.ietf.org/html/rfc7231#section-6.4.4 - if response.status_code == codes.SEE_OTHER and method != "HEAD": - method = "GET" - - # Do what the browsers do, despite standards... - # Turn 302s into GETs. - if response.status_code == codes.FOUND and method != "HEAD": - method = "GET" - - # If a POST is responded to with a 301, turn it into a GET. - # This bizarre behaviour is explained in 'requests' issue 1704. - if response.status_code == codes.MOVED_PERMANENTLY and method == "POST": - method = "GET" - - return method - - def _redirect_url(self, request: Request, response: Response) -> URL: - """ - Return the URL for the redirect to follow. - """ - location = response.headers["Location"] - - try: - url = URL(location) - except InvalidURL as exc: - raise RemoteProtocolError( - f"Invalid URL in location header: {exc}.", request=request - ) from None - - # Handle malformed 'Location' headers that are "absolute" form, have no host. - # See: https://github.com/encode/httpx/issues/771 - if url.scheme and not url.host: - url = url.copy_with(host=request.url.host) - - # Facilitate relative 'Location' headers, as allowed by RFC 7231. - # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') - if url.is_relative_url: - url = request.url.join(url) - - # Attach previous fragment if needed (RFC 7231 7.1.2) - if request.url.fragment and not url.fragment: - url = url.copy_with(fragment=request.url.fragment) - - return url - - def _redirect_headers(self, request: Request, url: URL, method: str) -> Headers: - """ - Return the headers that should be used for the redirect request. - """ - headers = Headers(request.headers) - - if not _same_origin(url, request.url): - if not _is_https_redirect(request.url, url): - # Strip Authorization headers when responses are redirected - # away from the origin. (Except for direct HTTP to HTTPS redirects.) - headers.pop("Authorization", None) - - # Update the Host header. - headers["Host"] = url.netloc.decode("ascii") - - if method != request.method and method == "GET": - # If we've switch to a 'GET' request, then strip any headers which - # are only relevant to the request body. - headers.pop("Content-Length", None) - headers.pop("Transfer-Encoding", None) - - # We should use the client cookie store to determine any cookie header, - # rather than whatever was on the original outgoing request. - headers.pop("Cookie", None) - - return headers - - def _redirect_stream( - self, request: Request, method: str - ) -> SyncByteStream | AsyncByteStream | None: - """ - Return the body that should be used for the redirect request. - """ - if method != request.method and method == "GET": - return None - - return request.stream - - def _set_timeout(self, request: Request) -> None: - if "timeout" not in request.extensions: - timeout = ( - self.timeout - if isinstance(self.timeout, UseClientDefault) - else Timeout(self.timeout) - ) - request.extensions = dict(**request.extensions, timeout=timeout.as_dict()) - - -class Client(BaseClient): - """ - An HTTP client, with connection pooling, HTTP/2, redirects, cookie persistence, etc. - - It can be shared between threads. - - Usage: - - ```python - >>> client = httpx.Client() - >>> response = client.get('https://example.org') - ``` - - **Parameters:** - - * **auth** - *(optional)* An authentication class to use when sending - requests. - * **params** - *(optional)* Query parameters to include in request URLs, as - a string, dictionary, or sequence of two-tuples. - * **headers** - *(optional)* Dictionary of HTTP headers to include when - sending requests. - * **cookies** - *(optional)* Dictionary of Cookie items to include when - sending requests. - * **verify** - *(optional)* Either `True` to use an SSL context with the - default CA bundle, `False` to disable verification, or an instance of - `ssl.SSLContext` to use a custom context. - * **http2** - *(optional)* A boolean indicating if HTTP/2 support should be - enabled. Defaults to `False`. - * **proxy** - *(optional)* A proxy URL where all the traffic should be routed. - * **timeout** - *(optional)* The timeout configuration to use when sending - requests. - * **limits** - *(optional)* The limits configuration to use. - * **max_redirects** - *(optional)* The maximum number of redirect responses - that should be followed. - * **base_url** - *(optional)* A URL to use as the base when building - request URLs. - * **transport** - *(optional)* A transport class to use for sending requests - over the network. - * **trust_env** - *(optional)* Enables or disables usage of environment - variables for configuration. - * **default_encoding** - *(optional)* The default encoding to use for decoding - response text, if no charset information is included in a response Content-Type - header. Set to a callable for automatic character set detection. Default: "utf-8". - """ - - def __init__( - self, - *, - auth: AuthTypes | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - verify: ssl.SSLContext | str | bool = True, - cert: CertTypes | None = None, - trust_env: bool = True, - http1: bool = True, - http2: bool = False, - proxy: ProxyTypes | None = None, - mounts: None | (typing.Mapping[str, BaseTransport | None]) = None, - timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, - follow_redirects: bool = False, - limits: Limits = DEFAULT_LIMITS, - max_redirects: int = DEFAULT_MAX_REDIRECTS, - event_hooks: None | (typing.Mapping[str, list[EventHook]]) = None, - base_url: URL | str = "", - transport: BaseTransport | None = None, - default_encoding: str | typing.Callable[[bytes], str] = "utf-8", - ) -> None: - super().__init__( - auth=auth, - params=params, - headers=headers, - cookies=cookies, - timeout=timeout, - follow_redirects=follow_redirects, - max_redirects=max_redirects, - event_hooks=event_hooks, - base_url=base_url, - trust_env=trust_env, - default_encoding=default_encoding, - ) - - if http2: - try: - import h2 # noqa - except ImportError: # pragma: no cover - raise ImportError( - "Using http2=True, but the 'h2' package is not installed. " - "Make sure to install httpx using `pip install httpx[http2]`." - ) from None - - allow_env_proxies = trust_env and transport is None - proxy_map = self._get_proxy_map(proxy, allow_env_proxies) - - self._transport = self._init_transport( - verify=verify, - cert=cert, - trust_env=trust_env, - http1=http1, - http2=http2, - limits=limits, - transport=transport, - ) - self._mounts: dict[URLPattern, BaseTransport | None] = { - URLPattern(key): None - if proxy is None - else self._init_proxy_transport( - proxy, - verify=verify, - cert=cert, - trust_env=trust_env, - http1=http1, - http2=http2, - limits=limits, - ) - for key, proxy in proxy_map.items() - } - if mounts is not None: - self._mounts.update( - {URLPattern(key): transport for key, transport in mounts.items()} - ) - - self._mounts = dict(sorted(self._mounts.items())) - - def _init_transport( - self, - verify: ssl.SSLContext | str | bool = True, - cert: CertTypes | None = None, - trust_env: bool = True, - http1: bool = True, - http2: bool = False, - limits: Limits = DEFAULT_LIMITS, - transport: BaseTransport | None = None, - ) -> BaseTransport: - if transport is not None: - return transport - - return HTTPTransport( - verify=verify, - cert=cert, - trust_env=trust_env, - http1=http1, - http2=http2, - limits=limits, - ) - - def _init_proxy_transport( - self, - proxy: Proxy, - verify: ssl.SSLContext | str | bool = True, - cert: CertTypes | None = None, - trust_env: bool = True, - http1: bool = True, - http2: bool = False, - limits: Limits = DEFAULT_LIMITS, - ) -> BaseTransport: - return HTTPTransport( - verify=verify, - cert=cert, - trust_env=trust_env, - http1=http1, - http2=http2, - limits=limits, - proxy=proxy, - ) - - def _transport_for_url(self, url: URL) -> BaseTransport: - """ - Returns the transport instance that should be used for a given URL. - This will either be the standard connection pool, or a proxy. - """ - for pattern, transport in self._mounts.items(): - if pattern.matches(url): - return self._transport if transport is None else transport - - return self._transport - - def request( - self, - method: str, - url: URL | str, - *, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Build and send a request. - - Equivalent to: - - ```python - request = client.build_request(...) - response = client.send(request, ...) - ``` - - See `Client.build_request()`, `Client.send()` and - [Merging of configuration][0] for how the various parameters - are merged with client-level configuration. - - [0]: /advanced/clients/#merging-of-configuration - """ - if cookies is not None: - message = ( - "Setting per-request cookies=<...> is being deprecated, because " - "the expected behaviour on cookie persistence is ambiguous. Set " - "cookies directly on the client instance instead." - ) - warnings.warn(message, DeprecationWarning, stacklevel=2) - - request = self.build_request( - method=method, - url=url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - cookies=cookies, - timeout=timeout, - extensions=extensions, - ) - return self.send(request, auth=auth, follow_redirects=follow_redirects) - - @contextmanager - def stream( - self, - method: str, - url: URL | str, - *, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> typing.Iterator[Response]: - """ - Alternative to `httpx.request()` that streams the response body - instead of loading it into memory at once. - - **Parameters**: See `httpx.request`. - - See also: [Streaming Responses][0] - - [0]: /quickstart#streaming-responses - """ - request = self.build_request( - method=method, - url=url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - cookies=cookies, - timeout=timeout, - extensions=extensions, - ) - response = self.send( - request=request, - auth=auth, - follow_redirects=follow_redirects, - stream=True, - ) - try: - yield response - finally: - response.close() - - def send( - self, - request: Request, - *, - stream: bool = False, - auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - ) -> Response: - """ - Send a request. - - The request is sent as-is, unmodified. - - Typically you'll want to build one with `Client.build_request()` - so that any client-level configuration is merged into the request, - but passing an explicit `httpx.Request()` is supported as well. - - See also: [Request instances][0] - - [0]: /advanced/clients/#request-instances - """ - if self._state == ClientState.CLOSED: - raise RuntimeError("Cannot send a request, as the client has been closed.") - - self._state = ClientState.OPENED - follow_redirects = ( - self.follow_redirects - if isinstance(follow_redirects, UseClientDefault) - else follow_redirects - ) - - self._set_timeout(request) - - auth = self._build_request_auth(request, auth) - - response = self._send_handling_auth( - request, - auth=auth, - follow_redirects=follow_redirects, - history=[], - ) - try: - if not stream: - response.read() - - return response - - except BaseException as exc: - response.close() - raise exc - - def _send_handling_auth( - self, - request: Request, - auth: Auth, - follow_redirects: bool, - history: list[Response], - ) -> Response: - auth_flow = auth.sync_auth_flow(request) - try: - request = next(auth_flow) - - while True: - response = self._send_handling_redirects( - request, - follow_redirects=follow_redirects, - history=history, - ) - try: - try: - next_request = auth_flow.send(response) - except StopIteration: - return response - - response.history = list(history) - response.read() - request = next_request - history.append(response) - - except BaseException as exc: - response.close() - raise exc - finally: - auth_flow.close() - - def _send_handling_redirects( - self, - request: Request, - follow_redirects: bool, - history: list[Response], - ) -> Response: - while True: - if len(history) > self.max_redirects: - raise TooManyRedirects( - "Exceeded maximum allowed redirects.", request=request - ) - - for hook in self._event_hooks["request"]: - hook(request) - - response = self._send_single_request(request) - try: - for hook in self._event_hooks["response"]: - hook(response) - response.history = list(history) - - if not response.has_redirect_location: - return response - - request = self._build_redirect_request(request, response) - history = history + [response] - - if follow_redirects: - response.read() - else: - response.next_request = request - return response - - except BaseException as exc: - response.close() - raise exc - - def _send_single_request(self, request: Request) -> Response: - """ - Sends a single request, without handling any redirections. - """ - transport = self._transport_for_url(request.url) - start = time.perf_counter() - - if not isinstance(request.stream, SyncByteStream): - raise RuntimeError( - "Attempted to send an async request with a sync Client instance." - ) - - with request_context(request=request): - response = transport.handle_request(request) - - assert isinstance(response.stream, SyncByteStream) - - response.request = request - response.stream = BoundSyncStream( - response.stream, response=response, start=start - ) - self.cookies.extract_cookies(response) - response.default_encoding = self._default_encoding - - logger.info( - 'HTTP Request: %s %s "%s %d %s"', - request.method, - request.url, - response.http_version, - response.status_code, - response.reason_phrase, - ) - - return response - - def get( - self, - url: URL | str, - *, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Send a `GET` request. - - **Parameters**: See `httpx.request`. - """ - return self.request( - "GET", - url, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - follow_redirects=follow_redirects, - timeout=timeout, - extensions=extensions, - ) - - def options( - self, - url: URL | str, - *, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Send an `OPTIONS` request. - - **Parameters**: See `httpx.request`. - """ - return self.request( - "OPTIONS", - url, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - follow_redirects=follow_redirects, - timeout=timeout, - extensions=extensions, - ) - - def head( - self, - url: URL | str, - *, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Send a `HEAD` request. - - **Parameters**: See `httpx.request`. - """ - return self.request( - "HEAD", - url, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - follow_redirects=follow_redirects, - timeout=timeout, - extensions=extensions, - ) - - def post( - self, - url: URL | str, - *, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Send a `POST` request. - - **Parameters**: See `httpx.request`. - """ - return self.request( - "POST", - url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - follow_redirects=follow_redirects, - timeout=timeout, - extensions=extensions, - ) - - def put( - self, - url: URL | str, - *, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Send a `PUT` request. - - **Parameters**: See `httpx.request`. - """ - return self.request( - "PUT", - url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - follow_redirects=follow_redirects, - timeout=timeout, - extensions=extensions, - ) - - def patch( - self, - url: URL | str, - *, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Send a `PATCH` request. - - **Parameters**: See `httpx.request`. - """ - return self.request( - "PATCH", - url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - follow_redirects=follow_redirects, - timeout=timeout, - extensions=extensions, - ) - - def delete( - self, - url: URL | str, - *, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Send a `DELETE` request. - - **Parameters**: See `httpx.request`. - """ - return self.request( - "DELETE", - url, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - follow_redirects=follow_redirects, - timeout=timeout, - extensions=extensions, - ) - - def close(self) -> None: - """ - Close transport and proxies. - """ - if self._state != ClientState.CLOSED: - self._state = ClientState.CLOSED - - self._transport.close() - for transport in self._mounts.values(): - if transport is not None: - transport.close() - - def __enter__(self: T) -> T: - if self._state != ClientState.UNOPENED: - msg = { - ClientState.OPENED: "Cannot open a client instance more than once.", - ClientState.CLOSED: ( - "Cannot reopen a client instance, once it has been closed." - ), - }[self._state] - raise RuntimeError(msg) - - self._state = ClientState.OPENED - - self._transport.__enter__() - for transport in self._mounts.values(): - if transport is not None: - transport.__enter__() - return self - - def __exit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: TracebackType | None = None, - ) -> None: - self._state = ClientState.CLOSED - - self._transport.__exit__(exc_type, exc_value, traceback) - for transport in self._mounts.values(): - if transport is not None: - transport.__exit__(exc_type, exc_value, traceback) - - -class AsyncClient(BaseClient): - """ - An asynchronous HTTP client, with connection pooling, HTTP/2, redirects, - cookie persistence, etc. - - It can be shared between tasks. - - Usage: - - ```python - >>> async with httpx.AsyncClient() as client: - >>> response = await client.get('https://example.org') - ``` - - **Parameters:** - - * **auth** - *(optional)* An authentication class to use when sending - requests. - * **params** - *(optional)* Query parameters to include in request URLs, as - a string, dictionary, or sequence of two-tuples. - * **headers** - *(optional)* Dictionary of HTTP headers to include when - sending requests. - * **cookies** - *(optional)* Dictionary of Cookie items to include when - sending requests. - * **verify** - *(optional)* Either `True` to use an SSL context with the - default CA bundle, `False` to disable verification, or an instance of - `ssl.SSLContext` to use a custom context. - * **http2** - *(optional)* A boolean indicating if HTTP/2 support should be - enabled. Defaults to `False`. - * **proxy** - *(optional)* A proxy URL where all the traffic should be routed. - * **timeout** - *(optional)* The timeout configuration to use when sending - requests. - * **limits** - *(optional)* The limits configuration to use. - * **max_redirects** - *(optional)* The maximum number of redirect responses - that should be followed. - * **base_url** - *(optional)* A URL to use as the base when building - request URLs. - * **transport** - *(optional)* A transport class to use for sending requests - over the network. - * **trust_env** - *(optional)* Enables or disables usage of environment - variables for configuration. - * **default_encoding** - *(optional)* The default encoding to use for decoding - response text, if no charset information is included in a response Content-Type - header. Set to a callable for automatic character set detection. Default: "utf-8". - """ - - def __init__( - self, - *, - auth: AuthTypes | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - verify: ssl.SSLContext | str | bool = True, - cert: CertTypes | None = None, - http1: bool = True, - http2: bool = False, - proxy: ProxyTypes | None = None, - mounts: None | (typing.Mapping[str, AsyncBaseTransport | None]) = None, - timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, - follow_redirects: bool = False, - limits: Limits = DEFAULT_LIMITS, - max_redirects: int = DEFAULT_MAX_REDIRECTS, - event_hooks: None | (typing.Mapping[str, list[EventHook]]) = None, - base_url: URL | str = "", - transport: AsyncBaseTransport | None = None, - trust_env: bool = True, - default_encoding: str | typing.Callable[[bytes], str] = "utf-8", - ) -> None: - super().__init__( - auth=auth, - params=params, - headers=headers, - cookies=cookies, - timeout=timeout, - follow_redirects=follow_redirects, - max_redirects=max_redirects, - event_hooks=event_hooks, - base_url=base_url, - trust_env=trust_env, - default_encoding=default_encoding, - ) - - if http2: - try: - import h2 # noqa - except ImportError: # pragma: no cover - raise ImportError( - "Using http2=True, but the 'h2' package is not installed. " - "Make sure to install httpx using `pip install httpx[http2]`." - ) from None - - allow_env_proxies = trust_env and transport is None - proxy_map = self._get_proxy_map(proxy, allow_env_proxies) - - self._transport = self._init_transport( - verify=verify, - cert=cert, - trust_env=trust_env, - http1=http1, - http2=http2, - limits=limits, - transport=transport, - ) - - self._mounts: dict[URLPattern, AsyncBaseTransport | None] = { - URLPattern(key): None - if proxy is None - else self._init_proxy_transport( - proxy, - verify=verify, - cert=cert, - trust_env=trust_env, - http1=http1, - http2=http2, - limits=limits, - ) - for key, proxy in proxy_map.items() - } - if mounts is not None: - self._mounts.update( - {URLPattern(key): transport for key, transport in mounts.items()} - ) - self._mounts = dict(sorted(self._mounts.items())) - - def _init_transport( - self, - verify: ssl.SSLContext | str | bool = True, - cert: CertTypes | None = None, - trust_env: bool = True, - http1: bool = True, - http2: bool = False, - limits: Limits = DEFAULT_LIMITS, - transport: AsyncBaseTransport | None = None, - ) -> AsyncBaseTransport: - if transport is not None: - return transport - - return AsyncHTTPTransport( - verify=verify, - cert=cert, - trust_env=trust_env, - http1=http1, - http2=http2, - limits=limits, - ) - - def _init_proxy_transport( - self, - proxy: Proxy, - verify: ssl.SSLContext | str | bool = True, - cert: CertTypes | None = None, - trust_env: bool = True, - http1: bool = True, - http2: bool = False, - limits: Limits = DEFAULT_LIMITS, - ) -> AsyncBaseTransport: - return AsyncHTTPTransport( - verify=verify, - cert=cert, - trust_env=trust_env, - http1=http1, - http2=http2, - limits=limits, - proxy=proxy, - ) - - def _transport_for_url(self, url: URL) -> AsyncBaseTransport: - """ - Returns the transport instance that should be used for a given URL. - This will either be the standard connection pool, or a proxy. - """ - for pattern, transport in self._mounts.items(): - if pattern.matches(url): - return self._transport if transport is None else transport - - return self._transport - - async def request( - self, - method: str, - url: URL | str, - *, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Build and send a request. - - Equivalent to: - - ```python - request = client.build_request(...) - response = await client.send(request, ...) - ``` - - See `AsyncClient.build_request()`, `AsyncClient.send()` - and [Merging of configuration][0] for how the various parameters - are merged with client-level configuration. - - [0]: /advanced/clients/#merging-of-configuration - """ - - if cookies is not None: # pragma: no cover - message = ( - "Setting per-request cookies=<...> is being deprecated, because " - "the expected behaviour on cookie persistence is ambiguous. Set " - "cookies directly on the client instance instead." - ) - warnings.warn(message, DeprecationWarning, stacklevel=2) - - request = self.build_request( - method=method, - url=url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - cookies=cookies, - timeout=timeout, - extensions=extensions, - ) - return await self.send(request, auth=auth, follow_redirects=follow_redirects) - - @asynccontextmanager - async def stream( - self, - method: str, - url: URL | str, - *, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> typing.AsyncIterator[Response]: - """ - Alternative to `httpx.request()` that streams the response body - instead of loading it into memory at once. - - **Parameters**: See `httpx.request`. - - See also: [Streaming Responses][0] - - [0]: /quickstart#streaming-responses - """ - request = self.build_request( - method=method, - url=url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - cookies=cookies, - timeout=timeout, - extensions=extensions, - ) - response = await self.send( - request=request, - auth=auth, - follow_redirects=follow_redirects, - stream=True, - ) - try: - yield response - finally: - await response.aclose() - - async def send( - self, - request: Request, - *, - stream: bool = False, - auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - ) -> Response: - """ - Send a request. - - The request is sent as-is, unmodified. - - Typically you'll want to build one with `AsyncClient.build_request()` - so that any client-level configuration is merged into the request, - but passing an explicit `httpx.Request()` is supported as well. - - See also: [Request instances][0] - - [0]: /advanced/clients/#request-instances - """ - if self._state == ClientState.CLOSED: - raise RuntimeError("Cannot send a request, as the client has been closed.") - - self._state = ClientState.OPENED - follow_redirects = ( - self.follow_redirects - if isinstance(follow_redirects, UseClientDefault) - else follow_redirects - ) - - self._set_timeout(request) - - auth = self._build_request_auth(request, auth) - - response = await self._send_handling_auth( - request, - auth=auth, - follow_redirects=follow_redirects, - history=[], - ) - try: - if not stream: - await response.aread() - - return response - - except BaseException as exc: - await response.aclose() - raise exc - - async def _send_handling_auth( - self, - request: Request, - auth: Auth, - follow_redirects: bool, - history: list[Response], - ) -> Response: - auth_flow = auth.async_auth_flow(request) - try: - request = await auth_flow.__anext__() - - while True: - response = await self._send_handling_redirects( - request, - follow_redirects=follow_redirects, - history=history, - ) - try: - try: - next_request = await auth_flow.asend(response) - except StopAsyncIteration: - return response - - response.history = list(history) - await response.aread() - request = next_request - history.append(response) - - except BaseException as exc: - await response.aclose() - raise exc - finally: - await auth_flow.aclose() - - async def _send_handling_redirects( - self, - request: Request, - follow_redirects: bool, - history: list[Response], - ) -> Response: - while True: - if len(history) > self.max_redirects: - raise TooManyRedirects( - "Exceeded maximum allowed redirects.", request=request - ) - - for hook in self._event_hooks["request"]: - await hook(request) - - response = await self._send_single_request(request) - try: - for hook in self._event_hooks["response"]: - await hook(response) - - response.history = list(history) - - if not response.has_redirect_location: - return response - - request = self._build_redirect_request(request, response) - history = history + [response] - - if follow_redirects: - await response.aread() - else: - response.next_request = request - return response - - except BaseException as exc: - await response.aclose() - raise exc - - async def _send_single_request(self, request: Request) -> Response: - """ - Sends a single request, without handling any redirections. - """ - transport = self._transport_for_url(request.url) - start = time.perf_counter() - - if not isinstance(request.stream, AsyncByteStream): - raise RuntimeError( - "Attempted to send an sync request with an AsyncClient instance." - ) - - with request_context(request=request): - response = await transport.handle_async_request(request) - - assert isinstance(response.stream, AsyncByteStream) - response.request = request - response.stream = BoundAsyncStream( - response.stream, response=response, start=start - ) - self.cookies.extract_cookies(response) - response.default_encoding = self._default_encoding - - logger.info( - 'HTTP Request: %s %s "%s %d %s"', - request.method, - request.url, - response.http_version, - response.status_code, - response.reason_phrase, - ) - - return response - - async def get( - self, - url: URL | str, - *, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Send a `GET` request. - - **Parameters**: See `httpx.request`. - """ - return await self.request( - "GET", - url, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - follow_redirects=follow_redirects, - timeout=timeout, - extensions=extensions, - ) - - async def options( - self, - url: URL | str, - *, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Send an `OPTIONS` request. - - **Parameters**: See `httpx.request`. - """ - return await self.request( - "OPTIONS", - url, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - follow_redirects=follow_redirects, - timeout=timeout, - extensions=extensions, - ) - - async def head( - self, - url: URL | str, - *, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Send a `HEAD` request. - - **Parameters**: See `httpx.request`. - """ - return await self.request( - "HEAD", - url, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - follow_redirects=follow_redirects, - timeout=timeout, - extensions=extensions, - ) - - async def post( - self, - url: URL | str, - *, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Send a `POST` request. - - **Parameters**: See `httpx.request`. - """ - return await self.request( - "POST", - url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - follow_redirects=follow_redirects, - timeout=timeout, - extensions=extensions, - ) - - async def put( - self, - url: URL | str, - *, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Send a `PUT` request. - - **Parameters**: See `httpx.request`. - """ - return await self.request( - "PUT", - url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - follow_redirects=follow_redirects, - timeout=timeout, - extensions=extensions, - ) - - async def patch( - self, - url: URL | str, - *, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Send a `PATCH` request. - - **Parameters**: See `httpx.request`. - """ - return await self.request( - "PATCH", - url, - content=content, - data=data, - files=files, - json=json, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - follow_redirects=follow_redirects, - timeout=timeout, - extensions=extensions, - ) - - async def delete( - self, - url: URL | str, - *, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, - follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, - timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, - extensions: RequestExtensions | None = None, - ) -> Response: - """ - Send a `DELETE` request. - - **Parameters**: See `httpx.request`. - """ - return await self.request( - "DELETE", - url, - params=params, - headers=headers, - cookies=cookies, - auth=auth, - follow_redirects=follow_redirects, - timeout=timeout, - extensions=extensions, - ) - - async def aclose(self) -> None: - """ - Close transport and proxies. - """ - if self._state != ClientState.CLOSED: - self._state = ClientState.CLOSED - - await self._transport.aclose() - for proxy in self._mounts.values(): - if proxy is not None: - await proxy.aclose() - - async def __aenter__(self: U) -> U: - if self._state != ClientState.UNOPENED: - msg = { - ClientState.OPENED: "Cannot open a client instance more than once.", - ClientState.CLOSED: ( - "Cannot reopen a client instance, once it has been closed." - ), - }[self._state] - raise RuntimeError(msg) - - self._state = ClientState.OPENED - - await self._transport.__aenter__() - for proxy in self._mounts.values(): - if proxy is not None: - await proxy.__aenter__() - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: TracebackType | None = None, - ) -> None: - self._state = ClientState.CLOSED - - await self._transport.__aexit__(exc_type, exc_value, traceback) - for proxy in self._mounts.values(): - if proxy is not None: - await proxy.__aexit__(exc_type, exc_value, traceback) diff --git a/venv/lib/python3.11/site-packages/httpx/_config.py b/venv/lib/python3.11/site-packages/httpx/_config.py deleted file mode 100755 index 467a6c9..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_config.py +++ /dev/null @@ -1,248 +0,0 @@ -from __future__ import annotations - -import os -import typing - -from ._models import Headers -from ._types import CertTypes, HeaderTypes, TimeoutTypes -from ._urls import URL - -if typing.TYPE_CHECKING: - import ssl # pragma: no cover - -__all__ = ["Limits", "Proxy", "Timeout", "create_ssl_context"] - - -class UnsetType: - pass # pragma: no cover - - -UNSET = UnsetType() - - -def create_ssl_context( - verify: ssl.SSLContext | str | bool = True, - cert: CertTypes | None = None, - trust_env: bool = True, -) -> ssl.SSLContext: - import ssl - import warnings - - import certifi - - if verify is True: - if trust_env and os.environ.get("SSL_CERT_FILE"): # pragma: nocover - ctx = ssl.create_default_context(cafile=os.environ["SSL_CERT_FILE"]) - elif trust_env and os.environ.get("SSL_CERT_DIR"): # pragma: nocover - ctx = ssl.create_default_context(capath=os.environ["SSL_CERT_DIR"]) - else: - # Default case... - ctx = ssl.create_default_context(cafile=certifi.where()) - elif verify is False: - ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) - ctx.check_hostname = False - ctx.verify_mode = ssl.CERT_NONE - elif isinstance(verify, str): # pragma: nocover - message = ( - "`verify=` is deprecated. " - "Use `verify=ssl.create_default_context(cafile=...)` " - "or `verify=ssl.create_default_context(capath=...)` instead." - ) - warnings.warn(message, DeprecationWarning) - if os.path.isdir(verify): - return ssl.create_default_context(capath=verify) - return ssl.create_default_context(cafile=verify) - else: - ctx = verify - - if cert: # pragma: nocover - message = ( - "`cert=...` is deprecated. Use `verify=` instead," - "with `.load_cert_chain()` to configure the certificate chain." - ) - warnings.warn(message, DeprecationWarning) - if isinstance(cert, str): - ctx.load_cert_chain(cert) - else: - ctx.load_cert_chain(*cert) - - return ctx - - -class Timeout: - """ - Timeout configuration. - - **Usage**: - - Timeout(None) # No timeouts. - Timeout(5.0) # 5s timeout on all operations. - Timeout(None, connect=5.0) # 5s timeout on connect, no other timeouts. - Timeout(5.0, connect=10.0) # 10s timeout on connect. 5s timeout elsewhere. - Timeout(5.0, pool=None) # No timeout on acquiring connection from pool. - # 5s timeout elsewhere. - """ - - def __init__( - self, - timeout: TimeoutTypes | UnsetType = UNSET, - *, - connect: None | float | UnsetType = UNSET, - read: None | float | UnsetType = UNSET, - write: None | float | UnsetType = UNSET, - pool: None | float | UnsetType = UNSET, - ) -> None: - if isinstance(timeout, Timeout): - # Passed as a single explicit Timeout. - assert connect is UNSET - assert read is UNSET - assert write is UNSET - assert pool is UNSET - self.connect = timeout.connect # type: typing.Optional[float] - self.read = timeout.read # type: typing.Optional[float] - self.write = timeout.write # type: typing.Optional[float] - self.pool = timeout.pool # type: typing.Optional[float] - elif isinstance(timeout, tuple): - # Passed as a tuple. - self.connect = timeout[0] - self.read = timeout[1] - self.write = None if len(timeout) < 3 else timeout[2] - self.pool = None if len(timeout) < 4 else timeout[3] - elif not ( - isinstance(connect, UnsetType) - or isinstance(read, UnsetType) - or isinstance(write, UnsetType) - or isinstance(pool, UnsetType) - ): - self.connect = connect - self.read = read - self.write = write - self.pool = pool - else: - if isinstance(timeout, UnsetType): - raise ValueError( - "httpx.Timeout must either include a default, or set all " - "four parameters explicitly." - ) - self.connect = timeout if isinstance(connect, UnsetType) else connect - self.read = timeout if isinstance(read, UnsetType) else read - self.write = timeout if isinstance(write, UnsetType) else write - self.pool = timeout if isinstance(pool, UnsetType) else pool - - def as_dict(self) -> dict[str, float | None]: - return { - "connect": self.connect, - "read": self.read, - "write": self.write, - "pool": self.pool, - } - - def __eq__(self, other: typing.Any) -> bool: - return ( - isinstance(other, self.__class__) - and self.connect == other.connect - and self.read == other.read - and self.write == other.write - and self.pool == other.pool - ) - - def __repr__(self) -> str: - class_name = self.__class__.__name__ - if len({self.connect, self.read, self.write, self.pool}) == 1: - return f"{class_name}(timeout={self.connect})" - return ( - f"{class_name}(connect={self.connect}, " - f"read={self.read}, write={self.write}, pool={self.pool})" - ) - - -class Limits: - """ - Configuration for limits to various client behaviors. - - **Parameters:** - - * **max_connections** - The maximum number of concurrent connections that may be - established. - * **max_keepalive_connections** - Allow the connection pool to maintain - keep-alive connections below this point. Should be less than or equal - to `max_connections`. - * **keepalive_expiry** - Time limit on idle keep-alive connections in seconds. - """ - - def __init__( - self, - *, - max_connections: int | None = None, - max_keepalive_connections: int | None = None, - keepalive_expiry: float | None = 5.0, - ) -> None: - self.max_connections = max_connections - self.max_keepalive_connections = max_keepalive_connections - self.keepalive_expiry = keepalive_expiry - - def __eq__(self, other: typing.Any) -> bool: - return ( - isinstance(other, self.__class__) - and self.max_connections == other.max_connections - and self.max_keepalive_connections == other.max_keepalive_connections - and self.keepalive_expiry == other.keepalive_expiry - ) - - def __repr__(self) -> str: - class_name = self.__class__.__name__ - return ( - f"{class_name}(max_connections={self.max_connections}, " - f"max_keepalive_connections={self.max_keepalive_connections}, " - f"keepalive_expiry={self.keepalive_expiry})" - ) - - -class Proxy: - def __init__( - self, - url: URL | str, - *, - ssl_context: ssl.SSLContext | None = None, - auth: tuple[str, str] | None = None, - headers: HeaderTypes | None = None, - ) -> None: - url = URL(url) - headers = Headers(headers) - - if url.scheme not in ("http", "https", "socks5", "socks5h"): - raise ValueError(f"Unknown scheme for proxy URL {url!r}") - - if url.username or url.password: - # Remove any auth credentials from the URL. - auth = (url.username, url.password) - url = url.copy_with(username=None, password=None) - - self.url = url - self.auth = auth - self.headers = headers - self.ssl_context = ssl_context - - @property - def raw_auth(self) -> tuple[bytes, bytes] | None: - # The proxy authentication as raw bytes. - return ( - None - if self.auth is None - else (self.auth[0].encode("utf-8"), self.auth[1].encode("utf-8")) - ) - - def __repr__(self) -> str: - # The authentication is represented with the password component masked. - auth = (self.auth[0], "********") if self.auth else None - - # Build a nice concise representation. - url_str = f"{str(self.url)!r}" - auth_str = f", auth={auth!r}" if auth else "" - headers_str = f", headers={dict(self.headers)!r}" if self.headers else "" - return f"Proxy({url_str}{auth_str}{headers_str})" - - -DEFAULT_TIMEOUT_CONFIG = Timeout(timeout=5.0) -DEFAULT_LIMITS = Limits(max_connections=100, max_keepalive_connections=20) -DEFAULT_MAX_REDIRECTS = 20 diff --git a/venv/lib/python3.11/site-packages/httpx/_content.py b/venv/lib/python3.11/site-packages/httpx/_content.py deleted file mode 100755 index 6f479a0..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_content.py +++ /dev/null @@ -1,240 +0,0 @@ -from __future__ import annotations - -import inspect -import warnings -from json import dumps as json_dumps -from typing import ( - Any, - AsyncIterable, - AsyncIterator, - Iterable, - Iterator, - Mapping, -) -from urllib.parse import urlencode - -from ._exceptions import StreamClosed, StreamConsumed -from ._multipart import MultipartStream -from ._types import ( - AsyncByteStream, - RequestContent, - RequestData, - RequestFiles, - ResponseContent, - SyncByteStream, -) -from ._utils import peek_filelike_length, primitive_value_to_str - -__all__ = ["ByteStream"] - - -class ByteStream(AsyncByteStream, SyncByteStream): - def __init__(self, stream: bytes) -> None: - self._stream = stream - - def __iter__(self) -> Iterator[bytes]: - yield self._stream - - async def __aiter__(self) -> AsyncIterator[bytes]: - yield self._stream - - -class IteratorByteStream(SyncByteStream): - CHUNK_SIZE = 65_536 - - def __init__(self, stream: Iterable[bytes]) -> None: - self._stream = stream - self._is_stream_consumed = False - self._is_generator = inspect.isgenerator(stream) - - def __iter__(self) -> Iterator[bytes]: - if self._is_stream_consumed and self._is_generator: - raise StreamConsumed() - - self._is_stream_consumed = True - if hasattr(self._stream, "read"): - # File-like interfaces should use 'read' directly. - chunk = self._stream.read(self.CHUNK_SIZE) - while chunk: - yield chunk - chunk = self._stream.read(self.CHUNK_SIZE) - else: - # Otherwise iterate. - for part in self._stream: - yield part - - -class AsyncIteratorByteStream(AsyncByteStream): - CHUNK_SIZE = 65_536 - - def __init__(self, stream: AsyncIterable[bytes]) -> None: - self._stream = stream - self._is_stream_consumed = False - self._is_generator = inspect.isasyncgen(stream) - - async def __aiter__(self) -> AsyncIterator[bytes]: - if self._is_stream_consumed and self._is_generator: - raise StreamConsumed() - - self._is_stream_consumed = True - if hasattr(self._stream, "aread"): - # File-like interfaces should use 'aread' directly. - chunk = await self._stream.aread(self.CHUNK_SIZE) - while chunk: - yield chunk - chunk = await self._stream.aread(self.CHUNK_SIZE) - else: - # Otherwise iterate. - async for part in self._stream: - yield part - - -class UnattachedStream(AsyncByteStream, SyncByteStream): - """ - If a request or response is serialized using pickle, then it is no longer - attached to a stream for I/O purposes. Any stream operations should result - in `httpx.StreamClosed`. - """ - - def __iter__(self) -> Iterator[bytes]: - raise StreamClosed() - - async def __aiter__(self) -> AsyncIterator[bytes]: - raise StreamClosed() - yield b"" # pragma: no cover - - -def encode_content( - content: str | bytes | Iterable[bytes] | AsyncIterable[bytes], -) -> tuple[dict[str, str], SyncByteStream | AsyncByteStream]: - if isinstance(content, (bytes, str)): - body = content.encode("utf-8") if isinstance(content, str) else content - content_length = len(body) - headers = {"Content-Length": str(content_length)} if body else {} - return headers, ByteStream(body) - - elif isinstance(content, Iterable) and not isinstance(content, dict): - # `not isinstance(content, dict)` is a bit oddly specific, but it - # catches a case that's easy for users to make in error, and would - # otherwise pass through here, like any other bytes-iterable, - # because `dict` happens to be iterable. See issue #2491. - content_length_or_none = peek_filelike_length(content) - - if content_length_or_none is None: - headers = {"Transfer-Encoding": "chunked"} - else: - headers = {"Content-Length": str(content_length_or_none)} - return headers, IteratorByteStream(content) # type: ignore - - elif isinstance(content, AsyncIterable): - headers = {"Transfer-Encoding": "chunked"} - return headers, AsyncIteratorByteStream(content) - - raise TypeError(f"Unexpected type for 'content', {type(content)!r}") - - -def encode_urlencoded_data( - data: RequestData, -) -> tuple[dict[str, str], ByteStream]: - plain_data = [] - for key, value in data.items(): - if isinstance(value, (list, tuple)): - plain_data.extend([(key, primitive_value_to_str(item)) for item in value]) - else: - plain_data.append((key, primitive_value_to_str(value))) - body = urlencode(plain_data, doseq=True).encode("utf-8") - content_length = str(len(body)) - content_type = "application/x-www-form-urlencoded" - headers = {"Content-Length": content_length, "Content-Type": content_type} - return headers, ByteStream(body) - - -def encode_multipart_data( - data: RequestData, files: RequestFiles, boundary: bytes | None -) -> tuple[dict[str, str], MultipartStream]: - multipart = MultipartStream(data=data, files=files, boundary=boundary) - headers = multipart.get_headers() - return headers, multipart - - -def encode_text(text: str) -> tuple[dict[str, str], ByteStream]: - body = text.encode("utf-8") - content_length = str(len(body)) - content_type = "text/plain; charset=utf-8" - headers = {"Content-Length": content_length, "Content-Type": content_type} - return headers, ByteStream(body) - - -def encode_html(html: str) -> tuple[dict[str, str], ByteStream]: - body = html.encode("utf-8") - content_length = str(len(body)) - content_type = "text/html; charset=utf-8" - headers = {"Content-Length": content_length, "Content-Type": content_type} - return headers, ByteStream(body) - - -def encode_json(json: Any) -> tuple[dict[str, str], ByteStream]: - body = json_dumps( - json, ensure_ascii=False, separators=(",", ":"), allow_nan=False - ).encode("utf-8") - content_length = str(len(body)) - content_type = "application/json" - headers = {"Content-Length": content_length, "Content-Type": content_type} - return headers, ByteStream(body) - - -def encode_request( - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: Any | None = None, - boundary: bytes | None = None, -) -> tuple[dict[str, str], SyncByteStream | AsyncByteStream]: - """ - Handles encoding the given `content`, `data`, `files`, and `json`, - returning a two-tuple of (, ). - """ - if data is not None and not isinstance(data, Mapping): - # We prefer to separate `content=` - # for raw request content, and `data=

` for url encoded or - # multipart form content. - # - # However for compat with requests, we *do* still support - # `data=` usages. We deal with that case here, treating it - # as if `content=<...>` had been supplied instead. - message = "Use 'content=<...>' to upload raw bytes/text content." - warnings.warn(message, DeprecationWarning, stacklevel=2) - return encode_content(data) - - if content is not None: - return encode_content(content) - elif files: - return encode_multipart_data(data or {}, files, boundary) - elif data: - return encode_urlencoded_data(data) - elif json is not None: - return encode_json(json) - - return {}, ByteStream(b"") - - -def encode_response( - content: ResponseContent | None = None, - text: str | None = None, - html: str | None = None, - json: Any | None = None, -) -> tuple[dict[str, str], SyncByteStream | AsyncByteStream]: - """ - Handles encoding the given `content`, returning a two-tuple of - (, ). - """ - if content is not None: - return encode_content(content) - elif text is not None: - return encode_text(text) - elif html is not None: - return encode_html(html) - elif json is not None: - return encode_json(json) - - return {}, ByteStream(b"") diff --git a/venv/lib/python3.11/site-packages/httpx/_decoders.py b/venv/lib/python3.11/site-packages/httpx/_decoders.py deleted file mode 100755 index 899dfad..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_decoders.py +++ /dev/null @@ -1,393 +0,0 @@ -""" -Handlers for Content-Encoding. - -See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding -""" - -from __future__ import annotations - -import codecs -import io -import typing -import zlib - -from ._exceptions import DecodingError - -# Brotli support is optional -try: - # The C bindings in `brotli` are recommended for CPython. - import brotli -except ImportError: # pragma: no cover - try: - # The CFFI bindings in `brotlicffi` are recommended for PyPy - # and other environments. - import brotlicffi as brotli - except ImportError: - brotli = None - - -# Zstandard support is optional -try: - import zstandard -except ImportError: # pragma: no cover - zstandard = None # type: ignore - - -class ContentDecoder: - def decode(self, data: bytes) -> bytes: - raise NotImplementedError() # pragma: no cover - - def flush(self) -> bytes: - raise NotImplementedError() # pragma: no cover - - -class IdentityDecoder(ContentDecoder): - """ - Handle unencoded data. - """ - - def decode(self, data: bytes) -> bytes: - return data - - def flush(self) -> bytes: - return b"" - - -class DeflateDecoder(ContentDecoder): - """ - Handle 'deflate' decoding. - - See: https://stackoverflow.com/questions/1838699 - """ - - def __init__(self) -> None: - self.first_attempt = True - self.decompressor = zlib.decompressobj() - - def decode(self, data: bytes) -> bytes: - was_first_attempt = self.first_attempt - self.first_attempt = False - try: - return self.decompressor.decompress(data) - except zlib.error as exc: - if was_first_attempt: - self.decompressor = zlib.decompressobj(-zlib.MAX_WBITS) - return self.decode(data) - raise DecodingError(str(exc)) from exc - - def flush(self) -> bytes: - try: - return self.decompressor.flush() - except zlib.error as exc: # pragma: no cover - raise DecodingError(str(exc)) from exc - - -class GZipDecoder(ContentDecoder): - """ - Handle 'gzip' decoding. - - See: https://stackoverflow.com/questions/1838699 - """ - - def __init__(self) -> None: - self.decompressor = zlib.decompressobj(zlib.MAX_WBITS | 16) - - def decode(self, data: bytes) -> bytes: - try: - return self.decompressor.decompress(data) - except zlib.error as exc: - raise DecodingError(str(exc)) from exc - - def flush(self) -> bytes: - try: - return self.decompressor.flush() - except zlib.error as exc: # pragma: no cover - raise DecodingError(str(exc)) from exc - - -class BrotliDecoder(ContentDecoder): - """ - Handle 'brotli' decoding. - - Requires `pip install brotlipy`. See: https://brotlipy.readthedocs.io/ - or `pip install brotli`. See https://github.com/google/brotli - Supports both 'brotlipy' and 'Brotli' packages since they share an import - name. The top branches are for 'brotlipy' and bottom branches for 'Brotli' - """ - - def __init__(self) -> None: - if brotli is None: # pragma: no cover - raise ImportError( - "Using 'BrotliDecoder', but neither of the 'brotlicffi' or 'brotli' " - "packages have been installed. " - "Make sure to install httpx using `pip install httpx[brotli]`." - ) from None - - self.decompressor = brotli.Decompressor() - self.seen_data = False - self._decompress: typing.Callable[[bytes], bytes] - if hasattr(self.decompressor, "decompress"): - # The 'brotlicffi' package. - self._decompress = self.decompressor.decompress # pragma: no cover - else: - # The 'brotli' package. - self._decompress = self.decompressor.process # pragma: no cover - - def decode(self, data: bytes) -> bytes: - if not data: - return b"" - self.seen_data = True - try: - return self._decompress(data) - except brotli.error as exc: - raise DecodingError(str(exc)) from exc - - def flush(self) -> bytes: - if not self.seen_data: - return b"" - try: - if hasattr(self.decompressor, "finish"): - # Only available in the 'brotlicffi' package. - - # As the decompressor decompresses eagerly, this - # will never actually emit any data. However, it will potentially throw - # errors if a truncated or damaged data stream has been used. - self.decompressor.finish() # pragma: no cover - return b"" - except brotli.error as exc: # pragma: no cover - raise DecodingError(str(exc)) from exc - - -class ZStandardDecoder(ContentDecoder): - """ - Handle 'zstd' RFC 8878 decoding. - - Requires `pip install zstandard`. - Can be installed as a dependency of httpx using `pip install httpx[zstd]`. - """ - - # inspired by the ZstdDecoder implementation in urllib3 - def __init__(self) -> None: - if zstandard is None: # pragma: no cover - raise ImportError( - "Using 'ZStandardDecoder', ..." - "Make sure to install httpx using `pip install httpx[zstd]`." - ) from None - - self.decompressor = zstandard.ZstdDecompressor().decompressobj() - self.seen_data = False - - def decode(self, data: bytes) -> bytes: - assert zstandard is not None - self.seen_data = True - output = io.BytesIO() - try: - output.write(self.decompressor.decompress(data)) - while self.decompressor.eof and self.decompressor.unused_data: - unused_data = self.decompressor.unused_data - self.decompressor = zstandard.ZstdDecompressor().decompressobj() - output.write(self.decompressor.decompress(unused_data)) - except zstandard.ZstdError as exc: - raise DecodingError(str(exc)) from exc - return output.getvalue() - - def flush(self) -> bytes: - if not self.seen_data: - return b"" - ret = self.decompressor.flush() # note: this is a no-op - if not self.decompressor.eof: - raise DecodingError("Zstandard data is incomplete") # pragma: no cover - return bytes(ret) - - -class MultiDecoder(ContentDecoder): - """ - Handle the case where multiple encodings have been applied. - """ - - def __init__(self, children: typing.Sequence[ContentDecoder]) -> None: - """ - 'children' should be a sequence of decoders in the order in which - each was applied. - """ - # Note that we reverse the order for decoding. - self.children = list(reversed(children)) - - def decode(self, data: bytes) -> bytes: - for child in self.children: - data = child.decode(data) - return data - - def flush(self) -> bytes: - data = b"" - for child in self.children: - data = child.decode(data) + child.flush() - return data - - -class ByteChunker: - """ - Handles returning byte content in fixed-size chunks. - """ - - def __init__(self, chunk_size: int | None = None) -> None: - self._buffer = io.BytesIO() - self._chunk_size = chunk_size - - def decode(self, content: bytes) -> list[bytes]: - if self._chunk_size is None: - return [content] if content else [] - - self._buffer.write(content) - if self._buffer.tell() >= self._chunk_size: - value = self._buffer.getvalue() - chunks = [ - value[i : i + self._chunk_size] - for i in range(0, len(value), self._chunk_size) - ] - if len(chunks[-1]) == self._chunk_size: - self._buffer.seek(0) - self._buffer.truncate() - return chunks - else: - self._buffer.seek(0) - self._buffer.write(chunks[-1]) - self._buffer.truncate() - return chunks[:-1] - else: - return [] - - def flush(self) -> list[bytes]: - value = self._buffer.getvalue() - self._buffer.seek(0) - self._buffer.truncate() - return [value] if value else [] - - -class TextChunker: - """ - Handles returning text content in fixed-size chunks. - """ - - def __init__(self, chunk_size: int | None = None) -> None: - self._buffer = io.StringIO() - self._chunk_size = chunk_size - - def decode(self, content: str) -> list[str]: - if self._chunk_size is None: - return [content] if content else [] - - self._buffer.write(content) - if self._buffer.tell() >= self._chunk_size: - value = self._buffer.getvalue() - chunks = [ - value[i : i + self._chunk_size] - for i in range(0, len(value), self._chunk_size) - ] - if len(chunks[-1]) == self._chunk_size: - self._buffer.seek(0) - self._buffer.truncate() - return chunks - else: - self._buffer.seek(0) - self._buffer.write(chunks[-1]) - self._buffer.truncate() - return chunks[:-1] - else: - return [] - - def flush(self) -> list[str]: - value = self._buffer.getvalue() - self._buffer.seek(0) - self._buffer.truncate() - return [value] if value else [] - - -class TextDecoder: - """ - Handles incrementally decoding bytes into text - """ - - def __init__(self, encoding: str = "utf-8") -> None: - self.decoder = codecs.getincrementaldecoder(encoding)(errors="replace") - - def decode(self, data: bytes) -> str: - return self.decoder.decode(data) - - def flush(self) -> str: - return self.decoder.decode(b"", True) - - -class LineDecoder: - """ - Handles incrementally reading lines from text. - - Has the same behaviour as the stdllib splitlines, - but handling the input iteratively. - """ - - def __init__(self) -> None: - self.buffer: list[str] = [] - self.trailing_cr: bool = False - - def decode(self, text: str) -> list[str]: - # See https://docs.python.org/3/library/stdtypes.html#str.splitlines - NEWLINE_CHARS = "\n\r\x0b\x0c\x1c\x1d\x1e\x85\u2028\u2029" - - # We always push a trailing `\r` into the next decode iteration. - if self.trailing_cr: - text = "\r" + text - self.trailing_cr = False - if text.endswith("\r"): - self.trailing_cr = True - text = text[:-1] - - if not text: - # NOTE: the edge case input of empty text doesn't occur in practice, - # because other httpx internals filter out this value - return [] # pragma: no cover - - trailing_newline = text[-1] in NEWLINE_CHARS - lines = text.splitlines() - - if len(lines) == 1 and not trailing_newline: - # No new lines, buffer the input and continue. - self.buffer.append(lines[0]) - return [] - - if self.buffer: - # Include any existing buffer in the first portion of the - # splitlines result. - lines = ["".join(self.buffer) + lines[0]] + lines[1:] - self.buffer = [] - - if not trailing_newline: - # If the last segment of splitlines is not newline terminated, - # then drop it from our output and start a new buffer. - self.buffer = [lines.pop()] - - return lines - - def flush(self) -> list[str]: - if not self.buffer and not self.trailing_cr: - return [] - - lines = ["".join(self.buffer)] - self.buffer = [] - self.trailing_cr = False - return lines - - -SUPPORTED_DECODERS = { - "identity": IdentityDecoder, - "gzip": GZipDecoder, - "deflate": DeflateDecoder, - "br": BrotliDecoder, - "zstd": ZStandardDecoder, -} - - -if brotli is None: - SUPPORTED_DECODERS.pop("br") # pragma: no cover -if zstandard is None: - SUPPORTED_DECODERS.pop("zstd") # pragma: no cover diff --git a/venv/lib/python3.11/site-packages/httpx/_exceptions.py b/venv/lib/python3.11/site-packages/httpx/_exceptions.py deleted file mode 100755 index 77f45a6..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_exceptions.py +++ /dev/null @@ -1,379 +0,0 @@ -""" -Our exception hierarchy: - -* HTTPError - x RequestError - + TransportError - - TimeoutException - · ConnectTimeout - · ReadTimeout - · WriteTimeout - · PoolTimeout - - NetworkError - · ConnectError - · ReadError - · WriteError - · CloseError - - ProtocolError - · LocalProtocolError - · RemoteProtocolError - - ProxyError - - UnsupportedProtocol - + DecodingError - + TooManyRedirects - x HTTPStatusError -* InvalidURL -* CookieConflict -* StreamError - x StreamConsumed - x StreamClosed - x ResponseNotRead - x RequestNotRead -""" - -from __future__ import annotations - -import contextlib -import typing - -if typing.TYPE_CHECKING: - from ._models import Request, Response # pragma: no cover - -__all__ = [ - "CloseError", - "ConnectError", - "ConnectTimeout", - "CookieConflict", - "DecodingError", - "HTTPError", - "HTTPStatusError", - "InvalidURL", - "LocalProtocolError", - "NetworkError", - "PoolTimeout", - "ProtocolError", - "ProxyError", - "ReadError", - "ReadTimeout", - "RemoteProtocolError", - "RequestError", - "RequestNotRead", - "ResponseNotRead", - "StreamClosed", - "StreamConsumed", - "StreamError", - "TimeoutException", - "TooManyRedirects", - "TransportError", - "UnsupportedProtocol", - "WriteError", - "WriteTimeout", -] - - -class HTTPError(Exception): - """ - Base class for `RequestError` and `HTTPStatusError`. - - Useful for `try...except` blocks when issuing a request, - and then calling `.raise_for_status()`. - - For example: - - ``` - try: - response = httpx.get("https://www.example.com") - response.raise_for_status() - except httpx.HTTPError as exc: - print(f"HTTP Exception for {exc.request.url} - {exc}") - ``` - """ - - def __init__(self, message: str) -> None: - super().__init__(message) - self._request: Request | None = None - - @property - def request(self) -> Request: - if self._request is None: - raise RuntimeError("The .request property has not been set.") - return self._request - - @request.setter - def request(self, request: Request) -> None: - self._request = request - - -class RequestError(HTTPError): - """ - Base class for all exceptions that may occur when issuing a `.request()`. - """ - - def __init__(self, message: str, *, request: Request | None = None) -> None: - super().__init__(message) - # At the point an exception is raised we won't typically have a request - # instance to associate it with. - # - # The 'request_context' context manager is used within the Client and - # Response methods in order to ensure that any raised exceptions - # have a `.request` property set on them. - self._request = request - - -class TransportError(RequestError): - """ - Base class for all exceptions that occur at the level of the Transport API. - """ - - -# Timeout exceptions... - - -class TimeoutException(TransportError): - """ - The base class for timeout errors. - - An operation has timed out. - """ - - -class ConnectTimeout(TimeoutException): - """ - Timed out while connecting to the host. - """ - - -class ReadTimeout(TimeoutException): - """ - Timed out while receiving data from the host. - """ - - -class WriteTimeout(TimeoutException): - """ - Timed out while sending data to the host. - """ - - -class PoolTimeout(TimeoutException): - """ - Timed out waiting to acquire a connection from the pool. - """ - - -# Core networking exceptions... - - -class NetworkError(TransportError): - """ - The base class for network-related errors. - - An error occurred while interacting with the network. - """ - - -class ReadError(NetworkError): - """ - Failed to receive data from the network. - """ - - -class WriteError(NetworkError): - """ - Failed to send data through the network. - """ - - -class ConnectError(NetworkError): - """ - Failed to establish a connection. - """ - - -class CloseError(NetworkError): - """ - Failed to close a connection. - """ - - -# Other transport exceptions... - - -class ProxyError(TransportError): - """ - An error occurred while establishing a proxy connection. - """ - - -class UnsupportedProtocol(TransportError): - """ - Attempted to make a request to an unsupported protocol. - - For example issuing a request to `ftp://www.example.com`. - """ - - -class ProtocolError(TransportError): - """ - The protocol was violated. - """ - - -class LocalProtocolError(ProtocolError): - """ - A protocol was violated by the client. - - For example if the user instantiated a `Request` instance explicitly, - failed to include the mandatory `Host:` header, and then issued it directly - using `client.send()`. - """ - - -class RemoteProtocolError(ProtocolError): - """ - The protocol was violated by the server. - - For example, returning malformed HTTP. - """ - - -# Other request exceptions... - - -class DecodingError(RequestError): - """ - Decoding of the response failed, due to a malformed encoding. - """ - - -class TooManyRedirects(RequestError): - """ - Too many redirects. - """ - - -# Client errors - - -class HTTPStatusError(HTTPError): - """ - The response had an error HTTP status of 4xx or 5xx. - - May be raised when calling `response.raise_for_status()` - """ - - def __init__(self, message: str, *, request: Request, response: Response) -> None: - super().__init__(message) - self.request = request - self.response = response - - -class InvalidURL(Exception): - """ - URL is improperly formed or cannot be parsed. - """ - - def __init__(self, message: str) -> None: - super().__init__(message) - - -class CookieConflict(Exception): - """ - Attempted to lookup a cookie by name, but multiple cookies existed. - - Can occur when calling `response.cookies.get(...)`. - """ - - def __init__(self, message: str) -> None: - super().__init__(message) - - -# Stream exceptions... - -# These may occur as the result of a programming error, by accessing -# the request/response stream in an invalid manner. - - -class StreamError(RuntimeError): - """ - The base class for stream exceptions. - - The developer made an error in accessing the request stream in - an invalid way. - """ - - def __init__(self, message: str) -> None: - super().__init__(message) - - -class StreamConsumed(StreamError): - """ - Attempted to read or stream content, but the content has already - been streamed. - """ - - def __init__(self) -> None: - message = ( - "Attempted to read or stream some content, but the content has " - "already been streamed. For requests, this could be due to passing " - "a generator as request content, and then receiving a redirect " - "response or a secondary request as part of an authentication flow." - "For responses, this could be due to attempting to stream the response " - "content more than once." - ) - super().__init__(message) - - -class StreamClosed(StreamError): - """ - Attempted to read or stream response content, but the request has been - closed. - """ - - def __init__(self) -> None: - message = ( - "Attempted to read or stream content, but the stream has " "been closed." - ) - super().__init__(message) - - -class ResponseNotRead(StreamError): - """ - Attempted to access streaming response content, without having called `read()`. - """ - - def __init__(self) -> None: - message = ( - "Attempted to access streaming response content," - " without having called `read()`." - ) - super().__init__(message) - - -class RequestNotRead(StreamError): - """ - Attempted to access streaming request content, without having called `read()`. - """ - - def __init__(self) -> None: - message = ( - "Attempted to access streaming request content," - " without having called `read()`." - ) - super().__init__(message) - - -@contextlib.contextmanager -def request_context( - request: Request | None = None, -) -> typing.Iterator[None]: - """ - A context manager that can be used to attach the given request context - to any `RequestError` exceptions that are raised within the block. - """ - try: - yield - except RequestError as exc: - if request is not None: - exc.request = request - raise exc diff --git a/venv/lib/python3.11/site-packages/httpx/_main.py b/venv/lib/python3.11/site-packages/httpx/_main.py deleted file mode 100755 index cffa4bb..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_main.py +++ /dev/null @@ -1,506 +0,0 @@ -from __future__ import annotations - -import functools -import json -import sys -import typing - -import click -import pygments.lexers -import pygments.util -import rich.console -import rich.markup -import rich.progress -import rich.syntax -import rich.table - -from ._client import Client -from ._exceptions import RequestError -from ._models import Response -from ._status_codes import codes - -if typing.TYPE_CHECKING: - import httpcore # pragma: no cover - - -def print_help() -> None: - console = rich.console.Console() - - console.print("[bold]HTTPX :butterfly:", justify="center") - console.print() - console.print("A next generation HTTP client.", justify="center") - console.print() - console.print( - "Usage: [bold]httpx[/bold] [cyan] [OPTIONS][/cyan] ", justify="left" - ) - console.print() - - table = rich.table.Table.grid(padding=1, pad_edge=True) - table.add_column("Parameter", no_wrap=True, justify="left", style="bold") - table.add_column("Description") - table.add_row( - "-m, --method [cyan]METHOD", - "Request method, such as GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD.\n" - "[Default: GET, or POST if a request body is included]", - ) - table.add_row( - "-p, --params [cyan] ...", - "Query parameters to include in the request URL.", - ) - table.add_row( - "-c, --content [cyan]TEXT", "Byte content to include in the request body." - ) - table.add_row( - "-d, --data [cyan] ...", "Form data to include in the request body." - ) - table.add_row( - "-f, --files [cyan] ...", - "Form files to include in the request body.", - ) - table.add_row("-j, --json [cyan]TEXT", "JSON data to include in the request body.") - table.add_row( - "-h, --headers [cyan] ...", - "Include additional HTTP headers in the request.", - ) - table.add_row( - "--cookies [cyan] ...", "Cookies to include in the request." - ) - table.add_row( - "--auth [cyan]", - "Username and password to include in the request. Specify '-' for the password" - " to use a password prompt. Note that using --verbose/-v will expose" - " the Authorization header, including the password encoding" - " in a trivially reversible format.", - ) - - table.add_row( - "--proxy [cyan]URL", - "Send the request via a proxy. Should be the URL giving the proxy address.", - ) - - table.add_row( - "--timeout [cyan]FLOAT", - "Timeout value to use for network operations, such as establishing the" - " connection, reading some data, etc... [Default: 5.0]", - ) - - table.add_row("--follow-redirects", "Automatically follow redirects.") - table.add_row("--no-verify", "Disable SSL verification.") - table.add_row( - "--http2", "Send the request using HTTP/2, if the remote server supports it." - ) - - table.add_row( - "--download [cyan]FILE", - "Save the response content as a file, rather than displaying it.", - ) - - table.add_row("-v, --verbose", "Verbose output. Show request as well as response.") - table.add_row("--help", "Show this message and exit.") - console.print(table) - - -def get_lexer_for_response(response: Response) -> str: - content_type = response.headers.get("Content-Type") - if content_type is not None: - mime_type, _, _ = content_type.partition(";") - try: - return typing.cast( - str, pygments.lexers.get_lexer_for_mimetype(mime_type.strip()).name - ) - except pygments.util.ClassNotFound: # pragma: no cover - pass - return "" # pragma: no cover - - -def format_request_headers(request: httpcore.Request, http2: bool = False) -> str: - version = "HTTP/2" if http2 else "HTTP/1.1" - headers = [ - (name.lower() if http2 else name, value) for name, value in request.headers - ] - method = request.method.decode("ascii") - target = request.url.target.decode("ascii") - lines = [f"{method} {target} {version}"] + [ - f"{name.decode('ascii')}: {value.decode('ascii')}" for name, value in headers - ] - return "\n".join(lines) - - -def format_response_headers( - http_version: bytes, - status: int, - reason_phrase: bytes | None, - headers: list[tuple[bytes, bytes]], -) -> str: - version = http_version.decode("ascii") - reason = ( - codes.get_reason_phrase(status) - if reason_phrase is None - else reason_phrase.decode("ascii") - ) - lines = [f"{version} {status} {reason}"] + [ - f"{name.decode('ascii')}: {value.decode('ascii')}" for name, value in headers - ] - return "\n".join(lines) - - -def print_request_headers(request: httpcore.Request, http2: bool = False) -> None: - console = rich.console.Console() - http_text = format_request_headers(request, http2=http2) - syntax = rich.syntax.Syntax(http_text, "http", theme="ansi_dark", word_wrap=True) - console.print(syntax) - syntax = rich.syntax.Syntax("", "http", theme="ansi_dark", word_wrap=True) - console.print(syntax) - - -def print_response_headers( - http_version: bytes, - status: int, - reason_phrase: bytes | None, - headers: list[tuple[bytes, bytes]], -) -> None: - console = rich.console.Console() - http_text = format_response_headers(http_version, status, reason_phrase, headers) - syntax = rich.syntax.Syntax(http_text, "http", theme="ansi_dark", word_wrap=True) - console.print(syntax) - syntax = rich.syntax.Syntax("", "http", theme="ansi_dark", word_wrap=True) - console.print(syntax) - - -def print_response(response: Response) -> None: - console = rich.console.Console() - lexer_name = get_lexer_for_response(response) - if lexer_name: - if lexer_name.lower() == "json": - try: - data = response.json() - text = json.dumps(data, indent=4) - except ValueError: # pragma: no cover - text = response.text - else: - text = response.text - - syntax = rich.syntax.Syntax(text, lexer_name, theme="ansi_dark", word_wrap=True) - console.print(syntax) - else: - console.print(f"<{len(response.content)} bytes of binary data>") - - -_PCTRTT = typing.Tuple[typing.Tuple[str, str], ...] -_PCTRTTT = typing.Tuple[_PCTRTT, ...] -_PeerCertRetDictType = typing.Dict[str, typing.Union[str, _PCTRTTT, _PCTRTT]] - - -def format_certificate(cert: _PeerCertRetDictType) -> str: # pragma: no cover - lines = [] - for key, value in cert.items(): - if isinstance(value, (list, tuple)): - lines.append(f"* {key}:") - for item in value: - if key in ("subject", "issuer"): - for sub_item in item: - lines.append(f"* {sub_item[0]}: {sub_item[1]!r}") - elif isinstance(item, tuple) and len(item) == 2: - lines.append(f"* {item[0]}: {item[1]!r}") - else: - lines.append(f"* {item!r}") - else: - lines.append(f"* {key}: {value!r}") - return "\n".join(lines) - - -def trace( - name: str, info: typing.Mapping[str, typing.Any], verbose: bool = False -) -> None: - console = rich.console.Console() - if name == "connection.connect_tcp.started" and verbose: - host = info["host"] - console.print(f"* Connecting to {host!r}") - elif name == "connection.connect_tcp.complete" and verbose: - stream = info["return_value"] - server_addr = stream.get_extra_info("server_addr") - console.print(f"* Connected to {server_addr[0]!r} on port {server_addr[1]}") - elif name == "connection.start_tls.complete" and verbose: # pragma: no cover - stream = info["return_value"] - ssl_object = stream.get_extra_info("ssl_object") - version = ssl_object.version() - cipher = ssl_object.cipher() - server_cert = ssl_object.getpeercert() - alpn = ssl_object.selected_alpn_protocol() - console.print(f"* SSL established using {version!r} / {cipher[0]!r}") - console.print(f"* Selected ALPN protocol: {alpn!r}") - if server_cert: - console.print("* Server certificate:") - console.print(format_certificate(server_cert)) - elif name == "http11.send_request_headers.started" and verbose: - request = info["request"] - print_request_headers(request, http2=False) - elif name == "http2.send_request_headers.started" and verbose: # pragma: no cover - request = info["request"] - print_request_headers(request, http2=True) - elif name == "http11.receive_response_headers.complete": - http_version, status, reason_phrase, headers = info["return_value"] - print_response_headers(http_version, status, reason_phrase, headers) - elif name == "http2.receive_response_headers.complete": # pragma: no cover - status, headers = info["return_value"] - http_version = b"HTTP/2" - reason_phrase = None - print_response_headers(http_version, status, reason_phrase, headers) - - -def download_response(response: Response, download: typing.BinaryIO) -> None: - console = rich.console.Console() - console.print() - content_length = response.headers.get("Content-Length") - with rich.progress.Progress( - "[progress.description]{task.description}", - "[progress.percentage]{task.percentage:>3.0f}%", - rich.progress.BarColumn(bar_width=None), - rich.progress.DownloadColumn(), - rich.progress.TransferSpeedColumn(), - ) as progress: - description = f"Downloading [bold]{rich.markup.escape(download.name)}" - download_task = progress.add_task( - description, - total=int(content_length or 0), - start=content_length is not None, - ) - for chunk in response.iter_bytes(): - download.write(chunk) - progress.update(download_task, completed=response.num_bytes_downloaded) - - -def validate_json( - ctx: click.Context, - param: click.Option | click.Parameter, - value: typing.Any, -) -> typing.Any: - if value is None: - return None - - try: - return json.loads(value) - except json.JSONDecodeError: # pragma: no cover - raise click.BadParameter("Not valid JSON") - - -def validate_auth( - ctx: click.Context, - param: click.Option | click.Parameter, - value: typing.Any, -) -> typing.Any: - if value == (None, None): - return None - - username, password = value - if password == "-": # pragma: no cover - password = click.prompt("Password", hide_input=True) - return (username, password) - - -def handle_help( - ctx: click.Context, - param: click.Option | click.Parameter, - value: typing.Any, -) -> None: - if not value or ctx.resilient_parsing: - return - - print_help() - ctx.exit() - - -@click.command(add_help_option=False) -@click.argument("url", type=str) -@click.option( - "--method", - "-m", - "method", - type=str, - help=( - "Request method, such as GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD. " - "[Default: GET, or POST if a request body is included]" - ), -) -@click.option( - "--params", - "-p", - "params", - type=(str, str), - multiple=True, - help="Query parameters to include in the request URL.", -) -@click.option( - "--content", - "-c", - "content", - type=str, - help="Byte content to include in the request body.", -) -@click.option( - "--data", - "-d", - "data", - type=(str, str), - multiple=True, - help="Form data to include in the request body.", -) -@click.option( - "--files", - "-f", - "files", - type=(str, click.File(mode="rb")), - multiple=True, - help="Form files to include in the request body.", -) -@click.option( - "--json", - "-j", - "json", - type=str, - callback=validate_json, - help="JSON data to include in the request body.", -) -@click.option( - "--headers", - "-h", - "headers", - type=(str, str), - multiple=True, - help="Include additional HTTP headers in the request.", -) -@click.option( - "--cookies", - "cookies", - type=(str, str), - multiple=True, - help="Cookies to include in the request.", -) -@click.option( - "--auth", - "auth", - type=(str, str), - default=(None, None), - callback=validate_auth, - help=( - "Username and password to include in the request. " - "Specify '-' for the password to use a password prompt. " - "Note that using --verbose/-v will expose the Authorization header, " - "including the password encoding in a trivially reversible format." - ), -) -@click.option( - "--proxy", - "proxy", - type=str, - default=None, - help="Send the request via a proxy. Should be the URL giving the proxy address.", -) -@click.option( - "--timeout", - "timeout", - type=float, - default=5.0, - help=( - "Timeout value to use for network operations, such as establishing the " - "connection, reading some data, etc... [Default: 5.0]" - ), -) -@click.option( - "--follow-redirects", - "follow_redirects", - is_flag=True, - default=False, - help="Automatically follow redirects.", -) -@click.option( - "--no-verify", - "verify", - is_flag=True, - default=True, - help="Disable SSL verification.", -) -@click.option( - "--http2", - "http2", - type=bool, - is_flag=True, - default=False, - help="Send the request using HTTP/2, if the remote server supports it.", -) -@click.option( - "--download", - type=click.File("wb"), - help="Save the response content as a file, rather than displaying it.", -) -@click.option( - "--verbose", - "-v", - type=bool, - is_flag=True, - default=False, - help="Verbose. Show request as well as response.", -) -@click.option( - "--help", - is_flag=True, - is_eager=True, - expose_value=False, - callback=handle_help, - help="Show this message and exit.", -) -def main( - url: str, - method: str, - params: list[tuple[str, str]], - content: str, - data: list[tuple[str, str]], - files: list[tuple[str, click.File]], - json: str, - headers: list[tuple[str, str]], - cookies: list[tuple[str, str]], - auth: tuple[str, str] | None, - proxy: str, - timeout: float, - follow_redirects: bool, - verify: bool, - http2: bool, - download: typing.BinaryIO | None, - verbose: bool, -) -> None: - """ - An HTTP command line client. - Sends a request and displays the response. - """ - if not method: - method = "POST" if content or data or files or json else "GET" - - try: - with Client(proxy=proxy, timeout=timeout, http2=http2, verify=verify) as client: - with client.stream( - method, - url, - params=list(params), - content=content, - data=dict(data), - files=files, # type: ignore - json=json, - headers=headers, - cookies=dict(cookies), - auth=auth, - follow_redirects=follow_redirects, - extensions={"trace": functools.partial(trace, verbose=verbose)}, - ) as response: - if download is not None: - download_response(response, download) - else: - response.read() - if response.content: - print_response(response) - - except RequestError as exc: - console = rich.console.Console() - console.print(f"[red]{type(exc).__name__}[/red]: {exc}") - sys.exit(1) - - sys.exit(0 if response.is_success else 1) diff --git a/venv/lib/python3.11/site-packages/httpx/_models.py b/venv/lib/python3.11/site-packages/httpx/_models.py deleted file mode 100755 index 67d74bf..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_models.py +++ /dev/null @@ -1,1277 +0,0 @@ -from __future__ import annotations - -import codecs -import datetime -import email.message -import json as jsonlib -import re -import typing -import urllib.request -from collections.abc import Mapping -from http.cookiejar import Cookie, CookieJar - -from ._content import ByteStream, UnattachedStream, encode_request, encode_response -from ._decoders import ( - SUPPORTED_DECODERS, - ByteChunker, - ContentDecoder, - IdentityDecoder, - LineDecoder, - MultiDecoder, - TextChunker, - TextDecoder, -) -from ._exceptions import ( - CookieConflict, - HTTPStatusError, - RequestNotRead, - ResponseNotRead, - StreamClosed, - StreamConsumed, - request_context, -) -from ._multipart import get_multipart_boundary_from_content_type -from ._status_codes import codes -from ._types import ( - AsyncByteStream, - CookieTypes, - HeaderTypes, - QueryParamTypes, - RequestContent, - RequestData, - RequestExtensions, - RequestFiles, - ResponseContent, - ResponseExtensions, - SyncByteStream, -) -from ._urls import URL -from ._utils import to_bytes_or_str, to_str - -__all__ = ["Cookies", "Headers", "Request", "Response"] - -SENSITIVE_HEADERS = {"authorization", "proxy-authorization"} - - -def _is_known_encoding(encoding: str) -> bool: - """ - Return `True` if `encoding` is a known codec. - """ - try: - codecs.lookup(encoding) - except LookupError: - return False - return True - - -def _normalize_header_key(key: str | bytes, encoding: str | None = None) -> bytes: - """ - Coerce str/bytes into a strictly byte-wise HTTP header key. - """ - return key if isinstance(key, bytes) else key.encode(encoding or "ascii") - - -def _normalize_header_value(value: str | bytes, encoding: str | None = None) -> bytes: - """ - Coerce str/bytes into a strictly byte-wise HTTP header value. - """ - if isinstance(value, bytes): - return value - if not isinstance(value, str): - raise TypeError(f"Header value must be str or bytes, not {type(value)}") - return value.encode(encoding or "ascii") - - -def _parse_content_type_charset(content_type: str) -> str | None: - # We used to use `cgi.parse_header()` here, but `cgi` became a dead battery. - # See: https://peps.python.org/pep-0594/#cgi - msg = email.message.Message() - msg["content-type"] = content_type - return msg.get_content_charset(failobj=None) - - -def _parse_header_links(value: str) -> list[dict[str, str]]: - """ - Returns a list of parsed link headers, for more info see: - https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Link - The generic syntax of those is: - Link: < uri-reference >; param1=value1; param2="value2" - So for instance: - Link; '; type="image/jpeg",;' - would return - [ - {"url": "http:/.../front.jpeg", "type": "image/jpeg"}, - {"url": "http://.../back.jpeg"}, - ] - :param value: HTTP Link entity-header field - :return: list of parsed link headers - """ - links: list[dict[str, str]] = [] - replace_chars = " '\"" - value = value.strip(replace_chars) - if not value: - return links - for val in re.split(", *<", value): - try: - url, params = val.split(";", 1) - except ValueError: - url, params = val, "" - link = {"url": url.strip("<> '\"")} - for param in params.split(";"): - try: - key, value = param.split("=") - except ValueError: - break - link[key.strip(replace_chars)] = value.strip(replace_chars) - links.append(link) - return links - - -def _obfuscate_sensitive_headers( - items: typing.Iterable[tuple[typing.AnyStr, typing.AnyStr]], -) -> typing.Iterator[tuple[typing.AnyStr, typing.AnyStr]]: - for k, v in items: - if to_str(k.lower()) in SENSITIVE_HEADERS: - v = to_bytes_or_str("[secure]", match_type_of=v) - yield k, v - - -class Headers(typing.MutableMapping[str, str]): - """ - HTTP headers, as a case-insensitive multi-dict. - """ - - def __init__( - self, - headers: HeaderTypes | None = None, - encoding: str | None = None, - ) -> None: - self._list = [] # type: typing.List[typing.Tuple[bytes, bytes, bytes]] - - if isinstance(headers, Headers): - self._list = list(headers._list) - elif isinstance(headers, Mapping): - for k, v in headers.items(): - bytes_key = _normalize_header_key(k, encoding) - bytes_value = _normalize_header_value(v, encoding) - self._list.append((bytes_key, bytes_key.lower(), bytes_value)) - elif headers is not None: - for k, v in headers: - bytes_key = _normalize_header_key(k, encoding) - bytes_value = _normalize_header_value(v, encoding) - self._list.append((bytes_key, bytes_key.lower(), bytes_value)) - - self._encoding = encoding - - @property - def encoding(self) -> str: - """ - Header encoding is mandated as ascii, but we allow fallbacks to utf-8 - or iso-8859-1. - """ - if self._encoding is None: - for encoding in ["ascii", "utf-8"]: - for key, value in self.raw: - try: - key.decode(encoding) - value.decode(encoding) - except UnicodeDecodeError: - break - else: - # The else block runs if 'break' did not occur, meaning - # all values fitted the encoding. - self._encoding = encoding - break - else: - # The ISO-8859-1 encoding covers all 256 code points in a byte, - # so will never raise decode errors. - self._encoding = "iso-8859-1" - return self._encoding - - @encoding.setter - def encoding(self, value: str) -> None: - self._encoding = value - - @property - def raw(self) -> list[tuple[bytes, bytes]]: - """ - Returns a list of the raw header items, as byte pairs. - """ - return [(raw_key, value) for raw_key, _, value in self._list] - - def keys(self) -> typing.KeysView[str]: - return {key.decode(self.encoding): None for _, key, value in self._list}.keys() - - def values(self) -> typing.ValuesView[str]: - values_dict: dict[str, str] = {} - for _, key, value in self._list: - str_key = key.decode(self.encoding) - str_value = value.decode(self.encoding) - if str_key in values_dict: - values_dict[str_key] += f", {str_value}" - else: - values_dict[str_key] = str_value - return values_dict.values() - - def items(self) -> typing.ItemsView[str, str]: - """ - Return `(key, value)` items of headers. Concatenate headers - into a single comma separated value when a key occurs multiple times. - """ - values_dict: dict[str, str] = {} - for _, key, value in self._list: - str_key = key.decode(self.encoding) - str_value = value.decode(self.encoding) - if str_key in values_dict: - values_dict[str_key] += f", {str_value}" - else: - values_dict[str_key] = str_value - return values_dict.items() - - def multi_items(self) -> list[tuple[str, str]]: - """ - Return a list of `(key, value)` pairs of headers. Allow multiple - occurrences of the same key without concatenating into a single - comma separated value. - """ - return [ - (key.decode(self.encoding), value.decode(self.encoding)) - for _, key, value in self._list - ] - - def get(self, key: str, default: typing.Any = None) -> typing.Any: - """ - Return a header value. If multiple occurrences of the header occur - then concatenate them together with commas. - """ - try: - return self[key] - except KeyError: - return default - - def get_list(self, key: str, split_commas: bool = False) -> list[str]: - """ - Return a list of all header values for a given key. - If `split_commas=True` is passed, then any comma separated header - values are split into multiple return strings. - """ - get_header_key = key.lower().encode(self.encoding) - - values = [ - item_value.decode(self.encoding) - for _, item_key, item_value in self._list - if item_key.lower() == get_header_key - ] - - if not split_commas: - return values - - split_values = [] - for value in values: - split_values.extend([item.strip() for item in value.split(",")]) - return split_values - - def update(self, headers: HeaderTypes | None = None) -> None: # type: ignore - headers = Headers(headers) - for key in headers.keys(): - if key in self: - self.pop(key) - self._list.extend(headers._list) - - def copy(self) -> Headers: - return Headers(self, encoding=self.encoding) - - def __getitem__(self, key: str) -> str: - """ - Return a single header value. - - If there are multiple headers with the same key, then we concatenate - them with commas. See: https://tools.ietf.org/html/rfc7230#section-3.2.2 - """ - normalized_key = key.lower().encode(self.encoding) - - items = [ - header_value.decode(self.encoding) - for _, header_key, header_value in self._list - if header_key == normalized_key - ] - - if items: - return ", ".join(items) - - raise KeyError(key) - - def __setitem__(self, key: str, value: str) -> None: - """ - Set the header `key` to `value`, removing any duplicate entries. - Retains insertion order. - """ - set_key = key.encode(self._encoding or "utf-8") - set_value = value.encode(self._encoding or "utf-8") - lookup_key = set_key.lower() - - found_indexes = [ - idx - for idx, (_, item_key, _) in enumerate(self._list) - if item_key == lookup_key - ] - - for idx in reversed(found_indexes[1:]): - del self._list[idx] - - if found_indexes: - idx = found_indexes[0] - self._list[idx] = (set_key, lookup_key, set_value) - else: - self._list.append((set_key, lookup_key, set_value)) - - def __delitem__(self, key: str) -> None: - """ - Remove the header `key`. - """ - del_key = key.lower().encode(self.encoding) - - pop_indexes = [ - idx - for idx, (_, item_key, _) in enumerate(self._list) - if item_key.lower() == del_key - ] - - if not pop_indexes: - raise KeyError(key) - - for idx in reversed(pop_indexes): - del self._list[idx] - - def __contains__(self, key: typing.Any) -> bool: - header_key = key.lower().encode(self.encoding) - return header_key in [key for _, key, _ in self._list] - - def __iter__(self) -> typing.Iterator[typing.Any]: - return iter(self.keys()) - - def __len__(self) -> int: - return len(self._list) - - def __eq__(self, other: typing.Any) -> bool: - try: - other_headers = Headers(other) - except ValueError: - return False - - self_list = [(key, value) for _, key, value in self._list] - other_list = [(key, value) for _, key, value in other_headers._list] - return sorted(self_list) == sorted(other_list) - - def __repr__(self) -> str: - class_name = self.__class__.__name__ - - encoding_str = "" - if self.encoding != "ascii": - encoding_str = f", encoding={self.encoding!r}" - - as_list = list(_obfuscate_sensitive_headers(self.multi_items())) - as_dict = dict(as_list) - - no_duplicate_keys = len(as_dict) == len(as_list) - if no_duplicate_keys: - return f"{class_name}({as_dict!r}{encoding_str})" - return f"{class_name}({as_list!r}{encoding_str})" - - -class Request: - def __init__( - self, - method: str, - url: URL | str, - *, - params: QueryParamTypes | None = None, - headers: HeaderTypes | None = None, - cookies: CookieTypes | None = None, - content: RequestContent | None = None, - data: RequestData | None = None, - files: RequestFiles | None = None, - json: typing.Any | None = None, - stream: SyncByteStream | AsyncByteStream | None = None, - extensions: RequestExtensions | None = None, - ) -> None: - self.method = method.upper() - self.url = URL(url) if params is None else URL(url, params=params) - self.headers = Headers(headers) - self.extensions = {} if extensions is None else dict(extensions) - - if cookies: - Cookies(cookies).set_cookie_header(self) - - if stream is None: - content_type: str | None = self.headers.get("content-type") - headers, stream = encode_request( - content=content, - data=data, - files=files, - json=json, - boundary=get_multipart_boundary_from_content_type( - content_type=content_type.encode(self.headers.encoding) - if content_type - else None - ), - ) - self._prepare(headers) - self.stream = stream - # Load the request body, except for streaming content. - if isinstance(stream, ByteStream): - self.read() - else: - # There's an important distinction between `Request(content=...)`, - # and `Request(stream=...)`. - # - # Using `content=...` implies automatically populated `Host` and content - # headers, of either `Content-Length: ...` or `Transfer-Encoding: chunked`. - # - # Using `stream=...` will not automatically include *any* - # auto-populated headers. - # - # As an end-user you don't really need `stream=...`. It's only - # useful when: - # - # * Preserving the request stream when copying requests, eg for redirects. - # * Creating request instances on the *server-side* of the transport API. - self.stream = stream - - def _prepare(self, default_headers: dict[str, str]) -> None: - for key, value in default_headers.items(): - # Ignore Transfer-Encoding if the Content-Length has been set explicitly. - if key.lower() == "transfer-encoding" and "Content-Length" in self.headers: - continue - self.headers.setdefault(key, value) - - auto_headers: list[tuple[bytes, bytes]] = [] - - has_host = "Host" in self.headers - has_content_length = ( - "Content-Length" in self.headers or "Transfer-Encoding" in self.headers - ) - - if not has_host and self.url.host: - auto_headers.append((b"Host", self.url.netloc)) - if not has_content_length and self.method in ("POST", "PUT", "PATCH"): - auto_headers.append((b"Content-Length", b"0")) - - self.headers = Headers(auto_headers + self.headers.raw) - - @property - def content(self) -> bytes: - if not hasattr(self, "_content"): - raise RequestNotRead() - return self._content - - def read(self) -> bytes: - """ - Read and return the request content. - """ - if not hasattr(self, "_content"): - assert isinstance(self.stream, typing.Iterable) - self._content = b"".join(self.stream) - if not isinstance(self.stream, ByteStream): - # If a streaming request has been read entirely into memory, then - # we can replace the stream with a raw bytes implementation, - # to ensure that any non-replayable streams can still be used. - self.stream = ByteStream(self._content) - return self._content - - async def aread(self) -> bytes: - """ - Read and return the request content. - """ - if not hasattr(self, "_content"): - assert isinstance(self.stream, typing.AsyncIterable) - self._content = b"".join([part async for part in self.stream]) - if not isinstance(self.stream, ByteStream): - # If a streaming request has been read entirely into memory, then - # we can replace the stream with a raw bytes implementation, - # to ensure that any non-replayable streams can still be used. - self.stream = ByteStream(self._content) - return self._content - - def __repr__(self) -> str: - class_name = self.__class__.__name__ - url = str(self.url) - return f"<{class_name}({self.method!r}, {url!r})>" - - def __getstate__(self) -> dict[str, typing.Any]: - return { - name: value - for name, value in self.__dict__.items() - if name not in ["extensions", "stream"] - } - - def __setstate__(self, state: dict[str, typing.Any]) -> None: - for name, value in state.items(): - setattr(self, name, value) - self.extensions = {} - self.stream = UnattachedStream() - - -class Response: - def __init__( - self, - status_code: int, - *, - headers: HeaderTypes | None = None, - content: ResponseContent | None = None, - text: str | None = None, - html: str | None = None, - json: typing.Any = None, - stream: SyncByteStream | AsyncByteStream | None = None, - request: Request | None = None, - extensions: ResponseExtensions | None = None, - history: list[Response] | None = None, - default_encoding: str | typing.Callable[[bytes], str] = "utf-8", - ) -> None: - self.status_code = status_code - self.headers = Headers(headers) - - self._request: Request | None = request - - # When follow_redirects=False and a redirect is received, - # the client will set `response.next_request`. - self.next_request: Request | None = None - - self.extensions = {} if extensions is None else dict(extensions) - self.history = [] if history is None else list(history) - - self.is_closed = False - self.is_stream_consumed = False - - self.default_encoding = default_encoding - - if stream is None: - headers, stream = encode_response(content, text, html, json) - self._prepare(headers) - self.stream = stream - if isinstance(stream, ByteStream): - # Load the response body, except for streaming content. - self.read() - else: - # There's an important distinction between `Response(content=...)`, - # and `Response(stream=...)`. - # - # Using `content=...` implies automatically populated content headers, - # of either `Content-Length: ...` or `Transfer-Encoding: chunked`. - # - # Using `stream=...` will not automatically include any content headers. - # - # As an end-user you don't really need `stream=...`. It's only - # useful when creating response instances having received a stream - # from the transport API. - self.stream = stream - - self._num_bytes_downloaded = 0 - - def _prepare(self, default_headers: dict[str, str]) -> None: - for key, value in default_headers.items(): - # Ignore Transfer-Encoding if the Content-Length has been set explicitly. - if key.lower() == "transfer-encoding" and "content-length" in self.headers: - continue - self.headers.setdefault(key, value) - - @property - def elapsed(self) -> datetime.timedelta: - """ - Returns the time taken for the complete request/response - cycle to complete. - """ - if not hasattr(self, "_elapsed"): - raise RuntimeError( - "'.elapsed' may only be accessed after the response " - "has been read or closed." - ) - return self._elapsed - - @elapsed.setter - def elapsed(self, elapsed: datetime.timedelta) -> None: - self._elapsed = elapsed - - @property - def request(self) -> Request: - """ - Returns the request instance associated to the current response. - """ - if self._request is None: - raise RuntimeError( - "The request instance has not been set on this response." - ) - return self._request - - @request.setter - def request(self, value: Request) -> None: - self._request = value - - @property - def http_version(self) -> str: - try: - http_version: bytes = self.extensions["http_version"] - except KeyError: - return "HTTP/1.1" - else: - return http_version.decode("ascii", errors="ignore") - - @property - def reason_phrase(self) -> str: - try: - reason_phrase: bytes = self.extensions["reason_phrase"] - except KeyError: - return codes.get_reason_phrase(self.status_code) - else: - return reason_phrase.decode("ascii", errors="ignore") - - @property - def url(self) -> URL: - """ - Returns the URL for which the request was made. - """ - return self.request.url - - @property - def content(self) -> bytes: - if not hasattr(self, "_content"): - raise ResponseNotRead() - return self._content - - @property - def text(self) -> str: - if not hasattr(self, "_text"): - content = self.content - if not content: - self._text = "" - else: - decoder = TextDecoder(encoding=self.encoding or "utf-8") - self._text = "".join([decoder.decode(self.content), decoder.flush()]) - return self._text - - @property - def encoding(self) -> str | None: - """ - Return an encoding to use for decoding the byte content into text. - The priority for determining this is given by... - - * `.encoding = <>` has been set explicitly. - * The encoding as specified by the charset parameter in the Content-Type header. - * The encoding as determined by `default_encoding`, which may either be - a string like "utf-8" indicating the encoding to use, or may be a callable - which enables charset autodetection. - """ - if not hasattr(self, "_encoding"): - encoding = self.charset_encoding - if encoding is None or not _is_known_encoding(encoding): - if isinstance(self.default_encoding, str): - encoding = self.default_encoding - elif hasattr(self, "_content"): - encoding = self.default_encoding(self._content) - self._encoding = encoding or "utf-8" - return self._encoding - - @encoding.setter - def encoding(self, value: str) -> None: - """ - Set the encoding to use for decoding the byte content into text. - - If the `text` attribute has been accessed, attempting to set the - encoding will throw a ValueError. - """ - if hasattr(self, "_text"): - raise ValueError( - "Setting encoding after `text` has been accessed is not allowed." - ) - self._encoding = value - - @property - def charset_encoding(self) -> str | None: - """ - Return the encoding, as specified by the Content-Type header. - """ - content_type = self.headers.get("Content-Type") - if content_type is None: - return None - - return _parse_content_type_charset(content_type) - - def _get_content_decoder(self) -> ContentDecoder: - """ - Returns a decoder instance which can be used to decode the raw byte - content, depending on the Content-Encoding used in the response. - """ - if not hasattr(self, "_decoder"): - decoders: list[ContentDecoder] = [] - values = self.headers.get_list("content-encoding", split_commas=True) - for value in values: - value = value.strip().lower() - try: - decoder_cls = SUPPORTED_DECODERS[value] - decoders.append(decoder_cls()) - except KeyError: - continue - - if len(decoders) == 1: - self._decoder = decoders[0] - elif len(decoders) > 1: - self._decoder = MultiDecoder(children=decoders) - else: - self._decoder = IdentityDecoder() - - return self._decoder - - @property - def is_informational(self) -> bool: - """ - A property which is `True` for 1xx status codes, `False` otherwise. - """ - return codes.is_informational(self.status_code) - - @property - def is_success(self) -> bool: - """ - A property which is `True` for 2xx status codes, `False` otherwise. - """ - return codes.is_success(self.status_code) - - @property - def is_redirect(self) -> bool: - """ - A property which is `True` for 3xx status codes, `False` otherwise. - - Note that not all responses with a 3xx status code indicate a URL redirect. - - Use `response.has_redirect_location` to determine responses with a properly - formed URL redirection. - """ - return codes.is_redirect(self.status_code) - - @property - def is_client_error(self) -> bool: - """ - A property which is `True` for 4xx status codes, `False` otherwise. - """ - return codes.is_client_error(self.status_code) - - @property - def is_server_error(self) -> bool: - """ - A property which is `True` for 5xx status codes, `False` otherwise. - """ - return codes.is_server_error(self.status_code) - - @property - def is_error(self) -> bool: - """ - A property which is `True` for 4xx and 5xx status codes, `False` otherwise. - """ - return codes.is_error(self.status_code) - - @property - def has_redirect_location(self) -> bool: - """ - Returns True for 3xx responses with a properly formed URL redirection, - `False` otherwise. - """ - return ( - self.status_code - in ( - # 301 (Cacheable redirect. Method may change to GET.) - codes.MOVED_PERMANENTLY, - # 302 (Uncacheable redirect. Method may change to GET.) - codes.FOUND, - # 303 (Client should make a GET or HEAD request.) - codes.SEE_OTHER, - # 307 (Equiv. 302, but retain method) - codes.TEMPORARY_REDIRECT, - # 308 (Equiv. 301, but retain method) - codes.PERMANENT_REDIRECT, - ) - and "Location" in self.headers - ) - - def raise_for_status(self) -> Response: - """ - Raise the `HTTPStatusError` if one occurred. - """ - request = self._request - if request is None: - raise RuntimeError( - "Cannot call `raise_for_status` as the request " - "instance has not been set on this response." - ) - - if self.is_success: - return self - - if self.has_redirect_location: - message = ( - "{error_type} '{0.status_code} {0.reason_phrase}' for url '{0.url}'\n" - "Redirect location: '{0.headers[location]}'\n" - "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/{0.status_code}" - ) - else: - message = ( - "{error_type} '{0.status_code} {0.reason_phrase}' for url '{0.url}'\n" - "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/{0.status_code}" - ) - - status_class = self.status_code // 100 - error_types = { - 1: "Informational response", - 3: "Redirect response", - 4: "Client error", - 5: "Server error", - } - error_type = error_types.get(status_class, "Invalid status code") - message = message.format(self, error_type=error_type) - raise HTTPStatusError(message, request=request, response=self) - - def json(self, **kwargs: typing.Any) -> typing.Any: - return jsonlib.loads(self.content, **kwargs) - - @property - def cookies(self) -> Cookies: - if not hasattr(self, "_cookies"): - self._cookies = Cookies() - self._cookies.extract_cookies(self) - return self._cookies - - @property - def links(self) -> dict[str | None, dict[str, str]]: - """ - Returns the parsed header links of the response, if any - """ - header = self.headers.get("link") - if header is None: - return {} - - return { - (link.get("rel") or link.get("url")): link - for link in _parse_header_links(header) - } - - @property - def num_bytes_downloaded(self) -> int: - return self._num_bytes_downloaded - - def __repr__(self) -> str: - return f"" - - def __getstate__(self) -> dict[str, typing.Any]: - return { - name: value - for name, value in self.__dict__.items() - if name not in ["extensions", "stream", "is_closed", "_decoder"] - } - - def __setstate__(self, state: dict[str, typing.Any]) -> None: - for name, value in state.items(): - setattr(self, name, value) - self.is_closed = True - self.extensions = {} - self.stream = UnattachedStream() - - def read(self) -> bytes: - """ - Read and return the response content. - """ - if not hasattr(self, "_content"): - self._content = b"".join(self.iter_bytes()) - return self._content - - def iter_bytes(self, chunk_size: int | None = None) -> typing.Iterator[bytes]: - """ - A byte-iterator over the decoded response content. - This allows us to handle gzip, deflate, brotli, and zstd encoded responses. - """ - if hasattr(self, "_content"): - chunk_size = len(self._content) if chunk_size is None else chunk_size - for i in range(0, len(self._content), max(chunk_size, 1)): - yield self._content[i : i + chunk_size] - else: - decoder = self._get_content_decoder() - chunker = ByteChunker(chunk_size=chunk_size) - with request_context(request=self._request): - for raw_bytes in self.iter_raw(): - decoded = decoder.decode(raw_bytes) - for chunk in chunker.decode(decoded): - yield chunk - decoded = decoder.flush() - for chunk in chunker.decode(decoded): - yield chunk # pragma: no cover - for chunk in chunker.flush(): - yield chunk - - def iter_text(self, chunk_size: int | None = None) -> typing.Iterator[str]: - """ - A str-iterator over the decoded response content - that handles both gzip, deflate, etc but also detects the content's - string encoding. - """ - decoder = TextDecoder(encoding=self.encoding or "utf-8") - chunker = TextChunker(chunk_size=chunk_size) - with request_context(request=self._request): - for byte_content in self.iter_bytes(): - text_content = decoder.decode(byte_content) - for chunk in chunker.decode(text_content): - yield chunk - text_content = decoder.flush() - for chunk in chunker.decode(text_content): - yield chunk # pragma: no cover - for chunk in chunker.flush(): - yield chunk - - def iter_lines(self) -> typing.Iterator[str]: - decoder = LineDecoder() - with request_context(request=self._request): - for text in self.iter_text(): - for line in decoder.decode(text): - yield line - for line in decoder.flush(): - yield line - - def iter_raw(self, chunk_size: int | None = None) -> typing.Iterator[bytes]: - """ - A byte-iterator over the raw response content. - """ - if self.is_stream_consumed: - raise StreamConsumed() - if self.is_closed: - raise StreamClosed() - if not isinstance(self.stream, SyncByteStream): - raise RuntimeError("Attempted to call a sync iterator on an async stream.") - - self.is_stream_consumed = True - self._num_bytes_downloaded = 0 - chunker = ByteChunker(chunk_size=chunk_size) - - with request_context(request=self._request): - for raw_stream_bytes in self.stream: - self._num_bytes_downloaded += len(raw_stream_bytes) - for chunk in chunker.decode(raw_stream_bytes): - yield chunk - - for chunk in chunker.flush(): - yield chunk - - self.close() - - def close(self) -> None: - """ - Close the response and release the connection. - Automatically called if the response body is read to completion. - """ - if not isinstance(self.stream, SyncByteStream): - raise RuntimeError("Attempted to call an sync close on an async stream.") - - if not self.is_closed: - self.is_closed = True - with request_context(request=self._request): - self.stream.close() - - async def aread(self) -> bytes: - """ - Read and return the response content. - """ - if not hasattr(self, "_content"): - self._content = b"".join([part async for part in self.aiter_bytes()]) - return self._content - - async def aiter_bytes( - self, chunk_size: int | None = None - ) -> typing.AsyncIterator[bytes]: - """ - A byte-iterator over the decoded response content. - This allows us to handle gzip, deflate, brotli, and zstd encoded responses. - """ - if hasattr(self, "_content"): - chunk_size = len(self._content) if chunk_size is None else chunk_size - for i in range(0, len(self._content), max(chunk_size, 1)): - yield self._content[i : i + chunk_size] - else: - decoder = self._get_content_decoder() - chunker = ByteChunker(chunk_size=chunk_size) - with request_context(request=self._request): - async for raw_bytes in self.aiter_raw(): - decoded = decoder.decode(raw_bytes) - for chunk in chunker.decode(decoded): - yield chunk - decoded = decoder.flush() - for chunk in chunker.decode(decoded): - yield chunk # pragma: no cover - for chunk in chunker.flush(): - yield chunk - - async def aiter_text( - self, chunk_size: int | None = None - ) -> typing.AsyncIterator[str]: - """ - A str-iterator over the decoded response content - that handles both gzip, deflate, etc but also detects the content's - string encoding. - """ - decoder = TextDecoder(encoding=self.encoding or "utf-8") - chunker = TextChunker(chunk_size=chunk_size) - with request_context(request=self._request): - async for byte_content in self.aiter_bytes(): - text_content = decoder.decode(byte_content) - for chunk in chunker.decode(text_content): - yield chunk - text_content = decoder.flush() - for chunk in chunker.decode(text_content): - yield chunk # pragma: no cover - for chunk in chunker.flush(): - yield chunk - - async def aiter_lines(self) -> typing.AsyncIterator[str]: - decoder = LineDecoder() - with request_context(request=self._request): - async for text in self.aiter_text(): - for line in decoder.decode(text): - yield line - for line in decoder.flush(): - yield line - - async def aiter_raw( - self, chunk_size: int | None = None - ) -> typing.AsyncIterator[bytes]: - """ - A byte-iterator over the raw response content. - """ - if self.is_stream_consumed: - raise StreamConsumed() - if self.is_closed: - raise StreamClosed() - if not isinstance(self.stream, AsyncByteStream): - raise RuntimeError("Attempted to call an async iterator on an sync stream.") - - self.is_stream_consumed = True - self._num_bytes_downloaded = 0 - chunker = ByteChunker(chunk_size=chunk_size) - - with request_context(request=self._request): - async for raw_stream_bytes in self.stream: - self._num_bytes_downloaded += len(raw_stream_bytes) - for chunk in chunker.decode(raw_stream_bytes): - yield chunk - - for chunk in chunker.flush(): - yield chunk - - await self.aclose() - - async def aclose(self) -> None: - """ - Close the response and release the connection. - Automatically called if the response body is read to completion. - """ - if not isinstance(self.stream, AsyncByteStream): - raise RuntimeError("Attempted to call an async close on an sync stream.") - - if not self.is_closed: - self.is_closed = True - with request_context(request=self._request): - await self.stream.aclose() - - -class Cookies(typing.MutableMapping[str, str]): - """ - HTTP Cookies, as a mutable mapping. - """ - - def __init__(self, cookies: CookieTypes | None = None) -> None: - if cookies is None or isinstance(cookies, dict): - self.jar = CookieJar() - if isinstance(cookies, dict): - for key, value in cookies.items(): - self.set(key, value) - elif isinstance(cookies, list): - self.jar = CookieJar() - for key, value in cookies: - self.set(key, value) - elif isinstance(cookies, Cookies): - self.jar = CookieJar() - for cookie in cookies.jar: - self.jar.set_cookie(cookie) - else: - self.jar = cookies - - def extract_cookies(self, response: Response) -> None: - """ - Loads any cookies based on the response `Set-Cookie` headers. - """ - urllib_response = self._CookieCompatResponse(response) - urllib_request = self._CookieCompatRequest(response.request) - - self.jar.extract_cookies(urllib_response, urllib_request) # type: ignore - - def set_cookie_header(self, request: Request) -> None: - """ - Sets an appropriate 'Cookie:' HTTP header on the `Request`. - """ - urllib_request = self._CookieCompatRequest(request) - self.jar.add_cookie_header(urllib_request) - - def set(self, name: str, value: str, domain: str = "", path: str = "/") -> None: - """ - Set a cookie value by name. May optionally include domain and path. - """ - kwargs = { - "version": 0, - "name": name, - "value": value, - "port": None, - "port_specified": False, - "domain": domain, - "domain_specified": bool(domain), - "domain_initial_dot": domain.startswith("."), - "path": path, - "path_specified": bool(path), - "secure": False, - "expires": None, - "discard": True, - "comment": None, - "comment_url": None, - "rest": {"HttpOnly": None}, - "rfc2109": False, - } - cookie = Cookie(**kwargs) # type: ignore - self.jar.set_cookie(cookie) - - def get( # type: ignore - self, - name: str, - default: str | None = None, - domain: str | None = None, - path: str | None = None, - ) -> str | None: - """ - Get a cookie by name. May optionally include domain and path - in order to specify exactly which cookie to retrieve. - """ - value = None - for cookie in self.jar: - if cookie.name == name: - if domain is None or cookie.domain == domain: - if path is None or cookie.path == path: - if value is not None: - message = f"Multiple cookies exist with name={name}" - raise CookieConflict(message) - value = cookie.value - - if value is None: - return default - return value - - def delete( - self, - name: str, - domain: str | None = None, - path: str | None = None, - ) -> None: - """ - Delete a cookie by name. May optionally include domain and path - in order to specify exactly which cookie to delete. - """ - if domain is not None and path is not None: - return self.jar.clear(domain, path, name) - - remove = [ - cookie - for cookie in self.jar - if cookie.name == name - and (domain is None or cookie.domain == domain) - and (path is None or cookie.path == path) - ] - - for cookie in remove: - self.jar.clear(cookie.domain, cookie.path, cookie.name) - - def clear(self, domain: str | None = None, path: str | None = None) -> None: - """ - Delete all cookies. Optionally include a domain and path in - order to only delete a subset of all the cookies. - """ - args = [] - if domain is not None: - args.append(domain) - if path is not None: - assert domain is not None - args.append(path) - self.jar.clear(*args) - - def update(self, cookies: CookieTypes | None = None) -> None: # type: ignore - cookies = Cookies(cookies) - for cookie in cookies.jar: - self.jar.set_cookie(cookie) - - def __setitem__(self, name: str, value: str) -> None: - return self.set(name, value) - - def __getitem__(self, name: str) -> str: - value = self.get(name) - if value is None: - raise KeyError(name) - return value - - def __delitem__(self, name: str) -> None: - return self.delete(name) - - def __len__(self) -> int: - return len(self.jar) - - def __iter__(self) -> typing.Iterator[str]: - return (cookie.name for cookie in self.jar) - - def __bool__(self) -> bool: - for _ in self.jar: - return True - return False - - def __repr__(self) -> str: - cookies_repr = ", ".join( - [ - f"" - for cookie in self.jar - ] - ) - - return f"" - - class _CookieCompatRequest(urllib.request.Request): - """ - Wraps a `Request` instance up in a compatibility interface suitable - for use with `CookieJar` operations. - """ - - def __init__(self, request: Request) -> None: - super().__init__( - url=str(request.url), - headers=dict(request.headers), - method=request.method, - ) - self.request = request - - def add_unredirected_header(self, key: str, value: str) -> None: - super().add_unredirected_header(key, value) - self.request.headers[key] = value - - class _CookieCompatResponse: - """ - Wraps a `Request` instance up in a compatibility interface suitable - for use with `CookieJar` operations. - """ - - def __init__(self, response: Response) -> None: - self.response = response - - def info(self) -> email.message.Message: - info = email.message.Message() - for key, value in self.response.headers.multi_items(): - # Note that setting `info[key]` here is an "append" operation, - # not a "replace" operation. - # https://docs.python.org/3/library/email.compat32-message.html#email.message.Message.__setitem__ - info[key] = value - return info diff --git a/venv/lib/python3.11/site-packages/httpx/_multipart.py b/venv/lib/python3.11/site-packages/httpx/_multipart.py deleted file mode 100755 index b4761af..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_multipart.py +++ /dev/null @@ -1,300 +0,0 @@ -from __future__ import annotations - -import io -import mimetypes -import os -import re -import typing -from pathlib import Path - -from ._types import ( - AsyncByteStream, - FileContent, - FileTypes, - RequestData, - RequestFiles, - SyncByteStream, -) -from ._utils import ( - peek_filelike_length, - primitive_value_to_str, - to_bytes, -) - -_HTML5_FORM_ENCODING_REPLACEMENTS = {'"': "%22", "\\": "\\\\"} -_HTML5_FORM_ENCODING_REPLACEMENTS.update( - {chr(c): "%{:02X}".format(c) for c in range(0x1F + 1) if c != 0x1B} -) -_HTML5_FORM_ENCODING_RE = re.compile( - r"|".join([re.escape(c) for c in _HTML5_FORM_ENCODING_REPLACEMENTS.keys()]) -) - - -def _format_form_param(name: str, value: str) -> bytes: - """ - Encode a name/value pair within a multipart form. - """ - - def replacer(match: typing.Match[str]) -> str: - return _HTML5_FORM_ENCODING_REPLACEMENTS[match.group(0)] - - value = _HTML5_FORM_ENCODING_RE.sub(replacer, value) - return f'{name}="{value}"'.encode() - - -def _guess_content_type(filename: str | None) -> str | None: - """ - Guesses the mimetype based on a filename. Defaults to `application/octet-stream`. - - Returns `None` if `filename` is `None` or empty. - """ - if filename: - return mimetypes.guess_type(filename)[0] or "application/octet-stream" - return None - - -def get_multipart_boundary_from_content_type( - content_type: bytes | None, -) -> bytes | None: - if not content_type or not content_type.startswith(b"multipart/form-data"): - return None - # parse boundary according to - # https://www.rfc-editor.org/rfc/rfc2046#section-5.1.1 - if b";" in content_type: - for section in content_type.split(b";"): - if section.strip().lower().startswith(b"boundary="): - return section.strip()[len(b"boundary=") :].strip(b'"') - return None - - -class DataField: - """ - A single form field item, within a multipart form field. - """ - - def __init__(self, name: str, value: str | bytes | int | float | None) -> None: - if not isinstance(name, str): - raise TypeError( - f"Invalid type for name. Expected str, got {type(name)}: {name!r}" - ) - if value is not None and not isinstance(value, (str, bytes, int, float)): - raise TypeError( - "Invalid type for value. Expected primitive type," - f" got {type(value)}: {value!r}" - ) - self.name = name - self.value: str | bytes = ( - value if isinstance(value, bytes) else primitive_value_to_str(value) - ) - - def render_headers(self) -> bytes: - if not hasattr(self, "_headers"): - name = _format_form_param("name", self.name) - self._headers = b"".join( - [b"Content-Disposition: form-data; ", name, b"\r\n\r\n"] - ) - - return self._headers - - def render_data(self) -> bytes: - if not hasattr(self, "_data"): - self._data = to_bytes(self.value) - - return self._data - - def get_length(self) -> int: - headers = self.render_headers() - data = self.render_data() - return len(headers) + len(data) - - def render(self) -> typing.Iterator[bytes]: - yield self.render_headers() - yield self.render_data() - - -class FileField: - """ - A single file field item, within a multipart form field. - """ - - CHUNK_SIZE = 64 * 1024 - - def __init__(self, name: str, value: FileTypes) -> None: - self.name = name - - fileobj: FileContent - - headers: dict[str, str] = {} - content_type: str | None = None - - # This large tuple based API largely mirror's requests' API - # It would be good to think of better APIs for this that we could - # include in httpx 2.0 since variable length tuples(especially of 4 elements) - # are quite unwieldly - if isinstance(value, tuple): - if len(value) == 2: - # neither the 3rd parameter (content_type) nor the 4th (headers) - # was included - filename, fileobj = value - elif len(value) == 3: - filename, fileobj, content_type = value - else: - # all 4 parameters included - filename, fileobj, content_type, headers = value # type: ignore - else: - filename = Path(str(getattr(value, "name", "upload"))).name - fileobj = value - - if content_type is None: - content_type = _guess_content_type(filename) - - has_content_type_header = any("content-type" in key.lower() for key in headers) - if content_type is not None and not has_content_type_header: - # note that unlike requests, we ignore the content_type provided in the 3rd - # tuple element if it is also included in the headers requests does - # the opposite (it overwrites the headerwith the 3rd tuple element) - headers["Content-Type"] = content_type - - if isinstance(fileobj, io.StringIO): - raise TypeError( - "Multipart file uploads require 'io.BytesIO', not 'io.StringIO'." - ) - if isinstance(fileobj, io.TextIOBase): - raise TypeError( - "Multipart file uploads must be opened in binary mode, not text mode." - ) - - self.filename = filename - self.file = fileobj - self.headers = headers - - def get_length(self) -> int | None: - headers = self.render_headers() - - if isinstance(self.file, (str, bytes)): - return len(headers) + len(to_bytes(self.file)) - - file_length = peek_filelike_length(self.file) - - # If we can't determine the filesize without reading it into memory, - # then return `None` here, to indicate an unknown file length. - if file_length is None: - return None - - return len(headers) + file_length - - def render_headers(self) -> bytes: - if not hasattr(self, "_headers"): - parts = [ - b"Content-Disposition: form-data; ", - _format_form_param("name", self.name), - ] - if self.filename: - filename = _format_form_param("filename", self.filename) - parts.extend([b"; ", filename]) - for header_name, header_value in self.headers.items(): - key, val = f"\r\n{header_name}: ".encode(), header_value.encode() - parts.extend([key, val]) - parts.append(b"\r\n\r\n") - self._headers = b"".join(parts) - - return self._headers - - def render_data(self) -> typing.Iterator[bytes]: - if isinstance(self.file, (str, bytes)): - yield to_bytes(self.file) - return - - if hasattr(self.file, "seek"): - try: - self.file.seek(0) - except io.UnsupportedOperation: - pass - - chunk = self.file.read(self.CHUNK_SIZE) - while chunk: - yield to_bytes(chunk) - chunk = self.file.read(self.CHUNK_SIZE) - - def render(self) -> typing.Iterator[bytes]: - yield self.render_headers() - yield from self.render_data() - - -class MultipartStream(SyncByteStream, AsyncByteStream): - """ - Request content as streaming multipart encoded form data. - """ - - def __init__( - self, - data: RequestData, - files: RequestFiles, - boundary: bytes | None = None, - ) -> None: - if boundary is None: - boundary = os.urandom(16).hex().encode("ascii") - - self.boundary = boundary - self.content_type = "multipart/form-data; boundary=%s" % boundary.decode( - "ascii" - ) - self.fields = list(self._iter_fields(data, files)) - - def _iter_fields( - self, data: RequestData, files: RequestFiles - ) -> typing.Iterator[FileField | DataField]: - for name, value in data.items(): - if isinstance(value, (tuple, list)): - for item in value: - yield DataField(name=name, value=item) - else: - yield DataField(name=name, value=value) - - file_items = files.items() if isinstance(files, typing.Mapping) else files - for name, value in file_items: - yield FileField(name=name, value=value) - - def iter_chunks(self) -> typing.Iterator[bytes]: - for field in self.fields: - yield b"--%s\r\n" % self.boundary - yield from field.render() - yield b"\r\n" - yield b"--%s--\r\n" % self.boundary - - def get_content_length(self) -> int | None: - """ - Return the length of the multipart encoded content, or `None` if - any of the files have a length that cannot be determined upfront. - """ - boundary_length = len(self.boundary) - length = 0 - - for field in self.fields: - field_length = field.get_length() - if field_length is None: - return None - - length += 2 + boundary_length + 2 # b"--{boundary}\r\n" - length += field_length - length += 2 # b"\r\n" - - length += 2 + boundary_length + 4 # b"--{boundary}--\r\n" - return length - - # Content stream interface. - - def get_headers(self) -> dict[str, str]: - content_length = self.get_content_length() - content_type = self.content_type - if content_length is None: - return {"Transfer-Encoding": "chunked", "Content-Type": content_type} - return {"Content-Length": str(content_length), "Content-Type": content_type} - - def __iter__(self) -> typing.Iterator[bytes]: - for chunk in self.iter_chunks(): - yield chunk - - async def __aiter__(self) -> typing.AsyncIterator[bytes]: - for chunk in self.iter_chunks(): - yield chunk diff --git a/venv/lib/python3.11/site-packages/httpx/_status_codes.py b/venv/lib/python3.11/site-packages/httpx/_status_codes.py deleted file mode 100755 index 133a623..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_status_codes.py +++ /dev/null @@ -1,162 +0,0 @@ -from __future__ import annotations - -from enum import IntEnum - -__all__ = ["codes"] - - -class codes(IntEnum): - """HTTP status codes and reason phrases - - Status codes from the following RFCs are all observed: - - * RFC 7231: Hypertext Transfer Protocol (HTTP/1.1), obsoletes 2616 - * RFC 6585: Additional HTTP Status Codes - * RFC 3229: Delta encoding in HTTP - * RFC 4918: HTTP Extensions for WebDAV, obsoletes 2518 - * RFC 5842: Binding Extensions to WebDAV - * RFC 7238: Permanent Redirect - * RFC 2295: Transparent Content Negotiation in HTTP - * RFC 2774: An HTTP Extension Framework - * RFC 7540: Hypertext Transfer Protocol Version 2 (HTTP/2) - * RFC 2324: Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0) - * RFC 7725: An HTTP Status Code to Report Legal Obstacles - * RFC 8297: An HTTP Status Code for Indicating Hints - * RFC 8470: Using Early Data in HTTP - """ - - def __new__(cls, value: int, phrase: str = "") -> codes: - obj = int.__new__(cls, value) - obj._value_ = value - - obj.phrase = phrase # type: ignore[attr-defined] - return obj - - def __str__(self) -> str: - return str(self.value) - - @classmethod - def get_reason_phrase(cls, value: int) -> str: - try: - return codes(value).phrase # type: ignore - except ValueError: - return "" - - @classmethod - def is_informational(cls, value: int) -> bool: - """ - Returns `True` for 1xx status codes, `False` otherwise. - """ - return 100 <= value <= 199 - - @classmethod - def is_success(cls, value: int) -> bool: - """ - Returns `True` for 2xx status codes, `False` otherwise. - """ - return 200 <= value <= 299 - - @classmethod - def is_redirect(cls, value: int) -> bool: - """ - Returns `True` for 3xx status codes, `False` otherwise. - """ - return 300 <= value <= 399 - - @classmethod - def is_client_error(cls, value: int) -> bool: - """ - Returns `True` for 4xx status codes, `False` otherwise. - """ - return 400 <= value <= 499 - - @classmethod - def is_server_error(cls, value: int) -> bool: - """ - Returns `True` for 5xx status codes, `False` otherwise. - """ - return 500 <= value <= 599 - - @classmethod - def is_error(cls, value: int) -> bool: - """ - Returns `True` for 4xx or 5xx status codes, `False` otherwise. - """ - return 400 <= value <= 599 - - # informational - CONTINUE = 100, "Continue" - SWITCHING_PROTOCOLS = 101, "Switching Protocols" - PROCESSING = 102, "Processing" - EARLY_HINTS = 103, "Early Hints" - - # success - OK = 200, "OK" - CREATED = 201, "Created" - ACCEPTED = 202, "Accepted" - NON_AUTHORITATIVE_INFORMATION = 203, "Non-Authoritative Information" - NO_CONTENT = 204, "No Content" - RESET_CONTENT = 205, "Reset Content" - PARTIAL_CONTENT = 206, "Partial Content" - MULTI_STATUS = 207, "Multi-Status" - ALREADY_REPORTED = 208, "Already Reported" - IM_USED = 226, "IM Used" - - # redirection - MULTIPLE_CHOICES = 300, "Multiple Choices" - MOVED_PERMANENTLY = 301, "Moved Permanently" - FOUND = 302, "Found" - SEE_OTHER = 303, "See Other" - NOT_MODIFIED = 304, "Not Modified" - USE_PROXY = 305, "Use Proxy" - TEMPORARY_REDIRECT = 307, "Temporary Redirect" - PERMANENT_REDIRECT = 308, "Permanent Redirect" - - # client error - BAD_REQUEST = 400, "Bad Request" - UNAUTHORIZED = 401, "Unauthorized" - PAYMENT_REQUIRED = 402, "Payment Required" - FORBIDDEN = 403, "Forbidden" - NOT_FOUND = 404, "Not Found" - METHOD_NOT_ALLOWED = 405, "Method Not Allowed" - NOT_ACCEPTABLE = 406, "Not Acceptable" - PROXY_AUTHENTICATION_REQUIRED = 407, "Proxy Authentication Required" - REQUEST_TIMEOUT = 408, "Request Timeout" - CONFLICT = 409, "Conflict" - GONE = 410, "Gone" - LENGTH_REQUIRED = 411, "Length Required" - PRECONDITION_FAILED = 412, "Precondition Failed" - REQUEST_ENTITY_TOO_LARGE = 413, "Request Entity Too Large" - REQUEST_URI_TOO_LONG = 414, "Request-URI Too Long" - UNSUPPORTED_MEDIA_TYPE = 415, "Unsupported Media Type" - REQUESTED_RANGE_NOT_SATISFIABLE = 416, "Requested Range Not Satisfiable" - EXPECTATION_FAILED = 417, "Expectation Failed" - IM_A_TEAPOT = 418, "I'm a teapot" - MISDIRECTED_REQUEST = 421, "Misdirected Request" - UNPROCESSABLE_ENTITY = 422, "Unprocessable Entity" - LOCKED = 423, "Locked" - FAILED_DEPENDENCY = 424, "Failed Dependency" - TOO_EARLY = 425, "Too Early" - UPGRADE_REQUIRED = 426, "Upgrade Required" - PRECONDITION_REQUIRED = 428, "Precondition Required" - TOO_MANY_REQUESTS = 429, "Too Many Requests" - REQUEST_HEADER_FIELDS_TOO_LARGE = 431, "Request Header Fields Too Large" - UNAVAILABLE_FOR_LEGAL_REASONS = 451, "Unavailable For Legal Reasons" - - # server errors - INTERNAL_SERVER_ERROR = 500, "Internal Server Error" - NOT_IMPLEMENTED = 501, "Not Implemented" - BAD_GATEWAY = 502, "Bad Gateway" - SERVICE_UNAVAILABLE = 503, "Service Unavailable" - GATEWAY_TIMEOUT = 504, "Gateway Timeout" - HTTP_VERSION_NOT_SUPPORTED = 505, "HTTP Version Not Supported" - VARIANT_ALSO_NEGOTIATES = 506, "Variant Also Negotiates" - INSUFFICIENT_STORAGE = 507, "Insufficient Storage" - LOOP_DETECTED = 508, "Loop Detected" - NOT_EXTENDED = 510, "Not Extended" - NETWORK_AUTHENTICATION_REQUIRED = 511, "Network Authentication Required" - - -# Include lower-case styles for `requests` compatibility. -for code in codes: - setattr(codes, code._name_.lower(), int(code)) diff --git a/venv/lib/python3.11/site-packages/httpx/_transports/__init__.py b/venv/lib/python3.11/site-packages/httpx/_transports/__init__.py deleted file mode 100755 index 7a32105..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_transports/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -from .asgi import * -from .base import * -from .default import * -from .mock import * -from .wsgi import * - -__all__ = [ - "ASGITransport", - "AsyncBaseTransport", - "BaseTransport", - "AsyncHTTPTransport", - "HTTPTransport", - "MockTransport", - "WSGITransport", -] diff --git a/venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index d4fd6573132ae12972123837804e173c31786be4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcmZ8d%}T>S5Z+B!QcV#wOV%yRGKtLkNOLFXG$u zsC)I~t7F-r?OwQ0oB~{hF!3g&OX;wsyL`lQS=)sT4d@y3v(+>K{|dmN{oVTu@Fu z?`nneFTCLXaHV>?y5rK_)QHM3(x`9tXggr{bQCL%64Ry8V^OjRp>a&eCzur{&#&=- zCk!Vv^Ep1}A@5)+1Rk?=jN_<}MXm-s?X=o$EF;DC1@(tCWD*aQ5>J?@>OzSLiPA_B z(h~W+ewgrJ6tkmj$80J7Mcx=Qtw9LCKyy;*y1zRCrLO0f{3)t$TT@V(XS;Y=!;Jm| D{i%|? diff --git a/venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/asgi.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/asgi.cpython-311.pyc deleted file mode 100755 index 5afb40f5f5d75ce099b7e20aefaf16f5e246e634..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8122 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 BMcn`Z diff --git a/venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/mock.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/mock.cpython-311.pyc deleted file mode 100755 index 5b49c9e85dff1dc7c7a4bb3b186e000c91b7de08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2125 zcmcIk&2Jk;6rWkIy=!M}hr~_VCTUj{gt#KHLO4N$1Q8-M5YndN;LB>`og|y?hdaA2 zO>n`Y6>_UcMF=SorwECVDE|QB)D!28?fRErrgQ^*UZm=`f3+*-W79N||mi7s=O+6I(Qbosfpp0-=#G!EuR&gO^yl{8@m z=aU?IA8FzvqzObI;x3%w0N$qLQyRC3vhia!%woSswJh6JUEQ{v`D2b5IbXO%?v{w- z`r<9(6v0D|ansZHjtRbl7p(w_A3>bkH$lR7N|D=PoJZU9cZ?d=EI6#cfHMb6eMf8Fm4&gAVjg+U+De zg3A(K=Sy5>$;i!byfzc$py!WZ}M0%XsOjT3${=u#3Z>D#I!~U^a|5#Ogp1!m__QUL9dc2k%Zy+515I^r5 z@`i65_RZD$<~(Vxo*t~G=>=G=i@S#`Rlf(%9K!#ZzlTtQK8t*Uwjy8g{|lF5nR_wD z1CFsrUxICBc|WRlD50!81zgY}=!Nmlv=9v_?x23{T+~BzM%YpXP`^V9@J|msHJ_M| z?M>SgN4lRbO8$~i@8vKlqxF$jzW)5IRcDVntjuTmAj2rTgEYld8WdPrJ~eM%U}f2# zjj;=DsU}erKcOh5t(6ScmlWl0Ni~`t%E}LAC!sQ^eH73iBw|qJ0>y$j3!o~U*5GjT zDkM=z#l+~v1`4Z8irM}}1;Mguw!P&N6iV10Wp}}kx$8yUTJZ(8ZDKfQRmJC*pw?3n zW>I#LeQ`!L40XvMe$NYq*pJWH)GoQYMSLk#k_AP9A0QB`;`C*vSjGoOJ{6~%FuhGD zz{bjp^9!g(1Y=xB*Szp^gp!q@9idmf^PW1I^3HpXQkhMA`_pZG@1l2QvX*+i(o;`g z*!*Hg*k0cotzCcfr#GHup56D}`nYy|!MnOpOW&+WjTn-Kyu?sNXvBswfZDCR%;;Y7 N59avu9B**WzX5n#_s#$S diff --git a/venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/wsgi.cpython-311.pyc b/venv/lib/python3.11/site-packages/httpx/_transports/__pycache__/wsgi.cpython-311.pyc deleted file mode 100755 index e805d02ed87b37b008974d9e394ea4ff94df5696..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7389 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 bool: - try: - # sniffio is a dependency of trio. - - # See https://github.com/python-trio/trio/issues/2802 - import sniffio - - if sniffio.current_async_library() == "trio": - return True - except ImportError: # pragma: nocover - pass - - return False - - -def create_event() -> Event: - if is_running_trio(): - import trio - - return trio.Event() - - import asyncio - - return asyncio.Event() - - -class ASGIResponseStream(AsyncByteStream): - def __init__(self, body: list[bytes]) -> None: - self._body = body - - async def __aiter__(self) -> typing.AsyncIterator[bytes]: - yield b"".join(self._body) - - -class ASGITransport(AsyncBaseTransport): - """ - A custom AsyncTransport that handles sending requests directly to an ASGI app. - - ```python - transport = httpx.ASGITransport( - app=app, - root_path="/submount", - client=("1.2.3.4", 123) - ) - client = httpx.AsyncClient(transport=transport) - ``` - - Arguments: - - * `app` - The ASGI application. - * `raise_app_exceptions` - Boolean indicating if exceptions in the application - should be raised. Default to `True`. Can be set to `False` for use cases - such as testing the content of a client 500 response. - * `root_path` - The root path on which the ASGI application should be mounted. - * `client` - A two-tuple indicating the client IP and port of incoming requests. - ``` - """ - - def __init__( - self, - app: _ASGIApp, - raise_app_exceptions: bool = True, - root_path: str = "", - client: tuple[str, int] = ("127.0.0.1", 123), - ) -> None: - self.app = app - self.raise_app_exceptions = raise_app_exceptions - self.root_path = root_path - self.client = client - - async def handle_async_request( - self, - request: Request, - ) -> Response: - assert isinstance(request.stream, AsyncByteStream) - - # ASGI scope. - scope = { - "type": "http", - "asgi": {"version": "3.0"}, - "http_version": "1.1", - "method": request.method, - "headers": [(k.lower(), v) for (k, v) in request.headers.raw], - "scheme": request.url.scheme, - "path": request.url.path, - "raw_path": request.url.raw_path.split(b"?")[0], - "query_string": request.url.query, - "server": (request.url.host, request.url.port), - "client": self.client, - "root_path": self.root_path, - } - - # Request. - request_body_chunks = request.stream.__aiter__() - request_complete = False - - # Response. - status_code = None - response_headers = None - body_parts = [] - response_started = False - response_complete = create_event() - - # ASGI callables. - - async def receive() -> dict[str, typing.Any]: - nonlocal request_complete - - if request_complete: - await response_complete.wait() - return {"type": "http.disconnect"} - - try: - body = await request_body_chunks.__anext__() - except StopAsyncIteration: - request_complete = True - return {"type": "http.request", "body": b"", "more_body": False} - return {"type": "http.request", "body": body, "more_body": True} - - async def send(message: typing.MutableMapping[str, typing.Any]) -> None: - nonlocal status_code, response_headers, response_started - - if message["type"] == "http.response.start": - assert not response_started - - status_code = message["status"] - response_headers = message.get("headers", []) - response_started = True - - elif message["type"] == "http.response.body": - assert not response_complete.is_set() - body = message.get("body", b"") - more_body = message.get("more_body", False) - - if body and request.method != "HEAD": - body_parts.append(body) - - if not more_body: - response_complete.set() - - try: - await self.app(scope, receive, send) - except Exception: # noqa: PIE-786 - if self.raise_app_exceptions: - raise - - response_complete.set() - if status_code is None: - status_code = 500 - if response_headers is None: - response_headers = {} - - assert response_complete.is_set() - assert status_code is not None - assert response_headers is not None - - stream = ASGIResponseStream(body_parts) - - return Response(status_code, headers=response_headers, stream=stream) diff --git a/venv/lib/python3.11/site-packages/httpx/_transports/base.py b/venv/lib/python3.11/site-packages/httpx/_transports/base.py deleted file mode 100755 index 66fd99d..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_transports/base.py +++ /dev/null @@ -1,86 +0,0 @@ -from __future__ import annotations - -import typing -from types import TracebackType - -from .._models import Request, Response - -T = typing.TypeVar("T", bound="BaseTransport") -A = typing.TypeVar("A", bound="AsyncBaseTransport") - -__all__ = ["AsyncBaseTransport", "BaseTransport"] - - -class BaseTransport: - def __enter__(self: T) -> T: - return self - - def __exit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: TracebackType | None = None, - ) -> None: - self.close() - - def handle_request(self, request: Request) -> Response: - """ - Send a single HTTP request and return a response. - - Developers shouldn't typically ever need to call into this API directly, - since the Client class provides all the higher level user-facing API - niceties. - - In order to properly release any network resources, the response - stream should *either* be consumed immediately, with a call to - `response.stream.read()`, or else the `handle_request` call should - be followed with a try/finally block to ensuring the stream is - always closed. - - Example usage: - - with httpx.HTTPTransport() as transport: - req = httpx.Request( - method=b"GET", - url=(b"https", b"www.example.com", 443, b"/"), - headers=[(b"Host", b"www.example.com")], - ) - resp = transport.handle_request(req) - body = resp.stream.read() - print(resp.status_code, resp.headers, body) - - - Takes a `Request` instance as the only argument. - - Returns a `Response` instance. - """ - raise NotImplementedError( - "The 'handle_request' method must be implemented." - ) # pragma: no cover - - def close(self) -> None: - pass - - -class AsyncBaseTransport: - async def __aenter__(self: A) -> A: - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: TracebackType | None = None, - ) -> None: - await self.aclose() - - async def handle_async_request( - self, - request: Request, - ) -> Response: - raise NotImplementedError( - "The 'handle_async_request' method must be implemented." - ) # pragma: no cover - - async def aclose(self) -> None: - pass diff --git a/venv/lib/python3.11/site-packages/httpx/_transports/default.py b/venv/lib/python3.11/site-packages/httpx/_transports/default.py deleted file mode 100755 index d5aa05f..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_transports/default.py +++ /dev/null @@ -1,406 +0,0 @@ -""" -Custom transports, with nicely configured defaults. - -The following additional keyword arguments are currently supported by httpcore... - -* uds: str -* local_address: str -* retries: int - -Example usages... - -# Disable HTTP/2 on a single specific domain. -mounts = { - "all://": httpx.HTTPTransport(http2=True), - "all://*example.org": httpx.HTTPTransport() -} - -# Using advanced httpcore configuration, with connection retries. -transport = httpx.HTTPTransport(retries=1) -client = httpx.Client(transport=transport) - -# Using advanced httpcore configuration, with unix domain sockets. -transport = httpx.HTTPTransport(uds="socket.uds") -client = httpx.Client(transport=transport) -""" - -from __future__ import annotations - -import contextlib -import typing -from types import TracebackType - -if typing.TYPE_CHECKING: - import ssl # pragma: no cover - - import httpx # pragma: no cover - -from .._config import DEFAULT_LIMITS, Limits, Proxy, create_ssl_context -from .._exceptions import ( - ConnectError, - ConnectTimeout, - LocalProtocolError, - NetworkError, - PoolTimeout, - ProtocolError, - ProxyError, - ReadError, - ReadTimeout, - RemoteProtocolError, - TimeoutException, - UnsupportedProtocol, - WriteError, - WriteTimeout, -) -from .._models import Request, Response -from .._types import AsyncByteStream, CertTypes, ProxyTypes, SyncByteStream -from .._urls import URL -from .base import AsyncBaseTransport, BaseTransport - -T = typing.TypeVar("T", bound="HTTPTransport") -A = typing.TypeVar("A", bound="AsyncHTTPTransport") - -SOCKET_OPTION = typing.Union[ - typing.Tuple[int, int, int], - typing.Tuple[int, int, typing.Union[bytes, bytearray]], - typing.Tuple[int, int, None, int], -] - -__all__ = ["AsyncHTTPTransport", "HTTPTransport"] - -HTTPCORE_EXC_MAP: dict[type[Exception], type[httpx.HTTPError]] = {} - - -def _load_httpcore_exceptions() -> dict[type[Exception], type[httpx.HTTPError]]: - import httpcore - - return { - httpcore.TimeoutException: TimeoutException, - httpcore.ConnectTimeout: ConnectTimeout, - httpcore.ReadTimeout: ReadTimeout, - httpcore.WriteTimeout: WriteTimeout, - httpcore.PoolTimeout: PoolTimeout, - httpcore.NetworkError: NetworkError, - httpcore.ConnectError: ConnectError, - httpcore.ReadError: ReadError, - httpcore.WriteError: WriteError, - httpcore.ProxyError: ProxyError, - httpcore.UnsupportedProtocol: UnsupportedProtocol, - httpcore.ProtocolError: ProtocolError, - httpcore.LocalProtocolError: LocalProtocolError, - httpcore.RemoteProtocolError: RemoteProtocolError, - } - - -@contextlib.contextmanager -def map_httpcore_exceptions() -> typing.Iterator[None]: - global HTTPCORE_EXC_MAP - if len(HTTPCORE_EXC_MAP) == 0: - HTTPCORE_EXC_MAP = _load_httpcore_exceptions() - try: - yield - except Exception as exc: - mapped_exc = None - - for from_exc, to_exc in HTTPCORE_EXC_MAP.items(): - if not isinstance(exc, from_exc): - continue - # We want to map to the most specific exception we can find. - # Eg if `exc` is an `httpcore.ReadTimeout`, we want to map to - # `httpx.ReadTimeout`, not just `httpx.TimeoutException`. - if mapped_exc is None or issubclass(to_exc, mapped_exc): - mapped_exc = to_exc - - if mapped_exc is None: # pragma: no cover - raise - - message = str(exc) - raise mapped_exc(message) from exc - - -class ResponseStream(SyncByteStream): - def __init__(self, httpcore_stream: typing.Iterable[bytes]) -> None: - self._httpcore_stream = httpcore_stream - - def __iter__(self) -> typing.Iterator[bytes]: - with map_httpcore_exceptions(): - for part in self._httpcore_stream: - yield part - - def close(self) -> None: - if hasattr(self._httpcore_stream, "close"): - self._httpcore_stream.close() - - -class HTTPTransport(BaseTransport): - def __init__( - self, - verify: ssl.SSLContext | str | bool = True, - cert: CertTypes | None = None, - trust_env: bool = True, - http1: bool = True, - http2: bool = False, - limits: Limits = DEFAULT_LIMITS, - proxy: ProxyTypes | None = None, - uds: str | None = None, - local_address: str | None = None, - retries: int = 0, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> None: - import httpcore - - proxy = Proxy(url=proxy) if isinstance(proxy, (str, URL)) else proxy - ssl_context = create_ssl_context(verify=verify, cert=cert, trust_env=trust_env) - - if proxy is None: - self._pool = httpcore.ConnectionPool( - ssl_context=ssl_context, - max_connections=limits.max_connections, - max_keepalive_connections=limits.max_keepalive_connections, - keepalive_expiry=limits.keepalive_expiry, - http1=http1, - http2=http2, - uds=uds, - local_address=local_address, - retries=retries, - socket_options=socket_options, - ) - elif proxy.url.scheme in ("http", "https"): - self._pool = httpcore.HTTPProxy( - proxy_url=httpcore.URL( - scheme=proxy.url.raw_scheme, - host=proxy.url.raw_host, - port=proxy.url.port, - target=proxy.url.raw_path, - ), - proxy_auth=proxy.raw_auth, - proxy_headers=proxy.headers.raw, - ssl_context=ssl_context, - proxy_ssl_context=proxy.ssl_context, - max_connections=limits.max_connections, - max_keepalive_connections=limits.max_keepalive_connections, - keepalive_expiry=limits.keepalive_expiry, - http1=http1, - http2=http2, - socket_options=socket_options, - ) - elif proxy.url.scheme in ("socks5", "socks5h"): - try: - import socksio # noqa - except ImportError: # pragma: no cover - raise ImportError( - "Using SOCKS proxy, but the 'socksio' package is not installed. " - "Make sure to install httpx using `pip install httpx[socks]`." - ) from None - - self._pool = httpcore.SOCKSProxy( - proxy_url=httpcore.URL( - scheme=proxy.url.raw_scheme, - host=proxy.url.raw_host, - port=proxy.url.port, - target=proxy.url.raw_path, - ), - proxy_auth=proxy.raw_auth, - ssl_context=ssl_context, - max_connections=limits.max_connections, - max_keepalive_connections=limits.max_keepalive_connections, - keepalive_expiry=limits.keepalive_expiry, - http1=http1, - http2=http2, - ) - else: # pragma: no cover - raise ValueError( - "Proxy protocol must be either 'http', 'https', 'socks5', or 'socks5h'," - f" but got {proxy.url.scheme!r}." - ) - - def __enter__(self: T) -> T: # Use generics for subclass support. - self._pool.__enter__() - return self - - def __exit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: TracebackType | None = None, - ) -> None: - with map_httpcore_exceptions(): - self._pool.__exit__(exc_type, exc_value, traceback) - - def handle_request( - self, - request: Request, - ) -> Response: - assert isinstance(request.stream, SyncByteStream) - import httpcore - - req = httpcore.Request( - method=request.method, - url=httpcore.URL( - scheme=request.url.raw_scheme, - host=request.url.raw_host, - port=request.url.port, - target=request.url.raw_path, - ), - headers=request.headers.raw, - content=request.stream, - extensions=request.extensions, - ) - with map_httpcore_exceptions(): - resp = self._pool.handle_request(req) - - assert isinstance(resp.stream, typing.Iterable) - - return Response( - status_code=resp.status, - headers=resp.headers, - stream=ResponseStream(resp.stream), - extensions=resp.extensions, - ) - - def close(self) -> None: - self._pool.close() - - -class AsyncResponseStream(AsyncByteStream): - def __init__(self, httpcore_stream: typing.AsyncIterable[bytes]) -> None: - self._httpcore_stream = httpcore_stream - - async def __aiter__(self) -> typing.AsyncIterator[bytes]: - with map_httpcore_exceptions(): - async for part in self._httpcore_stream: - yield part - - async def aclose(self) -> None: - if hasattr(self._httpcore_stream, "aclose"): - await self._httpcore_stream.aclose() - - -class AsyncHTTPTransport(AsyncBaseTransport): - def __init__( - self, - verify: ssl.SSLContext | str | bool = True, - cert: CertTypes | None = None, - trust_env: bool = True, - http1: bool = True, - http2: bool = False, - limits: Limits = DEFAULT_LIMITS, - proxy: ProxyTypes | None = None, - uds: str | None = None, - local_address: str | None = None, - retries: int = 0, - socket_options: typing.Iterable[SOCKET_OPTION] | None = None, - ) -> None: - import httpcore - - proxy = Proxy(url=proxy) if isinstance(proxy, (str, URL)) else proxy - ssl_context = create_ssl_context(verify=verify, cert=cert, trust_env=trust_env) - - if proxy is None: - self._pool = httpcore.AsyncConnectionPool( - ssl_context=ssl_context, - max_connections=limits.max_connections, - max_keepalive_connections=limits.max_keepalive_connections, - keepalive_expiry=limits.keepalive_expiry, - http1=http1, - http2=http2, - uds=uds, - local_address=local_address, - retries=retries, - socket_options=socket_options, - ) - elif proxy.url.scheme in ("http", "https"): - self._pool = httpcore.AsyncHTTPProxy( - proxy_url=httpcore.URL( - scheme=proxy.url.raw_scheme, - host=proxy.url.raw_host, - port=proxy.url.port, - target=proxy.url.raw_path, - ), - proxy_auth=proxy.raw_auth, - proxy_headers=proxy.headers.raw, - proxy_ssl_context=proxy.ssl_context, - ssl_context=ssl_context, - max_connections=limits.max_connections, - max_keepalive_connections=limits.max_keepalive_connections, - keepalive_expiry=limits.keepalive_expiry, - http1=http1, - http2=http2, - socket_options=socket_options, - ) - elif proxy.url.scheme in ("socks5", "socks5h"): - try: - import socksio # noqa - except ImportError: # pragma: no cover - raise ImportError( - "Using SOCKS proxy, but the 'socksio' package is not installed. " - "Make sure to install httpx using `pip install httpx[socks]`." - ) from None - - self._pool = httpcore.AsyncSOCKSProxy( - proxy_url=httpcore.URL( - scheme=proxy.url.raw_scheme, - host=proxy.url.raw_host, - port=proxy.url.port, - target=proxy.url.raw_path, - ), - proxy_auth=proxy.raw_auth, - ssl_context=ssl_context, - max_connections=limits.max_connections, - max_keepalive_connections=limits.max_keepalive_connections, - keepalive_expiry=limits.keepalive_expiry, - http1=http1, - http2=http2, - ) - else: # pragma: no cover - raise ValueError( - "Proxy protocol must be either 'http', 'https', 'socks5', or 'socks5h'," - " but got {proxy.url.scheme!r}." - ) - - async def __aenter__(self: A) -> A: # Use generics for subclass support. - await self._pool.__aenter__() - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None = None, - exc_value: BaseException | None = None, - traceback: TracebackType | None = None, - ) -> None: - with map_httpcore_exceptions(): - await self._pool.__aexit__(exc_type, exc_value, traceback) - - async def handle_async_request( - self, - request: Request, - ) -> Response: - assert isinstance(request.stream, AsyncByteStream) - import httpcore - - req = httpcore.Request( - method=request.method, - url=httpcore.URL( - scheme=request.url.raw_scheme, - host=request.url.raw_host, - port=request.url.port, - target=request.url.raw_path, - ), - headers=request.headers.raw, - content=request.stream, - extensions=request.extensions, - ) - with map_httpcore_exceptions(): - resp = await self._pool.handle_async_request(req) - - assert isinstance(resp.stream, typing.AsyncIterable) - - return Response( - status_code=resp.status, - headers=resp.headers, - stream=AsyncResponseStream(resp.stream), - extensions=resp.extensions, - ) - - async def aclose(self) -> None: - await self._pool.aclose() diff --git a/venv/lib/python3.11/site-packages/httpx/_transports/mock.py b/venv/lib/python3.11/site-packages/httpx/_transports/mock.py deleted file mode 100755 index 8c418f5..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_transports/mock.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -import typing - -from .._models import Request, Response -from .base import AsyncBaseTransport, BaseTransport - -SyncHandler = typing.Callable[[Request], Response] -AsyncHandler = typing.Callable[[Request], typing.Coroutine[None, None, Response]] - - -__all__ = ["MockTransport"] - - -class MockTransport(AsyncBaseTransport, BaseTransport): - def __init__(self, handler: SyncHandler | AsyncHandler) -> None: - self.handler = handler - - def handle_request( - self, - request: Request, - ) -> Response: - request.read() - response = self.handler(request) - if not isinstance(response, Response): # pragma: no cover - raise TypeError("Cannot use an async handler in a sync Client") - return response - - async def handle_async_request( - self, - request: Request, - ) -> Response: - await request.aread() - response = self.handler(request) - - # Allow handler to *optionally* be an `async` function. - # If it is, then the `response` variable need to be awaited to actually - # return the result. - - if not isinstance(response, Response): - response = await response - - return response diff --git a/venv/lib/python3.11/site-packages/httpx/_transports/wsgi.py b/venv/lib/python3.11/site-packages/httpx/_transports/wsgi.py deleted file mode 100755 index 8592ffe..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_transports/wsgi.py +++ /dev/null @@ -1,149 +0,0 @@ -from __future__ import annotations - -import io -import itertools -import sys -import typing - -from .._models import Request, Response -from .._types import SyncByteStream -from .base import BaseTransport - -if typing.TYPE_CHECKING: - from _typeshed import OptExcInfo # pragma: no cover - from _typeshed.wsgi import WSGIApplication # pragma: no cover - -_T = typing.TypeVar("_T") - - -__all__ = ["WSGITransport"] - - -def _skip_leading_empty_chunks(body: typing.Iterable[_T]) -> typing.Iterable[_T]: - body = iter(body) - for chunk in body: - if chunk: - return itertools.chain([chunk], body) - return [] - - -class WSGIByteStream(SyncByteStream): - def __init__(self, result: typing.Iterable[bytes]) -> None: - self._close = getattr(result, "close", None) - self._result = _skip_leading_empty_chunks(result) - - def __iter__(self) -> typing.Iterator[bytes]: - for part in self._result: - yield part - - def close(self) -> None: - if self._close is not None: - self._close() - - -class WSGITransport(BaseTransport): - """ - A custom transport that handles sending requests directly to an WSGI app. - The simplest way to use this functionality is to use the `app` argument. - - ``` - client = httpx.Client(app=app) - ``` - - Alternatively, you can setup the transport instance explicitly. - This allows you to include any additional configuration arguments specific - to the WSGITransport class: - - ``` - transport = httpx.WSGITransport( - app=app, - script_name="/submount", - remote_addr="1.2.3.4" - ) - client = httpx.Client(transport=transport) - ``` - - Arguments: - - * `app` - The WSGI application. - * `raise_app_exceptions` - Boolean indicating if exceptions in the application - should be raised. Default to `True`. Can be set to `False` for use cases - such as testing the content of a client 500 response. - * `script_name` - The root path on which the WSGI application should be mounted. - * `remote_addr` - A string indicating the client IP of incoming requests. - ``` - """ - - def __init__( - self, - app: WSGIApplication, - raise_app_exceptions: bool = True, - script_name: str = "", - remote_addr: str = "127.0.0.1", - wsgi_errors: typing.TextIO | None = None, - ) -> None: - self.app = app - self.raise_app_exceptions = raise_app_exceptions - self.script_name = script_name - self.remote_addr = remote_addr - self.wsgi_errors = wsgi_errors - - def handle_request(self, request: Request) -> Response: - request.read() - wsgi_input = io.BytesIO(request.content) - - port = request.url.port or {"http": 80, "https": 443}[request.url.scheme] - environ = { - "wsgi.version": (1, 0), - "wsgi.url_scheme": request.url.scheme, - "wsgi.input": wsgi_input, - "wsgi.errors": self.wsgi_errors or sys.stderr, - "wsgi.multithread": True, - "wsgi.multiprocess": False, - "wsgi.run_once": False, - "REQUEST_METHOD": request.method, - "SCRIPT_NAME": self.script_name, - "PATH_INFO": request.url.path, - "QUERY_STRING": request.url.query.decode("ascii"), - "SERVER_NAME": request.url.host, - "SERVER_PORT": str(port), - "SERVER_PROTOCOL": "HTTP/1.1", - "REMOTE_ADDR": self.remote_addr, - } - for header_key, header_value in request.headers.raw: - key = header_key.decode("ascii").upper().replace("-", "_") - if key not in ("CONTENT_TYPE", "CONTENT_LENGTH"): - key = "HTTP_" + key - environ[key] = header_value.decode("ascii") - - seen_status = None - seen_response_headers = None - seen_exc_info = None - - def start_response( - status: str, - response_headers: list[tuple[str, str]], - exc_info: OptExcInfo | None = None, - ) -> typing.Callable[[bytes], typing.Any]: - nonlocal seen_status, seen_response_headers, seen_exc_info - seen_status = status - seen_response_headers = response_headers - seen_exc_info = exc_info - return lambda _: None - - result = self.app(environ, start_response) - - stream = WSGIByteStream(result) - - assert seen_status is not None - assert seen_response_headers is not None - if seen_exc_info and seen_exc_info[0] and self.raise_app_exceptions: - raise seen_exc_info[1] - - status_code = int(seen_status.split()[0]) - headers = [ - (key.encode("ascii"), value.encode("ascii")) - for key, value in seen_response_headers - ] - - return Response(status_code, headers=headers, stream=stream) diff --git a/venv/lib/python3.11/site-packages/httpx/_types.py b/venv/lib/python3.11/site-packages/httpx/_types.py deleted file mode 100755 index 704dfdf..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_types.py +++ /dev/null @@ -1,114 +0,0 @@ -""" -Type definitions for type checking purposes. -""" - -from http.cookiejar import CookieJar -from typing import ( - IO, - TYPE_CHECKING, - Any, - AsyncIterable, - AsyncIterator, - Callable, - Dict, - Iterable, - Iterator, - List, - Mapping, - Optional, - Sequence, - Tuple, - Union, -) - -if TYPE_CHECKING: # pragma: no cover - from ._auth import Auth # noqa: F401 - from ._config import Proxy, Timeout # noqa: F401 - from ._models import Cookies, Headers, Request # noqa: F401 - from ._urls import URL, QueryParams # noqa: F401 - - -PrimitiveData = Optional[Union[str, int, float, bool]] - -URLTypes = Union["URL", str] - -QueryParamTypes = Union[ - "QueryParams", - Mapping[str, Union[PrimitiveData, Sequence[PrimitiveData]]], - List[Tuple[str, PrimitiveData]], - Tuple[Tuple[str, PrimitiveData], ...], - str, - bytes, -] - -HeaderTypes = Union[ - "Headers", - Mapping[str, str], - Mapping[bytes, bytes], - Sequence[Tuple[str, str]], - Sequence[Tuple[bytes, bytes]], -] - -CookieTypes = Union["Cookies", CookieJar, Dict[str, str], List[Tuple[str, str]]] - -TimeoutTypes = Union[ - Optional[float], - Tuple[Optional[float], Optional[float], Optional[float], Optional[float]], - "Timeout", -] -ProxyTypes = Union["URL", str, "Proxy"] -CertTypes = Union[str, Tuple[str, str], Tuple[str, str, str]] - -AuthTypes = Union[ - Tuple[Union[str, bytes], Union[str, bytes]], - Callable[["Request"], "Request"], - "Auth", -] - -RequestContent = Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]] -ResponseContent = Union[str, bytes, Iterable[bytes], AsyncIterable[bytes]] -ResponseExtensions = Mapping[str, Any] - -RequestData = Mapping[str, Any] - -FileContent = Union[IO[bytes], bytes, str] -FileTypes = Union[ - # file (or bytes) - FileContent, - # (filename, file (or bytes)) - Tuple[Optional[str], FileContent], - # (filename, file (or bytes), content_type) - Tuple[Optional[str], FileContent, Optional[str]], - # (filename, file (or bytes), content_type, headers) - Tuple[Optional[str], FileContent, Optional[str], Mapping[str, str]], -] -RequestFiles = Union[Mapping[str, FileTypes], Sequence[Tuple[str, FileTypes]]] - -RequestExtensions = Mapping[str, Any] - -__all__ = ["AsyncByteStream", "SyncByteStream"] - - -class SyncByteStream: - def __iter__(self) -> Iterator[bytes]: - raise NotImplementedError( - "The '__iter__' method must be implemented." - ) # pragma: no cover - yield b"" # pragma: no cover - - def close(self) -> None: - """ - Subclasses can override this method to release any network resources - after a request/response cycle is complete. - """ - - -class AsyncByteStream: - async def __aiter__(self) -> AsyncIterator[bytes]: - raise NotImplementedError( - "The '__aiter__' method must be implemented." - ) # pragma: no cover - yield b"" # pragma: no cover - - async def aclose(self) -> None: - pass diff --git a/venv/lib/python3.11/site-packages/httpx/_urlparse.py b/venv/lib/python3.11/site-packages/httpx/_urlparse.py deleted file mode 100755 index bf190fd..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_urlparse.py +++ /dev/null @@ -1,527 +0,0 @@ -""" -An implementation of `urlparse` that provides URL validation and normalization -as described by RFC3986. - -We rely on this implementation rather than the one in Python's stdlib, because: - -* It provides more complete URL validation. -* It properly differentiates between an empty querystring and an absent querystring, - to distinguish URLs with a trailing '?'. -* It handles scheme, hostname, port, and path normalization. -* It supports IDNA hostnames, normalizing them to their encoded form. -* The API supports passing individual components, as well as the complete URL string. - -Previously we relied on the excellent `rfc3986` package to handle URL parsing and -validation, but this module provides a simpler alternative, with less indirection -required. -""" - -from __future__ import annotations - -import ipaddress -import re -import typing - -import idna - -from ._exceptions import InvalidURL - -MAX_URL_LENGTH = 65536 - -# https://datatracker.ietf.org/doc/html/rfc3986.html#section-2.3 -UNRESERVED_CHARACTERS = ( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~" -) -SUB_DELIMS = "!$&'()*+,;=" - -PERCENT_ENCODED_REGEX = re.compile("%[A-Fa-f0-9]{2}") - -# https://url.spec.whatwg.org/#percent-encoded-bytes - -# The fragment percent-encode set is the C0 control percent-encode set -# and U+0020 SPACE, U+0022 ("), U+003C (<), U+003E (>), and U+0060 (`). -FRAG_SAFE = "".join( - [chr(i) for i in range(0x20, 0x7F) if i not in (0x20, 0x22, 0x3C, 0x3E, 0x60)] -) - -# The query percent-encode set is the C0 control percent-encode set -# and U+0020 SPACE, U+0022 ("), U+0023 (#), U+003C (<), and U+003E (>). -QUERY_SAFE = "".join( - [chr(i) for i in range(0x20, 0x7F) if i not in (0x20, 0x22, 0x23, 0x3C, 0x3E)] -) - -# The path percent-encode set is the query percent-encode set -# and U+003F (?), U+0060 (`), U+007B ({), and U+007D (}). -PATH_SAFE = "".join( - [ - chr(i) - for i in range(0x20, 0x7F) - if i not in (0x20, 0x22, 0x23, 0x3C, 0x3E) + (0x3F, 0x60, 0x7B, 0x7D) - ] -) - -# The userinfo percent-encode set is the path percent-encode set -# and U+002F (/), U+003A (:), U+003B (;), U+003D (=), U+0040 (@), -# U+005B ([) to U+005E (^), inclusive, and U+007C (|). -USERNAME_SAFE = "".join( - [ - chr(i) - for i in range(0x20, 0x7F) - if i - not in (0x20, 0x22, 0x23, 0x3C, 0x3E) - + (0x3F, 0x60, 0x7B, 0x7D) - + (0x2F, 0x3A, 0x3B, 0x3D, 0x40, 0x5B, 0x5C, 0x5D, 0x5E, 0x7C) - ] -) -PASSWORD_SAFE = "".join( - [ - chr(i) - for i in range(0x20, 0x7F) - if i - not in (0x20, 0x22, 0x23, 0x3C, 0x3E) - + (0x3F, 0x60, 0x7B, 0x7D) - + (0x2F, 0x3A, 0x3B, 0x3D, 0x40, 0x5B, 0x5C, 0x5D, 0x5E, 0x7C) - ] -) -# Note... The terminology 'userinfo' percent-encode set in the WHATWG document -# is used for the username and password quoting. For the joint userinfo component -# we remove U+003A (:) from the safe set. -USERINFO_SAFE = "".join( - [ - chr(i) - for i in range(0x20, 0x7F) - if i - not in (0x20, 0x22, 0x23, 0x3C, 0x3E) - + (0x3F, 0x60, 0x7B, 0x7D) - + (0x2F, 0x3B, 0x3D, 0x40, 0x5B, 0x5C, 0x5D, 0x5E, 0x7C) - ] -) - - -# {scheme}: (optional) -# //{authority} (optional) -# {path} -# ?{query} (optional) -# #{fragment} (optional) -URL_REGEX = re.compile( - ( - r"(?:(?P{scheme}):)?" - r"(?://(?P{authority}))?" - r"(?P{path})" - r"(?:\?(?P{query}))?" - r"(?:#(?P{fragment}))?" - ).format( - scheme="([a-zA-Z][a-zA-Z0-9+.-]*)?", - authority="[^/?#]*", - path="[^?#]*", - query="[^#]*", - fragment=".*", - ) -) - -# {userinfo}@ (optional) -# {host} -# :{port} (optional) -AUTHORITY_REGEX = re.compile( - ( - r"(?:(?P{userinfo})@)?" r"(?P{host})" r":?(?P{port})?" - ).format( - userinfo=".*", # Any character sequence. - host="(\\[.*\\]|[^:@]*)", # Either any character sequence excluding ':' or '@', - # or an IPv6 address enclosed within square brackets. - port=".*", # Any character sequence. - ) -) - - -# If we call urlparse with an individual component, then we need to regex -# validate that component individually. -# Note that we're duplicating the same strings as above. Shock! Horror!! -COMPONENT_REGEX = { - "scheme": re.compile("([a-zA-Z][a-zA-Z0-9+.-]*)?"), - "authority": re.compile("[^/?#]*"), - "path": re.compile("[^?#]*"), - "query": re.compile("[^#]*"), - "fragment": re.compile(".*"), - "userinfo": re.compile("[^@]*"), - "host": re.compile("(\\[.*\\]|[^:]*)"), - "port": re.compile(".*"), -} - - -# We use these simple regexs as a first pass before handing off to -# the stdlib 'ipaddress' module for IP address validation. -IPv4_STYLE_HOSTNAME = re.compile(r"^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$") -IPv6_STYLE_HOSTNAME = re.compile(r"^\[.*\]$") - - -class ParseResult(typing.NamedTuple): - scheme: str - userinfo: str - host: str - port: int | None - path: str - query: str | None - fragment: str | None - - @property - def authority(self) -> str: - return "".join( - [ - f"{self.userinfo}@" if self.userinfo else "", - f"[{self.host}]" if ":" in self.host else self.host, - f":{self.port}" if self.port is not None else "", - ] - ) - - @property - def netloc(self) -> str: - return "".join( - [ - f"[{self.host}]" if ":" in self.host else self.host, - f":{self.port}" if self.port is not None else "", - ] - ) - - def copy_with(self, **kwargs: str | None) -> ParseResult: - if not kwargs: - return self - - defaults = { - "scheme": self.scheme, - "authority": self.authority, - "path": self.path, - "query": self.query, - "fragment": self.fragment, - } - defaults.update(kwargs) - return urlparse("", **defaults) - - def __str__(self) -> str: - authority = self.authority - return "".join( - [ - f"{self.scheme}:" if self.scheme else "", - f"//{authority}" if authority else "", - self.path, - f"?{self.query}" if self.query is not None else "", - f"#{self.fragment}" if self.fragment is not None else "", - ] - ) - - -def urlparse(url: str = "", **kwargs: str | None) -> ParseResult: - # Initial basic checks on allowable URLs. - # --------------------------------------- - - # Hard limit the maximum allowable URL length. - if len(url) > MAX_URL_LENGTH: - raise InvalidURL("URL too long") - - # If a URL includes any ASCII control characters including \t, \r, \n, - # then treat it as invalid. - if any(char.isascii() and not char.isprintable() for char in url): - char = next(char for char in url if char.isascii() and not char.isprintable()) - idx = url.find(char) - error = ( - f"Invalid non-printable ASCII character in URL, {char!r} at position {idx}." - ) - raise InvalidURL(error) - - # Some keyword arguments require special handling. - # ------------------------------------------------ - - # Coerce "port" to a string, if it is provided as an integer. - if "port" in kwargs: - port = kwargs["port"] - kwargs["port"] = str(port) if isinstance(port, int) else port - - # Replace "netloc" with "host and "port". - if "netloc" in kwargs: - netloc = kwargs.pop("netloc") or "" - kwargs["host"], _, kwargs["port"] = netloc.partition(":") - - # Replace "username" and/or "password" with "userinfo". - if "username" in kwargs or "password" in kwargs: - username = quote(kwargs.pop("username", "") or "", safe=USERNAME_SAFE) - password = quote(kwargs.pop("password", "") or "", safe=PASSWORD_SAFE) - kwargs["userinfo"] = f"{username}:{password}" if password else username - - # Replace "raw_path" with "path" and "query". - if "raw_path" in kwargs: - raw_path = kwargs.pop("raw_path") or "" - kwargs["path"], seperator, kwargs["query"] = raw_path.partition("?") - if not seperator: - kwargs["query"] = None - - # Ensure that IPv6 "host" addresses are always escaped with "[...]". - if "host" in kwargs: - host = kwargs.get("host") or "" - if ":" in host and not (host.startswith("[") and host.endswith("]")): - kwargs["host"] = f"[{host}]" - - # If any keyword arguments are provided, ensure they are valid. - # ------------------------------------------------------------- - - for key, value in kwargs.items(): - if value is not None: - if len(value) > MAX_URL_LENGTH: - raise InvalidURL(f"URL component '{key}' too long") - - # If a component includes any ASCII control characters including \t, \r, \n, - # then treat it as invalid. - if any(char.isascii() and not char.isprintable() for char in value): - char = next( - char for char in value if char.isascii() and not char.isprintable() - ) - idx = value.find(char) - error = ( - f"Invalid non-printable ASCII character in URL {key} component, " - f"{char!r} at position {idx}." - ) - raise InvalidURL(error) - - # Ensure that keyword arguments match as a valid regex. - if not COMPONENT_REGEX[key].fullmatch(value): - raise InvalidURL(f"Invalid URL component '{key}'") - - # The URL_REGEX will always match, but may have empty components. - url_match = URL_REGEX.match(url) - assert url_match is not None - url_dict = url_match.groupdict() - - # * 'scheme', 'authority', and 'path' may be empty strings. - # * 'query' may be 'None', indicating no trailing "?" portion. - # Any string including the empty string, indicates a trailing "?". - # * 'fragment' may be 'None', indicating no trailing "#" portion. - # Any string including the empty string, indicates a trailing "#". - scheme = kwargs.get("scheme", url_dict["scheme"]) or "" - authority = kwargs.get("authority", url_dict["authority"]) or "" - path = kwargs.get("path", url_dict["path"]) or "" - query = kwargs.get("query", url_dict["query"]) - frag = kwargs.get("fragment", url_dict["fragment"]) - - # The AUTHORITY_REGEX will always match, but may have empty components. - authority_match = AUTHORITY_REGEX.match(authority) - assert authority_match is not None - authority_dict = authority_match.groupdict() - - # * 'userinfo' and 'host' may be empty strings. - # * 'port' may be 'None'. - userinfo = kwargs.get("userinfo", authority_dict["userinfo"]) or "" - host = kwargs.get("host", authority_dict["host"]) or "" - port = kwargs.get("port", authority_dict["port"]) - - # Normalize and validate each component. - # We end up with a parsed representation of the URL, - # with components that are plain ASCII bytestrings. - parsed_scheme: str = scheme.lower() - parsed_userinfo: str = quote(userinfo, safe=USERINFO_SAFE) - parsed_host: str = encode_host(host) - parsed_port: int | None = normalize_port(port, scheme) - - has_scheme = parsed_scheme != "" - has_authority = ( - parsed_userinfo != "" or parsed_host != "" or parsed_port is not None - ) - validate_path(path, has_scheme=has_scheme, has_authority=has_authority) - if has_scheme or has_authority: - path = normalize_path(path) - - parsed_path: str = quote(path, safe=PATH_SAFE) - parsed_query: str | None = None if query is None else quote(query, safe=QUERY_SAFE) - parsed_frag: str | None = None if frag is None else quote(frag, safe=FRAG_SAFE) - - # The parsed ASCII bytestrings are our canonical form. - # All properties of the URL are derived from these. - return ParseResult( - parsed_scheme, - parsed_userinfo, - parsed_host, - parsed_port, - parsed_path, - parsed_query, - parsed_frag, - ) - - -def encode_host(host: str) -> str: - if not host: - return "" - - elif IPv4_STYLE_HOSTNAME.match(host): - # Validate IPv4 hostnames like #.#.#.# - # - # From https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.2 - # - # IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet - try: - ipaddress.IPv4Address(host) - except ipaddress.AddressValueError: - raise InvalidURL(f"Invalid IPv4 address: {host!r}") - return host - - elif IPv6_STYLE_HOSTNAME.match(host): - # Validate IPv6 hostnames like [...] - # - # From https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.2 - # - # "A host identified by an Internet Protocol literal address, version 6 - # [RFC3513] or later, is distinguished by enclosing the IP literal - # within square brackets ("[" and "]"). This is the only place where - # square bracket characters are allowed in the URI syntax." - try: - ipaddress.IPv6Address(host[1:-1]) - except ipaddress.AddressValueError: - raise InvalidURL(f"Invalid IPv6 address: {host!r}") - return host[1:-1] - - elif host.isascii(): - # Regular ASCII hostnames - # - # From https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.2 - # - # reg-name = *( unreserved / pct-encoded / sub-delims ) - WHATWG_SAFE = '"`{}%|\\' - return quote(host.lower(), safe=SUB_DELIMS + WHATWG_SAFE) - - # IDNA hostnames - try: - return idna.encode(host.lower()).decode("ascii") - except idna.IDNAError: - raise InvalidURL(f"Invalid IDNA hostname: {host!r}") - - -def normalize_port(port: str | int | None, scheme: str) -> int | None: - # From https://tools.ietf.org/html/rfc3986#section-3.2.3 - # - # "A scheme may define a default port. For example, the "http" scheme - # defines a default port of "80", corresponding to its reserved TCP - # port number. The type of port designated by the port number (e.g., - # TCP, UDP, SCTP) is defined by the URI scheme. URI producers and - # normalizers should omit the port component and its ":" delimiter if - # port is empty or if its value would be the same as that of the - # scheme's default." - if port is None or port == "": - return None - - try: - port_as_int = int(port) - except ValueError: - raise InvalidURL(f"Invalid port: {port!r}") - - # See https://url.spec.whatwg.org/#url-miscellaneous - default_port = {"ftp": 21, "http": 80, "https": 443, "ws": 80, "wss": 443}.get( - scheme - ) - if port_as_int == default_port: - return None - return port_as_int - - -def validate_path(path: str, has_scheme: bool, has_authority: bool) -> None: - """ - Path validation rules that depend on if the URL contains - a scheme or authority component. - - See https://datatracker.ietf.org/doc/html/rfc3986.html#section-3.3 - """ - if has_authority: - # If a URI contains an authority component, then the path component - # must either be empty or begin with a slash ("/") character." - if path and not path.startswith("/"): - raise InvalidURL("For absolute URLs, path must be empty or begin with '/'") - - if not has_scheme and not has_authority: - # If a URI does not contain an authority component, then the path cannot begin - # with two slash characters ("//"). - if path.startswith("//"): - raise InvalidURL("Relative URLs cannot have a path starting with '//'") - - # In addition, a URI reference (Section 4.1) may be a relative-path reference, - # in which case the first path segment cannot contain a colon (":") character. - if path.startswith(":"): - raise InvalidURL("Relative URLs cannot have a path starting with ':'") - - -def normalize_path(path: str) -> str: - """ - Drop "." and ".." segments from a URL path. - - For example: - - normalize_path("/path/./to/somewhere/..") == "/path/to" - """ - # Fast return when no '.' characters in the path. - if "." not in path: - return path - - components = path.split("/") - - # Fast return when no '.' or '..' components in the path. - if "." not in components and ".." not in components: - return path - - # https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4 - output: list[str] = [] - for component in components: - if component == ".": - pass - elif component == "..": - if output and output != [""]: - output.pop() - else: - output.append(component) - return "/".join(output) - - -def PERCENT(string: str) -> str: - return "".join([f"%{byte:02X}" for byte in string.encode("utf-8")]) - - -def percent_encoded(string: str, safe: str) -> str: - """ - Use percent-encoding to quote a string. - """ - NON_ESCAPED_CHARS = UNRESERVED_CHARACTERS + safe - - # Fast path for strings that don't need escaping. - if not string.rstrip(NON_ESCAPED_CHARS): - return string - - return "".join( - [char if char in NON_ESCAPED_CHARS else PERCENT(char) for char in string] - ) - - -def quote(string: str, safe: str) -> str: - """ - Use percent-encoding to quote a string, omitting existing '%xx' escape sequences. - - See: https://www.rfc-editor.org/rfc/rfc3986#section-2.1 - - * `string`: The string to be percent-escaped. - * `safe`: A string containing characters that may be treated as safe, and do not - need to be escaped. Unreserved characters are always treated as safe. - See: https://www.rfc-editor.org/rfc/rfc3986#section-2.3 - """ - parts = [] - current_position = 0 - for match in re.finditer(PERCENT_ENCODED_REGEX, string): - start_position, end_position = match.start(), match.end() - matched_text = match.group(0) - # Add any text up to the '%xx' escape sequence. - if start_position != current_position: - leading_text = string[current_position:start_position] - parts.append(percent_encoded(leading_text, safe=safe)) - - # Add the '%xx' escape sequence. - parts.append(matched_text) - current_position = end_position - - # Add any text after the final '%xx' escape sequence. - if current_position != len(string): - trailing_text = string[current_position:] - parts.append(percent_encoded(trailing_text, safe=safe)) - - return "".join(parts) diff --git a/venv/lib/python3.11/site-packages/httpx/_urls.py b/venv/lib/python3.11/site-packages/httpx/_urls.py deleted file mode 100755 index 147a8fa..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_urls.py +++ /dev/null @@ -1,641 +0,0 @@ -from __future__ import annotations - -import typing -from urllib.parse import parse_qs, unquote, urlencode - -import idna - -from ._types import QueryParamTypes -from ._urlparse import urlparse -from ._utils import primitive_value_to_str - -__all__ = ["URL", "QueryParams"] - - -class URL: - """ - url = httpx.URL("HTTPS://jo%40email.com:a%20secret@müller.de:1234/pa%20th?search=ab#anchorlink") - - assert url.scheme == "https" - assert url.username == "jo@email.com" - assert url.password == "a secret" - assert url.userinfo == b"jo%40email.com:a%20secret" - assert url.host == "müller.de" - assert url.raw_host == b"xn--mller-kva.de" - assert url.port == 1234 - assert url.netloc == b"xn--mller-kva.de:1234" - assert url.path == "/pa th" - assert url.query == b"?search=ab" - assert url.raw_path == b"/pa%20th?search=ab" - assert url.fragment == "anchorlink" - - The components of a URL are broken down like this: - - https://jo%40email.com:a%20secret@müller.de:1234/pa%20th?search=ab#anchorlink - [scheme] [ username ] [password] [ host ][port][ path ] [ query ] [fragment] - [ userinfo ] [ netloc ][ raw_path ] - - Note that: - - * `url.scheme` is normalized to always be lowercased. - - * `url.host` is normalized to always be lowercased. Internationalized domain - names are represented in unicode, without IDNA encoding applied. For instance: - - url = httpx.URL("http://中国.icom.museum") - assert url.host == "中国.icom.museum" - url = httpx.URL("http://xn--fiqs8s.icom.museum") - assert url.host == "中国.icom.museum" - - * `url.raw_host` is normalized to always be lowercased, and is IDNA encoded. - - url = httpx.URL("http://中国.icom.museum") - assert url.raw_host == b"xn--fiqs8s.icom.museum" - url = httpx.URL("http://xn--fiqs8s.icom.museum") - assert url.raw_host == b"xn--fiqs8s.icom.museum" - - * `url.port` is either None or an integer. URLs that include the default port for - "http", "https", "ws", "wss", and "ftp" schemes have their port - normalized to `None`. - - assert httpx.URL("http://example.com") == httpx.URL("http://example.com:80") - assert httpx.URL("http://example.com").port is None - assert httpx.URL("http://example.com:80").port is None - - * `url.userinfo` is raw bytes, without URL escaping. Usually you'll want to work - with `url.username` and `url.password` instead, which handle the URL escaping. - - * `url.raw_path` is raw bytes of both the path and query, without URL escaping. - This portion is used as the target when constructing HTTP requests. Usually you'll - want to work with `url.path` instead. - - * `url.query` is raw bytes, without URL escaping. A URL query string portion can - only be properly URL escaped when decoding the parameter names and values - themselves. - """ - - def __init__(self, url: URL | str = "", **kwargs: typing.Any) -> None: - if kwargs: - allowed = { - "scheme": str, - "username": str, - "password": str, - "userinfo": bytes, - "host": str, - "port": int, - "netloc": bytes, - "path": str, - "query": bytes, - "raw_path": bytes, - "fragment": str, - "params": object, - } - - # Perform type checking for all supported keyword arguments. - for key, value in kwargs.items(): - if key not in allowed: - message = f"{key!r} is an invalid keyword argument for URL()" - raise TypeError(message) - if value is not None and not isinstance(value, allowed[key]): - expected = allowed[key].__name__ - seen = type(value).__name__ - message = f"Argument {key!r} must be {expected} but got {seen}" - raise TypeError(message) - if isinstance(value, bytes): - kwargs[key] = value.decode("ascii") - - if "params" in kwargs: - # Replace any "params" keyword with the raw "query" instead. - # - # Ensure that empty params use `kwargs["query"] = None` rather - # than `kwargs["query"] = ""`, so that generated URLs do not - # include an empty trailing "?". - params = kwargs.pop("params") - kwargs["query"] = None if not params else str(QueryParams(params)) - - if isinstance(url, str): - self._uri_reference = urlparse(url, **kwargs) - elif isinstance(url, URL): - self._uri_reference = url._uri_reference.copy_with(**kwargs) - else: - raise TypeError( - "Invalid type for url. Expected str or httpx.URL," - f" got {type(url)}: {url!r}" - ) - - @property - def scheme(self) -> str: - """ - The URL scheme, such as "http", "https". - Always normalised to lowercase. - """ - return self._uri_reference.scheme - - @property - def raw_scheme(self) -> bytes: - """ - The raw bytes representation of the URL scheme, such as b"http", b"https". - Always normalised to lowercase. - """ - return self._uri_reference.scheme.encode("ascii") - - @property - def userinfo(self) -> bytes: - """ - The URL userinfo as a raw bytestring. - For example: b"jo%40email.com:a%20secret". - """ - return self._uri_reference.userinfo.encode("ascii") - - @property - def username(self) -> str: - """ - The URL username as a string, with URL decoding applied. - For example: "jo@email.com" - """ - userinfo = self._uri_reference.userinfo - return unquote(userinfo.partition(":")[0]) - - @property - def password(self) -> str: - """ - The URL password as a string, with URL decoding applied. - For example: "a secret" - """ - userinfo = self._uri_reference.userinfo - return unquote(userinfo.partition(":")[2]) - - @property - def host(self) -> str: - """ - The URL host as a string. - Always normalized to lowercase, with IDNA hosts decoded into unicode. - - Examples: - - url = httpx.URL("http://www.EXAMPLE.org") - assert url.host == "www.example.org" - - url = httpx.URL("http://中国.icom.museum") - assert url.host == "中国.icom.museum" - - url = httpx.URL("http://xn--fiqs8s.icom.museum") - assert url.host == "中国.icom.museum" - - url = httpx.URL("https://[::ffff:192.168.0.1]") - assert url.host == "::ffff:192.168.0.1" - """ - host: str = self._uri_reference.host - - if host.startswith("xn--"): - host = idna.decode(host) - - return host - - @property - def raw_host(self) -> bytes: - """ - The raw bytes representation of the URL host. - Always normalized to lowercase, and IDNA encoded. - - Examples: - - url = httpx.URL("http://www.EXAMPLE.org") - assert url.raw_host == b"www.example.org" - - url = httpx.URL("http://中国.icom.museum") - assert url.raw_host == b"xn--fiqs8s.icom.museum" - - url = httpx.URL("http://xn--fiqs8s.icom.museum") - assert url.raw_host == b"xn--fiqs8s.icom.museum" - - url = httpx.URL("https://[::ffff:192.168.0.1]") - assert url.raw_host == b"::ffff:192.168.0.1" - """ - return self._uri_reference.host.encode("ascii") - - @property - def port(self) -> int | None: - """ - The URL port as an integer. - - Note that the URL class performs port normalization as per the WHATWG spec. - Default ports for "http", "https", "ws", "wss", and "ftp" schemes are always - treated as `None`. - - For example: - - assert httpx.URL("http://www.example.com") == httpx.URL("http://www.example.com:80") - assert httpx.URL("http://www.example.com:80").port is None - """ - return self._uri_reference.port - - @property - def netloc(self) -> bytes: - """ - Either `` or `:` as bytes. - Always normalized to lowercase, and IDNA encoded. - - This property may be used for generating the value of a request - "Host" header. - """ - return self._uri_reference.netloc.encode("ascii") - - @property - def path(self) -> str: - """ - The URL path as a string. Excluding the query string, and URL decoded. - - For example: - - url = httpx.URL("https://example.com/pa%20th") - assert url.path == "/pa th" - """ - path = self._uri_reference.path or "/" - return unquote(path) - - @property - def query(self) -> bytes: - """ - The URL query string, as raw bytes, excluding the leading b"?". - - This is necessarily a bytewise interface, because we cannot - perform URL decoding of this representation until we've parsed - the keys and values into a QueryParams instance. - - For example: - - url = httpx.URL("https://example.com/?filter=some%20search%20terms") - assert url.query == b"filter=some%20search%20terms" - """ - query = self._uri_reference.query or "" - return query.encode("ascii") - - @property - def params(self) -> QueryParams: - """ - The URL query parameters, neatly parsed and packaged into an immutable - multidict representation. - """ - return QueryParams(self._uri_reference.query) - - @property - def raw_path(self) -> bytes: - """ - The complete URL path and query string as raw bytes. - Used as the target when constructing HTTP requests. - - For example: - - GET /users?search=some%20text HTTP/1.1 - Host: www.example.org - Connection: close - """ - path = self._uri_reference.path or "/" - if self._uri_reference.query is not None: - path += "?" + self._uri_reference.query - return path.encode("ascii") - - @property - def fragment(self) -> str: - """ - The URL fragments, as used in HTML anchors. - As a string, without the leading '#'. - """ - return unquote(self._uri_reference.fragment or "") - - @property - def is_absolute_url(self) -> bool: - """ - Return `True` for absolute URLs such as 'http://example.com/path', - and `False` for relative URLs such as '/path'. - """ - # We don't use `.is_absolute` from `rfc3986` because it treats - # URLs with a fragment portion as not absolute. - # What we actually care about is if the URL provides - # a scheme and hostname to which connections should be made. - return bool(self._uri_reference.scheme and self._uri_reference.host) - - @property - def is_relative_url(self) -> bool: - """ - Return `False` for absolute URLs such as 'http://example.com/path', - and `True` for relative URLs such as '/path'. - """ - return not self.is_absolute_url - - def copy_with(self, **kwargs: typing.Any) -> URL: - """ - Copy this URL, returning a new URL with some components altered. - Accepts the same set of parameters as the components that are made - available via properties on the `URL` class. - - For example: - - url = httpx.URL("https://www.example.com").copy_with( - username="jo@gmail.com", password="a secret" - ) - assert url == "https://jo%40email.com:a%20secret@www.example.com" - """ - return URL(self, **kwargs) - - def copy_set_param(self, key: str, value: typing.Any = None) -> URL: - return self.copy_with(params=self.params.set(key, value)) - - def copy_add_param(self, key: str, value: typing.Any = None) -> URL: - return self.copy_with(params=self.params.add(key, value)) - - def copy_remove_param(self, key: str) -> URL: - return self.copy_with(params=self.params.remove(key)) - - def copy_merge_params(self, params: QueryParamTypes) -> URL: - return self.copy_with(params=self.params.merge(params)) - - def join(self, url: URL | str) -> URL: - """ - Return an absolute URL, using this URL as the base. - - Eg. - - url = httpx.URL("https://www.example.com/test") - url = url.join("/new/path") - assert url == "https://www.example.com/new/path" - """ - from urllib.parse import urljoin - - return URL(urljoin(str(self), str(URL(url)))) - - def __hash__(self) -> int: - return hash(str(self)) - - def __eq__(self, other: typing.Any) -> bool: - return isinstance(other, (URL, str)) and str(self) == str(URL(other)) - - def __str__(self) -> str: - return str(self._uri_reference) - - def __repr__(self) -> str: - scheme, userinfo, host, port, path, query, fragment = self._uri_reference - - if ":" in userinfo: - # Mask any password component. - userinfo = f'{userinfo.split(":")[0]}:[secure]' - - authority = "".join( - [ - f"{userinfo}@" if userinfo else "", - f"[{host}]" if ":" in host else host, - f":{port}" if port is not None else "", - ] - ) - url = "".join( - [ - f"{self.scheme}:" if scheme else "", - f"//{authority}" if authority else "", - path, - f"?{query}" if query is not None else "", - f"#{fragment}" if fragment is not None else "", - ] - ) - - return f"{self.__class__.__name__}({url!r})" - - @property - def raw(self) -> tuple[bytes, bytes, int, bytes]: # pragma: nocover - import collections - import warnings - - warnings.warn("URL.raw is deprecated.") - RawURL = collections.namedtuple( - "RawURL", ["raw_scheme", "raw_host", "port", "raw_path"] - ) - return RawURL( - raw_scheme=self.raw_scheme, - raw_host=self.raw_host, - port=self.port, - raw_path=self.raw_path, - ) - - -class QueryParams(typing.Mapping[str, str]): - """ - URL query parameters, as a multi-dict. - """ - - def __init__(self, *args: QueryParamTypes | None, **kwargs: typing.Any) -> None: - assert len(args) < 2, "Too many arguments." - assert not (args and kwargs), "Cannot mix named and unnamed arguments." - - value = args[0] if args else kwargs - - if value is None or isinstance(value, (str, bytes)): - value = value.decode("ascii") if isinstance(value, bytes) else value - self._dict = parse_qs(value, keep_blank_values=True) - elif isinstance(value, QueryParams): - self._dict = {k: list(v) for k, v in value._dict.items()} - else: - dict_value: dict[typing.Any, list[typing.Any]] = {} - if isinstance(value, (list, tuple)): - # Convert list inputs like: - # [("a", "123"), ("a", "456"), ("b", "789")] - # To a dict representation, like: - # {"a": ["123", "456"], "b": ["789"]} - for item in value: - dict_value.setdefault(item[0], []).append(item[1]) - else: - # Convert dict inputs like: - # {"a": "123", "b": ["456", "789"]} - # To dict inputs where values are always lists, like: - # {"a": ["123"], "b": ["456", "789"]} - dict_value = { - k: list(v) if isinstance(v, (list, tuple)) else [v] - for k, v in value.items() - } - - # Ensure that keys and values are neatly coerced to strings. - # We coerce values `True` and `False` to JSON-like "true" and "false" - # representations, and coerce `None` values to the empty string. - self._dict = { - str(k): [primitive_value_to_str(item) for item in v] - for k, v in dict_value.items() - } - - def keys(self) -> typing.KeysView[str]: - """ - Return all the keys in the query params. - - Usage: - - q = httpx.QueryParams("a=123&a=456&b=789") - assert list(q.keys()) == ["a", "b"] - """ - return self._dict.keys() - - def values(self) -> typing.ValuesView[str]: - """ - Return all the values in the query params. If a key occurs more than once - only the first item for that key is returned. - - Usage: - - q = httpx.QueryParams("a=123&a=456&b=789") - assert list(q.values()) == ["123", "789"] - """ - return {k: v[0] for k, v in self._dict.items()}.values() - - def items(self) -> typing.ItemsView[str, str]: - """ - Return all items in the query params. If a key occurs more than once - only the first item for that key is returned. - - Usage: - - q = httpx.QueryParams("a=123&a=456&b=789") - assert list(q.items()) == [("a", "123"), ("b", "789")] - """ - return {k: v[0] for k, v in self._dict.items()}.items() - - def multi_items(self) -> list[tuple[str, str]]: - """ - Return all items in the query params. Allow duplicate keys to occur. - - Usage: - - q = httpx.QueryParams("a=123&a=456&b=789") - assert list(q.multi_items()) == [("a", "123"), ("a", "456"), ("b", "789")] - """ - multi_items: list[tuple[str, str]] = [] - for k, v in self._dict.items(): - multi_items.extend([(k, i) for i in v]) - return multi_items - - def get(self, key: typing.Any, default: typing.Any = None) -> typing.Any: - """ - Get a value from the query param for a given key. If the key occurs - more than once, then only the first value is returned. - - Usage: - - q = httpx.QueryParams("a=123&a=456&b=789") - assert q.get("a") == "123" - """ - if key in self._dict: - return self._dict[str(key)][0] - return default - - def get_list(self, key: str) -> list[str]: - """ - Get all values from the query param for a given key. - - Usage: - - q = httpx.QueryParams("a=123&a=456&b=789") - assert q.get_list("a") == ["123", "456"] - """ - return list(self._dict.get(str(key), [])) - - def set(self, key: str, value: typing.Any = None) -> QueryParams: - """ - Return a new QueryParams instance, setting the value of a key. - - Usage: - - q = httpx.QueryParams("a=123") - q = q.set("a", "456") - assert q == httpx.QueryParams("a=456") - """ - q = QueryParams() - q._dict = dict(self._dict) - q._dict[str(key)] = [primitive_value_to_str(value)] - return q - - def add(self, key: str, value: typing.Any = None) -> QueryParams: - """ - Return a new QueryParams instance, setting or appending the value of a key. - - Usage: - - q = httpx.QueryParams("a=123") - q = q.add("a", "456") - assert q == httpx.QueryParams("a=123&a=456") - """ - q = QueryParams() - q._dict = dict(self._dict) - q._dict[str(key)] = q.get_list(key) + [primitive_value_to_str(value)] - return q - - def remove(self, key: str) -> QueryParams: - """ - Return a new QueryParams instance, removing the value of a key. - - Usage: - - q = httpx.QueryParams("a=123") - q = q.remove("a") - assert q == httpx.QueryParams("") - """ - q = QueryParams() - q._dict = dict(self._dict) - q._dict.pop(str(key), None) - return q - - def merge(self, params: QueryParamTypes | None = None) -> QueryParams: - """ - Return a new QueryParams instance, updated with. - - Usage: - - q = httpx.QueryParams("a=123") - q = q.merge({"b": "456"}) - assert q == httpx.QueryParams("a=123&b=456") - - q = httpx.QueryParams("a=123") - q = q.merge({"a": "456", "b": "789"}) - assert q == httpx.QueryParams("a=456&b=789") - """ - q = QueryParams(params) - q._dict = {**self._dict, **q._dict} - return q - - def __getitem__(self, key: typing.Any) -> str: - return self._dict[key][0] - - def __contains__(self, key: typing.Any) -> bool: - return key in self._dict - - def __iter__(self) -> typing.Iterator[typing.Any]: - return iter(self.keys()) - - def __len__(self) -> int: - return len(self._dict) - - def __bool__(self) -> bool: - return bool(self._dict) - - def __hash__(self) -> int: - return hash(str(self)) - - def __eq__(self, other: typing.Any) -> bool: - if not isinstance(other, self.__class__): - return False - return sorted(self.multi_items()) == sorted(other.multi_items()) - - def __str__(self) -> str: - return urlencode(self.multi_items()) - - def __repr__(self) -> str: - class_name = self.__class__.__name__ - query_string = str(self) - return f"{class_name}({query_string!r})" - - def update(self, params: QueryParamTypes | None = None) -> None: - raise RuntimeError( - "QueryParams are immutable since 0.18.0. " - "Use `q = q.merge(...)` to create an updated copy." - ) - - def __setitem__(self, key: str, value: str) -> None: - raise RuntimeError( - "QueryParams are immutable since 0.18.0. " - "Use `q = q.set(key, value)` to create an updated copy." - ) diff --git a/venv/lib/python3.11/site-packages/httpx/_utils.py b/venv/lib/python3.11/site-packages/httpx/_utils.py deleted file mode 100755 index 7fe827d..0000000 --- a/venv/lib/python3.11/site-packages/httpx/_utils.py +++ /dev/null @@ -1,242 +0,0 @@ -from __future__ import annotations - -import ipaddress -import os -import re -import typing -from urllib.request import getproxies - -from ._types import PrimitiveData - -if typing.TYPE_CHECKING: # pragma: no cover - from ._urls import URL - - -def primitive_value_to_str(value: PrimitiveData) -> str: - """ - Coerce a primitive data type into a string value. - - Note that we prefer JSON-style 'true'/'false' for boolean values here. - """ - if value is True: - return "true" - elif value is False: - return "false" - elif value is None: - return "" - return str(value) - - -def get_environment_proxies() -> dict[str, str | None]: - """Gets proxy information from the environment""" - - # urllib.request.getproxies() falls back on System - # Registry and Config for proxies on Windows and macOS. - # We don't want to propagate non-HTTP proxies into - # our configuration such as 'TRAVIS_APT_PROXY'. - proxy_info = getproxies() - mounts: dict[str, str | None] = {} - - for scheme in ("http", "https", "all"): - if proxy_info.get(scheme): - hostname = proxy_info[scheme] - mounts[f"{scheme}://"] = ( - hostname if "://" in hostname else f"http://{hostname}" - ) - - no_proxy_hosts = [host.strip() for host in proxy_info.get("no", "").split(",")] - for hostname in no_proxy_hosts: - # See https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html for details - # on how names in `NO_PROXY` are handled. - if hostname == "*": - # If NO_PROXY=* is used or if "*" occurs as any one of the comma - # separated hostnames, then we should just bypass any information - # from HTTP_PROXY, HTTPS_PROXY, ALL_PROXY, and always ignore - # proxies. - return {} - elif hostname: - # NO_PROXY=.google.com is marked as "all://*.google.com, - # which disables "www.google.com" but not "google.com" - # NO_PROXY=google.com is marked as "all://*google.com, - # which disables "www.google.com" and "google.com". - # (But not "wwwgoogle.com") - # NO_PROXY can include domains, IPv6, IPv4 addresses and "localhost" - # NO_PROXY=example.com,::1,localhost,192.168.0.0/16 - if "://" in hostname: - mounts[hostname] = None - elif is_ipv4_hostname(hostname): - mounts[f"all://{hostname}"] = None - elif is_ipv6_hostname(hostname): - mounts[f"all://[{hostname}]"] = None - elif hostname.lower() == "localhost": - mounts[f"all://{hostname}"] = None - else: - mounts[f"all://*{hostname}"] = None - - return mounts - - -def to_bytes(value: str | bytes, encoding: str = "utf-8") -> bytes: - return value.encode(encoding) if isinstance(value, str) else value - - -def to_str(value: str | bytes, encoding: str = "utf-8") -> str: - return value if isinstance(value, str) else value.decode(encoding) - - -def to_bytes_or_str(value: str, match_type_of: typing.AnyStr) -> typing.AnyStr: - return value if isinstance(match_type_of, str) else value.encode() - - -def unquote(value: str) -> str: - return value[1:-1] if value[0] == value[-1] == '"' else value - - -def peek_filelike_length(stream: typing.Any) -> int | None: - """ - Given a file-like stream object, return its length in number of bytes - without reading it into memory. - """ - try: - # Is it an actual file? - fd = stream.fileno() - # Yup, seems to be an actual file. - length = os.fstat(fd).st_size - except (AttributeError, OSError): - # No... Maybe it's something that supports random access, like `io.BytesIO`? - try: - # Assuming so, go to end of stream to figure out its length, - # then put it back in place. - offset = stream.tell() - length = stream.seek(0, os.SEEK_END) - stream.seek(offset) - except (AttributeError, OSError): - # Not even that? Sorry, we're doomed... - return None - - return length - - -class URLPattern: - """ - A utility class currently used for making lookups against proxy keys... - - # Wildcard matching... - >>> pattern = URLPattern("all://") - >>> pattern.matches(httpx.URL("http://example.com")) - True - - # Witch scheme matching... - >>> pattern = URLPattern("https://") - >>> pattern.matches(httpx.URL("https://example.com")) - True - >>> pattern.matches(httpx.URL("http://example.com")) - False - - # With domain matching... - >>> pattern = URLPattern("https://example.com") - >>> pattern.matches(httpx.URL("https://example.com")) - True - >>> pattern.matches(httpx.URL("http://example.com")) - False - >>> pattern.matches(httpx.URL("https://other.com")) - False - - # Wildcard scheme, with domain matching... - >>> pattern = URLPattern("all://example.com") - >>> pattern.matches(httpx.URL("https://example.com")) - True - >>> pattern.matches(httpx.URL("http://example.com")) - True - >>> pattern.matches(httpx.URL("https://other.com")) - False - - # With port matching... - >>> pattern = URLPattern("https://example.com:1234") - >>> pattern.matches(httpx.URL("https://example.com:1234")) - True - >>> pattern.matches(httpx.URL("https://example.com")) - False - """ - - def __init__(self, pattern: str) -> None: - from ._urls import URL - - if pattern and ":" not in pattern: - raise ValueError( - f"Proxy keys should use proper URL forms rather " - f"than plain scheme strings. " - f'Instead of "{pattern}", use "{pattern}://"' - ) - - url = URL(pattern) - self.pattern = pattern - self.scheme = "" if url.scheme == "all" else url.scheme - self.host = "" if url.host == "*" else url.host - self.port = url.port - if not url.host or url.host == "*": - self.host_regex: typing.Pattern[str] | None = None - elif url.host.startswith("*."): - # *.example.com should match "www.example.com", but not "example.com" - domain = re.escape(url.host[2:]) - self.host_regex = re.compile(f"^.+\\.{domain}$") - elif url.host.startswith("*"): - # *example.com should match "www.example.com" and "example.com" - domain = re.escape(url.host[1:]) - self.host_regex = re.compile(f"^(.+\\.)?{domain}$") - else: - # example.com should match "example.com" but not "www.example.com" - domain = re.escape(url.host) - self.host_regex = re.compile(f"^{domain}$") - - def matches(self, other: URL) -> bool: - if self.scheme and self.scheme != other.scheme: - return False - if ( - self.host - and self.host_regex is not None - and not self.host_regex.match(other.host) - ): - return False - if self.port is not None and self.port != other.port: - return False - return True - - @property - def priority(self) -> tuple[int, int, int]: - """ - The priority allows URLPattern instances to be sortable, so that - we can match from most specific to least specific. - """ - # URLs with a port should take priority over URLs without a port. - port_priority = 0 if self.port is not None else 1 - # Longer hostnames should match first. - host_priority = -len(self.host) - # Longer schemes should match first. - scheme_priority = -len(self.scheme) - return (port_priority, host_priority, scheme_priority) - - def __hash__(self) -> int: - return hash(self.pattern) - - def __lt__(self, other: URLPattern) -> bool: - return self.priority < other.priority - - def __eq__(self, other: typing.Any) -> bool: - return isinstance(other, URLPattern) and self.pattern == other.pattern - - -def is_ipv4_hostname(hostname: str) -> bool: - try: - ipaddress.IPv4Address(hostname.split("/")[0]) - except Exception: - return False - return True - - -def is_ipv6_hostname(hostname: str) -> bool: - try: - ipaddress.IPv6Address(hostname.split("/")[0]) - except Exception: - return False - return True diff --git a/venv/lib/python3.11/site-packages/httpx/py.typed b/venv/lib/python3.11/site-packages/httpx/py.typed deleted file mode 100755 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/idna-3.19.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/idna-3.19.dist-info/INSTALLER deleted file mode 100755 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/idna-3.19.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/idna-3.19.dist-info/METADATA b/venv/lib/python3.11/site-packages/idna-3.19.dist-info/METADATA deleted file mode 100755 index 06dd41d..0000000 --- a/venv/lib/python3.11/site-packages/idna-3.19.dist-info/METADATA +++ /dev/null @@ -1,209 +0,0 @@ -Metadata-Version: 2.5 -Name: idna -Version: 3.19 -Summary: Internationalized Domain Names in Applications (IDNA) -Author-email: Kim Davies -Requires-Python: >=3.9 -Description-Content-Type: text/markdown -License-Expression: BSD-3-Clause -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: System Administrators -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: Internet :: Name Service (DNS) -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Utilities -License-File: LICENSE.md -Requires-Dist: ruff >= 0.16.0 ; extra == "all" -Requires-Dist: mypy >= 1.11.2 ; extra == "all" -Requires-Dist: ty >= 0.0.37 ; extra == "all" -Requires-Dist: pytest >= 8.3.2 ; extra == "all" -Requires-Dist: hypothesis >= 6.141.1 ; extra == "all" -Requires-Dist: coverage >= 7.10.0 ; extra == "all" -Project-URL: Changelog, https://github.com/kjd/idna/blob/master/HISTORY.md -Project-URL: Issue tracker, https://github.com/kjd/idna/issues -Project-URL: Source, https://github.com/kjd/idna -Provides-Extra: all -Import-Name: idna - -# Internationalized Domain Names in Applications (IDNA) - -Support for [Internationalized Domain Names in Applications -(IDNA)](https://tools.ietf.org/html/rfc5891) and [Unicode IDNA -Compatibility Processing](https://unicode.org/reports/tr46/). It -supersedes the standard library's `encodings.idna`, which only -implements the 2003 specification, offering broader script coverage and -limiting domains with known security vulnerabilities. - -## Usage - -Package may be installed from [PyPI](https://pypi.org/project/idna/) via -the typical methods (e.g. `python3 -m pip install idna`) - -For typical usage, the `encode` and `decode` functions will take a -domain name argument and perform a conversion to ASCII-compatible encoding -(known as A-labels), or to Unicode strings (known as U-labels) -respectively. - -```pycon ->>> import idna ->>> idna.encode('ドメイン.テスト') -b'xn--eckwd4c7c.xn--zckzah' ->>> print(idna.decode('xn--eckwd4c7c.xn--zckzah')) -ドメイン.テスト -``` - -Conversions can be applied at a per-label basis using the `ulabel` or -`alabel` functions for specialized use cases. - - -### Compatibility Mapping (UTS #46) - -This library provides support for [Unicode IDNA Compatibility -Processing](https://unicode.org/reports/tr46/) which normalizes input from -different potential ways a user may input a domain prior to performing the IDNA -conversion operations. This functionality, known as a -[mapping](https://tools.ietf.org/html/rfc5895), is considered by the -specification to be a local user-interface issue distinct from IDNA -conversion functionality. - -For example, "Königsgäßchen" is not a permissible label as capital letters -are not allowed. UTS #46 will convert this into lower case prior to applying -the IDNA conversion. - -```pycon ->>> import idna ->>> idna.encode('Königsgäßchen') -... -idna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed ->>> idna.encode('Königsgäßchen', uts46=True) -b'xn--knigsgchen-b4a3dun' ->>> idna.decode('xn--knigsgchen-b4a3dun') -'königsgäßchen' -``` - -When performing a decode operation for display purposes, `decode()` -accepts a `display=True` argument that leaves any `xn--` label that -fails to decode unchanged. This is useful for user interface display -where a domain is in use, the A-label form can be presented when it -is not a valid IDN. - - -## Exceptions - -All errors raised during conversion derive from the `idna.IDNAError` -base class. The more specific exceptions are: - -* `idna.IDNABidiError` — raised when a label contains an illegal - combination of left-to-right and right-to-left characters. -* `idna.InvalidCodepoint` — raised when a label contains a codepoint - that is INVALID for IDNA. -* `idna.InvalidCodepointContext` — raised when a CONTEXTO or CONTEXTJ - codepoint appears in a position whose contextual requirements are - not satisfied. - -Exceptions carry machine-readable attributes so that applications -do not need to parse the message: `code` is a short, stable identifier -for the rule that failed (listed below); and, when the failure can be -attributed to a particular character, `text` (the label, or domain for -UTS #46 processing, being validated), `codepoint` (the offending -codepoint as an integer) and `position` (its 1-based index within -`text`, as quoted in the message) are set. Each is `None` when it does -not apply. Message wording is not part of the API and may change. - -```pycon ->>> try: -... idna.encode('Königsgäßchen') -... except idna.IDNAError as err: -... print(err.code, err.codepoint, err.position, err.text) -disallowed_codepoint 75 1 Königsgäßchen -``` - -| `code` | Meaning | -|---|---| -| `input_too_long` | Input exceeds the library's defensive length limit and was not processed | -| `label_too_long` | A label exceeds 63 octets | -| `domain_too_long` | The domain exceeds 253 octets | -| `empty_label` | A label is empty (e.g. consecutive dots) | -| `empty_domain` | The domain is empty | -| `not_nfc` | The label is not in Unicode Normalization Form C | -| `hyphen_3_4` | The label has hyphens in the 3rd and 4th positions | -| `hyphen_start_end` | The label starts or ends with a hyphen | -| `leading_combiner` | The label starts with a combining mark | -| `disallowed_codepoint` | A codepoint is DISALLOWED or UNASSIGNED under IDNA 2008 | -| `contextj` | A CONTEXTJ codepoint (joiner) appears in an invalid context | -| `contexto` | A CONTEXTO codepoint appears in an invalid context | -| `unknown_codepoint` | A codepoint next to a joiner is unknown to this Python's Unicode database | -| `bidi_rule_1` … `bidi_rule_6` | The corresponding rule of RFC 5893 (the Bidi Rule) is violated | -| `bidi_unknown_direction` | A codepoint's directionality is unknown to this Python's Unicode database | -| `invalid_alabel` | An `xn--` label is malformed or is not valid Punycode | -| `non_canonical_alabel` | An `xn--` label is not the canonical Punycode encoding of its U-label (a "fake A-label") | -| `invalid_ascii` | Byte input is not ASCII | -| `invalid_utf8` | Byte input is not UTF-8 | -| `uts46_disallowed` | A codepoint is disallowed by the UTS #46 mapping table | -| `uts46_std3` | An ASCII character is rejected by the UTS #46 STD3 rules | -| `unsupported_errors` | The codec was given an `errors` handler other than `strict` | - - -## Command-line tool - -The package supports command-line usage to convert domain names -between their Unicode and ASCII-compatible forms. It can be run either -as a module (`python3 -m idna`) or, once installed (such as with `uv -tool` or `pipx`), via the `idna` script: - -```bash -$ uv tool install idna -$ idna xn--e1afmkfd.xn--p1ai -пример.рф -$ idna пример.рф -xn--e1afmkfd.xn--p1ai -``` - -Mode can be specified with `-e`/`--encode` or `-d`/`--decode`, otherwise -it will be chosen automatically based on the first input. Multiple -domains can be supplied either as arguments or through standard input. -UTS #46 mapping is applied by default, which lets the tool accept -inputs that aren't strictly valid IDNA 2008 by normalising them first, -pass `--strict` to disable UTS #46. - -Conversion failures are reported on stderr together with the -offending input; processing continues with the remaining domains and -the tool exits with a non-zero status if any conversion failed. - - -## Additional Notes - -* **Python version support**. This library supports Python 3.9 and higher. - As this library serves as a low-level toolkit for a variety of - applications, we strive to support all versions of Python that are - not beyond end-of-life. Free-threaded Python is also supported, - as the library holds no mutable global state the functions can be - called concurrently from multiple threads. - -* **Unicode version**. The IDNA and UTS #46 lookup tables are generated - from a specific Unicode release. Some Unicode data depends on the - running Python's `unicodedata` module, so on an older Python a - character new to Unicode may be rejected as unknown even if this - library knows about it. - -* **Emoji**. It is an occasional request to support emoji domains in - this library. Encoding of symbols like emoji is expressly prohibited by - the IDNA technical standard, and emoji domains are broadly phased - out across the domain industry due to associated security risks. - -* **Regenerating lookup tables**. The IDNA and UTS #46 functionality - relies upon pre-calculated lookup tables, generated using the - `idna-data` script in [`tools/`](tools/README.md). - diff --git a/venv/lib/python3.11/site-packages/idna-3.19.dist-info/RECORD b/venv/lib/python3.11/site-packages/idna-3.19.dist-info/RECORD deleted file mode 100755 index 59cc78b..0000000 --- a/venv/lib/python3.11/site-packages/idna-3.19.dist-info/RECORD +++ /dev/null @@ -1,28 +0,0 @@ -../../../bin/idna,sha256=izFcDwKO-vETDm3NmexDl0aEqMGd0nK_F5X4Jhm6gYE,177 -idna-3.19.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -idna-3.19.dist-info/METADATA,sha256=TRExYayoWC6NKP3fPqUPGbYHIJwrPkNkN5oWNFRoAIQ,9160 -idna-3.19.dist-info/RECORD,, -idna-3.19.dist-info/WHEEL,sha256=_yMHPaBV-s6fQMwUoo83NSdTCM3c8xXWFXRhqafN-7Y,81 -idna-3.19.dist-info/entry_points.txt,sha256=7H3nGOHap3jnLE5e7q7Ywr9Vq8axB7WIj5-C_4N2vhw,38 -idna-3.19.dist-info/licenses/LICENSE.md,sha256=GppPDj1HmickDd1ZqRN6ZqtKD539yMphiMwL_YUYfwQ,1541 -idna/__init__.py,sha256=hRTD7VMTajWW699RL6SHu919pama3K7YLgNj0sMG068,944 -idna/__main__.py,sha256=4JMK66Wj4uLZTKbF-sT3LAxOsr6buig77PmOkJCRRxw,83 -idna/__pycache__/__init__.cpython-311.pyc,, -idna/__pycache__/__main__.cpython-311.pyc,, -idna/__pycache__/cli.cpython-311.pyc,, -idna/__pycache__/codec.cpython-311.pyc,, -idna/__pycache__/compat.cpython-311.pyc,, -idna/__pycache__/core.cpython-311.pyc,, -idna/__pycache__/idnadata.cpython-311.pyc,, -idna/__pycache__/intranges.cpython-311.pyc,, -idna/__pycache__/package_data.cpython-311.pyc,, -idna/__pycache__/uts46data.cpython-311.pyc,, -idna/cli.py,sha256=LgGXKiXmev37pdgkATwB6AiJORZTnA2zP3LzfEK4iWo,4245 -idna/codec.py,sha256=ca5Iu563D2eLGV6m4pfQbxkAN4zsxQwr0bcFoSzzUmc,5302 -idna/compat.py,sha256=T_eZXOUt0b5Tga56cPybQu9CCYK0FTK1mdiPb96na8A,1376 -idna/core.py,sha256=2fLLPi-dqcSU_7HiflAUQdOVz5wSqoMhyWVv2puw2g0,32505 -idna/idnadata.py,sha256=Af-mo8WBmkhAK6TyXKOQH88OX0mQNDKtdL7UWtQpppk,44862 -idna/intranges.py,sha256=g49scLSkqJtAhLmOODa7hVHriSjmb60tiTsEoocJdBI,1851 -idna/package_data.py,sha256=M1-YMMD2mjma51RkdmgX7ovtlNPplEsobiYpsTITzRs,21 -idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -idna/uts46data.py,sha256=qNitv6h6T3KoqfnjhtjMg-79TIj402TEgm6rolhIFWc,234034 diff --git a/venv/lib/python3.11/site-packages/idna-3.19.dist-info/WHEEL b/venv/lib/python3.11/site-packages/idna-3.19.dist-info/WHEEL deleted file mode 100755 index 707a478..0000000 --- a/venv/lib/python3.11/site-packages/idna-3.19.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 4.0.2 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.11/site-packages/idna-3.19.dist-info/entry_points.txt b/venv/lib/python3.11/site-packages/idna-3.19.dist-info/entry_points.txt deleted file mode 100755 index 59ca7ac..0000000 --- a/venv/lib/python3.11/site-packages/idna-3.19.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[console_scripts] -idna=idna.cli:main - diff --git a/venv/lib/python3.11/site-packages/idna-3.19.dist-info/licenses/LICENSE.md b/venv/lib/python3.11/site-packages/idna-3.19.dist-info/licenses/LICENSE.md deleted file mode 100755 index f706835..0000000 --- a/venv/lib/python3.11/site-packages/idna-3.19.dist-info/licenses/LICENSE.md +++ /dev/null @@ -1,31 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2013-2026, Kim Davies and contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.11/site-packages/idna/__init__.py b/venv/lib/python3.11/site-packages/idna/__init__.py deleted file mode 100755 index d6c890a..0000000 --- a/venv/lib/python3.11/site-packages/idna/__init__.py +++ /dev/null @@ -1,47 +0,0 @@ -from .core import ( - IDNABidiError, - IDNAError, - InvalidCodepoint, - InvalidCodepointContext, - alabel, - check_bidi, - check_hyphen_ok, - check_initial_combiner, - check_label, - check_nfc, - decode, - encode, - ulabel, - uts46_remap, - valid_contextj, - valid_contexto, - valid_label_length, - valid_string_length, -) -from .idnadata import __version__ as unicode_version -from .intranges import intranges_contain -from .package_data import __version__ - -__all__ = [ - "__version__", - "unicode_version", - "IDNABidiError", - "IDNAError", - "InvalidCodepoint", - "InvalidCodepointContext", - "alabel", - "check_bidi", - "check_hyphen_ok", - "check_initial_combiner", - "check_label", - "check_nfc", - "decode", - "encode", - "intranges_contain", - "ulabel", - "uts46_remap", - "valid_contextj", - "valid_contexto", - "valid_label_length", - "valid_string_length", -] diff --git a/venv/lib/python3.11/site-packages/idna/__main__.py b/venv/lib/python3.11/site-packages/idna/__main__.py deleted file mode 100755 index dbdd066..0000000 --- a/venv/lib/python3.11/site-packages/idna/__main__.py +++ /dev/null @@ -1,6 +0,0 @@ -import sys - -from .cli import main - -if __name__ == "__main__": - sys.exit(main()) diff --git a/venv/lib/python3.11/site-packages/idna/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/idna/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 5ed6e2ce53973d05d07cae5296ba62b087e04bd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmdUtJ8u**5XbF%>^=70m)t=LM1zzo$SO*pLP!vh2t^t?H4bf&i-fo_}XqaksB8uKc9XtBlH8D>rvVm zmmi$*2}LNvF_M^ISt2D_CS_S66~ZlYP>c12Vv%SBi&ni)`n1IUdO|8E@iuTzm_o8Hy@jFu5C5-=K;26T3zx1KU1+ zaq{fBh{Q`{w6P6v3$u5uRxB3Lk&bwxh05&scH~H_jK9mQ$6_|+v2BKP9xmwA$=PmU z&(D%MS5zTPJfh=;DU^|&hD%Ob^JX6fN$YPe*H z?c^;wvAmJfTfVk~;(Puljk%g-b2}_zX=a3)ZGsbQeM(o{q(Uo7o!fUSHcZWUnyWLR zCfjD)ZJO;am4J?}(~Uc9WGa9vzys6(bwC3EH^caV7N8C207if=paoUf8T^i!j8vXy+MflM3 zShATw>WZY87*ZLsV0svUJf>wp@zo$nFj&S2n-Nu%Hmth$vK%tAmc$&d5O8H@$t7Hp=SpOK%N zs-K%!l$@{cm7kt(te;p=pkJ1nSEiqnnWSG(S(1^TXRK#vs9&5}lB!#fn4F!Mo?5J* znUa^N53^3Mpz;@oO>TZlX-=wL5iihSkh6*dfy4)9Mn=XP3|tLh_<%w50xEjI%-vCS tiCOXjv*ZmHo(AU@kB*Rzkj}84u!}4rS6DTnsQ@5eVM71_ diff --git a/venv/lib/python3.11/site-packages/idna/__pycache__/cli.cpython-311.pyc b/venv/lib/python3.11/site-packages/idna/__pycache__/cli.cpython-311.pyc deleted file mode 100755 index e68cd65b0f213c55d32ad6eae96844268034afd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6745 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 JpcYfbUjQ%)zmos} diff --git a/venv/lib/python3.11/site-packages/idna/__pycache__/codec.cpython-311.pyc b/venv/lib/python3.11/site-packages/idna/__pycache__/codec.cpython-311.pyc deleted file mode 100755 index 007993da800497fe9bdc104c255052f592c4d240..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7332 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%0ApyRCROSC+| zPjY`1)cmQ%uBmqEPPP|4*YXUEoo}}?%-6eve7&19syAufhUGF_biw@fBw9EJ0jcWRBgF&*Or^M?VGnFv}cRG2=Rvt=T_Z%CONQsZ)ktz zwq@acY?u$G-oEd05g(P1kidz#6Q@SU#gi_ckQ6UUn39qdpF4J9QhdsoNlEe4iCo;6 zxFum+V%#&A(J}G0qmsrZ#V1^oz-4)&^-ANy#Dk;xzbi+VB~N0sxr~mF2PbVfo2~7c e=}npuPc+-yH*?F`=a|iLdD5FC{|n#D?fL%?zt-9S diff --git a/venv/lib/python3.11/site-packages/idna/__pycache__/intranges.cpython-311.pyc b/venv/lib/python3.11/site-packages/idna/__pycache__/intranges.cpython-311.pyc deleted file mode 100755 index 22a5f35dc15c6539f2251f5608bbf339f2b7c32e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2905 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 diff --git a/venv/lib/python3.11/site-packages/idna/cli.py b/venv/lib/python3.11/site-packages/idna/cli.py deleted file mode 100755 index 894d8a0..0000000 --- a/venv/lib/python3.11/site-packages/idna/cli.py +++ /dev/null @@ -1,132 +0,0 @@ -"""Command-line interface for the :mod:`idna` package. - -Invoked via ``python -m idna``. See :func:`main` for the entry point. -""" - -from __future__ import annotations - -import argparse -import sys -from itertools import chain -from typing import IO, TYPE_CHECKING - -from . import IDNAError, decode, encode, unicode_version -from .core import _alabel_prefix, _unicode_dots_re -from .package_data import __version__ - -if TYPE_CHECKING: - from collections.abc import Iterable - - -def _looks_like_alabel(s: str) -> bool: - """Return True if any label in ``s`` carries the ``xn--`` ACE prefix.""" - prefix = _alabel_prefix.decode("ascii") - return any(label.lower().startswith(prefix) for label in _unicode_dots_re.split(s)) - - -def _build_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser( - prog="python -m idna", - description=( - "Convert a domain name between its Unicode (U-label) and " - "ASCII-compatible (A-label) forms. With no mode flag, the " - "direction is chosen from the first input — if it contains " - "an xn-- label the stream is decoded, otherwise it is " - "encoded — and the same mode is applied to every remaining " - "input. UTS #46 mapping is applied by default; pass " - "--strict to disable it. When no domains are given on the " - "command line and stdin is piped, one domain per line is " - "read from stdin." - ), - ) - mode = parser.add_mutually_exclusive_group() - mode.add_argument( - "-e", - "--encode", - dest="mode", - action="store_const", - const="encode", - help="Encode the input to its ASCII A-label form.", - ) - mode.add_argument( - "-d", - "--decode", - dest="mode", - action="store_const", - const="decode", - help="Decode the input from its ASCII A-label form.", - ) - parser.add_argument( - "--strict", - action="store_true", - help="Disable the default UTS #46 mapping and apply IDNA 2008 rules verbatim.", - ) - parser.add_argument( - "--version", - action="version", - version=f"idna {__version__} (Unicode {unicode_version})", - ) - parser.add_argument( - "domain", - nargs="*", - help="One or more domain names to convert. Omit to read from stdin.", - ) - return parser - - -def _iter_stdin(stream: IO[str]) -> Iterable[str]: - """Yield non-empty stripped lines from ``stream``, ignoring blanks.""" - for line in stream: - stripped = line.strip() - if stripped: - yield stripped - - -def _convert_one(domain: str, mode: str, uts46: bool) -> bool: - """Convert ``domain`` and write the result; return ``False`` on failure.""" - try: - if mode == "decode": - print(decode(domain, uts46=uts46)) - else: - print(encode(domain, uts46=uts46).decode("ascii")) - except IDNAError as err: - print(f"idna: {mode} failed for {domain!r}: {err}", file=sys.stderr) - return False - return True - - -def main(argv: list[str] | None = None) -> int: - """Entry point for ``python -m idna``. - - When more than one domain is supplied (via positional arguments or - piped stdin) and no mode flag is given, the first input determines - the direction and that mode is applied uniformly to the rest. - - :param argv: Argument list excluding the program name. Defaults to - :data:`sys.argv` when ``None``. - :returns: ``0`` on success, ``1`` if any conversion fails. - """ - parser = _build_parser() - args = parser.parse_args(argv) - uts46 = not args.strict - - if args.domain: - domains: Iterable[str] = args.domain - elif not sys.stdin.isatty(): - domains = _iter_stdin(sys.stdin) - else: - parser.error("a domain argument is required when stdin is a terminal") - - iterator = iter(domains) - first = next(iterator, None) - if first is None: - return 0 - - mode = args.mode or ("decode" if _looks_like_alabel(first) else "encode") - - results = [_convert_one(domain, mode, uts46) for domain in chain([first], iterator)] - return 0 if all(results) else 1 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/venv/lib/python3.11/site-packages/idna/codec.py b/venv/lib/python3.11/site-packages/idna/codec.py deleted file mode 100755 index 17995c9..0000000 --- a/venv/lib/python3.11/site-packages/idna/codec.py +++ /dev/null @@ -1,163 +0,0 @@ -from __future__ import annotations - -import codecs -from typing import Any - -from .core import IDNAError, _unicode_dots_re, alabel, decode, encode, ulabel - - -class Codec(codecs.Codec): - """Stateless IDNA 2008 codec. - - Implements the :class:`codecs.Codec` protocol so that the whole-domain - encoder (:func:`idna.encode`) and decoder (:func:`idna.decode`) are - accessible through the standard codec machinery as ``"idna2008"``. - - Only the ``"strict"`` error handler is supported; any other handler - raises :exc:`~idna.IDNAError`. - """ - - def encode(self, data: str, errors: str = "strict") -> tuple[bytes, int]: # ty: ignore[invalid-method-override] - if errors != "strict": - raise IDNAError(f'Unsupported error handling "{errors}"', code="unsupported_errors") - - if not data: - return b"", 0 - - return encode(data), len(data) - - def decode(self, data: bytes, errors: str = "strict") -> tuple[str, int]: # ty: ignore[invalid-method-override] - if errors != "strict": - raise IDNAError(f'Unsupported error handling "{errors}"', code="unsupported_errors") - - if not data: - return "", 0 - - return decode(data), len(data) - - -class IncrementalEncoder(codecs.BufferedIncrementalEncoder): - """Incremental IDNA 2008 encoder. - - Buffers a partial trailing label across calls until either the next - label separator is seen or ``final=True``, so that streamed input is - encoded one whole label at a time. Any of the four Unicode label - separators (``U+002E``, ``U+3002``, ``U+FF0E``, ``U+FF61``) ends a - label; the result always uses ``U+002E`` as the separator. - - Only the ``"strict"`` error handler is supported. - """ - - def _buffer_encode(self, data: str, errors: str, final: bool) -> tuple[bytes, int]: # ty: ignore[invalid-method-override] - if errors != "strict": - raise IDNAError(f'Unsupported error handling "{errors}"', code="unsupported_errors") - - if not data: - return b"", 0 - - labels = _unicode_dots_re.split(data) - trailing_dot = b"" - if labels: - if not labels[-1]: - trailing_dot = b"." - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = b"." - - result = [] - size = 0 - for label in labels: - result.append(alabel(label)) - if size: - size += 1 - size += len(label) - - result_bytes = b".".join(result) + trailing_dot - size += len(trailing_dot) - return result_bytes, size - - -class IncrementalDecoder(codecs.BufferedIncrementalDecoder): - """Incremental IDNA 2008 decoder. - - Buffers a partial trailing label across calls until either the next - label separator is seen or ``final=True``, so that streamed input is - decoded one whole label at a time. - - Only the ``"strict"`` error handler is supported. - """ - - def _buffer_decode(self, data: Any, errors: str, final: bool) -> tuple[str, int]: # ty: ignore[invalid-method-override] - if errors != "strict": - raise IDNAError(f'Unsupported error handling "{errors}"', code="unsupported_errors") - - if not data: - return ("", 0) - - if not isinstance(data, str): - try: - data = str(data, "ascii") - except UnicodeDecodeError as err: - raise IDNAError("Invalid ASCII in A-label", code="invalid_ascii") from err - - labels = _unicode_dots_re.split(data) - trailing_dot = "" - if labels: - if not labels[-1]: - trailing_dot = "." - del labels[-1] - elif not final: - # Keep potentially unfinished label until the next call - del labels[-1] - if labels: - trailing_dot = "." - - result = [] - size = 0 - for label in labels: - result.append(ulabel(label)) - if size: - size += 1 - size += len(label) - - result_str = ".".join(result) + trailing_dot - size += len(trailing_dot) - return (result_str, size) - - -class StreamWriter(Codec, codecs.StreamWriter): - pass - - -class StreamReader(Codec, codecs.StreamReader): - pass - - -def search_function(name: str) -> codecs.CodecInfo | None: - """Codec search function registered with :mod:`codecs`. - - Returns a :class:`codecs.CodecInfo` for the ``"idna2008"`` codec name - so that ``str.encode("idna2008")`` and ``bytes.decode("idna2008")`` - invoke the IDNA 2008 codec defined in this module. - - :param name: The codec name being looked up. - :returns: A :class:`codecs.CodecInfo` instance if ``name`` is - ``"idna2008"``, otherwise ``None``. - """ - if name != "idna2008": - return None - return codecs.CodecInfo( - name=name, - encode=Codec().encode, - decode=Codec().decode, # type: ignore - incrementalencoder=IncrementalEncoder, - incrementaldecoder=IncrementalDecoder, - streamwriter=StreamWriter, - streamreader=StreamReader, - ) - - -codecs.register(search_function) diff --git a/venv/lib/python3.11/site-packages/idna/compat.py b/venv/lib/python3.11/site-packages/idna/compat.py deleted file mode 100755 index 5bedee9..0000000 --- a/venv/lib/python3.11/site-packages/idna/compat.py +++ /dev/null @@ -1,43 +0,0 @@ -from __future__ import annotations - -from typing import Any - -from .core import decode, encode - - -def ToASCII(label: str) -> bytes: - """Compatibility shim for :rfc:`3490` ``ToASCII``. - - Delegates to :func:`idna.encode` (IDNA 2008). Provided to ease porting - of code written against the legacy :mod:`encodings.idna` API; new code - should call :func:`idna.encode` directly. - - :param label: The label or domain to encode. - :returns: The encoded form as ASCII :class:`bytes`. - """ - return encode(label) - - -def ToUnicode(label: bytes | bytearray) -> str: - """Compatibility shim for :rfc:`3490` ``ToUnicode``. - - Delegates to :func:`idna.decode` (IDNA 2008). Provided to ease porting - of code written against the legacy :mod:`encodings.idna` API; new code - should call :func:`idna.decode` directly. - - :param label: The label or domain to decode. - :returns: The decoded Unicode form. - """ - return decode(label) - - -def nameprep(s: Any) -> None: - """Stub for :rfc:`3491` Nameprep, which is not used by IDNA 2008. - - IDNA 2008 (:rfc:`5891`) replaces Nameprep with the per-codepoint - validity classes from :rfc:`5892`; this function exists only to - return a clear error if legacy code attempts to call it. - - :raises NotImplementedError: Always. - """ - raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol") diff --git a/venv/lib/python3.11/site-packages/idna/core.py b/venv/lib/python3.11/site-packages/idna/core.py deleted file mode 100755 index 138ee10..0000000 --- a/venv/lib/python3.11/site-packages/idna/core.py +++ /dev/null @@ -1,862 +0,0 @@ -from __future__ import annotations - -import bisect -import re -import unicodedata -import warnings -from typing import Literal - -from . import idnadata -from .intranges import intranges_contain - -_virama_combining_class = 9 -_alabel_prefix = b"xn--" -_max_input_length = 1024 -_STATUS_VALID, _STATUS_MAPPED, _STATUS_DEVIATION, _STATUS_IGNORED = b"VMDI" -_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]") -_std3_disallowed_re = re.compile("[\x00-\x2c\x2f\x3a-\x40A-Z\x5b-\x60\x7b-\x7f]") -_bidi_rtl_first = frozenset({"R", "AL"}) -_bidi_rtl_categories = frozenset({"R", "AL", "AN"}) -_bidi_rtl_allowed = frozenset({"R", "AL", "AN", "EN", "ES", "CS", "ET", "ON", "BN", "NSM"}) -_bidi_rtl_valid_ending = frozenset({"R", "AL", "EN", "AN"}) -_bidi_rtl_numeric = frozenset({"AN", "EN"}) -_bidi_ltr_allowed = frozenset({"L", "EN", "ES", "CS", "ET", "ON", "BN", "NSM"}) -_bidi_ltr_valid_ending = frozenset({"L", "EN"}) -_bidi_joiner_l_or_d = frozenset({"L", "D"}) -_bidi_joiner_r_or_d = frozenset({"R", "D"}) - - -def _joining_type(cp: int) -> str | None: - for jt, ranges in idnadata.joining_types.items(): - if intranges_contain(cp, ranges): - return jt - return None - - -# Machine-readable identifiers for the rule an :class:`IDNAError` reports. -# These strings are stable and documented; exception message wording is not. -_ErrorCode = Literal[ - "input_too_long", - "label_too_long", - "domain_too_long", - "empty_label", - "empty_domain", - "not_nfc", - "hyphen_3_4", - "hyphen_start_end", - "leading_combiner", - "disallowed_codepoint", - "contextj", - "contexto", - "unknown_codepoint", - "bidi_rule_1", - "bidi_rule_2", - "bidi_rule_3", - "bidi_rule_4", - "bidi_rule_5", - "bidi_rule_6", - "bidi_unknown_direction", - "invalid_alabel", - "non_canonical_alabel", - "invalid_ascii", - "invalid_utf8", - "uts46_disallowed", - "uts46_std3", - "unsupported_errors", -] - - -class IDNAError(UnicodeError): - """Base exception for all IDNA-encoding related problems. - - ``str(err)`` is a human-readable description of the failure. The - exception also carries machine-readable attributes so callers do not - need to parse the message: - - * ``code`` -- a short, stable identifier for the rule that failed, such - as ``"disallowed_codepoint"`` or ``"bidi_rule_2"``; the full list is - documented in the README. Message wording, by contrast, may change - between releases. - * ``text`` -- the label (or, for UTS #46 processing, the domain) that - was being validated; - * ``codepoint`` -- the offending codepoint, as an ``int``; - * ``position`` -- the 1-based index of the offending character within - ``text``, matching the position quoted in the message. - - Each is ``None`` when it does not apply. - """ - - code: str | None - text: str | None - codepoint: int | None - position: int | None - - def __init__( - self, - *args: object, - code: _ErrorCode | None = None, - text: str | None = None, - codepoint: int | None = None, - position: int | None = None, - ) -> None: - super().__init__(*args) - self.code = code - self.text = text - self.codepoint = codepoint - self.position = position - - -class IDNABidiError(IDNAError): - """Exception when bidirectional requirements are not satisfied""" - - -class InvalidCodepoint(IDNAError): - """Exception when a disallowed or unallocated codepoint is used""" - - -class InvalidCodepointContext(IDNAError): - """Exception when the codepoint is not valid in the context it is used""" - - -def _combining_class(cp: int) -> int: - v = unicodedata.combining(chr(cp)) - if v == 0 and not unicodedata.name(chr(cp)): - raise ValueError("Unknown character in unicodedata") - return v - - -def _is_script(cp: str, script: str) -> bool: - return intranges_contain(ord(cp), idnadata.scripts[script]) - - -def _punycode(s: str) -> bytes: - return s.encode("punycode") - - -def _unot(s: int) -> str: - return f"U+{s:04X}" - - -def valid_label_length(label: bytes | str) -> bool: - """Check that a label does not exceed the maximum permitted length. - - Per :rfc:`1035` (and :rfc:`5891` §4.2.4) a DNS label must not exceed - 63 octets. The argument may be either a :class:`str` (a U-label, where - length is measured in characters) or :class:`bytes` (an A-label, where - length is measured in octets). - - :param label: The label to check. - :returns: ``True`` if the label is within the length limit, otherwise - ``False``. - """ - return len(label) <= 63 - - -def valid_string_length(domain: bytes | str, trailing_dot: bool) -> bool: - """Check that a full domain name does not exceed the maximum length. - - Per :rfc:`1035`, a domain name is limited to 253 octets when no trailing - dot is present, or 254 octets when one is included. - - :param domain: The full (possibly multi-label) domain name. - :param trailing_dot: ``True`` if ``domain`` includes a trailing ``.``. - :returns: ``True`` if the domain is within the length limit, otherwise - ``False``. - """ - return len(domain) <= (254 if trailing_dot else 253) - - -def check_bidi(label: str, check_ltr: bool = False) -> bool: - """Validate the Bidi Rule from :rfc:`5893` for a single label. - - The Bidi Rule constrains how bidirectional characters (Hebrew, Arabic, - etc.) may appear within a label. By default the check is only applied - when the label contains at least one right-to-left character (Unicode - bidirectional categories ``R``, ``AL``, or ``AN``); set ``check_ltr`` - to ``True`` to apply it to LTR-only labels as well. - - :param label: The label to validate, as a Unicode string. - :param check_ltr: If ``True``, apply the rules even when the label - contains no RTL characters. - :returns: ``True`` if the label satisfies the Bidi Rule. - :raises IDNABidiError: If any of Bidi Rule conditions 1-6 are violated, - or if the directional category of a codepoint cannot be determined. - """ - if len(label) > _max_input_length: - raise IDNAError("Label too long", code="input_too_long") - # Bidi rules should only be applied if string contains RTL characters - bidi_label = False - for idx, cp in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - if direction == "": - # String likely comes from a newer version of Unicode - raise IDNABidiError( - f"Unknown directionality in label {label!r} at position {idx}", - code="bidi_unknown_direction", - text=label, - codepoint=ord(cp), - position=idx, - ) - if direction in _bidi_rtl_categories: - bidi_label = True - if not bidi_label and not check_ltr: - return True - - # Bidi rule 1 - direction = unicodedata.bidirectional(label[0]) - if direction in _bidi_rtl_first: - rtl = True - elif direction == "L": - rtl = False - else: - raise IDNABidiError( - f"First codepoint in label {label!r} must be directionality L, R or AL", - code="bidi_rule_1", - text=label, - codepoint=ord(label[0]), - position=1, - ) - - valid_ending = False - ending_idx = 1 - number_type: str | None = None - for idx, cp in enumerate(label, 1): - direction = unicodedata.bidirectional(cp) - - if rtl: - # Bidi rule 2 - if direction not in _bidi_rtl_allowed: - raise IDNABidiError( - f"Invalid direction for codepoint at position {idx} in a right-to-left label", - code="bidi_rule_2", - text=label, - codepoint=ord(cp), - position=idx, - ) - # Bidi rule 3 - if direction in _bidi_rtl_valid_ending: - valid_ending = True - ending_idx = idx - elif direction != "NSM": - valid_ending = False - ending_idx = idx - # Bidi rule 4 - if direction in _bidi_rtl_numeric: - if not number_type: - number_type = direction - elif number_type != direction: - raise IDNABidiError( - "Can not mix numeral types in a right-to-left label", - code="bidi_rule_4", - text=label, - codepoint=ord(cp), - position=idx, - ) - else: - # Bidi rule 5 - if direction not in _bidi_ltr_allowed: - raise IDNABidiError( - f"Invalid direction for codepoint at position {idx} in a left-to-right label", - code="bidi_rule_5", - text=label, - codepoint=ord(cp), - position=idx, - ) - # Bidi rule 6 - if direction in _bidi_ltr_valid_ending: - valid_ending = True - ending_idx = idx - elif direction != "NSM": - valid_ending = False - ending_idx = idx - - if not valid_ending: - # Rules 3 and 6 concern the last character that is not a - # non-spacing mark, which is what ``ending_idx`` tracks. - raise IDNABidiError( - "Label ends with illegal codepoint directionality", - code="bidi_rule_3" if rtl else "bidi_rule_6", - text=label, - codepoint=ord(label[ending_idx - 1]), - position=ending_idx, - ) - - return True - - -def check_initial_combiner(label: str) -> bool: - """Reject labels that begin with a combining mark. - - Per :rfc:`5891` §4.2.3.2 a label must not start with a character of - Unicode general category ``M`` (Mark). - - :param label: The label to check. - :returns: ``True`` if the first character is not a combining mark. - :raises IDNAError: If the label begins with a combining character. - """ - if label and unicodedata.category(label[0])[0] == "M": - raise IDNAError( - "Label begins with an illegal combining character", - code="leading_combiner", - text=label, - codepoint=ord(label[0]), - position=1, - ) - return True - - -def check_hyphen_ok(label: str) -> bool: - """Validate the hyphen restrictions for a label. - - Per :rfc:`5891` §4.2.3.1 a label must not start or end with a hyphen - (``U+002D``), and must not have hyphens in both the third and fourth - positions (the prefix reserved for A-labels). - - :param label: The label to check. - :returns: ``True`` if the hyphen restrictions are satisfied. - :raises IDNAError: If any of the hyphen restrictions are violated. - """ - if label[2:4] == "--": - raise IDNAError("Label has disallowed hyphens in 3rd and 4th position", code="hyphen_3_4") - if label.startswith("-") or label.endswith("-"): - raise IDNAError("Label must not start or end with a hyphen", code="hyphen_start_end") - return True - - -def check_nfc(label: str) -> None: - """Require that a label is in Unicode Normalization Form C. - - :param label: The label to check. - :raises IDNAError: If ``label`` differs from its NFC normalisation. - """ - if len(label) > _max_input_length: - raise IDNAError("Label too long", code="input_too_long") - if unicodedata.normalize("NFC", label) != label: - raise IDNAError("Label must be in Normalization Form C", code="not_nfc") - - -def valid_contextj(label: str, pos: int) -> bool: - """Validate the CONTEXTJ rules from :rfc:`5892` Appendix A. - - These rules govern the contextual use of the joiner codepoints - ``U+200C`` (ZERO WIDTH NON-JOINER, Appendix A.1) and ``U+200D`` - (ZERO WIDTH JOINER, Appendix A.2) within a label. - - :param label: The label containing the codepoint. - :param pos: Index of the joiner codepoint within ``label``. - :returns: ``True`` if the codepoint at ``pos`` satisfies its CONTEXTJ - rule, ``False`` otherwise (including when the codepoint at - ``pos`` is not a recognised joiner). - :raises ValueError: If an adjacent codepoint has no Unicode name when - determining its combining class. - :raises IDNAError: If ``label`` exceeds the defensive input length limit. - """ - if len(label) > _max_input_length: - raise IDNAError("Label too long", code="input_too_long") - cp_value = ord(label[pos]) - - if cp_value == 0x200C: - if pos > 0 and _combining_class(ord(label[pos - 1])) == _virama_combining_class: - return True - - ok = False - for i in range(pos - 1, -1, -1): - joining_type = _joining_type(ord(label[i])) - if joining_type == "T": - continue - if joining_type in _bidi_joiner_l_or_d: - ok = True - break - break - - if not ok: - return False - - ok = False - for i in range(pos + 1, len(label)): - joining_type = _joining_type(ord(label[i])) - if joining_type == "T": - continue - if joining_type in _bidi_joiner_r_or_d: - ok = True - break - break - return ok - - if cp_value == 0x200D: - return pos > 0 and _combining_class(ord(label[pos - 1])) == _virama_combining_class - - return False - - -def valid_contexto(label: str, pos: int, exception: bool = False) -> bool: - """Validate the CONTEXTO rules from :rfc:`5892` Appendix A. - - Covers the contextual rules for codepoints such as MIDDLE DOT - (``U+00B7``), Greek lower numeral sign, Hebrew punctuation, Katakana - middle dot, and the Arabic-Indic / Extended Arabic-Indic digit ranges. - - :param label: The label containing the codepoint. - :param pos: Index of the codepoint within ``label``. - :param exception: Reserved for forward compatibility; currently unused. - :returns: ``True`` if the codepoint at ``pos`` satisfies its CONTEXTO - rule, ``False`` otherwise (including when the codepoint is not a - recognised CONTEXTO codepoint). - :raises IDNAError: If ``label`` exceeds the defensive input length limit. - """ - if len(label) > _max_input_length: - raise IDNAError("Label too long", code="input_too_long") - cp_value = ord(label[pos]) - - if cp_value == 0x00B7: - return 0 < pos < len(label) - 1 and ord(label[pos - 1]) == 0x006C and ord(label[pos + 1]) == 0x006C - - if cp_value == 0x0375: - if pos < len(label) - 1 and len(label) > 1: - return _is_script(label[pos + 1], "Greek") - return False - - if cp_value in {0x05F3, 0x05F4}: - if pos > 0: - return _is_script(label[pos - 1], "Hebrew") - return False - - if cp_value == 0x30FB: - for cp in label: - if cp == "\u30fb": - continue - if _is_script(cp, "Hiragana") or _is_script(cp, "Katakana") or _is_script(cp, "Han"): - return True - return False - - if 0x660 <= cp_value <= 0x669: - return not any(0x6F0 <= ord(cp) <= 0x06F9 for cp in label) - - if 0x6F0 <= cp_value <= 0x6F9: - return not any(0x660 <= ord(cp) <= 0x0669 for cp in label) - - return False - - -def check_label(label: str | bytes | bytearray) -> None: - """Run the full set of IDNA 2008 validity checks on a single label. - - Applies, in order: NFC normalisation (:func:`check_nfc`), hyphen - restrictions (:func:`check_hyphen_ok`), the no-leading-combiner rule - (:func:`check_initial_combiner`), per-codepoint validity (PVALID, - CONTEXTJ, CONTEXTO classes from :rfc:`5892`), and the Bidi Rule - (:func:`check_bidi`). - - :param label: The label to validate. ``bytes`` or ``bytearray`` input - is decoded as UTF-8 first. - :raises IDNAError: If the label is empty or fails a structural rule. - :raises InvalidCodepoint: If the label contains a DISALLOWED or - UNASSIGNED codepoint. - :raises InvalidCodepointContext: If a CONTEXTJ or CONTEXTO codepoint - is not valid in its context. - :raises IDNABidiError: If the Bidi Rule is violated. - """ - if len(label) > _max_input_length: - raise IDNAError("Label too long", code="input_too_long") - if isinstance(label, (bytes, bytearray)): - try: - label = label.decode("utf-8") - except UnicodeDecodeError as err: - raise IDNAError("Invalid UTF-8 in label", code="invalid_utf8") from err - if len(label) == 0: - raise IDNAError("Empty Label", code="empty_label") - - # Check against the domain length rather than the label length to - # support some UTS #46 use cases, while still bounding the work done - # by the label contextual rules below. - if not valid_string_length(label, trailing_dot=True): - raise IDNAError("Label too long", code="label_too_long") - - check_nfc(label) - check_hyphen_ok(label) - check_initial_combiner(label) - - for pos, cp in enumerate(label): - cp_value = ord(cp) - if intranges_contain(cp_value, idnadata.codepoint_classes["PVALID"]): - continue - if intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTJ"]): - try: - contextj_ok = valid_contextj(label, pos) - except ValueError as err: - raise IDNAError( - f"Unknown codepoint adjacent to joiner {_unot(cp_value)} at position {pos + 1} in {label!r}", - code="unknown_codepoint", - text=label, - codepoint=cp_value, - position=pos + 1, - ) from err - if not contextj_ok: - raise InvalidCodepointContext( - f"Joiner {_unot(cp_value)} not allowed at position {pos + 1} in {label!r}", - code="contextj", - text=label, - codepoint=cp_value, - position=pos + 1, - ) - elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTO"]): - if not valid_contexto(label, pos): - raise InvalidCodepointContext( - f"Codepoint {_unot(cp_value)} not allowed at position {pos + 1} in {label!r}", - code="contexto", - text=label, - codepoint=cp_value, - position=pos + 1, - ) - else: - raise InvalidCodepoint( - f"Codepoint {_unot(cp_value)} at position {pos + 1} of {label!r} not allowed", - code="disallowed_codepoint", - text=label, - codepoint=cp_value, - position=pos + 1, - ) - - check_bidi(label) - - -def alabel(label: str) -> bytes: - """Convert a single U-label into its A-label form. - - The result is the ASCII-Compatible Encoding (ACE) form per :rfc:`5891` - §4: the label is validated, Punycode-encoded, and prefixed with - ``xn--``. Pure ASCII labels that are already valid IDNA labels are - returned unchanged (as :class:`bytes`). - - :param label: The label to convert, as a Unicode string. - :returns: The A-label as ASCII-encoded :class:`bytes`. - :raises IDNAError: If the label is invalid or the resulting A-label - exceeds 63 octets. - """ - if len(label) > _max_input_length: - raise IDNAError("Label too long", code="input_too_long") - try: - label_bytes = label.encode("ascii") - except UnicodeEncodeError: - pass - else: - ulabel(label_bytes) - if not valid_label_length(label_bytes): - raise IDNAError("Label too long", code="label_too_long") - return label_bytes - - check_label(label) - label_bytes = _alabel_prefix + _punycode(label) - - if not valid_label_length(label_bytes): - raise IDNAError("Label too long", code="label_too_long") - - return label_bytes - - -def ulabel(label: str | bytes | bytearray) -> str: - """Convert a single A-label into its U-label form. - - Performs the inverse of :func:`alabel`: an ``xn--``-prefixed label is - Punycode-decoded and validated, and is rejected unless it is the - canonical A-label for the decoded U-label (:rfc:`5891` §5.3). Labels - that are already Unicode (or plain ASCII without the ACE prefix) are - validated and returned as a Unicode string. - - :param label: The label to convert. ``bytes`` or ``bytearray`` input - is treated as ASCII. - :returns: The U-label as a Unicode string. - :raises IDNAError: If the label is malformed or fails validation. - """ - if len(label) > _max_input_length: - raise IDNAError("Label too long", code="input_too_long") - if not isinstance(label, (bytes, bytearray)): - try: - label_bytes = label.encode("ascii") - except UnicodeEncodeError: - check_label(label) - return label - else: - label_bytes = bytes(label) - if not label_bytes.isascii(): - raise IDNAError("Invalid ASCII in A-label", code="invalid_ascii") - - label_bytes = label_bytes.lower() - if label_bytes.startswith(_alabel_prefix): - label_bytes = label_bytes[len(_alabel_prefix) :] - if not label_bytes: - raise IDNAError("Malformed A-label, no Punycode eligible content found", code="invalid_alabel") - if label_bytes.endswith(b"-"): - raise IDNAError("A-label must not end with a hyphen", code="invalid_alabel") - else: - check_label(label_bytes) - return label_bytes.decode("ascii") - - try: - label = label_bytes.decode("punycode") - except UnicodeError as err: - raise IDNAError("Invalid A-label", code="invalid_alabel") from err - # RFC 5891 §5.3: the label is rejected unless re-encoding the decoded - # form reproduces the (lowercased) input. This catches "fake A-labels" - # (RFC 5890 §2.3.2.1) such as ``xn---bbk``, a non-canonical Punycode - # spelling of ``xn--bbk`` that would otherwise decode to the same - # U-label and so display identically to a different wire-format name. - if _punycode(label) != label_bytes: - raise IDNAError("A-label is not the canonical Punycode encoding of its U-label", code="non_canonical_alabel") - check_label(label) - return label - - -def _check_std3(text: str, domain: str, offset: int) -> None: - """Raise if ``text``, a slice of ``domain`` starting at ``offset`` that - UTS #46 mapping left unchanged, contains an ASCII character disallowed - under ``UseSTD3ASCIIRules``.""" - match = _std3_disallowed_re.search(text) - if match: - codepoint = ord(match.group()) - position = offset + match.start() + 1 - raise InvalidCodepoint( - f"Codepoint {_unot(codepoint)} not allowed at position {position} in {domain!r}", - code="uts46_std3", - text=domain, - codepoint=codepoint, - position=position, - ) - - -def _warn_transitional() -> None: - warnings.warn( - "Transitional processing is deprecated in UTS #46 and has no effect. " - "The transitional argument will be removed in a future version.", - DeprecationWarning, - stacklevel=3, - ) - - -def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str: - """Apply the UTS #46 character mapping to a domain string. - - Implements the mapping table from `UTS #46 §4 - `_: each character is kept, - replaced, or rejected based on its status (``V``, ``M``, ``D``, - ``I``, ``X``). The result is returned in Normalisation Form C. - - :param domain: The full domain name to remap. - :param std3_rules: If ``True``, apply UTS #46's ``UseSTD3ASCIIRules``: - after mapping, any ASCII character other than a lowercase letter, - digit, hyphen or the label separator ``.`` is rejected, whether it - appeared in the input or was produced by a mapping (e.g. U+FF01 - FULLWIDTH EXCLAMATION MARK maps to ``!``). If ``False``, such - characters are passed through. - :param transitional: Deprecated and ignored. UTS #46 deprecated - transitional processing in Unicode 15.1 and deviation (status - ``D``) codepoints are now always kept, so this has no effect - beyond emitting a :class:`DeprecationWarning`. It will be removed - in a future version. - :returns: The remapped domain, in Normalisation Form C. - :raises InvalidCodepoint: If the domain contains a disallowed - codepoint under the chosen rules. - :raises IDNAError: If ``domain`` exceeds the defensive input length limit. - """ - if transitional: - _warn_transitional() - if len(domain) > _max_input_length: - raise IDNAError("Domain too long", code="input_too_long") - if domain.isascii(): - # The only ASCII mapping in UTS #46 is upper- to lowercase, and - # ASCII is invariant under NFC, so lowercasing is the whole job. - result = domain.lower() - if std3_rules: - _check_std3(result, domain, 0) - return result - - from .uts46data import uts46_replacements, uts46_starts, uts46_statuses - - # ``start`` marks the run of unchanged input not yet copied; a run is - # only sliced out when a character must be replaced or dropped, so the - # common no-change case makes no copy. STD3 is checked per output piece - # to report a violation at its input position. - output: list[str] = [] - start = 0 - for pos, char in enumerate(domain): - code_point = ord(char) - i = code_point if code_point < 256 else bisect.bisect_right(uts46_starts, code_point) - 1 - status = uts46_statuses[i] - # UTS #46 §4: V valid, D deviation (kept), M mapped, I ignored, - # anything else disallowed. - if status == _STATUS_VALID: - continue - if status == _STATUS_MAPPED: - replacement = uts46_replacements[i] - elif status == _STATUS_DEVIATION: - continue - elif status == _STATUS_IGNORED: - replacement = None - else: - raise InvalidCodepoint( - f"Codepoint {_unot(code_point)} not allowed at position {pos + 1} in {domain!r}", - code="uts46_disallowed", - text=domain, - codepoint=code_point, - position=pos + 1, - ) - if start < pos: - run = domain[start:pos] - if std3_rules: - _check_std3(run, domain, start) - output.append(run) - if replacement: - if std3_rules and _std3_disallowed_re.search(replacement): - raise InvalidCodepoint( - f"Codepoint {_unot(code_point)} not allowed at position {pos + 1} in {domain!r}", - code="uts46_std3", - text=domain, - codepoint=code_point, - position=pos + 1, - ) - output.append(replacement) - start = pos + 1 - - if start == 0: - if std3_rules: - _check_std3(domain, domain, 0) - return unicodedata.normalize("NFC", domain) - tail = domain[start:] - if std3_rules: - _check_std3(tail, domain, start) - output.append(tail) - return unicodedata.normalize("NFC", "".join(output)) - - -def encode( - s: str | bytes | bytearray, - strict: bool = False, - uts46: bool = False, - std3_rules: bool = False, - transitional: bool = False, -) -> bytes: - """Encode a Unicode domain name into its ASCII (A-label) form. - - Splits the input on label separators (only ``U+002E`` if ``strict`` is - set; otherwise also IDEOGRAPHIC FULL STOP ``U+3002``, FULLWIDTH FULL - STOP ``U+FF0E``, and HALFWIDTH IDEOGRAPHIC FULL STOP ``U+FF61``), - encodes each label with :func:`alabel`, and rejoins them with ``.``. - Optionally pre-processes the input through :func:`uts46_remap`. - - :param s: The domain name to encode. - :param strict: If ``True``, only ``U+002E`` is recognised as a label - separator. - :param uts46: If ``True``, apply UTS #46 mapping before encoding. - :param std3_rules: Forwarded to :func:`uts46_remap` when ``uts46`` is - ``True``. - :param transitional: Deprecated and ignored (see :func:`uts46_remap`): - emits a :class:`DeprecationWarning` and will be removed in a - future version. - :returns: The encoded domain as ASCII :class:`bytes`. - :raises IDNAError: If the domain is empty, contains an invalid label, - or exceeds the maximum domain length. - """ - if transitional: - _warn_transitional() - if not isinstance(s, str): - try: - s = str(s, "ascii") - except (UnicodeDecodeError, TypeError) as err: - raise IDNAError( - "should pass a unicode string to the function rather than a byte string.", code="invalid_ascii" - ) from err - if len(s) > _max_input_length: - raise IDNAError("Domain too long", code="input_too_long") - if uts46: - s = uts46_remap(s, std3_rules) - - if not valid_string_length(s, trailing_dot=True): - raise IDNAError("Domain too long", code="domain_too_long") - - trailing_dot = False - result = [] - labels = s.split(".") if strict else _unicode_dots_re.split(s) - if not labels or labels == [""]: - raise IDNAError("Empty domain", code="empty_domain") - if labels[-1] == "": - del labels[-1] - trailing_dot = True - for label in labels: - s = alabel(label) - if s: - result.append(s) - else: - raise IDNAError("Empty label", code="empty_label") - if trailing_dot: - result.append(b"") - s = b".".join(result) - if not valid_string_length(s, trailing_dot): - raise IDNAError("Domain too long", code="domain_too_long") - return s - - -def decode( - s: str | bytes | bytearray, - strict: bool = False, - uts46: bool = False, - std3_rules: bool = False, - display: bool = False, -) -> str: - """Decode an A-label-encoded domain name back to Unicode. - - Splits the input on label separators (see :func:`encode` for the - rules), decodes each label with :func:`ulabel`, and rejoins them - with ``.``. Optionally pre-processes the input through - :func:`uts46_remap`. - - :param s: The domain name to decode. - :param strict: If ``True``, only ``U+002E`` is recognised as a label - separator. - :param uts46: If ``True``, apply UTS #46 mapping before decoding. - :param std3_rules: Forwarded to :func:`uts46_remap` when ``uts46`` is - ``True``. - :param display: If ``True``, any ``xn--`` label that fails IDNA - validation is passed through unchanged (lowercased) rather than - aborting the whole call. Intended for "decode for display" - consumers (e.g. URL libraries, HTTP clients) that want to show - the user the label as it appears on the wire when it cannot be - rendered as Unicode. Matches the per-label recovery prescribed - by UTS #46 §4 and the WHATWG URL "domain to Unicode" algorithm. - :returns: The decoded domain as a Unicode string. - :raises IDNAError: If the input is not valid ASCII, contains an - invalid label, or is empty. - """ - if not isinstance(s, str): - try: - s = str(s, "ascii") - except (UnicodeDecodeError, TypeError) as err: - raise IDNAError("Invalid ASCII in A-label", code="invalid_ascii") from err - if len(s) > _max_input_length: - raise IDNAError("Domain too long", code="input_too_long") - if uts46: - s = uts46_remap(s, std3_rules, False) - if not valid_string_length(s, trailing_dot=True): - raise IDNAError("Domain too long", code="domain_too_long") - trailing_dot = False - result = [] - labels = s.split(".") if strict else _unicode_dots_re.split(s) - if not labels or labels == [""]: - raise IDNAError("Empty domain", code="empty_domain") - if not labels[-1]: - del labels[-1] - trailing_dot = True - for label in labels: - try: - u = ulabel(label) - except IDNAError: - if display and label[:4].lower() == "xn--": - u = label.lower() - else: - raise - if u: - result.append(u) - else: - raise IDNAError("Empty label", code="empty_label") - if trailing_dot: - result.append("") - return ".".join(result) diff --git a/venv/lib/python3.11/site-packages/idna/idnadata.py b/venv/lib/python3.11/site-packages/idna/idnadata.py deleted file mode 100755 index f2ab388..0000000 --- a/venv/lib/python3.11/site-packages/idna/idnadata.py +++ /dev/null @@ -1,1897 +0,0 @@ -# This file is automatically generated by tools/idna-data - -__version__ = "17.0.0" - -scripts = { - "Greek": ( - 0x37000000374, - 0x37500000378, - 0x37A0000037E, - 0x37F00000380, - 0x38400000385, - 0x38600000387, - 0x3880000038B, - 0x38C0000038D, - 0x38E000003A2, - 0x3A3000003E2, - 0x3F000000400, - 0x1D2600001D2B, - 0x1D5D00001D62, - 0x1D6600001D6B, - 0x1DBF00001DC0, - 0x1F0000001F16, - 0x1F1800001F1E, - 0x1F2000001F46, - 0x1F4800001F4E, - 0x1F5000001F58, - 0x1F5900001F5A, - 0x1F5B00001F5C, - 0x1F5D00001F5E, - 0x1F5F00001F7E, - 0x1F8000001FB5, - 0x1FB600001FC5, - 0x1FC600001FD4, - 0x1FD600001FDC, - 0x1FDD00001FF0, - 0x1FF200001FF5, - 0x1FF600001FFF, - 0x212600002127, - 0xAB650000AB66, - 0x101400001018F, - 0x101A0000101A1, - 0x1D2000001D246, - ), - "Han": ( - 0x2E8000002E9A, - 0x2E9B00002EF4, - 0x2F0000002FD6, - 0x300500003006, - 0x300700003008, - 0x30210000302A, - 0x30380000303C, - 0x340000004DC0, - 0x4E000000A000, - 0xF9000000FA6E, - 0xFA700000FADA, - 0x16FE200016FE4, - 0x16FF000016FF7, - 0x200000002A6E0, - 0x2A7000002B81E, - 0x2B8200002CEAE, - 0x2CEB00002EBE1, - 0x2EBF00002EE5E, - 0x2F8000002FA1E, - 0x300000003134B, - 0x313500003347A, - ), - "Hebrew": ( - 0x591000005C8, - 0x5D0000005EB, - 0x5EF000005F5, - 0xFB1D0000FB37, - 0xFB380000FB3D, - 0xFB3E0000FB3F, - 0xFB400000FB42, - 0xFB430000FB45, - 0xFB460000FB50, - ), - "Hiragana": ( - 0x304100003097, - 0x309D000030A0, - 0x1B0010001B120, - 0x1B1320001B133, - 0x1B1500001B153, - 0x1F2000001F201, - ), - "Katakana": ( - 0x30A1000030FB, - 0x30FD00003100, - 0x31F000003200, - 0x32D0000032FF, - 0x330000003358, - 0xFF660000FF70, - 0xFF710000FF9E, - 0x1AFF00001AFF4, - 0x1AFF50001AFFC, - 0x1AFFD0001AFFF, - 0x1B0000001B001, - 0x1B1200001B123, - 0x1B1550001B156, - 0x1B1640001B168, - ), -} - - -joining_types = { - "C": ( - 0x64000000641, - 0x7FA000007FB, - 0x88300000886, - 0x180A0000180B, - 0x200D0000200E, - ), - "D": ( - 0x62000000621, - 0x62600000627, - 0x62800000629, - 0x62A0000062F, - 0x63300000640, - 0x64100000648, - 0x6490000064B, - 0x66E00000670, - 0x67800000688, - 0x69A000006C0, - 0x6C1000006C3, - 0x6CC000006CD, - 0x6CE000006CF, - 0x6D0000006D2, - 0x6FA000006FD, - 0x6FF00000700, - 0x71200000715, - 0x71A0000071E, - 0x71F00000728, - 0x7290000072A, - 0x72B0000072C, - 0x72D0000072F, - 0x74E00000759, - 0x75C0000076B, - 0x76D00000771, - 0x77200000773, - 0x77500000778, - 0x77A00000780, - 0x7CA000007EB, - 0x84100000846, - 0x84800000849, - 0x84A00000854, - 0x85500000856, - 0x86000000861, - 0x86200000866, - 0x86800000869, - 0x88600000887, - 0x8890000088E, - 0x88F00000890, - 0x8A0000008AA, - 0x8AF000008B1, - 0x8B3000008B9, - 0x8BA000008C9, - 0x180700001808, - 0x182000001879, - 0x1887000018A9, - 0x18AA000018AB, - 0xA8400000A872, - 0x10AC000010AC5, - 0x10AD300010AD7, - 0x10AD800010ADD, - 0x10ADE00010AE1, - 0x10AEB00010AEF, - 0x10B8000010B81, - 0x10B8200010B83, - 0x10B8600010B89, - 0x10B8A00010B8C, - 0x10B8D00010B8E, - 0x10B9000010B91, - 0x10BAD00010BAF, - 0x10D0100010D22, - 0x10D2300010D24, - 0x10EC300010EC5, - 0x10EC600010EC8, - 0x10F3000010F33, - 0x10F3400010F45, - 0x10F5100010F54, - 0x10F7000010F74, - 0x10F7600010F82, - 0x10FB000010FB1, - 0x10FB200010FB4, - 0x10FB800010FB9, - 0x10FBB00010FBD, - 0x10FBE00010FC0, - 0x10FC100010FC2, - 0x10FC400010FC5, - 0x10FCA00010FCB, - 0x1E9000001E944, - ), - "L": ( - 0xA8720000A873, - 0x10ACD00010ACE, - 0x10AD700010AD8, - 0x10D0000010D01, - 0x10FCB00010FCC, - ), - "R": ( - 0x62200000626, - 0x62700000628, - 0x6290000062A, - 0x62F00000633, - 0x64800000649, - 0x67100000674, - 0x67500000678, - 0x6880000069A, - 0x6C0000006C1, - 0x6C3000006CC, - 0x6CD000006CE, - 0x6CF000006D0, - 0x6D2000006D4, - 0x6D5000006D6, - 0x6EE000006F0, - 0x71000000711, - 0x7150000071A, - 0x71E0000071F, - 0x72800000729, - 0x72A0000072B, - 0x72C0000072D, - 0x72F00000730, - 0x74D0000074E, - 0x7590000075C, - 0x76B0000076D, - 0x77100000772, - 0x77300000775, - 0x7780000077A, - 0x84000000841, - 0x84600000848, - 0x8490000084A, - 0x85400000855, - 0x85600000859, - 0x86700000868, - 0x8690000086B, - 0x87000000883, - 0x88E0000088F, - 0x8AA000008AD, - 0x8AE000008AF, - 0x8B1000008B3, - 0x8B9000008BA, - 0x10AC500010AC6, - 0x10AC700010AC8, - 0x10AC900010ACB, - 0x10ACE00010AD3, - 0x10ADD00010ADE, - 0x10AE100010AE2, - 0x10AE400010AE5, - 0x10AEF00010AF0, - 0x10B8100010B82, - 0x10B8300010B86, - 0x10B8900010B8A, - 0x10B8C00010B8D, - 0x10B8E00010B90, - 0x10B9100010B92, - 0x10BA900010BAD, - 0x10D2200010D23, - 0x10EC200010EC3, - 0x10F3300010F34, - 0x10F5400010F55, - 0x10F7400010F76, - 0x10FB400010FB7, - 0x10FB900010FBB, - 0x10FBD00010FBE, - 0x10FC200010FC4, - 0x10FC900010FCA, - ), - "T": ( - 0xAD000000AE, - 0x30000000370, - 0x4830000048A, - 0x591000005BE, - 0x5BF000005C0, - 0x5C1000005C3, - 0x5C4000005C6, - 0x5C7000005C8, - 0x6100000061B, - 0x61C0000061D, - 0x64B00000660, - 0x67000000671, - 0x6D6000006DD, - 0x6DF000006E5, - 0x6E7000006E9, - 0x6EA000006EE, - 0x70F00000710, - 0x71100000712, - 0x7300000074B, - 0x7A6000007B1, - 0x7EB000007F4, - 0x7FD000007FE, - 0x8160000081A, - 0x81B00000824, - 0x82500000828, - 0x8290000082E, - 0x8590000085C, - 0x897000008A0, - 0x8CA000008E2, - 0x8E300000903, - 0x93A0000093B, - 0x93C0000093D, - 0x94100000949, - 0x94D0000094E, - 0x95100000958, - 0x96200000964, - 0x98100000982, - 0x9BC000009BD, - 0x9C1000009C5, - 0x9CD000009CE, - 0x9E2000009E4, - 0x9FE000009FF, - 0xA0100000A03, - 0xA3C00000A3D, - 0xA4100000A43, - 0xA4700000A49, - 0xA4B00000A4E, - 0xA5100000A52, - 0xA7000000A72, - 0xA7500000A76, - 0xA8100000A83, - 0xABC00000ABD, - 0xAC100000AC6, - 0xAC700000AC9, - 0xACD00000ACE, - 0xAE200000AE4, - 0xAFA00000B00, - 0xB0100000B02, - 0xB3C00000B3D, - 0xB3F00000B40, - 0xB4100000B45, - 0xB4D00000B4E, - 0xB5500000B57, - 0xB6200000B64, - 0xB8200000B83, - 0xBC000000BC1, - 0xBCD00000BCE, - 0xC0000000C01, - 0xC0400000C05, - 0xC3C00000C3D, - 0xC3E00000C41, - 0xC4600000C49, - 0xC4A00000C4E, - 0xC5500000C57, - 0xC6200000C64, - 0xC8100000C82, - 0xCBC00000CBD, - 0xCBF00000CC0, - 0xCC600000CC7, - 0xCCC00000CCE, - 0xCE200000CE4, - 0xD0000000D02, - 0xD3B00000D3D, - 0xD4100000D45, - 0xD4D00000D4E, - 0xD6200000D64, - 0xD8100000D82, - 0xDCA00000DCB, - 0xDD200000DD5, - 0xDD600000DD7, - 0xE3100000E32, - 0xE3400000E3B, - 0xE4700000E4F, - 0xEB100000EB2, - 0xEB400000EBD, - 0xEC800000ECF, - 0xF1800000F1A, - 0xF3500000F36, - 0xF3700000F38, - 0xF3900000F3A, - 0xF7100000F7F, - 0xF8000000F85, - 0xF8600000F88, - 0xF8D00000F98, - 0xF9900000FBD, - 0xFC600000FC7, - 0x102D00001031, - 0x103200001038, - 0x10390000103B, - 0x103D0000103F, - 0x10580000105A, - 0x105E00001061, - 0x107100001075, - 0x108200001083, - 0x108500001087, - 0x108D0000108E, - 0x109D0000109E, - 0x135D00001360, - 0x171200001715, - 0x173200001734, - 0x175200001754, - 0x177200001774, - 0x17B4000017B6, - 0x17B7000017BE, - 0x17C6000017C7, - 0x17C9000017D4, - 0x17DD000017DE, - 0x180B0000180E, - 0x180F00001810, - 0x188500001887, - 0x18A9000018AA, - 0x192000001923, - 0x192700001929, - 0x193200001933, - 0x19390000193C, - 0x1A1700001A19, - 0x1A1B00001A1C, - 0x1A5600001A57, - 0x1A5800001A5F, - 0x1A6000001A61, - 0x1A6200001A63, - 0x1A6500001A6D, - 0x1A7300001A7D, - 0x1A7F00001A80, - 0x1AB000001ADE, - 0x1AE000001AEC, - 0x1B0000001B04, - 0x1B3400001B35, - 0x1B3600001B3B, - 0x1B3C00001B3D, - 0x1B4200001B43, - 0x1B6B00001B74, - 0x1B8000001B82, - 0x1BA200001BA6, - 0x1BA800001BAA, - 0x1BAB00001BAE, - 0x1BE600001BE7, - 0x1BE800001BEA, - 0x1BED00001BEE, - 0x1BEF00001BF2, - 0x1C2C00001C34, - 0x1C3600001C38, - 0x1CD000001CD3, - 0x1CD400001CE1, - 0x1CE200001CE9, - 0x1CED00001CEE, - 0x1CF400001CF5, - 0x1CF800001CFA, - 0x1DC000001E00, - 0x200B0000200C, - 0x200E00002010, - 0x202A0000202F, - 0x206000002065, - 0x206A00002070, - 0x20D0000020F1, - 0x2CEF00002CF2, - 0x2D7F00002D80, - 0x2DE000002E00, - 0x302A0000302E, - 0x30990000309B, - 0xA66F0000A673, - 0xA6740000A67E, - 0xA69E0000A6A0, - 0xA6F00000A6F2, - 0xA8020000A803, - 0xA8060000A807, - 0xA80B0000A80C, - 0xA8250000A827, - 0xA82C0000A82D, - 0xA8C40000A8C6, - 0xA8E00000A8F2, - 0xA8FF0000A900, - 0xA9260000A92E, - 0xA9470000A952, - 0xA9800000A983, - 0xA9B30000A9B4, - 0xA9B60000A9BA, - 0xA9BC0000A9BE, - 0xA9E50000A9E6, - 0xAA290000AA2F, - 0xAA310000AA33, - 0xAA350000AA37, - 0xAA430000AA44, - 0xAA4C0000AA4D, - 0xAA7C0000AA7D, - 0xAAB00000AAB1, - 0xAAB20000AAB5, - 0xAAB70000AAB9, - 0xAABE0000AAC0, - 0xAAC10000AAC2, - 0xAAEC0000AAEE, - 0xAAF60000AAF7, - 0xABE50000ABE6, - 0xABE80000ABE9, - 0xABED0000ABEE, - 0xFB1E0000FB1F, - 0xFE000000FE10, - 0xFE200000FE30, - 0xFEFF0000FF00, - 0xFFF90000FFFC, - 0x101FD000101FE, - 0x102E0000102E1, - 0x103760001037B, - 0x10A0100010A04, - 0x10A0500010A07, - 0x10A0C00010A10, - 0x10A3800010A3B, - 0x10A3F00010A40, - 0x10AE500010AE7, - 0x10D2400010D28, - 0x10D6900010D6E, - 0x10EAB00010EAD, - 0x10EFA00010F00, - 0x10F4600010F51, - 0x10F8200010F86, - 0x1100100011002, - 0x1103800011047, - 0x1107000011071, - 0x1107300011075, - 0x1107F00011082, - 0x110B3000110B7, - 0x110B9000110BB, - 0x110C2000110C3, - 0x1110000011103, - 0x111270001112C, - 0x1112D00011135, - 0x1117300011174, - 0x1118000011182, - 0x111B6000111BF, - 0x111C9000111CD, - 0x111CF000111D0, - 0x1122F00011232, - 0x1123400011235, - 0x1123600011238, - 0x1123E0001123F, - 0x1124100011242, - 0x112DF000112E0, - 0x112E3000112EB, - 0x1130000011302, - 0x1133B0001133D, - 0x1134000011341, - 0x113660001136D, - 0x1137000011375, - 0x113BB000113C1, - 0x113CE000113CF, - 0x113D0000113D1, - 0x113D2000113D3, - 0x113E1000113E3, - 0x1143800011440, - 0x1144200011445, - 0x1144600011447, - 0x1145E0001145F, - 0x114B3000114B9, - 0x114BA000114BB, - 0x114BF000114C1, - 0x114C2000114C4, - 0x115B2000115B6, - 0x115BC000115BE, - 0x115BF000115C1, - 0x115DC000115DE, - 0x116330001163B, - 0x1163D0001163E, - 0x1163F00011641, - 0x116AB000116AC, - 0x116AD000116AE, - 0x116B0000116B6, - 0x116B7000116B8, - 0x1171D0001171E, - 0x1171F00011720, - 0x1172200011726, - 0x117270001172C, - 0x1182F00011838, - 0x118390001183B, - 0x1193B0001193D, - 0x1193E0001193F, - 0x1194300011944, - 0x119D4000119D8, - 0x119DA000119DC, - 0x119E0000119E1, - 0x11A0100011A0B, - 0x11A3300011A39, - 0x11A3B00011A3F, - 0x11A4700011A48, - 0x11A5100011A57, - 0x11A5900011A5C, - 0x11A8A00011A97, - 0x11A9800011A9A, - 0x11B6000011B61, - 0x11B6200011B65, - 0x11B6600011B67, - 0x11C3000011C37, - 0x11C3800011C3E, - 0x11C3F00011C40, - 0x11C9200011CA8, - 0x11CAA00011CB1, - 0x11CB200011CB4, - 0x11CB500011CB7, - 0x11D3100011D37, - 0x11D3A00011D3B, - 0x11D3C00011D3E, - 0x11D3F00011D46, - 0x11D4700011D48, - 0x11D9000011D92, - 0x11D9500011D96, - 0x11D9700011D98, - 0x11EF300011EF5, - 0x11F0000011F02, - 0x11F3600011F3B, - 0x11F4000011F41, - 0x11F4200011F43, - 0x11F5A00011F5B, - 0x1343000013441, - 0x1344700013456, - 0x1611E0001612A, - 0x1612D00016130, - 0x16AF000016AF5, - 0x16B3000016B37, - 0x16F4F00016F50, - 0x16F8F00016F93, - 0x16FE400016FE5, - 0x1BC9D0001BC9F, - 0x1BCA00001BCA4, - 0x1CF000001CF2E, - 0x1CF300001CF47, - 0x1D1670001D16A, - 0x1D1730001D183, - 0x1D1850001D18C, - 0x1D1AA0001D1AE, - 0x1D2420001D245, - 0x1DA000001DA37, - 0x1DA3B0001DA6D, - 0x1DA750001DA76, - 0x1DA840001DA85, - 0x1DA9B0001DAA0, - 0x1DAA10001DAB0, - 0x1E0000001E007, - 0x1E0080001E019, - 0x1E01B0001E022, - 0x1E0230001E025, - 0x1E0260001E02B, - 0x1E08F0001E090, - 0x1E1300001E137, - 0x1E2AE0001E2AF, - 0x1E2EC0001E2F0, - 0x1E4EC0001E4F0, - 0x1E5EE0001E5F0, - 0x1E6E30001E6E4, - 0x1E6E60001E6E7, - 0x1E6EE0001E6F0, - 0x1E6F50001E6F6, - 0x1E8D00001E8D7, - 0x1E9440001E94C, - 0xE0001000E0002, - 0xE0020000E0080, - 0xE0100000E01F0, - ), -} - - -codepoint_classes = { - "PVALID": ( - 0x2D0000002E, - 0x300000003A, - 0x610000007B, - 0xDF000000F7, - 0xF800000100, - 0x10100000102, - 0x10300000104, - 0x10500000106, - 0x10700000108, - 0x1090000010A, - 0x10B0000010C, - 0x10D0000010E, - 0x10F00000110, - 0x11100000112, - 0x11300000114, - 0x11500000116, - 0x11700000118, - 0x1190000011A, - 0x11B0000011C, - 0x11D0000011E, - 0x11F00000120, - 0x12100000122, - 0x12300000124, - 0x12500000126, - 0x12700000128, - 0x1290000012A, - 0x12B0000012C, - 0x12D0000012E, - 0x12F00000130, - 0x13100000132, - 0x13500000136, - 0x13700000139, - 0x13A0000013B, - 0x13C0000013D, - 0x13E0000013F, - 0x14200000143, - 0x14400000145, - 0x14600000147, - 0x14800000149, - 0x14B0000014C, - 0x14D0000014E, - 0x14F00000150, - 0x15100000152, - 0x15300000154, - 0x15500000156, - 0x15700000158, - 0x1590000015A, - 0x15B0000015C, - 0x15D0000015E, - 0x15F00000160, - 0x16100000162, - 0x16300000164, - 0x16500000166, - 0x16700000168, - 0x1690000016A, - 0x16B0000016C, - 0x16D0000016E, - 0x16F00000170, - 0x17100000172, - 0x17300000174, - 0x17500000176, - 0x17700000178, - 0x17A0000017B, - 0x17C0000017D, - 0x17E0000017F, - 0x18000000181, - 0x18300000184, - 0x18500000186, - 0x18800000189, - 0x18C0000018E, - 0x19200000193, - 0x19500000196, - 0x1990000019C, - 0x19E0000019F, - 0x1A1000001A2, - 0x1A3000001A4, - 0x1A5000001A6, - 0x1A8000001A9, - 0x1AA000001AC, - 0x1AD000001AE, - 0x1B0000001B1, - 0x1B4000001B5, - 0x1B6000001B7, - 0x1B9000001BC, - 0x1BD000001C4, - 0x1CE000001CF, - 0x1D0000001D1, - 0x1D2000001D3, - 0x1D4000001D5, - 0x1D6000001D7, - 0x1D8000001D9, - 0x1DA000001DB, - 0x1DC000001DE, - 0x1DF000001E0, - 0x1E1000001E2, - 0x1E3000001E4, - 0x1E5000001E6, - 0x1E7000001E8, - 0x1E9000001EA, - 0x1EB000001EC, - 0x1ED000001EE, - 0x1EF000001F1, - 0x1F5000001F6, - 0x1F9000001FA, - 0x1FB000001FC, - 0x1FD000001FE, - 0x1FF00000200, - 0x20100000202, - 0x20300000204, - 0x20500000206, - 0x20700000208, - 0x2090000020A, - 0x20B0000020C, - 0x20D0000020E, - 0x20F00000210, - 0x21100000212, - 0x21300000214, - 0x21500000216, - 0x21700000218, - 0x2190000021A, - 0x21B0000021C, - 0x21D0000021E, - 0x21F00000220, - 0x22100000222, - 0x22300000224, - 0x22500000226, - 0x22700000228, - 0x2290000022A, - 0x22B0000022C, - 0x22D0000022E, - 0x22F00000230, - 0x23100000232, - 0x2330000023A, - 0x23C0000023D, - 0x23F00000241, - 0x24200000243, - 0x24700000248, - 0x2490000024A, - 0x24B0000024C, - 0x24D0000024E, - 0x24F000002B0, - 0x2B9000002C2, - 0x2C6000002D2, - 0x2EC000002ED, - 0x2EE000002EF, - 0x30000000340, - 0x34200000343, - 0x3460000034F, - 0x35000000370, - 0x37100000372, - 0x37300000374, - 0x37700000378, - 0x37B0000037E, - 0x39000000391, - 0x3AC000003CF, - 0x3D7000003D8, - 0x3D9000003DA, - 0x3DB000003DC, - 0x3DD000003DE, - 0x3DF000003E0, - 0x3E1000003E2, - 0x3E3000003E4, - 0x3E5000003E6, - 0x3E7000003E8, - 0x3E9000003EA, - 0x3EB000003EC, - 0x3ED000003EE, - 0x3EF000003F0, - 0x3F3000003F4, - 0x3F8000003F9, - 0x3FB000003FD, - 0x43000000460, - 0x46100000462, - 0x46300000464, - 0x46500000466, - 0x46700000468, - 0x4690000046A, - 0x46B0000046C, - 0x46D0000046E, - 0x46F00000470, - 0x47100000472, - 0x47300000474, - 0x47500000476, - 0x47700000478, - 0x4790000047A, - 0x47B0000047C, - 0x47D0000047E, - 0x47F00000480, - 0x48100000482, - 0x48300000488, - 0x48B0000048C, - 0x48D0000048E, - 0x48F00000490, - 0x49100000492, - 0x49300000494, - 0x49500000496, - 0x49700000498, - 0x4990000049A, - 0x49B0000049C, - 0x49D0000049E, - 0x49F000004A0, - 0x4A1000004A2, - 0x4A3000004A4, - 0x4A5000004A6, - 0x4A7000004A8, - 0x4A9000004AA, - 0x4AB000004AC, - 0x4AD000004AE, - 0x4AF000004B0, - 0x4B1000004B2, - 0x4B3000004B4, - 0x4B5000004B6, - 0x4B7000004B8, - 0x4B9000004BA, - 0x4BB000004BC, - 0x4BD000004BE, - 0x4BF000004C0, - 0x4C2000004C3, - 0x4C4000004C5, - 0x4C6000004C7, - 0x4C8000004C9, - 0x4CA000004CB, - 0x4CC000004CD, - 0x4CE000004D0, - 0x4D1000004D2, - 0x4D3000004D4, - 0x4D5000004D6, - 0x4D7000004D8, - 0x4D9000004DA, - 0x4DB000004DC, - 0x4DD000004DE, - 0x4DF000004E0, - 0x4E1000004E2, - 0x4E3000004E4, - 0x4E5000004E6, - 0x4E7000004E8, - 0x4E9000004EA, - 0x4EB000004EC, - 0x4ED000004EE, - 0x4EF000004F0, - 0x4F1000004F2, - 0x4F3000004F4, - 0x4F5000004F6, - 0x4F7000004F8, - 0x4F9000004FA, - 0x4FB000004FC, - 0x4FD000004FE, - 0x4FF00000500, - 0x50100000502, - 0x50300000504, - 0x50500000506, - 0x50700000508, - 0x5090000050A, - 0x50B0000050C, - 0x50D0000050E, - 0x50F00000510, - 0x51100000512, - 0x51300000514, - 0x51500000516, - 0x51700000518, - 0x5190000051A, - 0x51B0000051C, - 0x51D0000051E, - 0x51F00000520, - 0x52100000522, - 0x52300000524, - 0x52500000526, - 0x52700000528, - 0x5290000052A, - 0x52B0000052C, - 0x52D0000052E, - 0x52F00000530, - 0x5590000055A, - 0x56000000587, - 0x58800000589, - 0x591000005BE, - 0x5BF000005C0, - 0x5C1000005C3, - 0x5C4000005C6, - 0x5C7000005C8, - 0x5D0000005EB, - 0x5EF000005F3, - 0x6100000061B, - 0x62000000640, - 0x64100000660, - 0x66E00000675, - 0x679000006D4, - 0x6D5000006DD, - 0x6DF000006E9, - 0x6EA000006F0, - 0x6FA00000700, - 0x7100000074B, - 0x74D000007B2, - 0x7C0000007F6, - 0x7FD000007FE, - 0x8000000082E, - 0x8400000085C, - 0x8600000086B, - 0x87000000888, - 0x88900000890, - 0x897000008E2, - 0x8E300000958, - 0x96000000964, - 0x96600000970, - 0x97100000984, - 0x9850000098D, - 0x98F00000991, - 0x993000009A9, - 0x9AA000009B1, - 0x9B2000009B3, - 0x9B6000009BA, - 0x9BC000009C5, - 0x9C7000009C9, - 0x9CB000009CF, - 0x9D7000009D8, - 0x9E0000009E4, - 0x9E6000009F2, - 0x9FC000009FD, - 0x9FE000009FF, - 0xA0100000A04, - 0xA0500000A0B, - 0xA0F00000A11, - 0xA1300000A29, - 0xA2A00000A31, - 0xA3200000A33, - 0xA3500000A36, - 0xA3800000A3A, - 0xA3C00000A3D, - 0xA3E00000A43, - 0xA4700000A49, - 0xA4B00000A4E, - 0xA5100000A52, - 0xA5C00000A5D, - 0xA6600000A76, - 0xA8100000A84, - 0xA8500000A8E, - 0xA8F00000A92, - 0xA9300000AA9, - 0xAAA00000AB1, - 0xAB200000AB4, - 0xAB500000ABA, - 0xABC00000AC6, - 0xAC700000ACA, - 0xACB00000ACE, - 0xAD000000AD1, - 0xAE000000AE4, - 0xAE600000AF0, - 0xAF900000B00, - 0xB0100000B04, - 0xB0500000B0D, - 0xB0F00000B11, - 0xB1300000B29, - 0xB2A00000B31, - 0xB3200000B34, - 0xB3500000B3A, - 0xB3C00000B45, - 0xB4700000B49, - 0xB4B00000B4E, - 0xB5500000B58, - 0xB5F00000B64, - 0xB6600000B70, - 0xB7100000B72, - 0xB8200000B84, - 0xB8500000B8B, - 0xB8E00000B91, - 0xB9200000B96, - 0xB9900000B9B, - 0xB9C00000B9D, - 0xB9E00000BA0, - 0xBA300000BA5, - 0xBA800000BAB, - 0xBAE00000BBA, - 0xBBE00000BC3, - 0xBC600000BC9, - 0xBCA00000BCE, - 0xBD000000BD1, - 0xBD700000BD8, - 0xBE600000BF0, - 0xC0000000C0D, - 0xC0E00000C11, - 0xC1200000C29, - 0xC2A00000C3A, - 0xC3C00000C45, - 0xC4600000C49, - 0xC4A00000C4E, - 0xC5500000C57, - 0xC5800000C5B, - 0xC5C00000C5E, - 0xC6000000C64, - 0xC6600000C70, - 0xC8000000C84, - 0xC8500000C8D, - 0xC8E00000C91, - 0xC9200000CA9, - 0xCAA00000CB4, - 0xCB500000CBA, - 0xCBC00000CC5, - 0xCC600000CC9, - 0xCCA00000CCE, - 0xCD500000CD7, - 0xCDC00000CDF, - 0xCE000000CE4, - 0xCE600000CF0, - 0xCF100000CF4, - 0xD0000000D0D, - 0xD0E00000D11, - 0xD1200000D45, - 0xD4600000D49, - 0xD4A00000D4F, - 0xD5400000D58, - 0xD5F00000D64, - 0xD6600000D70, - 0xD7A00000D80, - 0xD8100000D84, - 0xD8500000D97, - 0xD9A00000DB2, - 0xDB300000DBC, - 0xDBD00000DBE, - 0xDC000000DC7, - 0xDCA00000DCB, - 0xDCF00000DD5, - 0xDD600000DD7, - 0xDD800000DE0, - 0xDE600000DF0, - 0xDF200000DF4, - 0xE0100000E33, - 0xE3400000E3B, - 0xE4000000E4F, - 0xE5000000E5A, - 0xE8100000E83, - 0xE8400000E85, - 0xE8600000E8B, - 0xE8C00000EA4, - 0xEA500000EA6, - 0xEA700000EB3, - 0xEB400000EBE, - 0xEC000000EC5, - 0xEC600000EC7, - 0xEC800000ECF, - 0xED000000EDA, - 0xEDE00000EE0, - 0xF0000000F01, - 0xF0B00000F0C, - 0xF1800000F1A, - 0xF2000000F2A, - 0xF3500000F36, - 0xF3700000F38, - 0xF3900000F3A, - 0xF3E00000F43, - 0xF4400000F48, - 0xF4900000F4D, - 0xF4E00000F52, - 0xF5300000F57, - 0xF5800000F5C, - 0xF5D00000F69, - 0xF6A00000F6D, - 0xF7100000F73, - 0xF7400000F75, - 0xF7A00000F81, - 0xF8200000F85, - 0xF8600000F93, - 0xF9400000F98, - 0xF9900000F9D, - 0xF9E00000FA2, - 0xFA300000FA7, - 0xFA800000FAC, - 0xFAD00000FB9, - 0xFBA00000FBD, - 0xFC600000FC7, - 0x10000000104A, - 0x10500000109E, - 0x10D0000010FB, - 0x10FD00001100, - 0x120000001249, - 0x124A0000124E, - 0x125000001257, - 0x125800001259, - 0x125A0000125E, - 0x126000001289, - 0x128A0000128E, - 0x1290000012B1, - 0x12B2000012B6, - 0x12B8000012BF, - 0x12C0000012C1, - 0x12C2000012C6, - 0x12C8000012D7, - 0x12D800001311, - 0x131200001316, - 0x13180000135B, - 0x135D00001360, - 0x138000001390, - 0x13A0000013F6, - 0x14010000166D, - 0x166F00001680, - 0x16810000169B, - 0x16A0000016EB, - 0x16F1000016F9, - 0x170000001716, - 0x171F00001735, - 0x174000001754, - 0x17600000176D, - 0x176E00001771, - 0x177200001774, - 0x1780000017B4, - 0x17B6000017D4, - 0x17D7000017D8, - 0x17DC000017DE, - 0x17E0000017EA, - 0x18100000181A, - 0x182000001879, - 0x1880000018AB, - 0x18B0000018F6, - 0x19000000191F, - 0x19200000192C, - 0x19300000193C, - 0x19460000196E, - 0x197000001975, - 0x1980000019AC, - 0x19B0000019CA, - 0x19D0000019DA, - 0x1A0000001A1C, - 0x1A2000001A5F, - 0x1A6000001A7D, - 0x1A7F00001A8A, - 0x1A9000001A9A, - 0x1AA700001AA8, - 0x1AB000001ABE, - 0x1ABF00001ADE, - 0x1AE000001AEC, - 0x1B0000001B4D, - 0x1B5000001B5A, - 0x1B6B00001B74, - 0x1B8000001BF4, - 0x1C0000001C38, - 0x1C4000001C4A, - 0x1C4D00001C7E, - 0x1C8A00001C8B, - 0x1CD000001CD3, - 0x1CD400001CFB, - 0x1D0000001D2C, - 0x1D2F00001D30, - 0x1D3B00001D3C, - 0x1D4E00001D4F, - 0x1D6B00001D78, - 0x1D7900001D9B, - 0x1DC000001E00, - 0x1E0100001E02, - 0x1E0300001E04, - 0x1E0500001E06, - 0x1E0700001E08, - 0x1E0900001E0A, - 0x1E0B00001E0C, - 0x1E0D00001E0E, - 0x1E0F00001E10, - 0x1E1100001E12, - 0x1E1300001E14, - 0x1E1500001E16, - 0x1E1700001E18, - 0x1E1900001E1A, - 0x1E1B00001E1C, - 0x1E1D00001E1E, - 0x1E1F00001E20, - 0x1E2100001E22, - 0x1E2300001E24, - 0x1E2500001E26, - 0x1E2700001E28, - 0x1E2900001E2A, - 0x1E2B00001E2C, - 0x1E2D00001E2E, - 0x1E2F00001E30, - 0x1E3100001E32, - 0x1E3300001E34, - 0x1E3500001E36, - 0x1E3700001E38, - 0x1E3900001E3A, - 0x1E3B00001E3C, - 0x1E3D00001E3E, - 0x1E3F00001E40, - 0x1E4100001E42, - 0x1E4300001E44, - 0x1E4500001E46, - 0x1E4700001E48, - 0x1E4900001E4A, - 0x1E4B00001E4C, - 0x1E4D00001E4E, - 0x1E4F00001E50, - 0x1E5100001E52, - 0x1E5300001E54, - 0x1E5500001E56, - 0x1E5700001E58, - 0x1E5900001E5A, - 0x1E5B00001E5C, - 0x1E5D00001E5E, - 0x1E5F00001E60, - 0x1E6100001E62, - 0x1E6300001E64, - 0x1E6500001E66, - 0x1E6700001E68, - 0x1E6900001E6A, - 0x1E6B00001E6C, - 0x1E6D00001E6E, - 0x1E6F00001E70, - 0x1E7100001E72, - 0x1E7300001E74, - 0x1E7500001E76, - 0x1E7700001E78, - 0x1E7900001E7A, - 0x1E7B00001E7C, - 0x1E7D00001E7E, - 0x1E7F00001E80, - 0x1E8100001E82, - 0x1E8300001E84, - 0x1E8500001E86, - 0x1E8700001E88, - 0x1E8900001E8A, - 0x1E8B00001E8C, - 0x1E8D00001E8E, - 0x1E8F00001E90, - 0x1E9100001E92, - 0x1E9300001E94, - 0x1E9500001E9A, - 0x1E9C00001E9E, - 0x1E9F00001EA0, - 0x1EA100001EA2, - 0x1EA300001EA4, - 0x1EA500001EA6, - 0x1EA700001EA8, - 0x1EA900001EAA, - 0x1EAB00001EAC, - 0x1EAD00001EAE, - 0x1EAF00001EB0, - 0x1EB100001EB2, - 0x1EB300001EB4, - 0x1EB500001EB6, - 0x1EB700001EB8, - 0x1EB900001EBA, - 0x1EBB00001EBC, - 0x1EBD00001EBE, - 0x1EBF00001EC0, - 0x1EC100001EC2, - 0x1EC300001EC4, - 0x1EC500001EC6, - 0x1EC700001EC8, - 0x1EC900001ECA, - 0x1ECB00001ECC, - 0x1ECD00001ECE, - 0x1ECF00001ED0, - 0x1ED100001ED2, - 0x1ED300001ED4, - 0x1ED500001ED6, - 0x1ED700001ED8, - 0x1ED900001EDA, - 0x1EDB00001EDC, - 0x1EDD00001EDE, - 0x1EDF00001EE0, - 0x1EE100001EE2, - 0x1EE300001EE4, - 0x1EE500001EE6, - 0x1EE700001EE8, - 0x1EE900001EEA, - 0x1EEB00001EEC, - 0x1EED00001EEE, - 0x1EEF00001EF0, - 0x1EF100001EF2, - 0x1EF300001EF4, - 0x1EF500001EF6, - 0x1EF700001EF8, - 0x1EF900001EFA, - 0x1EFB00001EFC, - 0x1EFD00001EFE, - 0x1EFF00001F08, - 0x1F1000001F16, - 0x1F2000001F28, - 0x1F3000001F38, - 0x1F4000001F46, - 0x1F5000001F58, - 0x1F6000001F68, - 0x1F7000001F71, - 0x1F7200001F73, - 0x1F7400001F75, - 0x1F7600001F77, - 0x1F7800001F79, - 0x1F7A00001F7B, - 0x1F7C00001F7D, - 0x1FB000001FB2, - 0x1FB600001FB7, - 0x1FC600001FC7, - 0x1FD000001FD3, - 0x1FD600001FD8, - 0x1FE000001FE3, - 0x1FE400001FE8, - 0x1FF600001FF7, - 0x214E0000214F, - 0x218400002185, - 0x2C3000002C60, - 0x2C6100002C62, - 0x2C6500002C67, - 0x2C6800002C69, - 0x2C6A00002C6B, - 0x2C6C00002C6D, - 0x2C7100002C72, - 0x2C7300002C75, - 0x2C7600002C7C, - 0x2C8100002C82, - 0x2C8300002C84, - 0x2C8500002C86, - 0x2C8700002C88, - 0x2C8900002C8A, - 0x2C8B00002C8C, - 0x2C8D00002C8E, - 0x2C8F00002C90, - 0x2C9100002C92, - 0x2C9300002C94, - 0x2C9500002C96, - 0x2C9700002C98, - 0x2C9900002C9A, - 0x2C9B00002C9C, - 0x2C9D00002C9E, - 0x2C9F00002CA0, - 0x2CA100002CA2, - 0x2CA300002CA4, - 0x2CA500002CA6, - 0x2CA700002CA8, - 0x2CA900002CAA, - 0x2CAB00002CAC, - 0x2CAD00002CAE, - 0x2CAF00002CB0, - 0x2CB100002CB2, - 0x2CB300002CB4, - 0x2CB500002CB6, - 0x2CB700002CB8, - 0x2CB900002CBA, - 0x2CBB00002CBC, - 0x2CBD00002CBE, - 0x2CBF00002CC0, - 0x2CC100002CC2, - 0x2CC300002CC4, - 0x2CC500002CC6, - 0x2CC700002CC8, - 0x2CC900002CCA, - 0x2CCB00002CCC, - 0x2CCD00002CCE, - 0x2CCF00002CD0, - 0x2CD100002CD2, - 0x2CD300002CD4, - 0x2CD500002CD6, - 0x2CD700002CD8, - 0x2CD900002CDA, - 0x2CDB00002CDC, - 0x2CDD00002CDE, - 0x2CDF00002CE0, - 0x2CE100002CE2, - 0x2CE300002CE5, - 0x2CEC00002CED, - 0x2CEE00002CF2, - 0x2CF300002CF4, - 0x2D0000002D26, - 0x2D2700002D28, - 0x2D2D00002D2E, - 0x2D3000002D68, - 0x2D7F00002D97, - 0x2DA000002DA7, - 0x2DA800002DAF, - 0x2DB000002DB7, - 0x2DB800002DBF, - 0x2DC000002DC7, - 0x2DC800002DCF, - 0x2DD000002DD7, - 0x2DD800002DDF, - 0x2DE000002E00, - 0x2E2F00002E30, - 0x300500003008, - 0x302A0000302E, - 0x303C0000303D, - 0x304100003097, - 0x30990000309B, - 0x309D0000309F, - 0x30A1000030FB, - 0x30FC000030FF, - 0x310500003130, - 0x31A0000031C0, - 0x31F000003200, - 0x340000004DC0, - 0x4E000000A48D, - 0xA4D00000A4FE, - 0xA5000000A60D, - 0xA6100000A62C, - 0xA6410000A642, - 0xA6430000A644, - 0xA6450000A646, - 0xA6470000A648, - 0xA6490000A64A, - 0xA64B0000A64C, - 0xA64D0000A64E, - 0xA64F0000A650, - 0xA6510000A652, - 0xA6530000A654, - 0xA6550000A656, - 0xA6570000A658, - 0xA6590000A65A, - 0xA65B0000A65C, - 0xA65D0000A65E, - 0xA65F0000A660, - 0xA6610000A662, - 0xA6630000A664, - 0xA6650000A666, - 0xA6670000A668, - 0xA6690000A66A, - 0xA66B0000A66C, - 0xA66D0000A670, - 0xA6740000A67E, - 0xA67F0000A680, - 0xA6810000A682, - 0xA6830000A684, - 0xA6850000A686, - 0xA6870000A688, - 0xA6890000A68A, - 0xA68B0000A68C, - 0xA68D0000A68E, - 0xA68F0000A690, - 0xA6910000A692, - 0xA6930000A694, - 0xA6950000A696, - 0xA6970000A698, - 0xA6990000A69A, - 0xA69B0000A69C, - 0xA69E0000A6E6, - 0xA6F00000A6F2, - 0xA7170000A720, - 0xA7230000A724, - 0xA7250000A726, - 0xA7270000A728, - 0xA7290000A72A, - 0xA72B0000A72C, - 0xA72D0000A72E, - 0xA72F0000A732, - 0xA7330000A734, - 0xA7350000A736, - 0xA7370000A738, - 0xA7390000A73A, - 0xA73B0000A73C, - 0xA73D0000A73E, - 0xA73F0000A740, - 0xA7410000A742, - 0xA7430000A744, - 0xA7450000A746, - 0xA7470000A748, - 0xA7490000A74A, - 0xA74B0000A74C, - 0xA74D0000A74E, - 0xA74F0000A750, - 0xA7510000A752, - 0xA7530000A754, - 0xA7550000A756, - 0xA7570000A758, - 0xA7590000A75A, - 0xA75B0000A75C, - 0xA75D0000A75E, - 0xA75F0000A760, - 0xA7610000A762, - 0xA7630000A764, - 0xA7650000A766, - 0xA7670000A768, - 0xA7690000A76A, - 0xA76B0000A76C, - 0xA76D0000A76E, - 0xA76F0000A770, - 0xA7710000A779, - 0xA77A0000A77B, - 0xA77C0000A77D, - 0xA77F0000A780, - 0xA7810000A782, - 0xA7830000A784, - 0xA7850000A786, - 0xA7870000A789, - 0xA78C0000A78D, - 0xA78E0000A790, - 0xA7910000A792, - 0xA7930000A796, - 0xA7970000A798, - 0xA7990000A79A, - 0xA79B0000A79C, - 0xA79D0000A79E, - 0xA79F0000A7A0, - 0xA7A10000A7A2, - 0xA7A30000A7A4, - 0xA7A50000A7A6, - 0xA7A70000A7A8, - 0xA7A90000A7AA, - 0xA7AF0000A7B0, - 0xA7B50000A7B6, - 0xA7B70000A7B8, - 0xA7B90000A7BA, - 0xA7BB0000A7BC, - 0xA7BD0000A7BE, - 0xA7BF0000A7C0, - 0xA7C10000A7C2, - 0xA7C30000A7C4, - 0xA7C80000A7C9, - 0xA7CA0000A7CB, - 0xA7CD0000A7CE, - 0xA7CF0000A7D0, - 0xA7D10000A7D2, - 0xA7D30000A7D4, - 0xA7D50000A7D6, - 0xA7D70000A7D8, - 0xA7D90000A7DA, - 0xA7DB0000A7DC, - 0xA7F60000A7F8, - 0xA7FA0000A828, - 0xA82C0000A82D, - 0xA8400000A874, - 0xA8800000A8C6, - 0xA8D00000A8DA, - 0xA8E00000A8F8, - 0xA8FB0000A8FC, - 0xA8FD0000A92E, - 0xA9300000A954, - 0xA9800000A9C1, - 0xA9CF0000A9DA, - 0xA9E00000A9FF, - 0xAA000000AA37, - 0xAA400000AA4E, - 0xAA500000AA5A, - 0xAA600000AA77, - 0xAA7A0000AAC3, - 0xAADB0000AADE, - 0xAAE00000AAF0, - 0xAAF20000AAF7, - 0xAB010000AB07, - 0xAB090000AB0F, - 0xAB110000AB17, - 0xAB200000AB27, - 0xAB280000AB2F, - 0xAB300000AB5B, - 0xAB600000AB69, - 0xABC00000ABEB, - 0xABEC0000ABEE, - 0xABF00000ABFA, - 0xAC000000D7A4, - 0xFA0E0000FA10, - 0xFA110000FA12, - 0xFA130000FA15, - 0xFA1F0000FA20, - 0xFA210000FA22, - 0xFA230000FA25, - 0xFA270000FA2A, - 0xFB1E0000FB1F, - 0xFE200000FE30, - 0xFE730000FE74, - 0x100000001000C, - 0x1000D00010027, - 0x100280001003B, - 0x1003C0001003E, - 0x1003F0001004E, - 0x100500001005E, - 0x10080000100FB, - 0x101FD000101FE, - 0x102800001029D, - 0x102A0000102D1, - 0x102E0000102E1, - 0x1030000010320, - 0x1032D00010341, - 0x103420001034A, - 0x103500001037B, - 0x103800001039E, - 0x103A0000103C4, - 0x103C8000103D0, - 0x104280001049E, - 0x104A0000104AA, - 0x104D8000104FC, - 0x1050000010528, - 0x1053000010564, - 0x10597000105A2, - 0x105A3000105B2, - 0x105B3000105BA, - 0x105BB000105BD, - 0x105C0000105F4, - 0x1060000010737, - 0x1074000010756, - 0x1076000010768, - 0x1078000010781, - 0x1080000010806, - 0x1080800010809, - 0x1080A00010836, - 0x1083700010839, - 0x1083C0001083D, - 0x1083F00010856, - 0x1086000010877, - 0x108800001089F, - 0x108E0000108F3, - 0x108F4000108F6, - 0x1090000010916, - 0x109200001093A, - 0x109400001095A, - 0x10980000109B8, - 0x109BE000109C0, - 0x10A0000010A04, - 0x10A0500010A07, - 0x10A0C00010A14, - 0x10A1500010A18, - 0x10A1900010A36, - 0x10A3800010A3B, - 0x10A3F00010A40, - 0x10A6000010A7D, - 0x10A8000010A9D, - 0x10AC000010AC8, - 0x10AC900010AE7, - 0x10B0000010B36, - 0x10B4000010B56, - 0x10B6000010B73, - 0x10B8000010B92, - 0x10C0000010C49, - 0x10CC000010CF3, - 0x10D0000010D28, - 0x10D3000010D3A, - 0x10D4000010D50, - 0x10D6900010D6E, - 0x10D6F00010D86, - 0x10E8000010EAA, - 0x10EAB00010EAD, - 0x10EB000010EB2, - 0x10EC200010EC8, - 0x10EFA00010F1D, - 0x10F2700010F28, - 0x10F3000010F51, - 0x10F7000010F86, - 0x10FB000010FC5, - 0x10FE000010FF7, - 0x1100000011047, - 0x1106600011076, - 0x1107F000110BB, - 0x110C2000110C3, - 0x110D0000110E9, - 0x110F0000110FA, - 0x1110000011135, - 0x1113600011140, - 0x1114400011148, - 0x1115000011174, - 0x1117600011177, - 0x11180000111C5, - 0x111C9000111CD, - 0x111CE000111DB, - 0x111DC000111DD, - 0x1120000011212, - 0x1121300011238, - 0x1123E00011242, - 0x1128000011287, - 0x1128800011289, - 0x1128A0001128E, - 0x1128F0001129E, - 0x1129F000112A9, - 0x112B0000112EB, - 0x112F0000112FA, - 0x1130000011304, - 0x113050001130D, - 0x1130F00011311, - 0x1131300011329, - 0x1132A00011331, - 0x1133200011334, - 0x113350001133A, - 0x1133B00011345, - 0x1134700011349, - 0x1134B0001134E, - 0x1135000011351, - 0x1135700011358, - 0x1135D00011364, - 0x113660001136D, - 0x1137000011375, - 0x113800001138A, - 0x1138B0001138C, - 0x1138E0001138F, - 0x11390000113B6, - 0x113B7000113C1, - 0x113C2000113C3, - 0x113C5000113C6, - 0x113C7000113CB, - 0x113CC000113D4, - 0x113E1000113E3, - 0x114000001144B, - 0x114500001145A, - 0x1145E00011462, - 0x11480000114C6, - 0x114C7000114C8, - 0x114D0000114DA, - 0x11580000115B6, - 0x115B8000115C1, - 0x115D8000115DE, - 0x1160000011641, - 0x1164400011645, - 0x116500001165A, - 0x11680000116B9, - 0x116C0000116CA, - 0x116D0000116E4, - 0x117000001171B, - 0x1171D0001172C, - 0x117300001173A, - 0x1174000011747, - 0x118000001183B, - 0x118C0000118EA, - 0x118FF00011907, - 0x119090001190A, - 0x1190C00011914, - 0x1191500011917, - 0x1191800011936, - 0x1193700011939, - 0x1193B00011944, - 0x119500001195A, - 0x119A0000119A8, - 0x119AA000119D8, - 0x119DA000119E2, - 0x119E3000119E5, - 0x11A0000011A3F, - 0x11A4700011A48, - 0x11A5000011A9A, - 0x11A9D00011A9E, - 0x11AB000011AF9, - 0x11B6000011B68, - 0x11BC000011BE1, - 0x11BF000011BFA, - 0x11C0000011C09, - 0x11C0A00011C37, - 0x11C3800011C41, - 0x11C5000011C5A, - 0x11C7200011C90, - 0x11C9200011CA8, - 0x11CA900011CB7, - 0x11D0000011D07, - 0x11D0800011D0A, - 0x11D0B00011D37, - 0x11D3A00011D3B, - 0x11D3C00011D3E, - 0x11D3F00011D48, - 0x11D5000011D5A, - 0x11D6000011D66, - 0x11D6700011D69, - 0x11D6A00011D8F, - 0x11D9000011D92, - 0x11D9300011D99, - 0x11DA000011DAA, - 0x11DB000011DDC, - 0x11DE000011DEA, - 0x11EE000011EF7, - 0x11F0000011F11, - 0x11F1200011F3B, - 0x11F3E00011F43, - 0x11F5000011F5B, - 0x11FB000011FB1, - 0x120000001239A, - 0x1248000012544, - 0x12F9000012FF1, - 0x1300000013430, - 0x1344000013456, - 0x13460000143FB, - 0x1440000014647, - 0x161000001613A, - 0x1680000016A39, - 0x16A4000016A5F, - 0x16A6000016A6A, - 0x16A7000016ABF, - 0x16AC000016ACA, - 0x16AD000016AEE, - 0x16AF000016AF5, - 0x16B0000016B37, - 0x16B4000016B44, - 0x16B5000016B5A, - 0x16B6300016B78, - 0x16B7D00016B90, - 0x16D4000016D6D, - 0x16D7000016D7A, - 0x16E6000016E80, - 0x16EBB00016ED4, - 0x16F0000016F4B, - 0x16F4F00016F88, - 0x16F8F00016FA0, - 0x16FE000016FE2, - 0x16FE300016FE5, - 0x16FF000016FF4, - 0x1700000018CD6, - 0x18CFF00018D1F, - 0x18D8000018DF3, - 0x1AFF00001AFF4, - 0x1AFF50001AFFC, - 0x1AFFD0001AFFF, - 0x1B0000001B123, - 0x1B1320001B133, - 0x1B1500001B153, - 0x1B1550001B156, - 0x1B1640001B168, - 0x1B1700001B2FC, - 0x1BC000001BC6B, - 0x1BC700001BC7D, - 0x1BC800001BC89, - 0x1BC900001BC9A, - 0x1BC9D0001BC9F, - 0x1CF000001CF2E, - 0x1CF300001CF47, - 0x1DA000001DA37, - 0x1DA3B0001DA6D, - 0x1DA750001DA76, - 0x1DA840001DA85, - 0x1DA9B0001DAA0, - 0x1DAA10001DAB0, - 0x1DF000001DF1F, - 0x1DF250001DF2B, - 0x1E0000001E007, - 0x1E0080001E019, - 0x1E01B0001E022, - 0x1E0230001E025, - 0x1E0260001E02B, - 0x1E08F0001E090, - 0x1E1000001E12D, - 0x1E1300001E13E, - 0x1E1400001E14A, - 0x1E14E0001E14F, - 0x1E2900001E2AF, - 0x1E2C00001E2FA, - 0x1E4D00001E4FA, - 0x1E5D00001E5FB, - 0x1E6C00001E6DF, - 0x1E6E00001E6F6, - 0x1E6FE0001E700, - 0x1E7E00001E7E7, - 0x1E7E80001E7EC, - 0x1E7ED0001E7EF, - 0x1E7F00001E7FF, - 0x1E8000001E8C5, - 0x1E8D00001E8D7, - 0x1E9220001E94C, - 0x1E9500001E95A, - 0x200000002A6E0, - 0x2A7000002B81E, - 0x2B8200002CEAE, - 0x2CEB00002EBE1, - 0x2EBF00002EE5E, - 0x300000003134B, - 0x313500003347A, - ), - "CONTEXTJ": (0x200C0000200E,), - "CONTEXTO": ( - 0xB7000000B8, - 0x37500000376, - 0x5F3000005F5, - 0x6600000066A, - 0x6F0000006FA, - 0x30FB000030FC, - ), -} diff --git a/venv/lib/python3.11/site-packages/idna/intranges.py b/venv/lib/python3.11/site-packages/idna/intranges.py deleted file mode 100755 index 19d7781..0000000 --- a/venv/lib/python3.11/site-packages/idna/intranges.py +++ /dev/null @@ -1,55 +0,0 @@ -""" -Given a list of integers, made up of (hopefully) a small number of long runs -of consecutive integers, compute a representation of the form -((start1, end1), (start2, end2) ...). Then answer the question "was x present -in the original list?" in time O(log(# runs)). -""" - -import bisect - - -def intranges_from_list(list_: list[int]) -> tuple[int, ...]: - """Represent a list of integers as a sequence of ranges: - ((start_0, end_0), (start_1, end_1), ...), such that the original - integers are exactly those x such that start_i <= x < end_i for some i. - - Ranges are encoded as single integers (start << 32 | end), not as tuples. - """ - - sorted_list = sorted(list_) - ranges = [] - last_write = -1 - for i in range(len(sorted_list)): - if i + 1 < len(sorted_list) and sorted_list[i] == sorted_list[i + 1] - 1: - continue - current_range = sorted_list[last_write + 1 : i + 1] - ranges.append(_encode_range(current_range[0], current_range[-1] + 1)) - last_write = i - - return tuple(ranges) - - -def _encode_range(start: int, end: int) -> int: - return (start << 32) | end - - -def _decode_range(r: int) -> tuple[int, int]: - return (r >> 32), (r & ((1 << 32) - 1)) - - -def intranges_contain(int_: int, ranges: tuple[int, ...]) -> bool: - """Determine if `int_` falls into one of the ranges in `ranges`.""" - tuple_ = _encode_range(int_, 0) - pos = bisect.bisect_left(ranges, tuple_) - # we could be immediately ahead of a tuple (start, end) - # with start < int_ <= end - if pos > 0: - left, right = _decode_range(ranges[pos - 1]) - if left <= int_ < right: - return True - # or we could be immediately behind a tuple (int_, end) - if pos < len(ranges): - left, _ = _decode_range(ranges[pos]) - if left == int_: - return True - return False diff --git a/venv/lib/python3.11/site-packages/idna/package_data.py b/venv/lib/python3.11/site-packages/idna/package_data.py deleted file mode 100755 index 684f1ce..0000000 --- a/venv/lib/python3.11/site-packages/idna/package_data.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "3.19" diff --git a/venv/lib/python3.11/site-packages/idna/py.typed b/venv/lib/python3.11/site-packages/idna/py.typed deleted file mode 100755 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/idna/uts46data.py b/venv/lib/python3.11/site-packages/idna/uts46data.py deleted file mode 100755 index d6712f1..0000000 --- a/venv/lib/python3.11/site-packages/idna/uts46data.py +++ /dev/null @@ -1,16897 +0,0 @@ -# This file is automatically generated by tools/idna-data - -from __future__ import annotations - -from array import array - -"""IDNA Mapping Table from UTS46.""" - - -__version__ = "17.0.0" - -uts46_starts: array[int] = array( - "I", - ( - 0x0, - 0x1, - 0x2, - 0x3, - 0x4, - 0x5, - 0x6, - 0x7, - 0x8, - 0x9, - 0xA, - 0xB, - 0xC, - 0xD, - 0xE, - 0xF, - 0x10, - 0x11, - 0x12, - 0x13, - 0x14, - 0x15, - 0x16, - 0x17, - 0x18, - 0x19, - 0x1A, - 0x1B, - 0x1C, - 0x1D, - 0x1E, - 0x1F, - 0x20, - 0x21, - 0x22, - 0x23, - 0x24, - 0x25, - 0x26, - 0x27, - 0x28, - 0x29, - 0x2A, - 0x2B, - 0x2C, - 0x2D, - 0x2E, - 0x2F, - 0x30, - 0x31, - 0x32, - 0x33, - 0x34, - 0x35, - 0x36, - 0x37, - 0x38, - 0x39, - 0x3A, - 0x3B, - 0x3C, - 0x3D, - 0x3E, - 0x3F, - 0x40, - 0x41, - 0x42, - 0x43, - 0x44, - 0x45, - 0x46, - 0x47, - 0x48, - 0x49, - 0x4A, - 0x4B, - 0x4C, - 0x4D, - 0x4E, - 0x4F, - 0x50, - 0x51, - 0x52, - 0x53, - 0x54, - 0x55, - 0x56, - 0x57, - 0x58, - 0x59, - 0x5A, - 0x5B, - 0x5C, - 0x5D, - 0x5E, - 0x5F, - 0x60, - 0x61, - 0x62, - 0x63, - 0x64, - 0x65, - 0x66, - 0x67, - 0x68, - 0x69, - 0x6A, - 0x6B, - 0x6C, - 0x6D, - 0x6E, - 0x6F, - 0x70, - 0x71, - 0x72, - 0x73, - 0x74, - 0x75, - 0x76, - 0x77, - 0x78, - 0x79, - 0x7A, - 0x7B, - 0x7C, - 0x7D, - 0x7E, - 0x7F, - 0x80, - 0x81, - 0x82, - 0x83, - 0x84, - 0x85, - 0x86, - 0x87, - 0x88, - 0x89, - 0x8A, - 0x8B, - 0x8C, - 0x8D, - 0x8E, - 0x8F, - 0x90, - 0x91, - 0x92, - 0x93, - 0x94, - 0x95, - 0x96, - 0x97, - 0x98, - 0x99, - 0x9A, - 0x9B, - 0x9C, - 0x9D, - 0x9E, - 0x9F, - 0xA0, - 0xA1, - 0xA2, - 0xA3, - 0xA4, - 0xA5, - 0xA6, - 0xA7, - 0xA8, - 0xA9, - 0xAA, - 0xAB, - 0xAC, - 0xAD, - 0xAE, - 0xAF, - 0xB0, - 0xB1, - 0xB2, - 0xB3, - 0xB4, - 0xB5, - 0xB6, - 0xB7, - 0xB8, - 0xB9, - 0xBA, - 0xBB, - 0xBC, - 0xBD, - 0xBE, - 0xBF, - 0xC0, - 0xC1, - 0xC2, - 0xC3, - 0xC4, - 0xC5, - 0xC6, - 0xC7, - 0xC8, - 0xC9, - 0xCA, - 0xCB, - 0xCC, - 0xCD, - 0xCE, - 0xCF, - 0xD0, - 0xD1, - 0xD2, - 0xD3, - 0xD4, - 0xD5, - 0xD6, - 0xD7, - 0xD8, - 0xD9, - 0xDA, - 0xDB, - 0xDC, - 0xDD, - 0xDE, - 0xDF, - 0xE0, - 0xE1, - 0xE2, - 0xE3, - 0xE4, - 0xE5, - 0xE6, - 0xE7, - 0xE8, - 0xE9, - 0xEA, - 0xEB, - 0xEC, - 0xED, - 0xEE, - 0xEF, - 0xF0, - 0xF1, - 0xF2, - 0xF3, - 0xF4, - 0xF5, - 0xF6, - 0xF7, - 0xF8, - 0xF9, - 0xFA, - 0xFB, - 0xFC, - 0xFD, - 0xFE, - 0xFF, - 0x100, - 0x101, - 0x102, - 0x103, - 0x104, - 0x105, - 0x106, - 0x107, - 0x108, - 0x109, - 0x10A, - 0x10B, - 0x10C, - 0x10D, - 0x10E, - 0x10F, - 0x110, - 0x111, - 0x112, - 0x113, - 0x114, - 0x115, - 0x116, - 0x117, - 0x118, - 0x119, - 0x11A, - 0x11B, - 0x11C, - 0x11D, - 0x11E, - 0x11F, - 0x120, - 0x121, - 0x122, - 0x123, - 0x124, - 0x125, - 0x126, - 0x127, - 0x128, - 0x129, - 0x12A, - 0x12B, - 0x12C, - 0x12D, - 0x12E, - 0x12F, - 0x130, - 0x131, - 0x132, - 0x134, - 0x135, - 0x136, - 0x137, - 0x139, - 0x13A, - 0x13B, - 0x13C, - 0x13D, - 0x13E, - 0x13F, - 0x141, - 0x142, - 0x143, - 0x144, - 0x145, - 0x146, - 0x147, - 0x148, - 0x149, - 0x14A, - 0x14B, - 0x14C, - 0x14D, - 0x14E, - 0x14F, - 0x150, - 0x151, - 0x152, - 0x153, - 0x154, - 0x155, - 0x156, - 0x157, - 0x158, - 0x159, - 0x15A, - 0x15B, - 0x15C, - 0x15D, - 0x15E, - 0x15F, - 0x160, - 0x161, - 0x162, - 0x163, - 0x164, - 0x165, - 0x166, - 0x167, - 0x168, - 0x169, - 0x16A, - 0x16B, - 0x16C, - 0x16D, - 0x16E, - 0x16F, - 0x170, - 0x171, - 0x172, - 0x173, - 0x174, - 0x175, - 0x176, - 0x177, - 0x178, - 0x179, - 0x17A, - 0x17B, - 0x17C, - 0x17D, - 0x17E, - 0x17F, - 0x180, - 0x181, - 0x182, - 0x183, - 0x184, - 0x185, - 0x186, - 0x187, - 0x188, - 0x189, - 0x18A, - 0x18B, - 0x18C, - 0x18E, - 0x18F, - 0x190, - 0x191, - 0x192, - 0x193, - 0x194, - 0x195, - 0x196, - 0x197, - 0x198, - 0x199, - 0x19C, - 0x19D, - 0x19E, - 0x19F, - 0x1A0, - 0x1A1, - 0x1A2, - 0x1A3, - 0x1A4, - 0x1A5, - 0x1A6, - 0x1A7, - 0x1A8, - 0x1A9, - 0x1AA, - 0x1AC, - 0x1AD, - 0x1AE, - 0x1AF, - 0x1B0, - 0x1B1, - 0x1B2, - 0x1B3, - 0x1B4, - 0x1B5, - 0x1B6, - 0x1B7, - 0x1B8, - 0x1B9, - 0x1BC, - 0x1BD, - 0x1C4, - 0x1C7, - 0x1CA, - 0x1CD, - 0x1CE, - 0x1CF, - 0x1D0, - 0x1D1, - 0x1D2, - 0x1D3, - 0x1D4, - 0x1D5, - 0x1D6, - 0x1D7, - 0x1D8, - 0x1D9, - 0x1DA, - 0x1DB, - 0x1DC, - 0x1DE, - 0x1DF, - 0x1E0, - 0x1E1, - 0x1E2, - 0x1E3, - 0x1E4, - 0x1E5, - 0x1E6, - 0x1E7, - 0x1E8, - 0x1E9, - 0x1EA, - 0x1EB, - 0x1EC, - 0x1ED, - 0x1EE, - 0x1EF, - 0x1F1, - 0x1F4, - 0x1F5, - 0x1F6, - 0x1F7, - 0x1F8, - 0x1F9, - 0x1FA, - 0x1FB, - 0x1FC, - 0x1FD, - 0x1FE, - 0x1FF, - 0x200, - 0x201, - 0x202, - 0x203, - 0x204, - 0x205, - 0x206, - 0x207, - 0x208, - 0x209, - 0x20A, - 0x20B, - 0x20C, - 0x20D, - 0x20E, - 0x20F, - 0x210, - 0x211, - 0x212, - 0x213, - 0x214, - 0x215, - 0x216, - 0x217, - 0x218, - 0x219, - 0x21A, - 0x21B, - 0x21C, - 0x21D, - 0x21E, - 0x21F, - 0x220, - 0x221, - 0x222, - 0x223, - 0x224, - 0x225, - 0x226, - 0x227, - 0x228, - 0x229, - 0x22A, - 0x22B, - 0x22C, - 0x22D, - 0x22E, - 0x22F, - 0x230, - 0x231, - 0x232, - 0x233, - 0x23A, - 0x23B, - 0x23C, - 0x23D, - 0x23E, - 0x23F, - 0x241, - 0x242, - 0x243, - 0x244, - 0x245, - 0x246, - 0x247, - 0x248, - 0x249, - 0x24A, - 0x24B, - 0x24C, - 0x24D, - 0x24E, - 0x24F, - 0x2B0, - 0x2B1, - 0x2B2, - 0x2B3, - 0x2B4, - 0x2B5, - 0x2B6, - 0x2B7, - 0x2B8, - 0x2B9, - 0x2D8, - 0x2D9, - 0x2DA, - 0x2DB, - 0x2DC, - 0x2DD, - 0x2DE, - 0x2E0, - 0x2E1, - 0x2E2, - 0x2E3, - 0x2E4, - 0x2E5, - 0x340, - 0x341, - 0x342, - 0x343, - 0x344, - 0x345, - 0x346, - 0x34F, - 0x350, - 0x370, - 0x371, - 0x372, - 0x373, - 0x374, - 0x375, - 0x376, - 0x377, - 0x378, - 0x37A, - 0x37B, - 0x37E, - 0x37F, - 0x380, - 0x384, - 0x385, - 0x386, - 0x387, - 0x388, - 0x389, - 0x38A, - 0x38B, - 0x38C, - 0x38D, - 0x38E, - 0x38F, - 0x390, - 0x391, - 0x392, - 0x393, - 0x394, - 0x395, - 0x396, - 0x397, - 0x398, - 0x399, - 0x39A, - 0x39B, - 0x39C, - 0x39D, - 0x39E, - 0x39F, - 0x3A0, - 0x3A1, - 0x3A2, - 0x3A3, - 0x3A4, - 0x3A5, - 0x3A6, - 0x3A7, - 0x3A8, - 0x3A9, - 0x3AA, - 0x3AB, - 0x3AC, - 0x3C2, - 0x3C3, - 0x3CF, - 0x3D0, - 0x3D1, - 0x3D2, - 0x3D3, - 0x3D4, - 0x3D5, - 0x3D6, - 0x3D7, - 0x3D8, - 0x3D9, - 0x3DA, - 0x3DB, - 0x3DC, - 0x3DD, - 0x3DE, - 0x3DF, - 0x3E0, - 0x3E1, - 0x3E2, - 0x3E3, - 0x3E4, - 0x3E5, - 0x3E6, - 0x3E7, - 0x3E8, - 0x3E9, - 0x3EA, - 0x3EB, - 0x3EC, - 0x3ED, - 0x3EE, - 0x3EF, - 0x3F0, - 0x3F1, - 0x3F2, - 0x3F3, - 0x3F4, - 0x3F5, - 0x3F6, - 0x3F7, - 0x3F8, - 0x3F9, - 0x3FA, - 0x3FB, - 0x3FD, - 0x3FE, - 0x3FF, - 0x400, - 0x401, - 0x402, - 0x403, - 0x404, - 0x405, - 0x406, - 0x407, - 0x408, - 0x409, - 0x40A, - 0x40B, - 0x40C, - 0x40D, - 0x40E, - 0x40F, - 0x410, - 0x411, - 0x412, - 0x413, - 0x414, - 0x415, - 0x416, - 0x417, - 0x418, - 0x419, - 0x41A, - 0x41B, - 0x41C, - 0x41D, - 0x41E, - 0x41F, - 0x420, - 0x421, - 0x422, - 0x423, - 0x424, - 0x425, - 0x426, - 0x427, - 0x428, - 0x429, - 0x42A, - 0x42B, - 0x42C, - 0x42D, - 0x42E, - 0x42F, - 0x430, - 0x460, - 0x461, - 0x462, - 0x463, - 0x464, - 0x465, - 0x466, - 0x467, - 0x468, - 0x469, - 0x46A, - 0x46B, - 0x46C, - 0x46D, - 0x46E, - 0x46F, - 0x470, - 0x471, - 0x472, - 0x473, - 0x474, - 0x475, - 0x476, - 0x477, - 0x478, - 0x479, - 0x47A, - 0x47B, - 0x47C, - 0x47D, - 0x47E, - 0x47F, - 0x480, - 0x481, - 0x48A, - 0x48B, - 0x48C, - 0x48D, - 0x48E, - 0x48F, - 0x490, - 0x491, - 0x492, - 0x493, - 0x494, - 0x495, - 0x496, - 0x497, - 0x498, - 0x499, - 0x49A, - 0x49B, - 0x49C, - 0x49D, - 0x49E, - 0x49F, - 0x4A0, - 0x4A1, - 0x4A2, - 0x4A3, - 0x4A4, - 0x4A5, - 0x4A6, - 0x4A7, - 0x4A8, - 0x4A9, - 0x4AA, - 0x4AB, - 0x4AC, - 0x4AD, - 0x4AE, - 0x4AF, - 0x4B0, - 0x4B1, - 0x4B2, - 0x4B3, - 0x4B4, - 0x4B5, - 0x4B6, - 0x4B7, - 0x4B8, - 0x4B9, - 0x4BA, - 0x4BB, - 0x4BC, - 0x4BD, - 0x4BE, - 0x4BF, - 0x4C0, - 0x4C1, - 0x4C2, - 0x4C3, - 0x4C4, - 0x4C5, - 0x4C6, - 0x4C7, - 0x4C8, - 0x4C9, - 0x4CA, - 0x4CB, - 0x4CC, - 0x4CD, - 0x4CE, - 0x4D0, - 0x4D1, - 0x4D2, - 0x4D3, - 0x4D4, - 0x4D5, - 0x4D6, - 0x4D7, - 0x4D8, - 0x4D9, - 0x4DA, - 0x4DB, - 0x4DC, - 0x4DD, - 0x4DE, - 0x4DF, - 0x4E0, - 0x4E1, - 0x4E2, - 0x4E3, - 0x4E4, - 0x4E5, - 0x4E6, - 0x4E7, - 0x4E8, - 0x4E9, - 0x4EA, - 0x4EB, - 0x4EC, - 0x4ED, - 0x4EE, - 0x4EF, - 0x4F0, - 0x4F1, - 0x4F2, - 0x4F3, - 0x4F4, - 0x4F5, - 0x4F6, - 0x4F7, - 0x4F8, - 0x4F9, - 0x4FA, - 0x4FB, - 0x4FC, - 0x4FD, - 0x4FE, - 0x4FF, - 0x500, - 0x501, - 0x502, - 0x503, - 0x504, - 0x505, - 0x506, - 0x507, - 0x508, - 0x509, - 0x50A, - 0x50B, - 0x50C, - 0x50D, - 0x50E, - 0x50F, - 0x510, - 0x511, - 0x512, - 0x513, - 0x514, - 0x515, - 0x516, - 0x517, - 0x518, - 0x519, - 0x51A, - 0x51B, - 0x51C, - 0x51D, - 0x51E, - 0x51F, - 0x520, - 0x521, - 0x522, - 0x523, - 0x524, - 0x525, - 0x526, - 0x527, - 0x528, - 0x529, - 0x52A, - 0x52B, - 0x52C, - 0x52D, - 0x52E, - 0x52F, - 0x530, - 0x531, - 0x532, - 0x533, - 0x534, - 0x535, - 0x536, - 0x537, - 0x538, - 0x539, - 0x53A, - 0x53B, - 0x53C, - 0x53D, - 0x53E, - 0x53F, - 0x540, - 0x541, - 0x542, - 0x543, - 0x544, - 0x545, - 0x546, - 0x547, - 0x548, - 0x549, - 0x54A, - 0x54B, - 0x54C, - 0x54D, - 0x54E, - 0x54F, - 0x550, - 0x551, - 0x552, - 0x553, - 0x554, - 0x555, - 0x556, - 0x557, - 0x559, - 0x587, - 0x588, - 0x58B, - 0x58D, - 0x590, - 0x591, - 0x5C8, - 0x5D0, - 0x5EB, - 0x5EF, - 0x5F5, - 0x606, - 0x61C, - 0x61D, - 0x675, - 0x676, - 0x677, - 0x678, - 0x679, - 0x6DD, - 0x6DE, - 0x70E, - 0x710, - 0x74B, - 0x74D, - 0x7B2, - 0x7C0, - 0x7FB, - 0x7FD, - 0x82E, - 0x830, - 0x83F, - 0x840, - 0x85C, - 0x85E, - 0x85F, - 0x860, - 0x86B, - 0x870, - 0x890, - 0x897, - 0x8E2, - 0x8E3, - 0x958, - 0x959, - 0x95A, - 0x95B, - 0x95C, - 0x95D, - 0x95E, - 0x95F, - 0x960, - 0x984, - 0x985, - 0x98D, - 0x98F, - 0x991, - 0x993, - 0x9A9, - 0x9AA, - 0x9B1, - 0x9B2, - 0x9B3, - 0x9B6, - 0x9BA, - 0x9BC, - 0x9C5, - 0x9C7, - 0x9C9, - 0x9CB, - 0x9CF, - 0x9D7, - 0x9D8, - 0x9DC, - 0x9DD, - 0x9DE, - 0x9DF, - 0x9E0, - 0x9E4, - 0x9E6, - 0x9FF, - 0xA01, - 0xA04, - 0xA05, - 0xA0B, - 0xA0F, - 0xA11, - 0xA13, - 0xA29, - 0xA2A, - 0xA31, - 0xA32, - 0xA33, - 0xA34, - 0xA35, - 0xA36, - 0xA37, - 0xA38, - 0xA3A, - 0xA3C, - 0xA3D, - 0xA3E, - 0xA43, - 0xA47, - 0xA49, - 0xA4B, - 0xA4E, - 0xA51, - 0xA52, - 0xA59, - 0xA5A, - 0xA5B, - 0xA5C, - 0xA5D, - 0xA5E, - 0xA5F, - 0xA66, - 0xA77, - 0xA81, - 0xA84, - 0xA85, - 0xA8E, - 0xA8F, - 0xA92, - 0xA93, - 0xAA9, - 0xAAA, - 0xAB1, - 0xAB2, - 0xAB4, - 0xAB5, - 0xABA, - 0xABC, - 0xAC6, - 0xAC7, - 0xACA, - 0xACB, - 0xACE, - 0xAD0, - 0xAD1, - 0xAE0, - 0xAE4, - 0xAE6, - 0xAF2, - 0xAF9, - 0xB00, - 0xB01, - 0xB04, - 0xB05, - 0xB0D, - 0xB0F, - 0xB11, - 0xB13, - 0xB29, - 0xB2A, - 0xB31, - 0xB32, - 0xB34, - 0xB35, - 0xB3A, - 0xB3C, - 0xB45, - 0xB47, - 0xB49, - 0xB4B, - 0xB4E, - 0xB55, - 0xB58, - 0xB5C, - 0xB5D, - 0xB5E, - 0xB5F, - 0xB64, - 0xB66, - 0xB78, - 0xB82, - 0xB84, - 0xB85, - 0xB8B, - 0xB8E, - 0xB91, - 0xB92, - 0xB96, - 0xB99, - 0xB9B, - 0xB9C, - 0xB9D, - 0xB9E, - 0xBA0, - 0xBA3, - 0xBA5, - 0xBA8, - 0xBAB, - 0xBAE, - 0xBBA, - 0xBBE, - 0xBC3, - 0xBC6, - 0xBC9, - 0xBCA, - 0xBCE, - 0xBD0, - 0xBD1, - 0xBD7, - 0xBD8, - 0xBE6, - 0xBFB, - 0xC00, - 0xC0D, - 0xC0E, - 0xC11, - 0xC12, - 0xC29, - 0xC2A, - 0xC3A, - 0xC3C, - 0xC45, - 0xC46, - 0xC49, - 0xC4A, - 0xC4E, - 0xC55, - 0xC57, - 0xC58, - 0xC5B, - 0xC5C, - 0xC5E, - 0xC60, - 0xC64, - 0xC66, - 0xC70, - 0xC77, - 0xC8D, - 0xC8E, - 0xC91, - 0xC92, - 0xCA9, - 0xCAA, - 0xCB4, - 0xCB5, - 0xCBA, - 0xCBC, - 0xCC5, - 0xCC6, - 0xCC9, - 0xCCA, - 0xCCE, - 0xCD5, - 0xCD7, - 0xCDC, - 0xCDF, - 0xCE0, - 0xCE4, - 0xCE6, - 0xCF0, - 0xCF1, - 0xCF4, - 0xD00, - 0xD0D, - 0xD0E, - 0xD11, - 0xD12, - 0xD45, - 0xD46, - 0xD49, - 0xD4A, - 0xD50, - 0xD54, - 0xD64, - 0xD66, - 0xD80, - 0xD81, - 0xD84, - 0xD85, - 0xD97, - 0xD9A, - 0xDB2, - 0xDB3, - 0xDBC, - 0xDBD, - 0xDBE, - 0xDC0, - 0xDC7, - 0xDCA, - 0xDCB, - 0xDCF, - 0xDD5, - 0xDD6, - 0xDD7, - 0xDD8, - 0xDE0, - 0xDE6, - 0xDF0, - 0xDF2, - 0xDF5, - 0xE01, - 0xE33, - 0xE34, - 0xE3B, - 0xE3F, - 0xE5C, - 0xE81, - 0xE83, - 0xE84, - 0xE85, - 0xE86, - 0xE8B, - 0xE8C, - 0xEA4, - 0xEA5, - 0xEA6, - 0xEA7, - 0xEB3, - 0xEB4, - 0xEBE, - 0xEC0, - 0xEC5, - 0xEC6, - 0xEC7, - 0xEC8, - 0xECF, - 0xED0, - 0xEDA, - 0xEDC, - 0xEDD, - 0xEDE, - 0xEE0, - 0xF00, - 0xF0C, - 0xF0D, - 0xF43, - 0xF44, - 0xF48, - 0xF49, - 0xF4D, - 0xF4E, - 0xF52, - 0xF53, - 0xF57, - 0xF58, - 0xF5C, - 0xF5D, - 0xF69, - 0xF6A, - 0xF6D, - 0xF71, - 0xF73, - 0xF74, - 0xF75, - 0xF76, - 0xF77, - 0xF78, - 0xF79, - 0xF7A, - 0xF81, - 0xF82, - 0xF93, - 0xF94, - 0xF98, - 0xF99, - 0xF9D, - 0xF9E, - 0xFA2, - 0xFA3, - 0xFA7, - 0xFA8, - 0xFAC, - 0xFAD, - 0xFB9, - 0xFBA, - 0xFBD, - 0xFBE, - 0xFCD, - 0xFCE, - 0xFDB, - 0x1000, - 0x10A0, - 0x10A1, - 0x10A2, - 0x10A3, - 0x10A4, - 0x10A5, - 0x10A6, - 0x10A7, - 0x10A8, - 0x10A9, - 0x10AA, - 0x10AB, - 0x10AC, - 0x10AD, - 0x10AE, - 0x10AF, - 0x10B0, - 0x10B1, - 0x10B2, - 0x10B3, - 0x10B4, - 0x10B5, - 0x10B6, - 0x10B7, - 0x10B8, - 0x10B9, - 0x10BA, - 0x10BB, - 0x10BC, - 0x10BD, - 0x10BE, - 0x10BF, - 0x10C0, - 0x10C1, - 0x10C2, - 0x10C3, - 0x10C4, - 0x10C5, - 0x10C6, - 0x10C7, - 0x10C8, - 0x10CD, - 0x10CE, - 0x10D0, - 0x10FC, - 0x10FD, - 0x115F, - 0x1161, - 0x1249, - 0x124A, - 0x124E, - 0x1250, - 0x1257, - 0x1258, - 0x1259, - 0x125A, - 0x125E, - 0x1260, - 0x1289, - 0x128A, - 0x128E, - 0x1290, - 0x12B1, - 0x12B2, - 0x12B6, - 0x12B8, - 0x12BF, - 0x12C0, - 0x12C1, - 0x12C2, - 0x12C6, - 0x12C8, - 0x12D7, - 0x12D8, - 0x1311, - 0x1312, - 0x1316, - 0x1318, - 0x135B, - 0x135D, - 0x137D, - 0x1380, - 0x139A, - 0x13A0, - 0x13F6, - 0x13F8, - 0x13F9, - 0x13FA, - 0x13FB, - 0x13FC, - 0x13FD, - 0x13FE, - 0x1400, - 0x1680, - 0x1681, - 0x169D, - 0x16A0, - 0x16F9, - 0x1700, - 0x1716, - 0x171F, - 0x1737, - 0x1740, - 0x1754, - 0x1760, - 0x176D, - 0x176E, - 0x1771, - 0x1772, - 0x1774, - 0x1780, - 0x17B4, - 0x17B6, - 0x17DE, - 0x17E0, - 0x17EA, - 0x17F0, - 0x17FA, - 0x1800, - 0x180B, - 0x1810, - 0x181A, - 0x1820, - 0x1879, - 0x1880, - 0x18AB, - 0x18B0, - 0x18F6, - 0x1900, - 0x191F, - 0x1920, - 0x192C, - 0x1930, - 0x193C, - 0x1940, - 0x1941, - 0x1944, - 0x196E, - 0x1970, - 0x1975, - 0x1980, - 0x19AC, - 0x19B0, - 0x19CA, - 0x19D0, - 0x19DB, - 0x19DE, - 0x1A1C, - 0x1A1E, - 0x1A5F, - 0x1A60, - 0x1A7D, - 0x1A7F, - 0x1A8A, - 0x1A90, - 0x1A9A, - 0x1AA0, - 0x1AAE, - 0x1AB0, - 0x1ADE, - 0x1AE0, - 0x1AEC, - 0x1B00, - 0x1B4D, - 0x1B4E, - 0x1BF4, - 0x1BFC, - 0x1C38, - 0x1C3B, - 0x1C4A, - 0x1C4D, - 0x1C80, - 0x1C81, - 0x1C82, - 0x1C83, - 0x1C84, - 0x1C86, - 0x1C87, - 0x1C88, - 0x1C89, - 0x1C8A, - 0x1C8B, - 0x1C90, - 0x1C91, - 0x1C92, - 0x1C93, - 0x1C94, - 0x1C95, - 0x1C96, - 0x1C97, - 0x1C98, - 0x1C99, - 0x1C9A, - 0x1C9B, - 0x1C9C, - 0x1C9D, - 0x1C9E, - 0x1C9F, - 0x1CA0, - 0x1CA1, - 0x1CA2, - 0x1CA3, - 0x1CA4, - 0x1CA5, - 0x1CA6, - 0x1CA7, - 0x1CA8, - 0x1CA9, - 0x1CAA, - 0x1CAB, - 0x1CAC, - 0x1CAD, - 0x1CAE, - 0x1CAF, - 0x1CB0, - 0x1CB1, - 0x1CB2, - 0x1CB3, - 0x1CB4, - 0x1CB5, - 0x1CB6, - 0x1CB7, - 0x1CB8, - 0x1CB9, - 0x1CBA, - 0x1CBB, - 0x1CBD, - 0x1CBE, - 0x1CBF, - 0x1CC0, - 0x1CC8, - 0x1CD0, - 0x1CFB, - 0x1D00, - 0x1D2C, - 0x1D2D, - 0x1D2E, - 0x1D2F, - 0x1D30, - 0x1D31, - 0x1D32, - 0x1D33, - 0x1D34, - 0x1D35, - 0x1D36, - 0x1D37, - 0x1D38, - 0x1D39, - 0x1D3A, - 0x1D3B, - 0x1D3C, - 0x1D3D, - 0x1D3E, - 0x1D3F, - 0x1D40, - 0x1D41, - 0x1D42, - 0x1D43, - 0x1D44, - 0x1D45, - 0x1D46, - 0x1D47, - 0x1D48, - 0x1D49, - 0x1D4A, - 0x1D4B, - 0x1D4C, - 0x1D4D, - 0x1D4E, - 0x1D4F, - 0x1D50, - 0x1D51, - 0x1D52, - 0x1D53, - 0x1D54, - 0x1D55, - 0x1D56, - 0x1D57, - 0x1D58, - 0x1D59, - 0x1D5A, - 0x1D5B, - 0x1D5C, - 0x1D5D, - 0x1D5E, - 0x1D5F, - 0x1D60, - 0x1D61, - 0x1D62, - 0x1D63, - 0x1D64, - 0x1D65, - 0x1D66, - 0x1D67, - 0x1D68, - 0x1D69, - 0x1D6A, - 0x1D6B, - 0x1D78, - 0x1D79, - 0x1D9B, - 0x1D9C, - 0x1D9D, - 0x1D9E, - 0x1D9F, - 0x1DA0, - 0x1DA1, - 0x1DA2, - 0x1DA3, - 0x1DA4, - 0x1DA5, - 0x1DA6, - 0x1DA7, - 0x1DA8, - 0x1DA9, - 0x1DAA, - 0x1DAB, - 0x1DAC, - 0x1DAD, - 0x1DAE, - 0x1DAF, - 0x1DB0, - 0x1DB1, - 0x1DB2, - 0x1DB3, - 0x1DB4, - 0x1DB5, - 0x1DB6, - 0x1DB7, - 0x1DB8, - 0x1DB9, - 0x1DBA, - 0x1DBB, - 0x1DBC, - 0x1DBD, - 0x1DBE, - 0x1DBF, - 0x1DC0, - 0x1E00, - 0x1E01, - 0x1E02, - 0x1E03, - 0x1E04, - 0x1E05, - 0x1E06, - 0x1E07, - 0x1E08, - 0x1E09, - 0x1E0A, - 0x1E0B, - 0x1E0C, - 0x1E0D, - 0x1E0E, - 0x1E0F, - 0x1E10, - 0x1E11, - 0x1E12, - 0x1E13, - 0x1E14, - 0x1E15, - 0x1E16, - 0x1E17, - 0x1E18, - 0x1E19, - 0x1E1A, - 0x1E1B, - 0x1E1C, - 0x1E1D, - 0x1E1E, - 0x1E1F, - 0x1E20, - 0x1E21, - 0x1E22, - 0x1E23, - 0x1E24, - 0x1E25, - 0x1E26, - 0x1E27, - 0x1E28, - 0x1E29, - 0x1E2A, - 0x1E2B, - 0x1E2C, - 0x1E2D, - 0x1E2E, - 0x1E2F, - 0x1E30, - 0x1E31, - 0x1E32, - 0x1E33, - 0x1E34, - 0x1E35, - 0x1E36, - 0x1E37, - 0x1E38, - 0x1E39, - 0x1E3A, - 0x1E3B, - 0x1E3C, - 0x1E3D, - 0x1E3E, - 0x1E3F, - 0x1E40, - 0x1E41, - 0x1E42, - 0x1E43, - 0x1E44, - 0x1E45, - 0x1E46, - 0x1E47, - 0x1E48, - 0x1E49, - 0x1E4A, - 0x1E4B, - 0x1E4C, - 0x1E4D, - 0x1E4E, - 0x1E4F, - 0x1E50, - 0x1E51, - 0x1E52, - 0x1E53, - 0x1E54, - 0x1E55, - 0x1E56, - 0x1E57, - 0x1E58, - 0x1E59, - 0x1E5A, - 0x1E5B, - 0x1E5C, - 0x1E5D, - 0x1E5E, - 0x1E5F, - 0x1E60, - 0x1E61, - 0x1E62, - 0x1E63, - 0x1E64, - 0x1E65, - 0x1E66, - 0x1E67, - 0x1E68, - 0x1E69, - 0x1E6A, - 0x1E6B, - 0x1E6C, - 0x1E6D, - 0x1E6E, - 0x1E6F, - 0x1E70, - 0x1E71, - 0x1E72, - 0x1E73, - 0x1E74, - 0x1E75, - 0x1E76, - 0x1E77, - 0x1E78, - 0x1E79, - 0x1E7A, - 0x1E7B, - 0x1E7C, - 0x1E7D, - 0x1E7E, - 0x1E7F, - 0x1E80, - 0x1E81, - 0x1E82, - 0x1E83, - 0x1E84, - 0x1E85, - 0x1E86, - 0x1E87, - 0x1E88, - 0x1E89, - 0x1E8A, - 0x1E8B, - 0x1E8C, - 0x1E8D, - 0x1E8E, - 0x1E8F, - 0x1E90, - 0x1E91, - 0x1E92, - 0x1E93, - 0x1E94, - 0x1E95, - 0x1E9A, - 0x1E9B, - 0x1E9C, - 0x1E9E, - 0x1E9F, - 0x1EA0, - 0x1EA1, - 0x1EA2, - 0x1EA3, - 0x1EA4, - 0x1EA5, - 0x1EA6, - 0x1EA7, - 0x1EA8, - 0x1EA9, - 0x1EAA, - 0x1EAB, - 0x1EAC, - 0x1EAD, - 0x1EAE, - 0x1EAF, - 0x1EB0, - 0x1EB1, - 0x1EB2, - 0x1EB3, - 0x1EB4, - 0x1EB5, - 0x1EB6, - 0x1EB7, - 0x1EB8, - 0x1EB9, - 0x1EBA, - 0x1EBB, - 0x1EBC, - 0x1EBD, - 0x1EBE, - 0x1EBF, - 0x1EC0, - 0x1EC1, - 0x1EC2, - 0x1EC3, - 0x1EC4, - 0x1EC5, - 0x1EC6, - 0x1EC7, - 0x1EC8, - 0x1EC9, - 0x1ECA, - 0x1ECB, - 0x1ECC, - 0x1ECD, - 0x1ECE, - 0x1ECF, - 0x1ED0, - 0x1ED1, - 0x1ED2, - 0x1ED3, - 0x1ED4, - 0x1ED5, - 0x1ED6, - 0x1ED7, - 0x1ED8, - 0x1ED9, - 0x1EDA, - 0x1EDB, - 0x1EDC, - 0x1EDD, - 0x1EDE, - 0x1EDF, - 0x1EE0, - 0x1EE1, - 0x1EE2, - 0x1EE3, - 0x1EE4, - 0x1EE5, - 0x1EE6, - 0x1EE7, - 0x1EE8, - 0x1EE9, - 0x1EEA, - 0x1EEB, - 0x1EEC, - 0x1EED, - 0x1EEE, - 0x1EEF, - 0x1EF0, - 0x1EF1, - 0x1EF2, - 0x1EF3, - 0x1EF4, - 0x1EF5, - 0x1EF6, - 0x1EF7, - 0x1EF8, - 0x1EF9, - 0x1EFA, - 0x1EFB, - 0x1EFC, - 0x1EFD, - 0x1EFE, - 0x1EFF, - 0x1F08, - 0x1F09, - 0x1F0A, - 0x1F0B, - 0x1F0C, - 0x1F0D, - 0x1F0E, - 0x1F0F, - 0x1F10, - 0x1F16, - 0x1F18, - 0x1F19, - 0x1F1A, - 0x1F1B, - 0x1F1C, - 0x1F1D, - 0x1F1E, - 0x1F20, - 0x1F28, - 0x1F29, - 0x1F2A, - 0x1F2B, - 0x1F2C, - 0x1F2D, - 0x1F2E, - 0x1F2F, - 0x1F30, - 0x1F38, - 0x1F39, - 0x1F3A, - 0x1F3B, - 0x1F3C, - 0x1F3D, - 0x1F3E, - 0x1F3F, - 0x1F40, - 0x1F46, - 0x1F48, - 0x1F49, - 0x1F4A, - 0x1F4B, - 0x1F4C, - 0x1F4D, - 0x1F4E, - 0x1F50, - 0x1F58, - 0x1F59, - 0x1F5A, - 0x1F5B, - 0x1F5C, - 0x1F5D, - 0x1F5E, - 0x1F5F, - 0x1F60, - 0x1F68, - 0x1F69, - 0x1F6A, - 0x1F6B, - 0x1F6C, - 0x1F6D, - 0x1F6E, - 0x1F6F, - 0x1F70, - 0x1F71, - 0x1F72, - 0x1F73, - 0x1F74, - 0x1F75, - 0x1F76, - 0x1F77, - 0x1F78, - 0x1F79, - 0x1F7A, - 0x1F7B, - 0x1F7C, - 0x1F7D, - 0x1F7E, - 0x1F80, - 0x1F81, - 0x1F82, - 0x1F83, - 0x1F84, - 0x1F85, - 0x1F86, - 0x1F87, - 0x1F88, - 0x1F89, - 0x1F8A, - 0x1F8B, - 0x1F8C, - 0x1F8D, - 0x1F8E, - 0x1F8F, - 0x1F90, - 0x1F91, - 0x1F92, - 0x1F93, - 0x1F94, - 0x1F95, - 0x1F96, - 0x1F97, - 0x1F98, - 0x1F99, - 0x1F9A, - 0x1F9B, - 0x1F9C, - 0x1F9D, - 0x1F9E, - 0x1F9F, - 0x1FA0, - 0x1FA1, - 0x1FA2, - 0x1FA3, - 0x1FA4, - 0x1FA5, - 0x1FA6, - 0x1FA7, - 0x1FA8, - 0x1FA9, - 0x1FAA, - 0x1FAB, - 0x1FAC, - 0x1FAD, - 0x1FAE, - 0x1FAF, - 0x1FB0, - 0x1FB2, - 0x1FB3, - 0x1FB4, - 0x1FB5, - 0x1FB6, - 0x1FB7, - 0x1FB8, - 0x1FB9, - 0x1FBA, - 0x1FBB, - 0x1FBC, - 0x1FBD, - 0x1FBE, - 0x1FBF, - 0x1FC0, - 0x1FC1, - 0x1FC2, - 0x1FC3, - 0x1FC4, - 0x1FC5, - 0x1FC6, - 0x1FC7, - 0x1FC8, - 0x1FC9, - 0x1FCA, - 0x1FCB, - 0x1FCC, - 0x1FCD, - 0x1FCE, - 0x1FCF, - 0x1FD0, - 0x1FD3, - 0x1FD4, - 0x1FD6, - 0x1FD8, - 0x1FD9, - 0x1FDA, - 0x1FDB, - 0x1FDC, - 0x1FDD, - 0x1FDE, - 0x1FDF, - 0x1FE0, - 0x1FE3, - 0x1FE4, - 0x1FE8, - 0x1FE9, - 0x1FEA, - 0x1FEB, - 0x1FEC, - 0x1FED, - 0x1FEE, - 0x1FEF, - 0x1FF0, - 0x1FF2, - 0x1FF3, - 0x1FF4, - 0x1FF5, - 0x1FF6, - 0x1FF7, - 0x1FF8, - 0x1FF9, - 0x1FFA, - 0x1FFB, - 0x1FFC, - 0x1FFD, - 0x1FFE, - 0x1FFF, - 0x2000, - 0x200B, - 0x200C, - 0x200E, - 0x2010, - 0x2011, - 0x2012, - 0x2017, - 0x2018, - 0x2024, - 0x2027, - 0x2028, - 0x202F, - 0x2030, - 0x2033, - 0x2034, - 0x2035, - 0x2036, - 0x2037, - 0x2038, - 0x203C, - 0x203D, - 0x203E, - 0x203F, - 0x2047, - 0x2048, - 0x2049, - 0x204A, - 0x2057, - 0x2058, - 0x205F, - 0x2060, - 0x2065, - 0x206A, - 0x2070, - 0x2071, - 0x2072, - 0x2074, - 0x2075, - 0x2076, - 0x2077, - 0x2078, - 0x2079, - 0x207A, - 0x207B, - 0x207C, - 0x207D, - 0x207E, - 0x207F, - 0x2080, - 0x2081, - 0x2082, - 0x2083, - 0x2084, - 0x2085, - 0x2086, - 0x2087, - 0x2088, - 0x2089, - 0x208A, - 0x208B, - 0x208C, - 0x208D, - 0x208E, - 0x208F, - 0x2090, - 0x2091, - 0x2092, - 0x2093, - 0x2094, - 0x2095, - 0x2096, - 0x2097, - 0x2098, - 0x2099, - 0x209A, - 0x209B, - 0x209C, - 0x209D, - 0x20A0, - 0x20A8, - 0x20A9, - 0x20C2, - 0x20D0, - 0x20F1, - 0x2100, - 0x2101, - 0x2102, - 0x2103, - 0x2104, - 0x2105, - 0x2106, - 0x2107, - 0x2108, - 0x2109, - 0x210A, - 0x210B, - 0x210F, - 0x2110, - 0x2112, - 0x2114, - 0x2115, - 0x2116, - 0x2117, - 0x2119, - 0x211A, - 0x211B, - 0x211E, - 0x2120, - 0x2121, - 0x2122, - 0x2123, - 0x2124, - 0x2125, - 0x2126, - 0x2127, - 0x2128, - 0x2129, - 0x212A, - 0x212B, - 0x212C, - 0x212D, - 0x212E, - 0x212F, - 0x2131, - 0x2132, - 0x2133, - 0x2134, - 0x2135, - 0x2136, - 0x2137, - 0x2138, - 0x2139, - 0x213A, - 0x213B, - 0x213C, - 0x213D, - 0x213F, - 0x2140, - 0x2141, - 0x2145, - 0x2147, - 0x2148, - 0x2149, - 0x214A, - 0x2150, - 0x2151, - 0x2152, - 0x2153, - 0x2154, - 0x2155, - 0x2156, - 0x2157, - 0x2158, - 0x2159, - 0x215A, - 0x215B, - 0x215C, - 0x215D, - 0x215E, - 0x215F, - 0x2160, - 0x2161, - 0x2162, - 0x2163, - 0x2164, - 0x2165, - 0x2166, - 0x2167, - 0x2168, - 0x2169, - 0x216A, - 0x216B, - 0x216C, - 0x216D, - 0x216E, - 0x216F, - 0x2170, - 0x2171, - 0x2172, - 0x2173, - 0x2174, - 0x2175, - 0x2176, - 0x2177, - 0x2178, - 0x2179, - 0x217A, - 0x217B, - 0x217C, - 0x217D, - 0x217E, - 0x217F, - 0x2180, - 0x2183, - 0x2184, - 0x2189, - 0x218A, - 0x218C, - 0x2190, - 0x222C, - 0x222D, - 0x222E, - 0x222F, - 0x2230, - 0x2231, - 0x2329, - 0x232A, - 0x232B, - 0x242A, - 0x2440, - 0x244B, - 0x2460, - 0x2461, - 0x2462, - 0x2463, - 0x2464, - 0x2465, - 0x2466, - 0x2467, - 0x2468, - 0x2469, - 0x246A, - 0x246B, - 0x246C, - 0x246D, - 0x246E, - 0x246F, - 0x2470, - 0x2471, - 0x2472, - 0x2473, - 0x2474, - 0x2475, - 0x2476, - 0x2477, - 0x2478, - 0x2479, - 0x247A, - 0x247B, - 0x247C, - 0x247D, - 0x247E, - 0x247F, - 0x2480, - 0x2481, - 0x2482, - 0x2483, - 0x2484, - 0x2485, - 0x2486, - 0x2487, - 0x2488, - 0x249C, - 0x249D, - 0x249E, - 0x249F, - 0x24A0, - 0x24A1, - 0x24A2, - 0x24A3, - 0x24A4, - 0x24A5, - 0x24A6, - 0x24A7, - 0x24A8, - 0x24A9, - 0x24AA, - 0x24AB, - 0x24AC, - 0x24AD, - 0x24AE, - 0x24AF, - 0x24B0, - 0x24B1, - 0x24B2, - 0x24B3, - 0x24B4, - 0x24B5, - 0x24B6, - 0x24B7, - 0x24B8, - 0x24B9, - 0x24BA, - 0x24BB, - 0x24BC, - 0x24BD, - 0x24BE, - 0x24BF, - 0x24C0, - 0x24C1, - 0x24C2, - 0x24C3, - 0x24C4, - 0x24C5, - 0x24C6, - 0x24C7, - 0x24C8, - 0x24C9, - 0x24CA, - 0x24CB, - 0x24CC, - 0x24CD, - 0x24CE, - 0x24CF, - 0x24D0, - 0x24D1, - 0x24D2, - 0x24D3, - 0x24D4, - 0x24D5, - 0x24D6, - 0x24D7, - 0x24D8, - 0x24D9, - 0x24DA, - 0x24DB, - 0x24DC, - 0x24DD, - 0x24DE, - 0x24DF, - 0x24E0, - 0x24E1, - 0x24E2, - 0x24E3, - 0x24E4, - 0x24E5, - 0x24E6, - 0x24E7, - 0x24E8, - 0x24E9, - 0x24EA, - 0x24EB, - 0x2A0C, - 0x2A0D, - 0x2A74, - 0x2A75, - 0x2A76, - 0x2A77, - 0x2ADC, - 0x2ADD, - 0x2B74, - 0x2B76, - 0x2C00, - 0x2C01, - 0x2C02, - 0x2C03, - 0x2C04, - 0x2C05, - 0x2C06, - 0x2C07, - 0x2C08, - 0x2C09, - 0x2C0A, - 0x2C0B, - 0x2C0C, - 0x2C0D, - 0x2C0E, - 0x2C0F, - 0x2C10, - 0x2C11, - 0x2C12, - 0x2C13, - 0x2C14, - 0x2C15, - 0x2C16, - 0x2C17, - 0x2C18, - 0x2C19, - 0x2C1A, - 0x2C1B, - 0x2C1C, - 0x2C1D, - 0x2C1E, - 0x2C1F, - 0x2C20, - 0x2C21, - 0x2C22, - 0x2C23, - 0x2C24, - 0x2C25, - 0x2C26, - 0x2C27, - 0x2C28, - 0x2C29, - 0x2C2A, - 0x2C2B, - 0x2C2C, - 0x2C2D, - 0x2C2E, - 0x2C2F, - 0x2C30, - 0x2C60, - 0x2C61, - 0x2C62, - 0x2C63, - 0x2C64, - 0x2C65, - 0x2C67, - 0x2C68, - 0x2C69, - 0x2C6A, - 0x2C6B, - 0x2C6C, - 0x2C6D, - 0x2C6E, - 0x2C6F, - 0x2C70, - 0x2C71, - 0x2C72, - 0x2C73, - 0x2C75, - 0x2C76, - 0x2C7C, - 0x2C7D, - 0x2C7E, - 0x2C7F, - 0x2C80, - 0x2C81, - 0x2C82, - 0x2C83, - 0x2C84, - 0x2C85, - 0x2C86, - 0x2C87, - 0x2C88, - 0x2C89, - 0x2C8A, - 0x2C8B, - 0x2C8C, - 0x2C8D, - 0x2C8E, - 0x2C8F, - 0x2C90, - 0x2C91, - 0x2C92, - 0x2C93, - 0x2C94, - 0x2C95, - 0x2C96, - 0x2C97, - 0x2C98, - 0x2C99, - 0x2C9A, - 0x2C9B, - 0x2C9C, - 0x2C9D, - 0x2C9E, - 0x2C9F, - 0x2CA0, - 0x2CA1, - 0x2CA2, - 0x2CA3, - 0x2CA4, - 0x2CA5, - 0x2CA6, - 0x2CA7, - 0x2CA8, - 0x2CA9, - 0x2CAA, - 0x2CAB, - 0x2CAC, - 0x2CAD, - 0x2CAE, - 0x2CAF, - 0x2CB0, - 0x2CB1, - 0x2CB2, - 0x2CB3, - 0x2CB4, - 0x2CB5, - 0x2CB6, - 0x2CB7, - 0x2CB8, - 0x2CB9, - 0x2CBA, - 0x2CBB, - 0x2CBC, - 0x2CBD, - 0x2CBE, - 0x2CBF, - 0x2CC0, - 0x2CC1, - 0x2CC2, - 0x2CC3, - 0x2CC4, - 0x2CC5, - 0x2CC6, - 0x2CC7, - 0x2CC8, - 0x2CC9, - 0x2CCA, - 0x2CCB, - 0x2CCC, - 0x2CCD, - 0x2CCE, - 0x2CCF, - 0x2CD0, - 0x2CD1, - 0x2CD2, - 0x2CD3, - 0x2CD4, - 0x2CD5, - 0x2CD6, - 0x2CD7, - 0x2CD8, - 0x2CD9, - 0x2CDA, - 0x2CDB, - 0x2CDC, - 0x2CDD, - 0x2CDE, - 0x2CDF, - 0x2CE0, - 0x2CE1, - 0x2CE2, - 0x2CE3, - 0x2CEB, - 0x2CEC, - 0x2CED, - 0x2CEE, - 0x2CF2, - 0x2CF3, - 0x2CF4, - 0x2CF9, - 0x2D26, - 0x2D27, - 0x2D28, - 0x2D2D, - 0x2D2E, - 0x2D30, - 0x2D68, - 0x2D6F, - 0x2D70, - 0x2D71, - 0x2D7F, - 0x2D97, - 0x2DA0, - 0x2DA7, - 0x2DA8, - 0x2DAF, - 0x2DB0, - 0x2DB7, - 0x2DB8, - 0x2DBF, - 0x2DC0, - 0x2DC7, - 0x2DC8, - 0x2DCF, - 0x2DD0, - 0x2DD7, - 0x2DD8, - 0x2DDF, - 0x2DE0, - 0x2E5E, - 0x2E80, - 0x2E9A, - 0x2E9B, - 0x2E9F, - 0x2EA0, - 0x2EF3, - 0x2EF4, - 0x2F00, - 0x2F01, - 0x2F02, - 0x2F03, - 0x2F04, - 0x2F05, - 0x2F06, - 0x2F07, - 0x2F08, - 0x2F09, - 0x2F0A, - 0x2F0B, - 0x2F0C, - 0x2F0D, - 0x2F0E, - 0x2F0F, - 0x2F10, - 0x2F11, - 0x2F12, - 0x2F13, - 0x2F14, - 0x2F15, - 0x2F16, - 0x2F17, - 0x2F18, - 0x2F19, - 0x2F1A, - 0x2F1B, - 0x2F1C, - 0x2F1D, - 0x2F1E, - 0x2F1F, - 0x2F20, - 0x2F21, - 0x2F22, - 0x2F23, - 0x2F24, - 0x2F25, - 0x2F26, - 0x2F27, - 0x2F28, - 0x2F29, - 0x2F2A, - 0x2F2B, - 0x2F2C, - 0x2F2D, - 0x2F2E, - 0x2F2F, - 0x2F30, - 0x2F31, - 0x2F32, - 0x2F33, - 0x2F34, - 0x2F35, - 0x2F36, - 0x2F37, - 0x2F38, - 0x2F39, - 0x2F3A, - 0x2F3B, - 0x2F3C, - 0x2F3D, - 0x2F3E, - 0x2F3F, - 0x2F40, - 0x2F41, - 0x2F42, - 0x2F43, - 0x2F44, - 0x2F45, - 0x2F46, - 0x2F47, - 0x2F48, - 0x2F49, - 0x2F4A, - 0x2F4B, - 0x2F4C, - 0x2F4D, - 0x2F4E, - 0x2F4F, - 0x2F50, - 0x2F51, - 0x2F52, - 0x2F53, - 0x2F54, - 0x2F55, - 0x2F56, - 0x2F57, - 0x2F58, - 0x2F59, - 0x2F5A, - 0x2F5B, - 0x2F5C, - 0x2F5D, - 0x2F5E, - 0x2F5F, - 0x2F60, - 0x2F61, - 0x2F62, - 0x2F63, - 0x2F64, - 0x2F65, - 0x2F66, - 0x2F67, - 0x2F68, - 0x2F69, - 0x2F6A, - 0x2F6B, - 0x2F6C, - 0x2F6D, - 0x2F6E, - 0x2F6F, - 0x2F70, - 0x2F71, - 0x2F72, - 0x2F73, - 0x2F74, - 0x2F75, - 0x2F76, - 0x2F77, - 0x2F78, - 0x2F79, - 0x2F7A, - 0x2F7B, - 0x2F7C, - 0x2F7D, - 0x2F7E, - 0x2F7F, - 0x2F80, - 0x2F81, - 0x2F82, - 0x2F83, - 0x2F84, - 0x2F85, - 0x2F86, - 0x2F87, - 0x2F88, - 0x2F89, - 0x2F8A, - 0x2F8B, - 0x2F8C, - 0x2F8D, - 0x2F8E, - 0x2F8F, - 0x2F90, - 0x2F91, - 0x2F92, - 0x2F93, - 0x2F94, - 0x2F95, - 0x2F96, - 0x2F97, - 0x2F98, - 0x2F99, - 0x2F9A, - 0x2F9B, - 0x2F9C, - 0x2F9D, - 0x2F9E, - 0x2F9F, - 0x2FA0, - 0x2FA1, - 0x2FA2, - 0x2FA3, - 0x2FA4, - 0x2FA5, - 0x2FA6, - 0x2FA7, - 0x2FA8, - 0x2FA9, - 0x2FAA, - 0x2FAB, - 0x2FAC, - 0x2FAD, - 0x2FAE, - 0x2FAF, - 0x2FB0, - 0x2FB1, - 0x2FB2, - 0x2FB3, - 0x2FB4, - 0x2FB5, - 0x2FB6, - 0x2FB7, - 0x2FB8, - 0x2FB9, - 0x2FBA, - 0x2FBB, - 0x2FBC, - 0x2FBD, - 0x2FBE, - 0x2FBF, - 0x2FC0, - 0x2FC1, - 0x2FC2, - 0x2FC3, - 0x2FC4, - 0x2FC5, - 0x2FC6, - 0x2FC7, - 0x2FC8, - 0x2FC9, - 0x2FCA, - 0x2FCB, - 0x2FCC, - 0x2FCD, - 0x2FCE, - 0x2FCF, - 0x2FD0, - 0x2FD1, - 0x2FD2, - 0x2FD3, - 0x2FD4, - 0x2FD5, - 0x2FD6, - 0x3000, - 0x3001, - 0x3002, - 0x3003, - 0x3036, - 0x3037, - 0x3038, - 0x3039, - 0x303A, - 0x303B, - 0x3040, - 0x3041, - 0x3097, - 0x3099, - 0x309B, - 0x309C, - 0x309D, - 0x309F, - 0x30A0, - 0x30FF, - 0x3100, - 0x3105, - 0x3130, - 0x3131, - 0x3132, - 0x3133, - 0x3134, - 0x3135, - 0x3136, - 0x3137, - 0x3138, - 0x3139, - 0x313A, - 0x313B, - 0x313C, - 0x313D, - 0x313E, - 0x313F, - 0x3140, - 0x3141, - 0x3142, - 0x3143, - 0x3144, - 0x3145, - 0x3146, - 0x3147, - 0x3148, - 0x3149, - 0x314A, - 0x314B, - 0x314C, - 0x314D, - 0x314E, - 0x314F, - 0x3150, - 0x3151, - 0x3152, - 0x3153, - 0x3154, - 0x3155, - 0x3156, - 0x3157, - 0x3158, - 0x3159, - 0x315A, - 0x315B, - 0x315C, - 0x315D, - 0x315E, - 0x315F, - 0x3160, - 0x3161, - 0x3162, - 0x3163, - 0x3164, - 0x3165, - 0x3166, - 0x3167, - 0x3168, - 0x3169, - 0x316A, - 0x316B, - 0x316C, - 0x316D, - 0x316E, - 0x316F, - 0x3170, - 0x3171, - 0x3172, - 0x3173, - 0x3174, - 0x3175, - 0x3176, - 0x3177, - 0x3178, - 0x3179, - 0x317A, - 0x317B, - 0x317C, - 0x317D, - 0x317E, - 0x317F, - 0x3180, - 0x3181, - 0x3182, - 0x3183, - 0x3184, - 0x3185, - 0x3186, - 0x3187, - 0x3188, - 0x3189, - 0x318A, - 0x318B, - 0x318C, - 0x318D, - 0x318E, - 0x318F, - 0x3190, - 0x3192, - 0x3193, - 0x3194, - 0x3195, - 0x3196, - 0x3197, - 0x3198, - 0x3199, - 0x319A, - 0x319B, - 0x319C, - 0x319D, - 0x319E, - 0x319F, - 0x31A0, - 0x31E6, - 0x31F0, - 0x3200, - 0x3201, - 0x3202, - 0x3203, - 0x3204, - 0x3205, - 0x3206, - 0x3207, - 0x3208, - 0x3209, - 0x320A, - 0x320B, - 0x320C, - 0x320D, - 0x320E, - 0x320F, - 0x3210, - 0x3211, - 0x3212, - 0x3213, - 0x3214, - 0x3215, - 0x3216, - 0x3217, - 0x3218, - 0x3219, - 0x321A, - 0x321B, - 0x321C, - 0x321D, - 0x321E, - 0x321F, - 0x3220, - 0x3221, - 0x3222, - 0x3223, - 0x3224, - 0x3225, - 0x3226, - 0x3227, - 0x3228, - 0x3229, - 0x322A, - 0x322B, - 0x322C, - 0x322D, - 0x322E, - 0x322F, - 0x3230, - 0x3231, - 0x3232, - 0x3233, - 0x3234, - 0x3235, - 0x3236, - 0x3237, - 0x3238, - 0x3239, - 0x323A, - 0x323B, - 0x323C, - 0x323D, - 0x323E, - 0x323F, - 0x3240, - 0x3241, - 0x3242, - 0x3243, - 0x3244, - 0x3245, - 0x3246, - 0x3247, - 0x3248, - 0x3250, - 0x3251, - 0x3252, - 0x3253, - 0x3254, - 0x3255, - 0x3256, - 0x3257, - 0x3258, - 0x3259, - 0x325A, - 0x325B, - 0x325C, - 0x325D, - 0x325E, - 0x325F, - 0x3260, - 0x3261, - 0x3262, - 0x3263, - 0x3264, - 0x3265, - 0x3266, - 0x3267, - 0x3268, - 0x3269, - 0x326A, - 0x326B, - 0x326C, - 0x326D, - 0x326E, - 0x326F, - 0x3270, - 0x3271, - 0x3272, - 0x3273, - 0x3274, - 0x3275, - 0x3276, - 0x3277, - 0x3278, - 0x3279, - 0x327A, - 0x327B, - 0x327C, - 0x327D, - 0x327E, - 0x327F, - 0x3280, - 0x3281, - 0x3282, - 0x3283, - 0x3284, - 0x3285, - 0x3286, - 0x3287, - 0x3288, - 0x3289, - 0x328A, - 0x328B, - 0x328C, - 0x328D, - 0x328E, - 0x328F, - 0x3290, - 0x3291, - 0x3292, - 0x3293, - 0x3294, - 0x3295, - 0x3296, - 0x3297, - 0x3298, - 0x3299, - 0x329A, - 0x329B, - 0x329C, - 0x329D, - 0x329E, - 0x329F, - 0x32A0, - 0x32A1, - 0x32A2, - 0x32A3, - 0x32A4, - 0x32A5, - 0x32A6, - 0x32A7, - 0x32A8, - 0x32A9, - 0x32AA, - 0x32AB, - 0x32AC, - 0x32AD, - 0x32AE, - 0x32AF, - 0x32B0, - 0x32B1, - 0x32B2, - 0x32B3, - 0x32B4, - 0x32B5, - 0x32B6, - 0x32B7, - 0x32B8, - 0x32B9, - 0x32BA, - 0x32BB, - 0x32BC, - 0x32BD, - 0x32BE, - 0x32BF, - 0x32C0, - 0x32C1, - 0x32C2, - 0x32C3, - 0x32C4, - 0x32C5, - 0x32C6, - 0x32C7, - 0x32C8, - 0x32C9, - 0x32CA, - 0x32CB, - 0x32CC, - 0x32CD, - 0x32CE, - 0x32CF, - 0x32D0, - 0x32D1, - 0x32D2, - 0x32D3, - 0x32D4, - 0x32D5, - 0x32D6, - 0x32D7, - 0x32D8, - 0x32D9, - 0x32DA, - 0x32DB, - 0x32DC, - 0x32DD, - 0x32DE, - 0x32DF, - 0x32E0, - 0x32E1, - 0x32E2, - 0x32E3, - 0x32E4, - 0x32E5, - 0x32E6, - 0x32E7, - 0x32E8, - 0x32E9, - 0x32EA, - 0x32EB, - 0x32EC, - 0x32ED, - 0x32EE, - 0x32EF, - 0x32F0, - 0x32F1, - 0x32F2, - 0x32F3, - 0x32F4, - 0x32F5, - 0x32F6, - 0x32F7, - 0x32F8, - 0x32F9, - 0x32FA, - 0x32FB, - 0x32FC, - 0x32FD, - 0x32FE, - 0x32FF, - 0x3300, - 0x3301, - 0x3302, - 0x3303, - 0x3304, - 0x3305, - 0x3306, - 0x3307, - 0x3308, - 0x3309, - 0x330A, - 0x330B, - 0x330C, - 0x330D, - 0x330E, - 0x330F, - 0x3310, - 0x3311, - 0x3312, - 0x3313, - 0x3314, - 0x3315, - 0x3316, - 0x3317, - 0x3318, - 0x3319, - 0x331A, - 0x331B, - 0x331C, - 0x331D, - 0x331E, - 0x331F, - 0x3320, - 0x3321, - 0x3322, - 0x3323, - 0x3324, - 0x3325, - 0x3326, - 0x3327, - 0x3328, - 0x3329, - 0x332A, - 0x332B, - 0x332C, - 0x332D, - 0x332E, - 0x332F, - 0x3330, - 0x3331, - 0x3332, - 0x3333, - 0x3334, - 0x3335, - 0x3336, - 0x3337, - 0x3338, - 0x3339, - 0x333A, - 0x333B, - 0x333C, - 0x333D, - 0x333E, - 0x333F, - 0x3340, - 0x3341, - 0x3342, - 0x3343, - 0x3344, - 0x3345, - 0x3346, - 0x3347, - 0x3348, - 0x3349, - 0x334A, - 0x334B, - 0x334C, - 0x334D, - 0x334E, - 0x334F, - 0x3350, - 0x3351, - 0x3352, - 0x3353, - 0x3354, - 0x3355, - 0x3356, - 0x3357, - 0x3358, - 0x3359, - 0x335A, - 0x335B, - 0x335C, - 0x335D, - 0x335E, - 0x335F, - 0x3360, - 0x3361, - 0x3362, - 0x3363, - 0x3364, - 0x3365, - 0x3366, - 0x3367, - 0x3368, - 0x3369, - 0x336A, - 0x336B, - 0x336C, - 0x336D, - 0x336E, - 0x336F, - 0x3370, - 0x3371, - 0x3372, - 0x3373, - 0x3374, - 0x3375, - 0x3376, - 0x3377, - 0x3378, - 0x3379, - 0x337A, - 0x337B, - 0x337C, - 0x337D, - 0x337E, - 0x337F, - 0x3380, - 0x3381, - 0x3382, - 0x3383, - 0x3384, - 0x3385, - 0x3386, - 0x3387, - 0x3388, - 0x3389, - 0x338A, - 0x338B, - 0x338C, - 0x338D, - 0x338E, - 0x338F, - 0x3390, - 0x3391, - 0x3392, - 0x3393, - 0x3394, - 0x3395, - 0x3396, - 0x3397, - 0x3398, - 0x3399, - 0x339A, - 0x339B, - 0x339C, - 0x339D, - 0x339E, - 0x339F, - 0x33A0, - 0x33A1, - 0x33A2, - 0x33A3, - 0x33A4, - 0x33A5, - 0x33A6, - 0x33A7, - 0x33A8, - 0x33A9, - 0x33AA, - 0x33AB, - 0x33AC, - 0x33AD, - 0x33AE, - 0x33AF, - 0x33B0, - 0x33B1, - 0x33B2, - 0x33B3, - 0x33B4, - 0x33B5, - 0x33B6, - 0x33B7, - 0x33B8, - 0x33B9, - 0x33BA, - 0x33BB, - 0x33BC, - 0x33BD, - 0x33BE, - 0x33BF, - 0x33C0, - 0x33C1, - 0x33C2, - 0x33C3, - 0x33C4, - 0x33C5, - 0x33C6, - 0x33C7, - 0x33C8, - 0x33C9, - 0x33CA, - 0x33CB, - 0x33CC, - 0x33CD, - 0x33CE, - 0x33CF, - 0x33D0, - 0x33D1, - 0x33D2, - 0x33D3, - 0x33D4, - 0x33D5, - 0x33D6, - 0x33D7, - 0x33D8, - 0x33D9, - 0x33DA, - 0x33DB, - 0x33DC, - 0x33DD, - 0x33DE, - 0x33DF, - 0x33E0, - 0x33E1, - 0x33E2, - 0x33E3, - 0x33E4, - 0x33E5, - 0x33E6, - 0x33E7, - 0x33E8, - 0x33E9, - 0x33EA, - 0x33EB, - 0x33EC, - 0x33ED, - 0x33EE, - 0x33EF, - 0x33F0, - 0x33F1, - 0x33F2, - 0x33F3, - 0x33F4, - 0x33F5, - 0x33F6, - 0x33F7, - 0x33F8, - 0x33F9, - 0x33FA, - 0x33FB, - 0x33FC, - 0x33FD, - 0x33FE, - 0x33FF, - 0x3400, - 0xA48D, - 0xA490, - 0xA4C7, - 0xA4D0, - 0xA62C, - 0xA640, - 0xA641, - 0xA642, - 0xA643, - 0xA644, - 0xA645, - 0xA646, - 0xA647, - 0xA648, - 0xA649, - 0xA64A, - 0xA64B, - 0xA64C, - 0xA64D, - 0xA64E, - 0xA64F, - 0xA650, - 0xA651, - 0xA652, - 0xA653, - 0xA654, - 0xA655, - 0xA656, - 0xA657, - 0xA658, - 0xA659, - 0xA65A, - 0xA65B, - 0xA65C, - 0xA65D, - 0xA65E, - 0xA65F, - 0xA660, - 0xA661, - 0xA662, - 0xA663, - 0xA664, - 0xA665, - 0xA666, - 0xA667, - 0xA668, - 0xA669, - 0xA66A, - 0xA66B, - 0xA66C, - 0xA66D, - 0xA680, - 0xA681, - 0xA682, - 0xA683, - 0xA684, - 0xA685, - 0xA686, - 0xA687, - 0xA688, - 0xA689, - 0xA68A, - 0xA68B, - 0xA68C, - 0xA68D, - 0xA68E, - 0xA68F, - 0xA690, - 0xA691, - 0xA692, - 0xA693, - 0xA694, - 0xA695, - 0xA696, - 0xA697, - 0xA698, - 0xA699, - 0xA69A, - 0xA69B, - 0xA69C, - 0xA69D, - 0xA69E, - 0xA6F8, - 0xA700, - 0xA722, - 0xA723, - 0xA724, - 0xA725, - 0xA726, - 0xA727, - 0xA728, - 0xA729, - 0xA72A, - 0xA72B, - 0xA72C, - 0xA72D, - 0xA72E, - 0xA72F, - 0xA732, - 0xA733, - 0xA734, - 0xA735, - 0xA736, - 0xA737, - 0xA738, - 0xA739, - 0xA73A, - 0xA73B, - 0xA73C, - 0xA73D, - 0xA73E, - 0xA73F, - 0xA740, - 0xA741, - 0xA742, - 0xA743, - 0xA744, - 0xA745, - 0xA746, - 0xA747, - 0xA748, - 0xA749, - 0xA74A, - 0xA74B, - 0xA74C, - 0xA74D, - 0xA74E, - 0xA74F, - 0xA750, - 0xA751, - 0xA752, - 0xA753, - 0xA754, - 0xA755, - 0xA756, - 0xA757, - 0xA758, - 0xA759, - 0xA75A, - 0xA75B, - 0xA75C, - 0xA75D, - 0xA75E, - 0xA75F, - 0xA760, - 0xA761, - 0xA762, - 0xA763, - 0xA764, - 0xA765, - 0xA766, - 0xA767, - 0xA768, - 0xA769, - 0xA76A, - 0xA76B, - 0xA76C, - 0xA76D, - 0xA76E, - 0xA76F, - 0xA770, - 0xA771, - 0xA779, - 0xA77A, - 0xA77B, - 0xA77C, - 0xA77D, - 0xA77E, - 0xA77F, - 0xA780, - 0xA781, - 0xA782, - 0xA783, - 0xA784, - 0xA785, - 0xA786, - 0xA787, - 0xA78B, - 0xA78C, - 0xA78D, - 0xA78E, - 0xA790, - 0xA791, - 0xA792, - 0xA793, - 0xA796, - 0xA797, - 0xA798, - 0xA799, - 0xA79A, - 0xA79B, - 0xA79C, - 0xA79D, - 0xA79E, - 0xA79F, - 0xA7A0, - 0xA7A1, - 0xA7A2, - 0xA7A3, - 0xA7A4, - 0xA7A5, - 0xA7A6, - 0xA7A7, - 0xA7A8, - 0xA7A9, - 0xA7AA, - 0xA7AB, - 0xA7AC, - 0xA7AD, - 0xA7AE, - 0xA7AF, - 0xA7B0, - 0xA7B1, - 0xA7B2, - 0xA7B3, - 0xA7B4, - 0xA7B5, - 0xA7B6, - 0xA7B7, - 0xA7B8, - 0xA7B9, - 0xA7BA, - 0xA7BB, - 0xA7BC, - 0xA7BD, - 0xA7BE, - 0xA7BF, - 0xA7C0, - 0xA7C1, - 0xA7C2, - 0xA7C3, - 0xA7C4, - 0xA7C5, - 0xA7C6, - 0xA7C7, - 0xA7C8, - 0xA7C9, - 0xA7CA, - 0xA7CB, - 0xA7CC, - 0xA7CD, - 0xA7CE, - 0xA7CF, - 0xA7D0, - 0xA7D1, - 0xA7D2, - 0xA7D3, - 0xA7D4, - 0xA7D5, - 0xA7D6, - 0xA7D7, - 0xA7D8, - 0xA7D9, - 0xA7DA, - 0xA7DB, - 0xA7DC, - 0xA7DD, - 0xA7F1, - 0xA7F2, - 0xA7F3, - 0xA7F4, - 0xA7F5, - 0xA7F6, - 0xA7F8, - 0xA7F9, - 0xA7FA, - 0xA82D, - 0xA830, - 0xA83A, - 0xA840, - 0xA878, - 0xA880, - 0xA8C6, - 0xA8CE, - 0xA8DA, - 0xA8E0, - 0xA954, - 0xA95F, - 0xA97D, - 0xA980, - 0xA9CE, - 0xA9CF, - 0xA9DA, - 0xA9DE, - 0xA9FF, - 0xAA00, - 0xAA37, - 0xAA40, - 0xAA4E, - 0xAA50, - 0xAA5A, - 0xAA5C, - 0xAAC3, - 0xAADB, - 0xAAF7, - 0xAB01, - 0xAB07, - 0xAB09, - 0xAB0F, - 0xAB11, - 0xAB17, - 0xAB20, - 0xAB27, - 0xAB28, - 0xAB2F, - 0xAB30, - 0xAB5C, - 0xAB5D, - 0xAB5E, - 0xAB5F, - 0xAB60, - 0xAB69, - 0xAB6A, - 0xAB6C, - 0xAB70, - 0xAB71, - 0xAB72, - 0xAB73, - 0xAB74, - 0xAB75, - 0xAB76, - 0xAB77, - 0xAB78, - 0xAB79, - 0xAB7A, - 0xAB7B, - 0xAB7C, - 0xAB7D, - 0xAB7E, - 0xAB7F, - 0xAB80, - 0xAB81, - 0xAB82, - 0xAB83, - 0xAB84, - 0xAB85, - 0xAB86, - 0xAB87, - 0xAB88, - 0xAB89, - 0xAB8A, - 0xAB8B, - 0xAB8C, - 0xAB8D, - 0xAB8E, - 0xAB8F, - 0xAB90, - 0xAB91, - 0xAB92, - 0xAB93, - 0xAB94, - 0xAB95, - 0xAB96, - 0xAB97, - 0xAB98, - 0xAB99, - 0xAB9A, - 0xAB9B, - 0xAB9C, - 0xAB9D, - 0xAB9E, - 0xAB9F, - 0xABA0, - 0xABA1, - 0xABA2, - 0xABA3, - 0xABA4, - 0xABA5, - 0xABA6, - 0xABA7, - 0xABA8, - 0xABA9, - 0xABAA, - 0xABAB, - 0xABAC, - 0xABAD, - 0xABAE, - 0xABAF, - 0xABB0, - 0xABB1, - 0xABB2, - 0xABB3, - 0xABB4, - 0xABB5, - 0xABB6, - 0xABB7, - 0xABB8, - 0xABB9, - 0xABBA, - 0xABBB, - 0xABBC, - 0xABBD, - 0xABBE, - 0xABBF, - 0xABC0, - 0xABEE, - 0xABF0, - 0xABFA, - 0xAC00, - 0xD7A4, - 0xD7B0, - 0xD7C7, - 0xD7CB, - 0xD7FC, - 0xF900, - 0xF901, - 0xF902, - 0xF903, - 0xF904, - 0xF905, - 0xF906, - 0xF907, - 0xF909, - 0xF90A, - 0xF90B, - 0xF90C, - 0xF90D, - 0xF90E, - 0xF90F, - 0xF910, - 0xF911, - 0xF912, - 0xF913, - 0xF914, - 0xF915, - 0xF916, - 0xF917, - 0xF918, - 0xF919, - 0xF91A, - 0xF91B, - 0xF91C, - 0xF91D, - 0xF91E, - 0xF91F, - 0xF920, - 0xF921, - 0xF922, - 0xF923, - 0xF924, - 0xF925, - 0xF926, - 0xF927, - 0xF928, - 0xF929, - 0xF92A, - 0xF92B, - 0xF92C, - 0xF92D, - 0xF92E, - 0xF92F, - 0xF930, - 0xF931, - 0xF932, - 0xF933, - 0xF934, - 0xF935, - 0xF936, - 0xF937, - 0xF938, - 0xF939, - 0xF93A, - 0xF93B, - 0xF93C, - 0xF93D, - 0xF93E, - 0xF93F, - 0xF940, - 0xF941, - 0xF942, - 0xF943, - 0xF944, - 0xF945, - 0xF946, - 0xF947, - 0xF948, - 0xF949, - 0xF94A, - 0xF94B, - 0xF94C, - 0xF94D, - 0xF94E, - 0xF94F, - 0xF950, - 0xF951, - 0xF952, - 0xF953, - 0xF954, - 0xF955, - 0xF956, - 0xF957, - 0xF958, - 0xF959, - 0xF95A, - 0xF95B, - 0xF95C, - 0xF95D, - 0xF95E, - 0xF95F, - 0xF960, - 0xF961, - 0xF962, - 0xF963, - 0xF964, - 0xF965, - 0xF966, - 0xF967, - 0xF968, - 0xF969, - 0xF96A, - 0xF96B, - 0xF96C, - 0xF96D, - 0xF96E, - 0xF96F, - 0xF970, - 0xF971, - 0xF972, - 0xF973, - 0xF974, - 0xF975, - 0xF976, - 0xF977, - 0xF978, - 0xF979, - 0xF97A, - 0xF97B, - 0xF97C, - 0xF97D, - 0xF97E, - 0xF97F, - 0xF980, - 0xF981, - 0xF982, - 0xF983, - 0xF984, - 0xF985, - 0xF986, - 0xF987, - 0xF988, - 0xF989, - 0xF98A, - 0xF98B, - 0xF98C, - 0xF98D, - 0xF98E, - 0xF98F, - 0xF990, - 0xF991, - 0xF992, - 0xF993, - 0xF994, - 0xF995, - 0xF996, - 0xF997, - 0xF998, - 0xF999, - 0xF99A, - 0xF99B, - 0xF99C, - 0xF99D, - 0xF99E, - 0xF99F, - 0xF9A0, - 0xF9A1, - 0xF9A2, - 0xF9A3, - 0xF9A4, - 0xF9A5, - 0xF9A6, - 0xF9A7, - 0xF9A8, - 0xF9A9, - 0xF9AA, - 0xF9AB, - 0xF9AC, - 0xF9AD, - 0xF9AE, - 0xF9AF, - 0xF9B0, - 0xF9B1, - 0xF9B2, - 0xF9B3, - 0xF9B4, - 0xF9B5, - 0xF9B6, - 0xF9B7, - 0xF9B8, - 0xF9B9, - 0xF9BA, - 0xF9BB, - 0xF9BC, - 0xF9BD, - 0xF9BE, - 0xF9BF, - 0xF9C0, - 0xF9C1, - 0xF9C2, - 0xF9C3, - 0xF9C4, - 0xF9C5, - 0xF9C6, - 0xF9C7, - 0xF9C8, - 0xF9C9, - 0xF9CA, - 0xF9CB, - 0xF9CC, - 0xF9CD, - 0xF9CE, - 0xF9CF, - 0xF9D0, - 0xF9D1, - 0xF9D2, - 0xF9D3, - 0xF9D4, - 0xF9D5, - 0xF9D6, - 0xF9D7, - 0xF9D8, - 0xF9D9, - 0xF9DA, - 0xF9DB, - 0xF9DC, - 0xF9DD, - 0xF9DE, - 0xF9DF, - 0xF9E0, - 0xF9E1, - 0xF9E2, - 0xF9E3, - 0xF9E4, - 0xF9E5, - 0xF9E6, - 0xF9E7, - 0xF9E8, - 0xF9E9, - 0xF9EA, - 0xF9EB, - 0xF9EC, - 0xF9ED, - 0xF9EE, - 0xF9EF, - 0xF9F0, - 0xF9F1, - 0xF9F2, - 0xF9F3, - 0xF9F4, - 0xF9F5, - 0xF9F6, - 0xF9F7, - 0xF9F8, - 0xF9F9, - 0xF9FA, - 0xF9FB, - 0xF9FC, - 0xF9FD, - 0xF9FE, - 0xF9FF, - 0xFA00, - 0xFA01, - 0xFA02, - 0xFA03, - 0xFA04, - 0xFA05, - 0xFA06, - 0xFA07, - 0xFA08, - 0xFA09, - 0xFA0A, - 0xFA0B, - 0xFA0C, - 0xFA0D, - 0xFA0E, - 0xFA10, - 0xFA11, - 0xFA12, - 0xFA13, - 0xFA15, - 0xFA16, - 0xFA17, - 0xFA18, - 0xFA19, - 0xFA1A, - 0xFA1B, - 0xFA1C, - 0xFA1D, - 0xFA1E, - 0xFA1F, - 0xFA20, - 0xFA21, - 0xFA22, - 0xFA23, - 0xFA25, - 0xFA26, - 0xFA27, - 0xFA2A, - 0xFA2B, - 0xFA2C, - 0xFA2D, - 0xFA2E, - 0xFA2F, - 0xFA30, - 0xFA31, - 0xFA32, - 0xFA33, - 0xFA34, - 0xFA35, - 0xFA36, - 0xFA37, - 0xFA38, - 0xFA39, - 0xFA3A, - 0xFA3B, - 0xFA3C, - 0xFA3D, - 0xFA3E, - 0xFA3F, - 0xFA40, - 0xFA41, - 0xFA42, - 0xFA43, - 0xFA44, - 0xFA45, - 0xFA46, - 0xFA47, - 0xFA48, - 0xFA49, - 0xFA4A, - 0xFA4B, - 0xFA4C, - 0xFA4D, - 0xFA4E, - 0xFA4F, - 0xFA50, - 0xFA51, - 0xFA52, - 0xFA53, - 0xFA54, - 0xFA55, - 0xFA56, - 0xFA57, - 0xFA58, - 0xFA59, - 0xFA5A, - 0xFA5B, - 0xFA5C, - 0xFA5D, - 0xFA5F, - 0xFA60, - 0xFA61, - 0xFA62, - 0xFA63, - 0xFA64, - 0xFA65, - 0xFA66, - 0xFA67, - 0xFA68, - 0xFA69, - 0xFA6A, - 0xFA6B, - 0xFA6C, - 0xFA6D, - 0xFA6E, - 0xFA70, - 0xFA71, - 0xFA72, - 0xFA73, - 0xFA74, - 0xFA75, - 0xFA76, - 0xFA77, - 0xFA78, - 0xFA79, - 0xFA7A, - 0xFA7B, - 0xFA7C, - 0xFA7D, - 0xFA7E, - 0xFA7F, - 0xFA80, - 0xFA81, - 0xFA82, - 0xFA83, - 0xFA84, - 0xFA85, - 0xFA86, - 0xFA87, - 0xFA88, - 0xFA89, - 0xFA8A, - 0xFA8B, - 0xFA8C, - 0xFA8D, - 0xFA8E, - 0xFA8F, - 0xFA90, - 0xFA91, - 0xFA92, - 0xFA93, - 0xFA94, - 0xFA95, - 0xFA96, - 0xFA97, - 0xFA98, - 0xFA99, - 0xFA9A, - 0xFA9B, - 0xFA9C, - 0xFA9D, - 0xFA9E, - 0xFA9F, - 0xFAA0, - 0xFAA1, - 0xFAA2, - 0xFAA3, - 0xFAA4, - 0xFAA5, - 0xFAA6, - 0xFAA7, - 0xFAA8, - 0xFAA9, - 0xFAAA, - 0xFAAB, - 0xFAAC, - 0xFAAD, - 0xFAAE, - 0xFAAF, - 0xFAB0, - 0xFAB1, - 0xFAB2, - 0xFAB3, - 0xFAB4, - 0xFAB5, - 0xFAB6, - 0xFAB7, - 0xFAB8, - 0xFAB9, - 0xFABA, - 0xFABB, - 0xFABC, - 0xFABD, - 0xFABE, - 0xFABF, - 0xFAC0, - 0xFAC1, - 0xFAC2, - 0xFAC3, - 0xFAC4, - 0xFAC5, - 0xFAC6, - 0xFAC7, - 0xFAC8, - 0xFAC9, - 0xFACA, - 0xFACB, - 0xFACC, - 0xFACD, - 0xFACE, - 0xFACF, - 0xFAD0, - 0xFAD1, - 0xFAD2, - 0xFAD3, - 0xFAD4, - 0xFAD5, - 0xFAD6, - 0xFAD7, - 0xFAD8, - 0xFAD9, - 0xFADA, - 0xFB00, - 0xFB01, - 0xFB02, - 0xFB03, - 0xFB04, - 0xFB05, - 0xFB07, - 0xFB13, - 0xFB14, - 0xFB15, - 0xFB16, - 0xFB17, - 0xFB18, - 0xFB1D, - 0xFB1E, - 0xFB1F, - 0xFB20, - 0xFB21, - 0xFB22, - 0xFB23, - 0xFB24, - 0xFB25, - 0xFB26, - 0xFB27, - 0xFB28, - 0xFB29, - 0xFB2A, - 0xFB2B, - 0xFB2C, - 0xFB2D, - 0xFB2E, - 0xFB2F, - 0xFB30, - 0xFB31, - 0xFB32, - 0xFB33, - 0xFB34, - 0xFB35, - 0xFB36, - 0xFB37, - 0xFB38, - 0xFB39, - 0xFB3A, - 0xFB3B, - 0xFB3C, - 0xFB3D, - 0xFB3E, - 0xFB3F, - 0xFB40, - 0xFB41, - 0xFB42, - 0xFB43, - 0xFB44, - 0xFB45, - 0xFB46, - 0xFB47, - 0xFB48, - 0xFB49, - 0xFB4A, - 0xFB4B, - 0xFB4C, - 0xFB4D, - 0xFB4E, - 0xFB4F, - 0xFB50, - 0xFB52, - 0xFB56, - 0xFB5A, - 0xFB5E, - 0xFB62, - 0xFB66, - 0xFB6A, - 0xFB6E, - 0xFB72, - 0xFB76, - 0xFB7A, - 0xFB7E, - 0xFB82, - 0xFB84, - 0xFB86, - 0xFB88, - 0xFB8A, - 0xFB8C, - 0xFB8E, - 0xFB92, - 0xFB96, - 0xFB9A, - 0xFB9E, - 0xFBA0, - 0xFBA4, - 0xFBA6, - 0xFBAA, - 0xFBAE, - 0xFBB0, - 0xFBB2, - 0xFBD3, - 0xFBD7, - 0xFBD9, - 0xFBDB, - 0xFBDD, - 0xFBDE, - 0xFBE0, - 0xFBE2, - 0xFBE4, - 0xFBE8, - 0xFBEA, - 0xFBEC, - 0xFBEE, - 0xFBF0, - 0xFBF2, - 0xFBF4, - 0xFBF6, - 0xFBF9, - 0xFBFC, - 0xFC00, - 0xFC01, - 0xFC02, - 0xFC03, - 0xFC04, - 0xFC05, - 0xFC06, - 0xFC07, - 0xFC08, - 0xFC09, - 0xFC0A, - 0xFC0B, - 0xFC0C, - 0xFC0D, - 0xFC0E, - 0xFC0F, - 0xFC10, - 0xFC11, - 0xFC12, - 0xFC13, - 0xFC14, - 0xFC15, - 0xFC16, - 0xFC17, - 0xFC18, - 0xFC19, - 0xFC1A, - 0xFC1B, - 0xFC1C, - 0xFC1D, - 0xFC1E, - 0xFC1F, - 0xFC20, - 0xFC21, - 0xFC22, - 0xFC23, - 0xFC24, - 0xFC25, - 0xFC26, - 0xFC27, - 0xFC28, - 0xFC29, - 0xFC2A, - 0xFC2B, - 0xFC2C, - 0xFC2D, - 0xFC2E, - 0xFC2F, - 0xFC30, - 0xFC31, - 0xFC32, - 0xFC33, - 0xFC34, - 0xFC35, - 0xFC36, - 0xFC37, - 0xFC38, - 0xFC39, - 0xFC3A, - 0xFC3B, - 0xFC3C, - 0xFC3D, - 0xFC3E, - 0xFC3F, - 0xFC40, - 0xFC41, - 0xFC42, - 0xFC43, - 0xFC44, - 0xFC45, - 0xFC46, - 0xFC47, - 0xFC48, - 0xFC49, - 0xFC4A, - 0xFC4B, - 0xFC4C, - 0xFC4D, - 0xFC4E, - 0xFC4F, - 0xFC50, - 0xFC51, - 0xFC52, - 0xFC53, - 0xFC54, - 0xFC55, - 0xFC56, - 0xFC57, - 0xFC58, - 0xFC59, - 0xFC5A, - 0xFC5B, - 0xFC5C, - 0xFC5D, - 0xFC5E, - 0xFC5F, - 0xFC60, - 0xFC61, - 0xFC62, - 0xFC63, - 0xFC64, - 0xFC65, - 0xFC66, - 0xFC67, - 0xFC68, - 0xFC69, - 0xFC6A, - 0xFC6B, - 0xFC6C, - 0xFC6D, - 0xFC6E, - 0xFC6F, - 0xFC70, - 0xFC71, - 0xFC72, - 0xFC73, - 0xFC74, - 0xFC75, - 0xFC76, - 0xFC77, - 0xFC78, - 0xFC79, - 0xFC7A, - 0xFC7B, - 0xFC7C, - 0xFC7D, - 0xFC7E, - 0xFC7F, - 0xFC80, - 0xFC81, - 0xFC82, - 0xFC83, - 0xFC84, - 0xFC85, - 0xFC86, - 0xFC87, - 0xFC88, - 0xFC89, - 0xFC8A, - 0xFC8B, - 0xFC8C, - 0xFC8D, - 0xFC8E, - 0xFC8F, - 0xFC90, - 0xFC91, - 0xFC92, - 0xFC93, - 0xFC94, - 0xFC95, - 0xFC96, - 0xFC97, - 0xFC98, - 0xFC99, - 0xFC9A, - 0xFC9B, - 0xFC9C, - 0xFC9D, - 0xFC9E, - 0xFC9F, - 0xFCA0, - 0xFCA1, - 0xFCA2, - 0xFCA3, - 0xFCA4, - 0xFCA5, - 0xFCA6, - 0xFCA7, - 0xFCA8, - 0xFCA9, - 0xFCAA, - 0xFCAB, - 0xFCAC, - 0xFCAD, - 0xFCAE, - 0xFCAF, - 0xFCB0, - 0xFCB1, - 0xFCB2, - 0xFCB3, - 0xFCB4, - 0xFCB5, - 0xFCB6, - 0xFCB7, - 0xFCB8, - 0xFCB9, - 0xFCBA, - 0xFCBB, - 0xFCBC, - 0xFCBD, - 0xFCBE, - 0xFCBF, - 0xFCC0, - 0xFCC1, - 0xFCC2, - 0xFCC3, - 0xFCC4, - 0xFCC5, - 0xFCC6, - 0xFCC7, - 0xFCC8, - 0xFCC9, - 0xFCCA, - 0xFCCB, - 0xFCCC, - 0xFCCD, - 0xFCCE, - 0xFCCF, - 0xFCD0, - 0xFCD1, - 0xFCD2, - 0xFCD3, - 0xFCD4, - 0xFCD5, - 0xFCD6, - 0xFCD7, - 0xFCD8, - 0xFCD9, - 0xFCDA, - 0xFCDB, - 0xFCDC, - 0xFCDD, - 0xFCDE, - 0xFCDF, - 0xFCE0, - 0xFCE1, - 0xFCE2, - 0xFCE3, - 0xFCE4, - 0xFCE5, - 0xFCE6, - 0xFCE7, - 0xFCE8, - 0xFCE9, - 0xFCEA, - 0xFCEB, - 0xFCEC, - 0xFCED, - 0xFCEE, - 0xFCEF, - 0xFCF0, - 0xFCF1, - 0xFCF2, - 0xFCF3, - 0xFCF4, - 0xFCF5, - 0xFCF6, - 0xFCF7, - 0xFCF8, - 0xFCF9, - 0xFCFA, - 0xFCFB, - 0xFCFC, - 0xFCFD, - 0xFCFE, - 0xFCFF, - 0xFD00, - 0xFD01, - 0xFD02, - 0xFD03, - 0xFD04, - 0xFD05, - 0xFD06, - 0xFD07, - 0xFD08, - 0xFD09, - 0xFD0A, - 0xFD0B, - 0xFD0C, - 0xFD0D, - 0xFD0E, - 0xFD0F, - 0xFD10, - 0xFD11, - 0xFD12, - 0xFD13, - 0xFD14, - 0xFD15, - 0xFD16, - 0xFD17, - 0xFD18, - 0xFD19, - 0xFD1A, - 0xFD1B, - 0xFD1C, - 0xFD1D, - 0xFD1E, - 0xFD1F, - 0xFD20, - 0xFD21, - 0xFD22, - 0xFD23, - 0xFD24, - 0xFD25, - 0xFD26, - 0xFD27, - 0xFD28, - 0xFD29, - 0xFD2A, - 0xFD2B, - 0xFD2C, - 0xFD2D, - 0xFD2E, - 0xFD2F, - 0xFD30, - 0xFD31, - 0xFD32, - 0xFD33, - 0xFD34, - 0xFD35, - 0xFD36, - 0xFD37, - 0xFD38, - 0xFD39, - 0xFD3A, - 0xFD3B, - 0xFD3C, - 0xFD3E, - 0xFD50, - 0xFD51, - 0xFD53, - 0xFD54, - 0xFD55, - 0xFD56, - 0xFD57, - 0xFD58, - 0xFD5A, - 0xFD5B, - 0xFD5C, - 0xFD5D, - 0xFD5E, - 0xFD5F, - 0xFD61, - 0xFD62, - 0xFD64, - 0xFD66, - 0xFD67, - 0xFD69, - 0xFD6A, - 0xFD6C, - 0xFD6E, - 0xFD6F, - 0xFD71, - 0xFD73, - 0xFD74, - 0xFD75, - 0xFD76, - 0xFD78, - 0xFD79, - 0xFD7A, - 0xFD7B, - 0xFD7C, - 0xFD7E, - 0xFD7F, - 0xFD80, - 0xFD81, - 0xFD82, - 0xFD83, - 0xFD85, - 0xFD87, - 0xFD89, - 0xFD8A, - 0xFD8B, - 0xFD8C, - 0xFD8D, - 0xFD8E, - 0xFD8F, - 0xFD90, - 0xFD92, - 0xFD93, - 0xFD94, - 0xFD95, - 0xFD96, - 0xFD97, - 0xFD99, - 0xFD9A, - 0xFD9B, - 0xFD9C, - 0xFD9E, - 0xFD9F, - 0xFDA0, - 0xFDA1, - 0xFDA2, - 0xFDA3, - 0xFDA4, - 0xFDA5, - 0xFDA6, - 0xFDA7, - 0xFDA8, - 0xFDA9, - 0xFDAA, - 0xFDAB, - 0xFDAC, - 0xFDAD, - 0xFDAE, - 0xFDAF, - 0xFDB0, - 0xFDB1, - 0xFDB2, - 0xFDB3, - 0xFDB4, - 0xFDB5, - 0xFDB6, - 0xFDB7, - 0xFDB8, - 0xFDB9, - 0xFDBA, - 0xFDBB, - 0xFDBC, - 0xFDBD, - 0xFDBE, - 0xFDBF, - 0xFDC0, - 0xFDC1, - 0xFDC2, - 0xFDC3, - 0xFDC4, - 0xFDC5, - 0xFDC6, - 0xFDC7, - 0xFDC8, - 0xFDD0, - 0xFDF0, - 0xFDF1, - 0xFDF2, - 0xFDF3, - 0xFDF4, - 0xFDF5, - 0xFDF6, - 0xFDF7, - 0xFDF8, - 0xFDF9, - 0xFDFA, - 0xFDFB, - 0xFDFC, - 0xFDFD, - 0xFE00, - 0xFE10, - 0xFE11, - 0xFE12, - 0xFE13, - 0xFE14, - 0xFE15, - 0xFE16, - 0xFE17, - 0xFE18, - 0xFE19, - 0xFE20, - 0xFE30, - 0xFE31, - 0xFE32, - 0xFE33, - 0xFE35, - 0xFE36, - 0xFE37, - 0xFE38, - 0xFE39, - 0xFE3A, - 0xFE3B, - 0xFE3C, - 0xFE3D, - 0xFE3E, - 0xFE3F, - 0xFE40, - 0xFE41, - 0xFE42, - 0xFE43, - 0xFE44, - 0xFE45, - 0xFE47, - 0xFE48, - 0xFE49, - 0xFE4D, - 0xFE50, - 0xFE51, - 0xFE52, - 0xFE54, - 0xFE55, - 0xFE56, - 0xFE57, - 0xFE58, - 0xFE59, - 0xFE5A, - 0xFE5B, - 0xFE5C, - 0xFE5D, - 0xFE5E, - 0xFE5F, - 0xFE60, - 0xFE61, - 0xFE62, - 0xFE63, - 0xFE64, - 0xFE65, - 0xFE66, - 0xFE67, - 0xFE68, - 0xFE69, - 0xFE6A, - 0xFE6B, - 0xFE6C, - 0xFE70, - 0xFE71, - 0xFE72, - 0xFE73, - 0xFE74, - 0xFE75, - 0xFE76, - 0xFE77, - 0xFE78, - 0xFE79, - 0xFE7A, - 0xFE7B, - 0xFE7C, - 0xFE7D, - 0xFE7E, - 0xFE7F, - 0xFE80, - 0xFE81, - 0xFE83, - 0xFE85, - 0xFE87, - 0xFE89, - 0xFE8D, - 0xFE8F, - 0xFE93, - 0xFE95, - 0xFE99, - 0xFE9D, - 0xFEA1, - 0xFEA5, - 0xFEA9, - 0xFEAB, - 0xFEAD, - 0xFEAF, - 0xFEB1, - 0xFEB5, - 0xFEB9, - 0xFEBD, - 0xFEC1, - 0xFEC5, - 0xFEC9, - 0xFECD, - 0xFED1, - 0xFED5, - 0xFED9, - 0xFEDD, - 0xFEE1, - 0xFEE5, - 0xFEE9, - 0xFEED, - 0xFEEF, - 0xFEF1, - 0xFEF5, - 0xFEF7, - 0xFEF9, - 0xFEFB, - 0xFEFD, - 0xFEFF, - 0xFF00, - 0xFF01, - 0xFF02, - 0xFF03, - 0xFF04, - 0xFF05, - 0xFF06, - 0xFF07, - 0xFF08, - 0xFF09, - 0xFF0A, - 0xFF0B, - 0xFF0C, - 0xFF0D, - 0xFF0E, - 0xFF0F, - 0xFF10, - 0xFF11, - 0xFF12, - 0xFF13, - 0xFF14, - 0xFF15, - 0xFF16, - 0xFF17, - 0xFF18, - 0xFF19, - 0xFF1A, - 0xFF1B, - 0xFF1C, - 0xFF1D, - 0xFF1E, - 0xFF1F, - 0xFF20, - 0xFF21, - 0xFF22, - 0xFF23, - 0xFF24, - 0xFF25, - 0xFF26, - 0xFF27, - 0xFF28, - 0xFF29, - 0xFF2A, - 0xFF2B, - 0xFF2C, - 0xFF2D, - 0xFF2E, - 0xFF2F, - 0xFF30, - 0xFF31, - 0xFF32, - 0xFF33, - 0xFF34, - 0xFF35, - 0xFF36, - 0xFF37, - 0xFF38, - 0xFF39, - 0xFF3A, - 0xFF3B, - 0xFF3C, - 0xFF3D, - 0xFF3E, - 0xFF3F, - 0xFF40, - 0xFF41, - 0xFF42, - 0xFF43, - 0xFF44, - 0xFF45, - 0xFF46, - 0xFF47, - 0xFF48, - 0xFF49, - 0xFF4A, - 0xFF4B, - 0xFF4C, - 0xFF4D, - 0xFF4E, - 0xFF4F, - 0xFF50, - 0xFF51, - 0xFF52, - 0xFF53, - 0xFF54, - 0xFF55, - 0xFF56, - 0xFF57, - 0xFF58, - 0xFF59, - 0xFF5A, - 0xFF5B, - 0xFF5C, - 0xFF5D, - 0xFF5E, - 0xFF5F, - 0xFF60, - 0xFF61, - 0xFF62, - 0xFF63, - 0xFF64, - 0xFF65, - 0xFF66, - 0xFF67, - 0xFF68, - 0xFF69, - 0xFF6A, - 0xFF6B, - 0xFF6C, - 0xFF6D, - 0xFF6E, - 0xFF6F, - 0xFF70, - 0xFF71, - 0xFF72, - 0xFF73, - 0xFF74, - 0xFF75, - 0xFF76, - 0xFF77, - 0xFF78, - 0xFF79, - 0xFF7A, - 0xFF7B, - 0xFF7C, - 0xFF7D, - 0xFF7E, - 0xFF7F, - 0xFF80, - 0xFF81, - 0xFF82, - 0xFF83, - 0xFF84, - 0xFF85, - 0xFF86, - 0xFF87, - 0xFF88, - 0xFF89, - 0xFF8A, - 0xFF8B, - 0xFF8C, - 0xFF8D, - 0xFF8E, - 0xFF8F, - 0xFF90, - 0xFF91, - 0xFF92, - 0xFF93, - 0xFF94, - 0xFF95, - 0xFF96, - 0xFF97, - 0xFF98, - 0xFF99, - 0xFF9A, - 0xFF9B, - 0xFF9C, - 0xFF9D, - 0xFF9E, - 0xFF9F, - 0xFFA0, - 0xFFA1, - 0xFFA2, - 0xFFA3, - 0xFFA4, - 0xFFA5, - 0xFFA6, - 0xFFA7, - 0xFFA8, - 0xFFA9, - 0xFFAA, - 0xFFAB, - 0xFFAC, - 0xFFAD, - 0xFFAE, - 0xFFAF, - 0xFFB0, - 0xFFB1, - 0xFFB2, - 0xFFB3, - 0xFFB4, - 0xFFB5, - 0xFFB6, - 0xFFB7, - 0xFFB8, - 0xFFB9, - 0xFFBA, - 0xFFBB, - 0xFFBC, - 0xFFBD, - 0xFFBE, - 0xFFBF, - 0xFFC2, - 0xFFC3, - 0xFFC4, - 0xFFC5, - 0xFFC6, - 0xFFC7, - 0xFFC8, - 0xFFCA, - 0xFFCB, - 0xFFCC, - 0xFFCD, - 0xFFCE, - 0xFFCF, - 0xFFD0, - 0xFFD2, - 0xFFD3, - 0xFFD4, - 0xFFD5, - 0xFFD6, - 0xFFD7, - 0xFFD8, - 0xFFDA, - 0xFFDB, - 0xFFDC, - 0xFFDD, - 0xFFE0, - 0xFFE1, - 0xFFE2, - 0xFFE3, - 0xFFE4, - 0xFFE5, - 0xFFE6, - 0xFFE7, - 0xFFE8, - 0xFFE9, - 0xFFEA, - 0xFFEB, - 0xFFEC, - 0xFFED, - 0xFFEE, - 0xFFEF, - 0x10000, - 0x1000C, - 0x1000D, - 0x10027, - 0x10028, - 0x1003B, - 0x1003C, - 0x1003E, - 0x1003F, - 0x1004E, - 0x10050, - 0x1005E, - 0x10080, - 0x100FB, - 0x10100, - 0x10103, - 0x10107, - 0x10134, - 0x10137, - 0x1018F, - 0x10190, - 0x1019D, - 0x101A0, - 0x101A1, - 0x101D0, - 0x101FE, - 0x10280, - 0x1029D, - 0x102A0, - 0x102D1, - 0x102E0, - 0x102FC, - 0x10300, - 0x10324, - 0x1032D, - 0x1034B, - 0x10350, - 0x1037B, - 0x10380, - 0x1039E, - 0x1039F, - 0x103C4, - 0x103C8, - 0x103D6, - 0x10400, - 0x10401, - 0x10402, - 0x10403, - 0x10404, - 0x10405, - 0x10406, - 0x10407, - 0x10408, - 0x10409, - 0x1040A, - 0x1040B, - 0x1040C, - 0x1040D, - 0x1040E, - 0x1040F, - 0x10410, - 0x10411, - 0x10412, - 0x10413, - 0x10414, - 0x10415, - 0x10416, - 0x10417, - 0x10418, - 0x10419, - 0x1041A, - 0x1041B, - 0x1041C, - 0x1041D, - 0x1041E, - 0x1041F, - 0x10420, - 0x10421, - 0x10422, - 0x10423, - 0x10424, - 0x10425, - 0x10426, - 0x10427, - 0x10428, - 0x1049E, - 0x104A0, - 0x104AA, - 0x104B0, - 0x104B1, - 0x104B2, - 0x104B3, - 0x104B4, - 0x104B5, - 0x104B6, - 0x104B7, - 0x104B8, - 0x104B9, - 0x104BA, - 0x104BB, - 0x104BC, - 0x104BD, - 0x104BE, - 0x104BF, - 0x104C0, - 0x104C1, - 0x104C2, - 0x104C3, - 0x104C4, - 0x104C5, - 0x104C6, - 0x104C7, - 0x104C8, - 0x104C9, - 0x104CA, - 0x104CB, - 0x104CC, - 0x104CD, - 0x104CE, - 0x104CF, - 0x104D0, - 0x104D1, - 0x104D2, - 0x104D3, - 0x104D4, - 0x104D8, - 0x104FC, - 0x10500, - 0x10528, - 0x10530, - 0x10564, - 0x1056F, - 0x10570, - 0x10571, - 0x10572, - 0x10573, - 0x10574, - 0x10575, - 0x10576, - 0x10577, - 0x10578, - 0x10579, - 0x1057A, - 0x1057B, - 0x1057C, - 0x1057D, - 0x1057E, - 0x1057F, - 0x10580, - 0x10581, - 0x10582, - 0x10583, - 0x10584, - 0x10585, - 0x10586, - 0x10587, - 0x10588, - 0x10589, - 0x1058A, - 0x1058B, - 0x1058C, - 0x1058D, - 0x1058E, - 0x1058F, - 0x10590, - 0x10591, - 0x10592, - 0x10593, - 0x10594, - 0x10595, - 0x10596, - 0x10597, - 0x105A2, - 0x105A3, - 0x105B2, - 0x105B3, - 0x105BA, - 0x105BB, - 0x105BD, - 0x105C0, - 0x105F4, - 0x10600, - 0x10737, - 0x10740, - 0x10756, - 0x10760, - 0x10768, - 0x10780, - 0x10781, - 0x10782, - 0x10783, - 0x10784, - 0x10785, - 0x10786, - 0x10787, - 0x10788, - 0x10789, - 0x1078A, - 0x1078B, - 0x1078C, - 0x1078D, - 0x1078E, - 0x1078F, - 0x10790, - 0x10791, - 0x10792, - 0x10793, - 0x10794, - 0x10795, - 0x10796, - 0x10797, - 0x10798, - 0x10799, - 0x1079A, - 0x1079B, - 0x1079C, - 0x1079D, - 0x1079E, - 0x1079F, - 0x107A0, - 0x107A1, - 0x107A2, - 0x107A3, - 0x107A4, - 0x107A5, - 0x107A6, - 0x107A7, - 0x107A8, - 0x107A9, - 0x107AA, - 0x107AB, - 0x107AC, - 0x107AD, - 0x107AE, - 0x107AF, - 0x107B0, - 0x107B1, - 0x107B2, - 0x107B3, - 0x107B4, - 0x107B5, - 0x107B6, - 0x107B7, - 0x107B8, - 0x107B9, - 0x107BA, - 0x107BB, - 0x10800, - 0x10806, - 0x10808, - 0x10809, - 0x1080A, - 0x10836, - 0x10837, - 0x10839, - 0x1083C, - 0x1083D, - 0x1083F, - 0x10856, - 0x10857, - 0x1089F, - 0x108A7, - 0x108B0, - 0x108E0, - 0x108F3, - 0x108F4, - 0x108F6, - 0x108FB, - 0x1091C, - 0x1091F, - 0x1093A, - 0x1093F, - 0x1095A, - 0x10980, - 0x109B8, - 0x109BC, - 0x109D0, - 0x109D2, - 0x10A04, - 0x10A05, - 0x10A07, - 0x10A0C, - 0x10A14, - 0x10A15, - 0x10A18, - 0x10A19, - 0x10A36, - 0x10A38, - 0x10A3B, - 0x10A3F, - 0x10A49, - 0x10A50, - 0x10A59, - 0x10A60, - 0x10AA0, - 0x10AC0, - 0x10AE7, - 0x10AEB, - 0x10AF7, - 0x10B00, - 0x10B36, - 0x10B39, - 0x10B56, - 0x10B58, - 0x10B73, - 0x10B78, - 0x10B92, - 0x10B99, - 0x10B9D, - 0x10BA9, - 0x10BB0, - 0x10C00, - 0x10C49, - 0x10C80, - 0x10C81, - 0x10C82, - 0x10C83, - 0x10C84, - 0x10C85, - 0x10C86, - 0x10C87, - 0x10C88, - 0x10C89, - 0x10C8A, - 0x10C8B, - 0x10C8C, - 0x10C8D, - 0x10C8E, - 0x10C8F, - 0x10C90, - 0x10C91, - 0x10C92, - 0x10C93, - 0x10C94, - 0x10C95, - 0x10C96, - 0x10C97, - 0x10C98, - 0x10C99, - 0x10C9A, - 0x10C9B, - 0x10C9C, - 0x10C9D, - 0x10C9E, - 0x10C9F, - 0x10CA0, - 0x10CA1, - 0x10CA2, - 0x10CA3, - 0x10CA4, - 0x10CA5, - 0x10CA6, - 0x10CA7, - 0x10CA8, - 0x10CA9, - 0x10CAA, - 0x10CAB, - 0x10CAC, - 0x10CAD, - 0x10CAE, - 0x10CAF, - 0x10CB0, - 0x10CB1, - 0x10CB2, - 0x10CB3, - 0x10CC0, - 0x10CF3, - 0x10CFA, - 0x10D28, - 0x10D30, - 0x10D3A, - 0x10D40, - 0x10D50, - 0x10D51, - 0x10D52, - 0x10D53, - 0x10D54, - 0x10D55, - 0x10D56, - 0x10D57, - 0x10D58, - 0x10D59, - 0x10D5A, - 0x10D5B, - 0x10D5C, - 0x10D5D, - 0x10D5E, - 0x10D5F, - 0x10D60, - 0x10D61, - 0x10D62, - 0x10D63, - 0x10D64, - 0x10D65, - 0x10D66, - 0x10D69, - 0x10D86, - 0x10D8E, - 0x10D90, - 0x10E60, - 0x10E7F, - 0x10E80, - 0x10EAA, - 0x10EAB, - 0x10EAE, - 0x10EB0, - 0x10EB2, - 0x10EC2, - 0x10EC8, - 0x10ED0, - 0x10ED9, - 0x10EFA, - 0x10F28, - 0x10F30, - 0x10F5A, - 0x10F70, - 0x10F8A, - 0x10FB0, - 0x10FCC, - 0x10FE0, - 0x10FF7, - 0x11000, - 0x1104E, - 0x11052, - 0x11076, - 0x1107F, - 0x110BD, - 0x110BE, - 0x110C3, - 0x110D0, - 0x110E9, - 0x110F0, - 0x110FA, - 0x11100, - 0x11135, - 0x11136, - 0x11148, - 0x11150, - 0x11177, - 0x11180, - 0x111E0, - 0x111E1, - 0x111F5, - 0x11200, - 0x11212, - 0x11213, - 0x11242, - 0x11280, - 0x11287, - 0x11288, - 0x11289, - 0x1128A, - 0x1128E, - 0x1128F, - 0x1129E, - 0x1129F, - 0x112AA, - 0x112B0, - 0x112EB, - 0x112F0, - 0x112FA, - 0x11300, - 0x11304, - 0x11305, - 0x1130D, - 0x1130F, - 0x11311, - 0x11313, - 0x11329, - 0x1132A, - 0x11331, - 0x11332, - 0x11334, - 0x11335, - 0x1133A, - 0x1133B, - 0x11345, - 0x11347, - 0x11349, - 0x1134B, - 0x1134E, - 0x11350, - 0x11351, - 0x11357, - 0x11358, - 0x1135D, - 0x11364, - 0x11366, - 0x1136D, - 0x11370, - 0x11375, - 0x11380, - 0x1138A, - 0x1138B, - 0x1138C, - 0x1138E, - 0x1138F, - 0x11390, - 0x113B6, - 0x113B7, - 0x113C1, - 0x113C2, - 0x113C3, - 0x113C5, - 0x113C6, - 0x113C7, - 0x113CB, - 0x113CC, - 0x113D6, - 0x113D7, - 0x113D9, - 0x113E1, - 0x113E3, - 0x11400, - 0x1145C, - 0x1145D, - 0x11462, - 0x11480, - 0x114C8, - 0x114D0, - 0x114DA, - 0x11580, - 0x115B6, - 0x115B8, - 0x115DE, - 0x11600, - 0x11645, - 0x11650, - 0x1165A, - 0x11660, - 0x1166D, - 0x11680, - 0x116BA, - 0x116C0, - 0x116CA, - 0x116D0, - 0x116E4, - 0x11700, - 0x1171B, - 0x1171D, - 0x1172C, - 0x11730, - 0x11747, - 0x11800, - 0x1183C, - 0x118A0, - 0x118A1, - 0x118A2, - 0x118A3, - 0x118A4, - 0x118A5, - 0x118A6, - 0x118A7, - 0x118A8, - 0x118A9, - 0x118AA, - 0x118AB, - 0x118AC, - 0x118AD, - 0x118AE, - 0x118AF, - 0x118B0, - 0x118B1, - 0x118B2, - 0x118B3, - 0x118B4, - 0x118B5, - 0x118B6, - 0x118B7, - 0x118B8, - 0x118B9, - 0x118BA, - 0x118BB, - 0x118BC, - 0x118BD, - 0x118BE, - 0x118BF, - 0x118C0, - 0x118F3, - 0x118FF, - 0x11907, - 0x11909, - 0x1190A, - 0x1190C, - 0x11914, - 0x11915, - 0x11917, - 0x11918, - 0x11936, - 0x11937, - 0x11939, - 0x1193B, - 0x11947, - 0x11950, - 0x1195A, - 0x119A0, - 0x119A8, - 0x119AA, - 0x119D8, - 0x119DA, - 0x119E5, - 0x11A00, - 0x11A48, - 0x11A50, - 0x11AA3, - 0x11AB0, - 0x11AF9, - 0x11B00, - 0x11B0A, - 0x11B60, - 0x11B68, - 0x11BC0, - 0x11BE2, - 0x11BF0, - 0x11BFA, - 0x11C00, - 0x11C09, - 0x11C0A, - 0x11C37, - 0x11C38, - 0x11C46, - 0x11C50, - 0x11C6D, - 0x11C70, - 0x11C90, - 0x11C92, - 0x11CA8, - 0x11CA9, - 0x11CB7, - 0x11D00, - 0x11D07, - 0x11D08, - 0x11D0A, - 0x11D0B, - 0x11D37, - 0x11D3A, - 0x11D3B, - 0x11D3C, - 0x11D3E, - 0x11D3F, - 0x11D48, - 0x11D50, - 0x11D5A, - 0x11D60, - 0x11D66, - 0x11D67, - 0x11D69, - 0x11D6A, - 0x11D8F, - 0x11D90, - 0x11D92, - 0x11D93, - 0x11D99, - 0x11DA0, - 0x11DAA, - 0x11DB0, - 0x11DDC, - 0x11DE0, - 0x11DEA, - 0x11EE0, - 0x11EF9, - 0x11F00, - 0x11F11, - 0x11F12, - 0x11F3B, - 0x11F3E, - 0x11F5B, - 0x11FB0, - 0x11FB1, - 0x11FC0, - 0x11FF2, - 0x11FFF, - 0x1239A, - 0x12400, - 0x1246F, - 0x12470, - 0x12475, - 0x12480, - 0x12544, - 0x12F90, - 0x12FF3, - 0x13000, - 0x13430, - 0x13440, - 0x13456, - 0x13460, - 0x143FB, - 0x14400, - 0x14647, - 0x16100, - 0x1613A, - 0x16800, - 0x16A39, - 0x16A40, - 0x16A5F, - 0x16A60, - 0x16A6A, - 0x16A6E, - 0x16ABF, - 0x16AC0, - 0x16ACA, - 0x16AD0, - 0x16AEE, - 0x16AF0, - 0x16AF6, - 0x16B00, - 0x16B46, - 0x16B50, - 0x16B5A, - 0x16B5B, - 0x16B62, - 0x16B63, - 0x16B78, - 0x16B7D, - 0x16B90, - 0x16D40, - 0x16D7A, - 0x16E40, - 0x16E41, - 0x16E42, - 0x16E43, - 0x16E44, - 0x16E45, - 0x16E46, - 0x16E47, - 0x16E48, - 0x16E49, - 0x16E4A, - 0x16E4B, - 0x16E4C, - 0x16E4D, - 0x16E4E, - 0x16E4F, - 0x16E50, - 0x16E51, - 0x16E52, - 0x16E53, - 0x16E54, - 0x16E55, - 0x16E56, - 0x16E57, - 0x16E58, - 0x16E59, - 0x16E5A, - 0x16E5B, - 0x16E5C, - 0x16E5D, - 0x16E5E, - 0x16E5F, - 0x16E60, - 0x16E9B, - 0x16EA0, - 0x16EA1, - 0x16EA2, - 0x16EA3, - 0x16EA4, - 0x16EA5, - 0x16EA6, - 0x16EA7, - 0x16EA8, - 0x16EA9, - 0x16EAA, - 0x16EAB, - 0x16EAC, - 0x16EAD, - 0x16EAE, - 0x16EAF, - 0x16EB0, - 0x16EB1, - 0x16EB2, - 0x16EB3, - 0x16EB4, - 0x16EB5, - 0x16EB6, - 0x16EB7, - 0x16EB8, - 0x16EB9, - 0x16EBB, - 0x16ED4, - 0x16F00, - 0x16F4B, - 0x16F4F, - 0x16F88, - 0x16F8F, - 0x16FA0, - 0x16FE0, - 0x16FE5, - 0x16FF0, - 0x16FF7, - 0x17000, - 0x18CD6, - 0x18CFF, - 0x18D1F, - 0x18D80, - 0x18DF3, - 0x1AFF0, - 0x1AFF4, - 0x1AFF5, - 0x1AFFC, - 0x1AFFD, - 0x1AFFF, - 0x1B000, - 0x1B123, - 0x1B132, - 0x1B133, - 0x1B150, - 0x1B153, - 0x1B155, - 0x1B156, - 0x1B164, - 0x1B168, - 0x1B170, - 0x1B2FC, - 0x1BC00, - 0x1BC6B, - 0x1BC70, - 0x1BC7D, - 0x1BC80, - 0x1BC89, - 0x1BC90, - 0x1BC9A, - 0x1BC9C, - 0x1BCA0, - 0x1BCA4, - 0x1CC00, - 0x1CCD6, - 0x1CCD7, - 0x1CCD8, - 0x1CCD9, - 0x1CCDA, - 0x1CCDB, - 0x1CCDC, - 0x1CCDD, - 0x1CCDE, - 0x1CCDF, - 0x1CCE0, - 0x1CCE1, - 0x1CCE2, - 0x1CCE3, - 0x1CCE4, - 0x1CCE5, - 0x1CCE6, - 0x1CCE7, - 0x1CCE8, - 0x1CCE9, - 0x1CCEA, - 0x1CCEB, - 0x1CCEC, - 0x1CCED, - 0x1CCEE, - 0x1CCEF, - 0x1CCF0, - 0x1CCF1, - 0x1CCF2, - 0x1CCF3, - 0x1CCF4, - 0x1CCF5, - 0x1CCF6, - 0x1CCF7, - 0x1CCF8, - 0x1CCF9, - 0x1CCFA, - 0x1CCFD, - 0x1CD00, - 0x1CEB4, - 0x1CEBA, - 0x1CED1, - 0x1CEE0, - 0x1CEF1, - 0x1CF00, - 0x1CF2E, - 0x1CF30, - 0x1CF47, - 0x1CF50, - 0x1CFC4, - 0x1D000, - 0x1D0F6, - 0x1D100, - 0x1D127, - 0x1D129, - 0x1D15E, - 0x1D15F, - 0x1D160, - 0x1D161, - 0x1D162, - 0x1D163, - 0x1D164, - 0x1D165, - 0x1D173, - 0x1D17B, - 0x1D1BB, - 0x1D1BC, - 0x1D1BD, - 0x1D1BE, - 0x1D1BF, - 0x1D1C0, - 0x1D1C1, - 0x1D1EB, - 0x1D200, - 0x1D246, - 0x1D2C0, - 0x1D2D4, - 0x1D2E0, - 0x1D2F4, - 0x1D300, - 0x1D357, - 0x1D360, - 0x1D379, - 0x1D400, - 0x1D401, - 0x1D402, - 0x1D403, - 0x1D404, - 0x1D405, - 0x1D406, - 0x1D407, - 0x1D408, - 0x1D409, - 0x1D40A, - 0x1D40B, - 0x1D40C, - 0x1D40D, - 0x1D40E, - 0x1D40F, - 0x1D410, - 0x1D411, - 0x1D412, - 0x1D413, - 0x1D414, - 0x1D415, - 0x1D416, - 0x1D417, - 0x1D418, - 0x1D419, - 0x1D41A, - 0x1D41B, - 0x1D41C, - 0x1D41D, - 0x1D41E, - 0x1D41F, - 0x1D420, - 0x1D421, - 0x1D422, - 0x1D423, - 0x1D424, - 0x1D425, - 0x1D426, - 0x1D427, - 0x1D428, - 0x1D429, - 0x1D42A, - 0x1D42B, - 0x1D42C, - 0x1D42D, - 0x1D42E, - 0x1D42F, - 0x1D430, - 0x1D431, - 0x1D432, - 0x1D433, - 0x1D434, - 0x1D435, - 0x1D436, - 0x1D437, - 0x1D438, - 0x1D439, - 0x1D43A, - 0x1D43B, - 0x1D43C, - 0x1D43D, - 0x1D43E, - 0x1D43F, - 0x1D440, - 0x1D441, - 0x1D442, - 0x1D443, - 0x1D444, - 0x1D445, - 0x1D446, - 0x1D447, - 0x1D448, - 0x1D449, - 0x1D44A, - 0x1D44B, - 0x1D44C, - 0x1D44D, - 0x1D44E, - 0x1D44F, - 0x1D450, - 0x1D451, - 0x1D452, - 0x1D453, - 0x1D454, - 0x1D455, - 0x1D456, - 0x1D457, - 0x1D458, - 0x1D459, - 0x1D45A, - 0x1D45B, - 0x1D45C, - 0x1D45D, - 0x1D45E, - 0x1D45F, - 0x1D460, - 0x1D461, - 0x1D462, - 0x1D463, - 0x1D464, - 0x1D465, - 0x1D466, - 0x1D467, - 0x1D468, - 0x1D469, - 0x1D46A, - 0x1D46B, - 0x1D46C, - 0x1D46D, - 0x1D46E, - 0x1D46F, - 0x1D470, - 0x1D471, - 0x1D472, - 0x1D473, - 0x1D474, - 0x1D475, - 0x1D476, - 0x1D477, - 0x1D478, - 0x1D479, - 0x1D47A, - 0x1D47B, - 0x1D47C, - 0x1D47D, - 0x1D47E, - 0x1D47F, - 0x1D480, - 0x1D481, - 0x1D482, - 0x1D483, - 0x1D484, - 0x1D485, - 0x1D486, - 0x1D487, - 0x1D488, - 0x1D489, - 0x1D48A, - 0x1D48B, - 0x1D48C, - 0x1D48D, - 0x1D48E, - 0x1D48F, - 0x1D490, - 0x1D491, - 0x1D492, - 0x1D493, - 0x1D494, - 0x1D495, - 0x1D496, - 0x1D497, - 0x1D498, - 0x1D499, - 0x1D49A, - 0x1D49B, - 0x1D49C, - 0x1D49D, - 0x1D49E, - 0x1D49F, - 0x1D4A0, - 0x1D4A2, - 0x1D4A3, - 0x1D4A5, - 0x1D4A6, - 0x1D4A7, - 0x1D4A9, - 0x1D4AA, - 0x1D4AB, - 0x1D4AC, - 0x1D4AD, - 0x1D4AE, - 0x1D4AF, - 0x1D4B0, - 0x1D4B1, - 0x1D4B2, - 0x1D4B3, - 0x1D4B4, - 0x1D4B5, - 0x1D4B6, - 0x1D4B7, - 0x1D4B8, - 0x1D4B9, - 0x1D4BA, - 0x1D4BB, - 0x1D4BC, - 0x1D4BD, - 0x1D4BE, - 0x1D4BF, - 0x1D4C0, - 0x1D4C1, - 0x1D4C2, - 0x1D4C3, - 0x1D4C4, - 0x1D4C5, - 0x1D4C6, - 0x1D4C7, - 0x1D4C8, - 0x1D4C9, - 0x1D4CA, - 0x1D4CB, - 0x1D4CC, - 0x1D4CD, - 0x1D4CE, - 0x1D4CF, - 0x1D4D0, - 0x1D4D1, - 0x1D4D2, - 0x1D4D3, - 0x1D4D4, - 0x1D4D5, - 0x1D4D6, - 0x1D4D7, - 0x1D4D8, - 0x1D4D9, - 0x1D4DA, - 0x1D4DB, - 0x1D4DC, - 0x1D4DD, - 0x1D4DE, - 0x1D4DF, - 0x1D4E0, - 0x1D4E1, - 0x1D4E2, - 0x1D4E3, - 0x1D4E4, - 0x1D4E5, - 0x1D4E6, - 0x1D4E7, - 0x1D4E8, - 0x1D4E9, - 0x1D4EA, - 0x1D4EB, - 0x1D4EC, - 0x1D4ED, - 0x1D4EE, - 0x1D4EF, - 0x1D4F0, - 0x1D4F1, - 0x1D4F2, - 0x1D4F3, - 0x1D4F4, - 0x1D4F5, - 0x1D4F6, - 0x1D4F7, - 0x1D4F8, - 0x1D4F9, - 0x1D4FA, - 0x1D4FB, - 0x1D4FC, - 0x1D4FD, - 0x1D4FE, - 0x1D4FF, - 0x1D500, - 0x1D501, - 0x1D502, - 0x1D503, - 0x1D504, - 0x1D505, - 0x1D506, - 0x1D507, - 0x1D508, - 0x1D509, - 0x1D50A, - 0x1D50B, - 0x1D50D, - 0x1D50E, - 0x1D50F, - 0x1D510, - 0x1D511, - 0x1D512, - 0x1D513, - 0x1D514, - 0x1D515, - 0x1D516, - 0x1D517, - 0x1D518, - 0x1D519, - 0x1D51A, - 0x1D51B, - 0x1D51C, - 0x1D51D, - 0x1D51E, - 0x1D51F, - 0x1D520, - 0x1D521, - 0x1D522, - 0x1D523, - 0x1D524, - 0x1D525, - 0x1D526, - 0x1D527, - 0x1D528, - 0x1D529, - 0x1D52A, - 0x1D52B, - 0x1D52C, - 0x1D52D, - 0x1D52E, - 0x1D52F, - 0x1D530, - 0x1D531, - 0x1D532, - 0x1D533, - 0x1D534, - 0x1D535, - 0x1D536, - 0x1D537, - 0x1D538, - 0x1D539, - 0x1D53A, - 0x1D53B, - 0x1D53C, - 0x1D53D, - 0x1D53E, - 0x1D53F, - 0x1D540, - 0x1D541, - 0x1D542, - 0x1D543, - 0x1D544, - 0x1D545, - 0x1D546, - 0x1D547, - 0x1D54A, - 0x1D54B, - 0x1D54C, - 0x1D54D, - 0x1D54E, - 0x1D54F, - 0x1D550, - 0x1D551, - 0x1D552, - 0x1D553, - 0x1D554, - 0x1D555, - 0x1D556, - 0x1D557, - 0x1D558, - 0x1D559, - 0x1D55A, - 0x1D55B, - 0x1D55C, - 0x1D55D, - 0x1D55E, - 0x1D55F, - 0x1D560, - 0x1D561, - 0x1D562, - 0x1D563, - 0x1D564, - 0x1D565, - 0x1D566, - 0x1D567, - 0x1D568, - 0x1D569, - 0x1D56A, - 0x1D56B, - 0x1D56C, - 0x1D56D, - 0x1D56E, - 0x1D56F, - 0x1D570, - 0x1D571, - 0x1D572, - 0x1D573, - 0x1D574, - 0x1D575, - 0x1D576, - 0x1D577, - 0x1D578, - 0x1D579, - 0x1D57A, - 0x1D57B, - 0x1D57C, - 0x1D57D, - 0x1D57E, - 0x1D57F, - 0x1D580, - 0x1D581, - 0x1D582, - 0x1D583, - 0x1D584, - 0x1D585, - 0x1D586, - 0x1D587, - 0x1D588, - 0x1D589, - 0x1D58A, - 0x1D58B, - 0x1D58C, - 0x1D58D, - 0x1D58E, - 0x1D58F, - 0x1D590, - 0x1D591, - 0x1D592, - 0x1D593, - 0x1D594, - 0x1D595, - 0x1D596, - 0x1D597, - 0x1D598, - 0x1D599, - 0x1D59A, - 0x1D59B, - 0x1D59C, - 0x1D59D, - 0x1D59E, - 0x1D59F, - 0x1D5A0, - 0x1D5A1, - 0x1D5A2, - 0x1D5A3, - 0x1D5A4, - 0x1D5A5, - 0x1D5A6, - 0x1D5A7, - 0x1D5A8, - 0x1D5A9, - 0x1D5AA, - 0x1D5AB, - 0x1D5AC, - 0x1D5AD, - 0x1D5AE, - 0x1D5AF, - 0x1D5B0, - 0x1D5B1, - 0x1D5B2, - 0x1D5B3, - 0x1D5B4, - 0x1D5B5, - 0x1D5B6, - 0x1D5B7, - 0x1D5B8, - 0x1D5B9, - 0x1D5BA, - 0x1D5BB, - 0x1D5BC, - 0x1D5BD, - 0x1D5BE, - 0x1D5BF, - 0x1D5C0, - 0x1D5C1, - 0x1D5C2, - 0x1D5C3, - 0x1D5C4, - 0x1D5C5, - 0x1D5C6, - 0x1D5C7, - 0x1D5C8, - 0x1D5C9, - 0x1D5CA, - 0x1D5CB, - 0x1D5CC, - 0x1D5CD, - 0x1D5CE, - 0x1D5CF, - 0x1D5D0, - 0x1D5D1, - 0x1D5D2, - 0x1D5D3, - 0x1D5D4, - 0x1D5D5, - 0x1D5D6, - 0x1D5D7, - 0x1D5D8, - 0x1D5D9, - 0x1D5DA, - 0x1D5DB, - 0x1D5DC, - 0x1D5DD, - 0x1D5DE, - 0x1D5DF, - 0x1D5E0, - 0x1D5E1, - 0x1D5E2, - 0x1D5E3, - 0x1D5E4, - 0x1D5E5, - 0x1D5E6, - 0x1D5E7, - 0x1D5E8, - 0x1D5E9, - 0x1D5EA, - 0x1D5EB, - 0x1D5EC, - 0x1D5ED, - 0x1D5EE, - 0x1D5EF, - 0x1D5F0, - 0x1D5F1, - 0x1D5F2, - 0x1D5F3, - 0x1D5F4, - 0x1D5F5, - 0x1D5F6, - 0x1D5F7, - 0x1D5F8, - 0x1D5F9, - 0x1D5FA, - 0x1D5FB, - 0x1D5FC, - 0x1D5FD, - 0x1D5FE, - 0x1D5FF, - 0x1D600, - 0x1D601, - 0x1D602, - 0x1D603, - 0x1D604, - 0x1D605, - 0x1D606, - 0x1D607, - 0x1D608, - 0x1D609, - 0x1D60A, - 0x1D60B, - 0x1D60C, - 0x1D60D, - 0x1D60E, - 0x1D60F, - 0x1D610, - 0x1D611, - 0x1D612, - 0x1D613, - 0x1D614, - 0x1D615, - 0x1D616, - 0x1D617, - 0x1D618, - 0x1D619, - 0x1D61A, - 0x1D61B, - 0x1D61C, - 0x1D61D, - 0x1D61E, - 0x1D61F, - 0x1D620, - 0x1D621, - 0x1D622, - 0x1D623, - 0x1D624, - 0x1D625, - 0x1D626, - 0x1D627, - 0x1D628, - 0x1D629, - 0x1D62A, - 0x1D62B, - 0x1D62C, - 0x1D62D, - 0x1D62E, - 0x1D62F, - 0x1D630, - 0x1D631, - 0x1D632, - 0x1D633, - 0x1D634, - 0x1D635, - 0x1D636, - 0x1D637, - 0x1D638, - 0x1D639, - 0x1D63A, - 0x1D63B, - 0x1D63C, - 0x1D63D, - 0x1D63E, - 0x1D63F, - 0x1D640, - 0x1D641, - 0x1D642, - 0x1D643, - 0x1D644, - 0x1D645, - 0x1D646, - 0x1D647, - 0x1D648, - 0x1D649, - 0x1D64A, - 0x1D64B, - 0x1D64C, - 0x1D64D, - 0x1D64E, - 0x1D64F, - 0x1D650, - 0x1D651, - 0x1D652, - 0x1D653, - 0x1D654, - 0x1D655, - 0x1D656, - 0x1D657, - 0x1D658, - 0x1D659, - 0x1D65A, - 0x1D65B, - 0x1D65C, - 0x1D65D, - 0x1D65E, - 0x1D65F, - 0x1D660, - 0x1D661, - 0x1D662, - 0x1D663, - 0x1D664, - 0x1D665, - 0x1D666, - 0x1D667, - 0x1D668, - 0x1D669, - 0x1D66A, - 0x1D66B, - 0x1D66C, - 0x1D66D, - 0x1D66E, - 0x1D66F, - 0x1D670, - 0x1D671, - 0x1D672, - 0x1D673, - 0x1D674, - 0x1D675, - 0x1D676, - 0x1D677, - 0x1D678, - 0x1D679, - 0x1D67A, - 0x1D67B, - 0x1D67C, - 0x1D67D, - 0x1D67E, - 0x1D67F, - 0x1D680, - 0x1D681, - 0x1D682, - 0x1D683, - 0x1D684, - 0x1D685, - 0x1D686, - 0x1D687, - 0x1D688, - 0x1D689, - 0x1D68A, - 0x1D68B, - 0x1D68C, - 0x1D68D, - 0x1D68E, - 0x1D68F, - 0x1D690, - 0x1D691, - 0x1D692, - 0x1D693, - 0x1D694, - 0x1D695, - 0x1D696, - 0x1D697, - 0x1D698, - 0x1D699, - 0x1D69A, - 0x1D69B, - 0x1D69C, - 0x1D69D, - 0x1D69E, - 0x1D69F, - 0x1D6A0, - 0x1D6A1, - 0x1D6A2, - 0x1D6A3, - 0x1D6A4, - 0x1D6A5, - 0x1D6A6, - 0x1D6A8, - 0x1D6A9, - 0x1D6AA, - 0x1D6AB, - 0x1D6AC, - 0x1D6AD, - 0x1D6AE, - 0x1D6AF, - 0x1D6B0, - 0x1D6B1, - 0x1D6B2, - 0x1D6B3, - 0x1D6B4, - 0x1D6B5, - 0x1D6B6, - 0x1D6B7, - 0x1D6B8, - 0x1D6B9, - 0x1D6BA, - 0x1D6BB, - 0x1D6BC, - 0x1D6BD, - 0x1D6BE, - 0x1D6BF, - 0x1D6C0, - 0x1D6C1, - 0x1D6C2, - 0x1D6C3, - 0x1D6C4, - 0x1D6C5, - 0x1D6C6, - 0x1D6C7, - 0x1D6C8, - 0x1D6C9, - 0x1D6CA, - 0x1D6CB, - 0x1D6CC, - 0x1D6CD, - 0x1D6CE, - 0x1D6CF, - 0x1D6D0, - 0x1D6D1, - 0x1D6D2, - 0x1D6D3, - 0x1D6D5, - 0x1D6D6, - 0x1D6D7, - 0x1D6D8, - 0x1D6D9, - 0x1D6DA, - 0x1D6DB, - 0x1D6DC, - 0x1D6DD, - 0x1D6DE, - 0x1D6DF, - 0x1D6E0, - 0x1D6E1, - 0x1D6E2, - 0x1D6E3, - 0x1D6E4, - 0x1D6E5, - 0x1D6E6, - 0x1D6E7, - 0x1D6E8, - 0x1D6E9, - 0x1D6EA, - 0x1D6EB, - 0x1D6EC, - 0x1D6ED, - 0x1D6EE, - 0x1D6EF, - 0x1D6F0, - 0x1D6F1, - 0x1D6F2, - 0x1D6F3, - 0x1D6F4, - 0x1D6F5, - 0x1D6F6, - 0x1D6F7, - 0x1D6F8, - 0x1D6F9, - 0x1D6FA, - 0x1D6FB, - 0x1D6FC, - 0x1D6FD, - 0x1D6FE, - 0x1D6FF, - 0x1D700, - 0x1D701, - 0x1D702, - 0x1D703, - 0x1D704, - 0x1D705, - 0x1D706, - 0x1D707, - 0x1D708, - 0x1D709, - 0x1D70A, - 0x1D70B, - 0x1D70C, - 0x1D70D, - 0x1D70F, - 0x1D710, - 0x1D711, - 0x1D712, - 0x1D713, - 0x1D714, - 0x1D715, - 0x1D716, - 0x1D717, - 0x1D718, - 0x1D719, - 0x1D71A, - 0x1D71B, - 0x1D71C, - 0x1D71D, - 0x1D71E, - 0x1D71F, - 0x1D720, - 0x1D721, - 0x1D722, - 0x1D723, - 0x1D724, - 0x1D725, - 0x1D726, - 0x1D727, - 0x1D728, - 0x1D729, - 0x1D72A, - 0x1D72B, - 0x1D72C, - 0x1D72D, - 0x1D72E, - 0x1D72F, - 0x1D730, - 0x1D731, - 0x1D732, - 0x1D733, - 0x1D734, - 0x1D735, - 0x1D736, - 0x1D737, - 0x1D738, - 0x1D739, - 0x1D73A, - 0x1D73B, - 0x1D73C, - 0x1D73D, - 0x1D73E, - 0x1D73F, - 0x1D740, - 0x1D741, - 0x1D742, - 0x1D743, - 0x1D744, - 0x1D745, - 0x1D746, - 0x1D747, - 0x1D749, - 0x1D74A, - 0x1D74B, - 0x1D74C, - 0x1D74D, - 0x1D74E, - 0x1D74F, - 0x1D750, - 0x1D751, - 0x1D752, - 0x1D753, - 0x1D754, - 0x1D755, - 0x1D756, - 0x1D757, - 0x1D758, - 0x1D759, - 0x1D75A, - 0x1D75B, - 0x1D75C, - 0x1D75D, - 0x1D75E, - 0x1D75F, - 0x1D760, - 0x1D761, - 0x1D762, - 0x1D763, - 0x1D764, - 0x1D765, - 0x1D766, - 0x1D767, - 0x1D768, - 0x1D769, - 0x1D76A, - 0x1D76B, - 0x1D76C, - 0x1D76D, - 0x1D76E, - 0x1D76F, - 0x1D770, - 0x1D771, - 0x1D772, - 0x1D773, - 0x1D774, - 0x1D775, - 0x1D776, - 0x1D777, - 0x1D778, - 0x1D779, - 0x1D77A, - 0x1D77B, - 0x1D77C, - 0x1D77D, - 0x1D77E, - 0x1D77F, - 0x1D780, - 0x1D781, - 0x1D783, - 0x1D784, - 0x1D785, - 0x1D786, - 0x1D787, - 0x1D788, - 0x1D789, - 0x1D78A, - 0x1D78B, - 0x1D78C, - 0x1D78D, - 0x1D78E, - 0x1D78F, - 0x1D790, - 0x1D791, - 0x1D792, - 0x1D793, - 0x1D794, - 0x1D795, - 0x1D796, - 0x1D797, - 0x1D798, - 0x1D799, - 0x1D79A, - 0x1D79B, - 0x1D79C, - 0x1D79D, - 0x1D79E, - 0x1D79F, - 0x1D7A0, - 0x1D7A1, - 0x1D7A2, - 0x1D7A3, - 0x1D7A4, - 0x1D7A5, - 0x1D7A6, - 0x1D7A7, - 0x1D7A8, - 0x1D7A9, - 0x1D7AA, - 0x1D7AB, - 0x1D7AC, - 0x1D7AD, - 0x1D7AE, - 0x1D7AF, - 0x1D7B0, - 0x1D7B1, - 0x1D7B2, - 0x1D7B3, - 0x1D7B4, - 0x1D7B5, - 0x1D7B6, - 0x1D7B7, - 0x1D7B8, - 0x1D7B9, - 0x1D7BA, - 0x1D7BB, - 0x1D7BD, - 0x1D7BE, - 0x1D7BF, - 0x1D7C0, - 0x1D7C1, - 0x1D7C2, - 0x1D7C3, - 0x1D7C4, - 0x1D7C5, - 0x1D7C6, - 0x1D7C7, - 0x1D7C8, - 0x1D7C9, - 0x1D7CA, - 0x1D7CC, - 0x1D7CE, - 0x1D7CF, - 0x1D7D0, - 0x1D7D1, - 0x1D7D2, - 0x1D7D3, - 0x1D7D4, - 0x1D7D5, - 0x1D7D6, - 0x1D7D7, - 0x1D7D8, - 0x1D7D9, - 0x1D7DA, - 0x1D7DB, - 0x1D7DC, - 0x1D7DD, - 0x1D7DE, - 0x1D7DF, - 0x1D7E0, - 0x1D7E1, - 0x1D7E2, - 0x1D7E3, - 0x1D7E4, - 0x1D7E5, - 0x1D7E6, - 0x1D7E7, - 0x1D7E8, - 0x1D7E9, - 0x1D7EA, - 0x1D7EB, - 0x1D7EC, - 0x1D7ED, - 0x1D7EE, - 0x1D7EF, - 0x1D7F0, - 0x1D7F1, - 0x1D7F2, - 0x1D7F3, - 0x1D7F4, - 0x1D7F5, - 0x1D7F6, - 0x1D7F7, - 0x1D7F8, - 0x1D7F9, - 0x1D7FA, - 0x1D7FB, - 0x1D7FC, - 0x1D7FD, - 0x1D7FE, - 0x1D7FF, - 0x1D800, - 0x1DA8C, - 0x1DA9B, - 0x1DAA0, - 0x1DAA1, - 0x1DAB0, - 0x1DF00, - 0x1DF1F, - 0x1DF25, - 0x1DF2B, - 0x1E000, - 0x1E007, - 0x1E008, - 0x1E019, - 0x1E01B, - 0x1E022, - 0x1E023, - 0x1E025, - 0x1E026, - 0x1E02B, - 0x1E030, - 0x1E031, - 0x1E032, - 0x1E033, - 0x1E034, - 0x1E035, - 0x1E036, - 0x1E037, - 0x1E038, - 0x1E039, - 0x1E03A, - 0x1E03B, - 0x1E03C, - 0x1E03D, - 0x1E03E, - 0x1E03F, - 0x1E040, - 0x1E041, - 0x1E042, - 0x1E043, - 0x1E044, - 0x1E045, - 0x1E046, - 0x1E047, - 0x1E048, - 0x1E049, - 0x1E04A, - 0x1E04B, - 0x1E04C, - 0x1E04D, - 0x1E04E, - 0x1E04F, - 0x1E050, - 0x1E051, - 0x1E052, - 0x1E053, - 0x1E054, - 0x1E055, - 0x1E056, - 0x1E057, - 0x1E058, - 0x1E059, - 0x1E05A, - 0x1E05B, - 0x1E05C, - 0x1E05D, - 0x1E05E, - 0x1E05F, - 0x1E060, - 0x1E061, - 0x1E062, - 0x1E063, - 0x1E064, - 0x1E065, - 0x1E066, - 0x1E067, - 0x1E068, - 0x1E069, - 0x1E06A, - 0x1E06B, - 0x1E06C, - 0x1E06D, - 0x1E06E, - 0x1E08F, - 0x1E090, - 0x1E100, - 0x1E12D, - 0x1E130, - 0x1E13E, - 0x1E140, - 0x1E14A, - 0x1E14E, - 0x1E150, - 0x1E290, - 0x1E2AF, - 0x1E2C0, - 0x1E2FA, - 0x1E2FF, - 0x1E300, - 0x1E4D0, - 0x1E4FA, - 0x1E5D0, - 0x1E5FB, - 0x1E5FF, - 0x1E600, - 0x1E6C0, - 0x1E6DF, - 0x1E6E0, - 0x1E6F6, - 0x1E6FE, - 0x1E700, - 0x1E7E0, - 0x1E7E7, - 0x1E7E8, - 0x1E7EC, - 0x1E7ED, - 0x1E7EF, - 0x1E7F0, - 0x1E7FF, - 0x1E800, - 0x1E8C5, - 0x1E8C7, - 0x1E8D7, - 0x1E900, - 0x1E901, - 0x1E902, - 0x1E903, - 0x1E904, - 0x1E905, - 0x1E906, - 0x1E907, - 0x1E908, - 0x1E909, - 0x1E90A, - 0x1E90B, - 0x1E90C, - 0x1E90D, - 0x1E90E, - 0x1E90F, - 0x1E910, - 0x1E911, - 0x1E912, - 0x1E913, - 0x1E914, - 0x1E915, - 0x1E916, - 0x1E917, - 0x1E918, - 0x1E919, - 0x1E91A, - 0x1E91B, - 0x1E91C, - 0x1E91D, - 0x1E91E, - 0x1E91F, - 0x1E920, - 0x1E921, - 0x1E922, - 0x1E94C, - 0x1E950, - 0x1E95A, - 0x1E95E, - 0x1E960, - 0x1EC71, - 0x1ECB5, - 0x1ED01, - 0x1ED3E, - 0x1EE00, - 0x1EE01, - 0x1EE02, - 0x1EE03, - 0x1EE04, - 0x1EE05, - 0x1EE06, - 0x1EE07, - 0x1EE08, - 0x1EE09, - 0x1EE0A, - 0x1EE0B, - 0x1EE0C, - 0x1EE0D, - 0x1EE0E, - 0x1EE0F, - 0x1EE10, - 0x1EE11, - 0x1EE12, - 0x1EE13, - 0x1EE14, - 0x1EE15, - 0x1EE16, - 0x1EE17, - 0x1EE18, - 0x1EE19, - 0x1EE1A, - 0x1EE1B, - 0x1EE1C, - 0x1EE1D, - 0x1EE1E, - 0x1EE1F, - 0x1EE20, - 0x1EE21, - 0x1EE22, - 0x1EE23, - 0x1EE24, - 0x1EE25, - 0x1EE27, - 0x1EE28, - 0x1EE29, - 0x1EE2A, - 0x1EE2B, - 0x1EE2C, - 0x1EE2D, - 0x1EE2E, - 0x1EE2F, - 0x1EE30, - 0x1EE31, - 0x1EE32, - 0x1EE33, - 0x1EE34, - 0x1EE35, - 0x1EE36, - 0x1EE37, - 0x1EE38, - 0x1EE39, - 0x1EE3A, - 0x1EE3B, - 0x1EE3C, - 0x1EE42, - 0x1EE43, - 0x1EE47, - 0x1EE48, - 0x1EE49, - 0x1EE4A, - 0x1EE4B, - 0x1EE4C, - 0x1EE4D, - 0x1EE4E, - 0x1EE4F, - 0x1EE50, - 0x1EE51, - 0x1EE52, - 0x1EE53, - 0x1EE54, - 0x1EE55, - 0x1EE57, - 0x1EE58, - 0x1EE59, - 0x1EE5A, - 0x1EE5B, - 0x1EE5C, - 0x1EE5D, - 0x1EE5E, - 0x1EE5F, - 0x1EE60, - 0x1EE61, - 0x1EE62, - 0x1EE63, - 0x1EE64, - 0x1EE65, - 0x1EE67, - 0x1EE68, - 0x1EE69, - 0x1EE6A, - 0x1EE6B, - 0x1EE6C, - 0x1EE6D, - 0x1EE6E, - 0x1EE6F, - 0x1EE70, - 0x1EE71, - 0x1EE72, - 0x1EE73, - 0x1EE74, - 0x1EE75, - 0x1EE76, - 0x1EE77, - 0x1EE78, - 0x1EE79, - 0x1EE7A, - 0x1EE7B, - 0x1EE7C, - 0x1EE7D, - 0x1EE7E, - 0x1EE7F, - 0x1EE80, - 0x1EE81, - 0x1EE82, - 0x1EE83, - 0x1EE84, - 0x1EE85, - 0x1EE86, - 0x1EE87, - 0x1EE88, - 0x1EE89, - 0x1EE8A, - 0x1EE8B, - 0x1EE8C, - 0x1EE8D, - 0x1EE8E, - 0x1EE8F, - 0x1EE90, - 0x1EE91, - 0x1EE92, - 0x1EE93, - 0x1EE94, - 0x1EE95, - 0x1EE96, - 0x1EE97, - 0x1EE98, - 0x1EE99, - 0x1EE9A, - 0x1EE9B, - 0x1EE9C, - 0x1EEA1, - 0x1EEA2, - 0x1EEA3, - 0x1EEA4, - 0x1EEA5, - 0x1EEA6, - 0x1EEA7, - 0x1EEA8, - 0x1EEA9, - 0x1EEAA, - 0x1EEAB, - 0x1EEAC, - 0x1EEAD, - 0x1EEAE, - 0x1EEAF, - 0x1EEB0, - 0x1EEB1, - 0x1EEB2, - 0x1EEB3, - 0x1EEB4, - 0x1EEB5, - 0x1EEB6, - 0x1EEB7, - 0x1EEB8, - 0x1EEB9, - 0x1EEBA, - 0x1EEBB, - 0x1EEBC, - 0x1EEF0, - 0x1EEF2, - 0x1F000, - 0x1F02C, - 0x1F030, - 0x1F094, - 0x1F0A0, - 0x1F0AF, - 0x1F0B1, - 0x1F0C0, - 0x1F0C1, - 0x1F0D0, - 0x1F0D1, - 0x1F0F6, - 0x1F101, - 0x1F102, - 0x1F103, - 0x1F104, - 0x1F105, - 0x1F106, - 0x1F107, - 0x1F108, - 0x1F109, - 0x1F10A, - 0x1F10B, - 0x1F110, - 0x1F111, - 0x1F112, - 0x1F113, - 0x1F114, - 0x1F115, - 0x1F116, - 0x1F117, - 0x1F118, - 0x1F119, - 0x1F11A, - 0x1F11B, - 0x1F11C, - 0x1F11D, - 0x1F11E, - 0x1F11F, - 0x1F120, - 0x1F121, - 0x1F122, - 0x1F123, - 0x1F124, - 0x1F125, - 0x1F126, - 0x1F127, - 0x1F128, - 0x1F129, - 0x1F12A, - 0x1F12B, - 0x1F12C, - 0x1F12D, - 0x1F12E, - 0x1F12F, - 0x1F130, - 0x1F131, - 0x1F132, - 0x1F133, - 0x1F134, - 0x1F135, - 0x1F136, - 0x1F137, - 0x1F138, - 0x1F139, - 0x1F13A, - 0x1F13B, - 0x1F13C, - 0x1F13D, - 0x1F13E, - 0x1F13F, - 0x1F140, - 0x1F141, - 0x1F142, - 0x1F143, - 0x1F144, - 0x1F145, - 0x1F146, - 0x1F147, - 0x1F148, - 0x1F149, - 0x1F14A, - 0x1F14B, - 0x1F14C, - 0x1F14D, - 0x1F14E, - 0x1F14F, - 0x1F150, - 0x1F16A, - 0x1F16B, - 0x1F16C, - 0x1F16D, - 0x1F190, - 0x1F191, - 0x1F1AE, - 0x1F1E6, - 0x1F200, - 0x1F201, - 0x1F202, - 0x1F203, - 0x1F210, - 0x1F211, - 0x1F212, - 0x1F213, - 0x1F214, - 0x1F215, - 0x1F216, - 0x1F217, - 0x1F218, - 0x1F219, - 0x1F21A, - 0x1F21B, - 0x1F21C, - 0x1F21D, - 0x1F21E, - 0x1F21F, - 0x1F220, - 0x1F221, - 0x1F222, - 0x1F223, - 0x1F224, - 0x1F225, - 0x1F226, - 0x1F227, - 0x1F228, - 0x1F229, - 0x1F22A, - 0x1F22B, - 0x1F22C, - 0x1F22D, - 0x1F22E, - 0x1F22F, - 0x1F230, - 0x1F231, - 0x1F232, - 0x1F233, - 0x1F234, - 0x1F235, - 0x1F236, - 0x1F237, - 0x1F238, - 0x1F239, - 0x1F23A, - 0x1F23B, - 0x1F23C, - 0x1F240, - 0x1F241, - 0x1F242, - 0x1F243, - 0x1F244, - 0x1F245, - 0x1F246, - 0x1F247, - 0x1F248, - 0x1F249, - 0x1F250, - 0x1F251, - 0x1F252, - 0x1F260, - 0x1F266, - 0x1F300, - 0x1F6D9, - 0x1F6DC, - 0x1F6ED, - 0x1F6F0, - 0x1F6FD, - 0x1F700, - 0x1F7DA, - 0x1F7E0, - 0x1F7EC, - 0x1F7F0, - 0x1F7F1, - 0x1F800, - 0x1F80C, - 0x1F810, - 0x1F848, - 0x1F850, - 0x1F85A, - 0x1F860, - 0x1F888, - 0x1F890, - 0x1F8AE, - 0x1F8B0, - 0x1F8BC, - 0x1F8C0, - 0x1F8C2, - 0x1F8D0, - 0x1F8D9, - 0x1F900, - 0x1FA58, - 0x1FA60, - 0x1FA6E, - 0x1FA70, - 0x1FA7D, - 0x1FA80, - 0x1FA8B, - 0x1FA8E, - 0x1FAC7, - 0x1FAC8, - 0x1FAC9, - 0x1FACD, - 0x1FADD, - 0x1FADF, - 0x1FAEB, - 0x1FAEF, - 0x1FAF9, - 0x1FB00, - 0x1FB93, - 0x1FB94, - 0x1FBF0, - 0x1FBF1, - 0x1FBF2, - 0x1FBF3, - 0x1FBF4, - 0x1FBF5, - 0x1FBF6, - 0x1FBF7, - 0x1FBF8, - 0x1FBF9, - 0x1FBFA, - 0x1FBFB, - 0x20000, - 0x2A6E0, - 0x2A700, - 0x2B81E, - 0x2B820, - 0x2CEAE, - 0x2CEB0, - 0x2EBE1, - 0x2EBF0, - 0x2EE5E, - 0x2F800, - 0x2F801, - 0x2F802, - 0x2F803, - 0x2F804, - 0x2F805, - 0x2F806, - 0x2F807, - 0x2F808, - 0x2F809, - 0x2F80A, - 0x2F80B, - 0x2F80C, - 0x2F80D, - 0x2F80E, - 0x2F80F, - 0x2F810, - 0x2F811, - 0x2F812, - 0x2F813, - 0x2F814, - 0x2F815, - 0x2F816, - 0x2F817, - 0x2F818, - 0x2F819, - 0x2F81A, - 0x2F81B, - 0x2F81C, - 0x2F81D, - 0x2F81E, - 0x2F81F, - 0x2F820, - 0x2F821, - 0x2F822, - 0x2F823, - 0x2F824, - 0x2F825, - 0x2F826, - 0x2F827, - 0x2F828, - 0x2F829, - 0x2F82A, - 0x2F82B, - 0x2F82C, - 0x2F82D, - 0x2F82E, - 0x2F82F, - 0x2F830, - 0x2F831, - 0x2F834, - 0x2F835, - 0x2F836, - 0x2F837, - 0x2F838, - 0x2F839, - 0x2F83A, - 0x2F83B, - 0x2F83C, - 0x2F83D, - 0x2F83E, - 0x2F83F, - 0x2F840, - 0x2F841, - 0x2F842, - 0x2F843, - 0x2F844, - 0x2F845, - 0x2F847, - 0x2F848, - 0x2F849, - 0x2F84A, - 0x2F84B, - 0x2F84C, - 0x2F84D, - 0x2F84E, - 0x2F84F, - 0x2F850, - 0x2F851, - 0x2F852, - 0x2F853, - 0x2F854, - 0x2F855, - 0x2F856, - 0x2F857, - 0x2F858, - 0x2F859, - 0x2F85A, - 0x2F85B, - 0x2F85C, - 0x2F85D, - 0x2F85E, - 0x2F85F, - 0x2F860, - 0x2F861, - 0x2F862, - 0x2F863, - 0x2F864, - 0x2F865, - 0x2F866, - 0x2F867, - 0x2F868, - 0x2F869, - 0x2F86A, - 0x2F86C, - 0x2F86D, - 0x2F86E, - 0x2F86F, - 0x2F870, - 0x2F871, - 0x2F872, - 0x2F873, - 0x2F874, - 0x2F875, - 0x2F876, - 0x2F877, - 0x2F878, - 0x2F879, - 0x2F87A, - 0x2F87B, - 0x2F87C, - 0x2F87D, - 0x2F87E, - 0x2F87F, - 0x2F880, - 0x2F881, - 0x2F882, - 0x2F883, - 0x2F884, - 0x2F885, - 0x2F886, - 0x2F887, - 0x2F888, - 0x2F889, - 0x2F88A, - 0x2F88B, - 0x2F88C, - 0x2F88D, - 0x2F88E, - 0x2F88F, - 0x2F890, - 0x2F891, - 0x2F893, - 0x2F894, - 0x2F896, - 0x2F897, - 0x2F898, - 0x2F899, - 0x2F89A, - 0x2F89B, - 0x2F89C, - 0x2F89D, - 0x2F89E, - 0x2F89F, - 0x2F8A0, - 0x2F8A1, - 0x2F8A2, - 0x2F8A3, - 0x2F8A4, - 0x2F8A5, - 0x2F8A6, - 0x2F8A7, - 0x2F8A8, - 0x2F8A9, - 0x2F8AA, - 0x2F8AB, - 0x2F8AC, - 0x2F8AD, - 0x2F8AE, - 0x2F8AF, - 0x2F8B0, - 0x2F8B1, - 0x2F8B2, - 0x2F8B3, - 0x2F8B4, - 0x2F8B5, - 0x2F8B6, - 0x2F8B7, - 0x2F8B8, - 0x2F8B9, - 0x2F8BA, - 0x2F8BB, - 0x2F8BC, - 0x2F8BD, - 0x2F8BE, - 0x2F8BF, - 0x2F8C0, - 0x2F8C1, - 0x2F8C2, - 0x2F8C3, - 0x2F8C4, - 0x2F8C5, - 0x2F8C6, - 0x2F8C7, - 0x2F8C8, - 0x2F8C9, - 0x2F8CA, - 0x2F8CB, - 0x2F8CC, - 0x2F8CD, - 0x2F8CE, - 0x2F8CF, - 0x2F8D0, - 0x2F8D1, - 0x2F8D2, - 0x2F8D3, - 0x2F8D4, - 0x2F8D5, - 0x2F8D6, - 0x2F8D7, - 0x2F8D8, - 0x2F8D9, - 0x2F8DA, - 0x2F8DB, - 0x2F8DC, - 0x2F8DD, - 0x2F8DE, - 0x2F8DF, - 0x2F8E0, - 0x2F8E1, - 0x2F8E2, - 0x2F8E3, - 0x2F8E4, - 0x2F8E5, - 0x2F8E6, - 0x2F8E7, - 0x2F8E8, - 0x2F8E9, - 0x2F8EA, - 0x2F8EB, - 0x2F8EC, - 0x2F8ED, - 0x2F8EE, - 0x2F8EF, - 0x2F8F0, - 0x2F8F1, - 0x2F8F2, - 0x2F8F3, - 0x2F8F4, - 0x2F8F5, - 0x2F8F6, - 0x2F8F7, - 0x2F8F8, - 0x2F8F9, - 0x2F8FA, - 0x2F8FB, - 0x2F8FC, - 0x2F8FD, - 0x2F8FE, - 0x2F8FF, - 0x2F900, - 0x2F901, - 0x2F902, - 0x2F903, - 0x2F904, - 0x2F905, - 0x2F906, - 0x2F907, - 0x2F908, - 0x2F909, - 0x2F90A, - 0x2F90B, - 0x2F90C, - 0x2F90D, - 0x2F90E, - 0x2F90F, - 0x2F910, - 0x2F911, - 0x2F912, - 0x2F913, - 0x2F914, - 0x2F915, - 0x2F916, - 0x2F917, - 0x2F918, - 0x2F919, - 0x2F91A, - 0x2F91B, - 0x2F91C, - 0x2F91D, - 0x2F91E, - 0x2F91F, - 0x2F920, - 0x2F921, - 0x2F922, - 0x2F923, - 0x2F924, - 0x2F925, - 0x2F926, - 0x2F927, - 0x2F928, - 0x2F929, - 0x2F92A, - 0x2F92B, - 0x2F92C, - 0x2F92E, - 0x2F92F, - 0x2F930, - 0x2F931, - 0x2F932, - 0x2F933, - 0x2F934, - 0x2F935, - 0x2F936, - 0x2F937, - 0x2F938, - 0x2F939, - 0x2F93A, - 0x2F93B, - 0x2F93C, - 0x2F93D, - 0x2F93E, - 0x2F93F, - 0x2F940, - 0x2F941, - 0x2F942, - 0x2F943, - 0x2F944, - 0x2F945, - 0x2F946, - 0x2F948, - 0x2F949, - 0x2F94A, - 0x2F94B, - 0x2F94C, - 0x2F94D, - 0x2F94E, - 0x2F94F, - 0x2F950, - 0x2F951, - 0x2F952, - 0x2F953, - 0x2F954, - 0x2F955, - 0x2F956, - 0x2F957, - 0x2F958, - 0x2F959, - 0x2F95A, - 0x2F95B, - 0x2F95C, - 0x2F95D, - 0x2F95F, - 0x2F960, - 0x2F961, - 0x2F962, - 0x2F963, - 0x2F964, - 0x2F965, - 0x2F966, - 0x2F967, - 0x2F968, - 0x2F969, - 0x2F96A, - 0x2F96B, - 0x2F96C, - 0x2F96D, - 0x2F96E, - 0x2F96F, - 0x2F970, - 0x2F971, - 0x2F972, - 0x2F973, - 0x2F974, - 0x2F975, - 0x2F976, - 0x2F977, - 0x2F978, - 0x2F979, - 0x2F97A, - 0x2F97B, - 0x2F97C, - 0x2F97D, - 0x2F97E, - 0x2F97F, - 0x2F980, - 0x2F981, - 0x2F982, - 0x2F983, - 0x2F984, - 0x2F985, - 0x2F986, - 0x2F987, - 0x2F988, - 0x2F989, - 0x2F98A, - 0x2F98B, - 0x2F98C, - 0x2F98D, - 0x2F98E, - 0x2F98F, - 0x2F990, - 0x2F991, - 0x2F992, - 0x2F993, - 0x2F994, - 0x2F995, - 0x2F996, - 0x2F997, - 0x2F998, - 0x2F999, - 0x2F99A, - 0x2F99B, - 0x2F99C, - 0x2F99D, - 0x2F99E, - 0x2F99F, - 0x2F9A0, - 0x2F9A1, - 0x2F9A2, - 0x2F9A3, - 0x2F9A4, - 0x2F9A5, - 0x2F9A6, - 0x2F9A7, - 0x2F9A8, - 0x2F9A9, - 0x2F9AA, - 0x2F9AB, - 0x2F9AC, - 0x2F9AD, - 0x2F9AE, - 0x2F9AF, - 0x2F9B0, - 0x2F9B1, - 0x2F9B2, - 0x2F9B3, - 0x2F9B4, - 0x2F9B5, - 0x2F9B6, - 0x2F9B7, - 0x2F9B8, - 0x2F9B9, - 0x2F9BA, - 0x2F9BB, - 0x2F9BC, - 0x2F9BD, - 0x2F9BE, - 0x2F9BF, - 0x2F9C0, - 0x2F9C1, - 0x2F9C2, - 0x2F9C3, - 0x2F9C4, - 0x2F9C5, - 0x2F9C6, - 0x2F9C7, - 0x2F9C8, - 0x2F9C9, - 0x2F9CA, - 0x2F9CB, - 0x2F9CC, - 0x2F9CD, - 0x2F9CE, - 0x2F9CF, - 0x2F9D0, - 0x2F9D1, - 0x2F9D2, - 0x2F9D3, - 0x2F9D4, - 0x2F9D5, - 0x2F9D6, - 0x2F9D7, - 0x2F9D8, - 0x2F9D9, - 0x2F9DA, - 0x2F9DB, - 0x2F9DC, - 0x2F9DD, - 0x2F9DE, - 0x2F9DF, - 0x2F9E0, - 0x2F9E1, - 0x2F9E2, - 0x2F9E3, - 0x2F9E4, - 0x2F9E5, - 0x2F9E6, - 0x2F9E7, - 0x2F9E8, - 0x2F9E9, - 0x2F9EA, - 0x2F9EB, - 0x2F9EC, - 0x2F9ED, - 0x2F9EE, - 0x2F9EF, - 0x2F9F0, - 0x2F9F1, - 0x2F9F2, - 0x2F9F3, - 0x2F9F4, - 0x2F9F5, - 0x2F9F6, - 0x2F9F7, - 0x2F9F8, - 0x2F9F9, - 0x2F9FA, - 0x2F9FB, - 0x2F9FC, - 0x2F9FD, - 0x2F9FE, - 0x2FA00, - 0x2FA01, - 0x2FA02, - 0x2FA03, - 0x2FA04, - 0x2FA05, - 0x2FA06, - 0x2FA07, - 0x2FA08, - 0x2FA09, - 0x2FA0A, - 0x2FA0B, - 0x2FA0C, - 0x2FA0D, - 0x2FA0E, - 0x2FA0F, - 0x2FA10, - 0x2FA11, - 0x2FA12, - 0x2FA13, - 0x2FA14, - 0x2FA15, - 0x2FA16, - 0x2FA17, - 0x2FA18, - 0x2FA19, - 0x2FA1A, - 0x2FA1B, - 0x2FA1C, - 0x2FA1D, - 0x2FA1E, - 0x30000, - 0x3134B, - 0x31350, - 0x3347A, - 0xE0100, - 0xE01F0, - ), -) - -uts46_statuses: bytes = ( - b"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV" - b"VMMMMMMMMMMMMMMMMMMMMMMMMMMVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV" - b"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXMVVVVVVVMVMVVIVMVVMMMMVVMMMVMMMV" - b"MMMMMMMMMMMMMMMMMMMMMMMVMMMMMMMDVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV" - b"MVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMMVMVMVMVMVMMV" - b"MVMVMVMMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMMVMVMVMVMM" - b"VMVMMVMMMVMMMMVMMVMMMVMMVMMVMVMVMMVMVMVMMVMMMVMVMMVMVMMMMVMVMVMV" - b"MVMVMVMVMVMVMVMVMVMVMVMVMVMMVMMMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVM" - b"VMVMVMVMVMVMVMVMVMVMVMVMVMVMMVMMVMVMMMMVMVMVMVMVMMMMMMMMMVMMMMMM" - b"VMMMMMVMMVMMMVIVMVMVMVMVXMVMMXMMMMMMMXMXMMVMMMMMMMMMMMMMMMMMXMMM" - b"MMMMMMVDVMMMMMMMMVMVMVMVMVMVMVMVMVMVMVMVMVMMMVMMVMVMMVMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVMVMVMVMVMVMVMVMVMVMVMV" - b"MVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMV" - b"MVMMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVM" - b"VMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVXMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMXVMVXVXVXVXVXVXVMMMMVXVXVXVXVXVXVXVXVXVX" - b"VXVXVMMMMMMMMVXVXVXVXVXVXVXVXVXVXVXMMXMVXVXVXVXVXVXVXVMXVMXVXVXV" - b"XVXVXVXMMMVXMXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVX" - b"VXMMXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXV" - b"XVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXV" - b"XVMVXVXVXVXVXVXVXVMVXVXVXVXVXMMVXVMVMVXVMVMVMVMVMVXVMVMMMMMVMVMV" - b"XVMVMVMVMVMVXVXVXVMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXMXMXVMV" - b"IVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXMMMMMMXVXVXVXVXVXVXVXVXVX" - b"VIVXVXVXVIVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVMMM" - b"MMMMMMVXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXMMMVXVXVMMMV" - b"MMMMMMMMMMMVMMMMMMMMMMMMMMMMMMVMMMMMMMMMMMMMMMMMMMMMMMMMMMMVMVMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVMVMVMVMVMVMVMVMVMVMVMVMVMVMV" - b"MVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMV" - b"MVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMMVMVM" - b"VMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVM" - b"VMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMMMMMMMMVXMMMMMMXVMMMMMMMMVMMMMMM" - b"MMVXMMMMMMXVXMXMXMXMVMMMMMMMMVMVMVMVMVMVMVMXMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMVMMMXVMMMMMMMMMMMMMMXVMMMMMMMMMVMXVM" - b"MMMXMMMVMVMMMMMMMMXMMMXVMMMMMMMMXMIDXVMVMVXVXMVMMVMMVMVMVMMMVMVM" - b"IXIMMXMMMMMMMMMMMMMMMMMMMMMMMMMMMXMMMMMMMMMMMMMXVMVXVXMMMMVMMMVM" - b"MMMMMVMMVMMMVMMMVMVMVMVMMMMVMMMMMMMMMMVMMMMMVMMMMVMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVMVMVXVMMVMMVMMVXVXMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVMVMMMVMVXVMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVMVMMMVMVMVMVMMMMVMVMVMM" - b"MMMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMV" - b"MVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVXVXVXVXVXMVXVXVXVXVX" - b"VXVXVXVXVXVXVXVMVMXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXMVMVMVMMMVXVXVMMVMVMXV" - b"XMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMIMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXVMMMMMMMMMMMMMMVXVMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXMMMMXMMMMMMMMMMMMM" - b"MMMXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVXVXVXMVMVMVMVMVMVMVM" - b"VMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMMVXV" - b"MVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMV" - b"MVMVMVMVMVMVMVMVMVMMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMMMMMVM" - b"MMMMVMVMVMVMVMVMVMVMMMMVMVMMVMVMVMVMVMVMVMVMXMMMMMVMMVXVXVXVXVXV" - b"XVXVXVXVXVXVXVXVXVXVXVXVXVXVXVMMMMVMVXMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVXVXVXVXVX" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMVMVMVMMMMMMMMMMVMVMVMMVMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMXMMMMMMXMMMMMXMVMMMMMMMMMMMMMMMMMMMMMMMMXMMMMM" - b"XMXMMXMMXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMVMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVXMMMMMMMMMMMMMVIMMXMMM" - b"MMMXVXMMMMMMMMMMMMMMMMMMMVMMMMMMXMMMMMMMMMMMMMMMMMMMXMMMMXMMMVMX" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXIXMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMIMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXMMMMMMXMMMMM" - b"MXMMMMMMXMMMXMMMMMMMXMMMMMMMXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXV" - b"XVXVXVXVXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVXVXMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMXVXVXVXVMMMMMMMMMMMXMMMMMMMMMMMMMMMXMMM" - b"MMMMXMMXVXVXVXVXVXVXVXVXVMMMMMXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMXMMMMMMMMMXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVX" - b"VXVXVXVXVXVXVXVXVXVXVXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMXVXVXVXVMMMMMMMMMMMMMMMMMMMMMMXVXVXVXVXVXVXVXVXVXVXVXVX" - b"VXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVX" - b"VXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVX" - b"VXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVX" - b"VXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMVXMMMMMMMMMMMMMMMMMMMMMMMMMXVXVXVXVXVXVXVXVXVXVXVXVXVX" - b"VXVXVXVXVXVXVXVXVXVIXVMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVXVXVX" - b"VXVXVXVXVXVXVMMMMMMMVIVMMMMMMVXVXVXVXVXVXMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMXMMXMXMMXMMMMXMMMMMMMMMMMMXMXMMMMMMMXMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXMMMMXMMMMMMMMXMMMMM" - b"MMXMMMMMMMMMMMMMMMMMMMMMMMMMMMMXMMMMXMMMMMXMXMMMMMMMXMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMVXVXVXVXVXVXVXVXVXVXMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXVXVXVXVXVXVXVXVXVX" - b"VXVXVXVXVXVXVXVXVXVXVXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVXVXVXVX" - b"VXMMMMXMMMMMMMMMMMMMMMMMMMMMMMMMMMXMMXMXMXMMMMMMMMMMXMMMMXMXMXMX" - b"MXMXMXMMMXMMXMXMXMXMXMXMXMMXMXMMMMXMMMMMMMXMMMMXMMMMXMXMMMMMMMMM" - b"MXMMMMMMMMMMMMMMMMMXMMMXMMMMMXMMMMMMMMMMMMMMMMMXVXVXVXVXVXVXVXMM" - b"MMMMMMMMVMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMVMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMVMMMVMVXVMMMXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMXMMMMMMMMMXMMXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVXVX" - b"VXVMMMMMMMMMMVXVXVXVXVXVXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" - b"MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMXVXVXIX" -) - -uts46_replacements: tuple[str | None, ...] = ( - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - " ", - None, - None, - None, - None, - None, - None, - None, - " ̈", - None, - "a", - None, - None, - None, - None, - " ̄", - None, - None, - "2", - "3", - " ́", - "μ", - None, - None, - " ̧", - "1", - "o", - None, - "1⁄4", - "1⁄2", - "3⁄4", - None, - "à", - "á", - "â", - "ã", - "ä", - "å", - "æ", - "ç", - "è", - "é", - "ê", - "ë", - "ì", - "í", - "î", - "ï", - "ð", - "ñ", - "ò", - "ó", - "ô", - "õ", - "ö", - None, - "ø", - "ù", - "ú", - "û", - "ü", - "ý", - "þ", - "ss", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "ā", - None, - "ă", - None, - "ą", - None, - "ć", - None, - "ĉ", - None, - "ċ", - None, - "č", - None, - "ď", - None, - "đ", - None, - "ē", - None, - "ĕ", - None, - "ė", - None, - "ę", - None, - "ě", - None, - "ĝ", - None, - "ğ", - None, - "ġ", - None, - "ģ", - None, - "ĥ", - None, - "ħ", - None, - "ĩ", - None, - "ī", - None, - "ĭ", - None, - "į", - None, - "i̇", - None, - "ij", - "ĵ", - None, - "ķ", - None, - "ĺ", - None, - "ļ", - None, - "ľ", - None, - "l·", - "ł", - None, - "ń", - None, - "ņ", - None, - "ň", - None, - "ʼn", - "ŋ", - None, - "ō", - None, - "ŏ", - None, - "ő", - None, - "œ", - None, - "ŕ", - None, - "ŗ", - None, - "ř", - None, - "ś", - None, - "ŝ", - None, - "ş", - None, - "š", - None, - "ţ", - None, - "ť", - None, - "ŧ", - None, - "ũ", - None, - "ū", - None, - "ŭ", - None, - "ů", - None, - "ű", - None, - "ų", - None, - "ŵ", - None, - "ŷ", - None, - "ÿ", - "ź", - None, - "ż", - None, - "ž", - None, - "s", - None, - "ɓ", - "ƃ", - None, - "ƅ", - None, - "ɔ", - "ƈ", - None, - "ɖ", - "ɗ", - "ƌ", - None, - "ǝ", - "ə", - "ɛ", - "ƒ", - None, - "ɠ", - "ɣ", - None, - "ɩ", - "ɨ", - "ƙ", - None, - "ɯ", - "ɲ", - None, - "ɵ", - "ơ", - None, - "ƣ", - None, - "ƥ", - None, - "ʀ", - "ƨ", - None, - "ʃ", - None, - "ƭ", - None, - "ʈ", - "ư", - None, - "ʊ", - "ʋ", - "ƴ", - None, - "ƶ", - None, - "ʒ", - "ƹ", - None, - "ƽ", - None, - "dž", - "lj", - "nj", - "ǎ", - None, - "ǐ", - None, - "ǒ", - None, - "ǔ", - None, - "ǖ", - None, - "ǘ", - None, - "ǚ", - None, - "ǜ", - None, - "ǟ", - None, - "ǡ", - None, - "ǣ", - None, - "ǥ", - None, - "ǧ", - None, - "ǩ", - None, - "ǫ", - None, - "ǭ", - None, - "ǯ", - None, - "dz", - "ǵ", - None, - "ƕ", - "ƿ", - "ǹ", - None, - "ǻ", - None, - "ǽ", - None, - "ǿ", - None, - "ȁ", - None, - "ȃ", - None, - "ȅ", - None, - "ȇ", - None, - "ȉ", - None, - "ȋ", - None, - "ȍ", - None, - "ȏ", - None, - "ȑ", - None, - "ȓ", - None, - "ȕ", - None, - "ȗ", - None, - "ș", - None, - "ț", - None, - "ȝ", - None, - "ȟ", - None, - "ƞ", - None, - "ȣ", - None, - "ȥ", - None, - "ȧ", - None, - "ȩ", - None, - "ȫ", - None, - "ȭ", - None, - "ȯ", - None, - "ȱ", - None, - "ȳ", - None, - "ⱥ", - "ȼ", - None, - "ƚ", - "ⱦ", - None, - "ɂ", - None, - "ƀ", - "ʉ", - "ʌ", - "ɇ", - None, - "ɉ", - None, - "ɋ", - None, - "ɍ", - None, - "ɏ", - None, - "h", - "ɦ", - "j", - "r", - "ɹ", - "ɻ", - "ʁ", - "w", - "y", - None, - " ̆", - " ̇", - " ̊", - " ̨", - " ̃", - " ̋", - None, - "ɣ", - "l", - "s", - "x", - "ʕ", - None, - "̀", - "́", - None, - "̓", - "̈́", - "ι", - None, - None, - None, - "ͱ", - None, - "ͳ", - None, - "ʹ", - None, - "ͷ", - None, - None, - " ι", - None, - ";", - "ϳ", - None, - " ́", - " ̈́", - "ά", - "·", - "έ", - "ή", - "ί", - None, - "ό", - None, - "ύ", - "ώ", - None, - "α", - "β", - "γ", - "δ", - "ε", - "ζ", - "η", - "θ", - "ι", - "κ", - "λ", - "μ", - "ν", - "ξ", - "ο", - "π", - "ρ", - None, - "σ", - "τ", - "υ", - "φ", - "χ", - "ψ", - "ω", - "ϊ", - "ϋ", - None, - "σ", - None, - "ϗ", - "β", - "θ", - "υ", - "ύ", - "ϋ", - "φ", - "π", - None, - "ϙ", - None, - "ϛ", - None, - "ϝ", - None, - "ϟ", - None, - "ϡ", - None, - "ϣ", - None, - "ϥ", - None, - "ϧ", - None, - "ϩ", - None, - "ϫ", - None, - "ϭ", - None, - "ϯ", - None, - "κ", - "ρ", - "σ", - None, - "θ", - "ε", - None, - "ϸ", - None, - "σ", - "ϻ", - None, - "ͻ", - "ͼ", - "ͽ", - "ѐ", - "ё", - "ђ", - "ѓ", - "є", - "ѕ", - "і", - "ї", - "ј", - "љ", - "њ", - "ћ", - "ќ", - "ѝ", - "ў", - "џ", - "а", - "б", - "в", - "г", - "д", - "е", - "ж", - "з", - "и", - "й", - "к", - "л", - "м", - "н", - "о", - "п", - "р", - "с", - "т", - "у", - "ф", - "х", - "ц", - "ч", - "ш", - "щ", - "ъ", - "ы", - "ь", - "э", - "ю", - "я", - None, - "ѡ", - None, - "ѣ", - None, - "ѥ", - None, - "ѧ", - None, - "ѩ", - None, - "ѫ", - None, - "ѭ", - None, - "ѯ", - None, - "ѱ", - None, - "ѳ", - None, - "ѵ", - None, - "ѷ", - None, - "ѹ", - None, - "ѻ", - None, - "ѽ", - None, - "ѿ", - None, - "ҁ", - None, - "ҋ", - None, - "ҍ", - None, - "ҏ", - None, - "ґ", - None, - "ғ", - None, - "ҕ", - None, - "җ", - None, - "ҙ", - None, - "қ", - None, - "ҝ", - None, - "ҟ", - None, - "ҡ", - None, - "ң", - None, - "ҥ", - None, - "ҧ", - None, - "ҩ", - None, - "ҫ", - None, - "ҭ", - None, - "ү", - None, - "ұ", - None, - "ҳ", - None, - "ҵ", - None, - "ҷ", - None, - "ҹ", - None, - "һ", - None, - "ҽ", - None, - "ҿ", - None, - "ӏ", - "ӂ", - None, - "ӄ", - None, - "ӆ", - None, - "ӈ", - None, - "ӊ", - None, - "ӌ", - None, - "ӎ", - None, - "ӑ", - None, - "ӓ", - None, - "ӕ", - None, - "ӗ", - None, - "ә", - None, - "ӛ", - None, - "ӝ", - None, - "ӟ", - None, - "ӡ", - None, - "ӣ", - None, - "ӥ", - None, - "ӧ", - None, - "ө", - None, - "ӫ", - None, - "ӭ", - None, - "ӯ", - None, - "ӱ", - None, - "ӳ", - None, - "ӵ", - None, - "ӷ", - None, - "ӹ", - None, - "ӻ", - None, - "ӽ", - None, - "ӿ", - None, - "ԁ", - None, - "ԃ", - None, - "ԅ", - None, - "ԇ", - None, - "ԉ", - None, - "ԋ", - None, - "ԍ", - None, - "ԏ", - None, - "ԑ", - None, - "ԓ", - None, - "ԕ", - None, - "ԗ", - None, - "ԙ", - None, - "ԛ", - None, - "ԝ", - None, - "ԟ", - None, - "ԡ", - None, - "ԣ", - None, - "ԥ", - None, - "ԧ", - None, - "ԩ", - None, - "ԫ", - None, - "ԭ", - None, - "ԯ", - None, - None, - "ա", - "բ", - "գ", - "դ", - "ե", - "զ", - "է", - "ը", - "թ", - "ժ", - "ի", - "լ", - "խ", - "ծ", - "կ", - "հ", - "ձ", - "ղ", - "ճ", - "մ", - "յ", - "ն", - "շ", - "ո", - "չ", - "պ", - "ջ", - "ռ", - "ս", - "վ", - "տ", - "ր", - "ց", - "ւ", - "փ", - "ք", - "օ", - "ֆ", - None, - None, - "եւ", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "اٴ", - "وٴ", - "ۇٴ", - "يٴ", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "क़", - "ख़", - "ग़", - "ज़", - "ड़", - "ढ़", - "फ़", - "य़", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "ড়", - "ঢ়", - None, - "য়", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "ਲ਼", - None, - None, - "ਸ਼", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "ਖ਼", - "ਗ਼", - "ਜ਼", - None, - None, - "ਫ਼", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "ଡ଼", - "ଢ଼", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "ํา", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "ໍາ", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "ຫນ", - "ຫມ", - None, - None, - None, - "་", - None, - "གྷ", - None, - None, - None, - "ཌྷ", - None, - "དྷ", - None, - "བྷ", - None, - "ཛྷ", - None, - "ཀྵ", - None, - None, - None, - "ཱི", - None, - "ཱུ", - "ྲྀ", - "ྲཱྀ", - "ླྀ", - "ླཱྀ", - None, - "ཱྀ", - None, - "ྒྷ", - None, - None, - None, - "ྜྷ", - None, - "ྡྷ", - None, - "ྦྷ", - None, - "ྫྷ", - None, - "ྐྵ", - None, - None, - None, - None, - None, - None, - None, - "ⴀ", - "ⴁ", - "ⴂ", - "ⴃ", - "ⴄ", - "ⴅ", - "ⴆ", - "ⴇ", - "ⴈ", - "ⴉ", - "ⴊ", - "ⴋ", - "ⴌ", - "ⴍ", - "ⴎ", - "ⴏ", - "ⴐ", - "ⴑ", - "ⴒ", - "ⴓ", - "ⴔ", - "ⴕ", - "ⴖ", - "ⴗ", - "ⴘ", - "ⴙ", - "ⴚ", - "ⴛ", - "ⴜ", - "ⴝ", - "ⴞ", - "ⴟ", - "ⴠ", - "ⴡ", - "ⴢ", - "ⴣ", - "ⴤ", - "ⴥ", - None, - "ⴧ", - None, - "ⴭ", - None, - None, - "ნ", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "Ᏸ", - "Ᏹ", - "Ᏺ", - "Ᏻ", - "Ᏼ", - "Ᏽ", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "в", - "д", - "о", - "с", - "т", - "ъ", - "ѣ", - "ꙋ", - "ᲊ", - None, - None, - "ა", - "ბ", - "გ", - "დ", - "ე", - "ვ", - "ზ", - "თ", - "ი", - "კ", - "ლ", - "მ", - "ნ", - "ო", - "პ", - "ჟ", - "რ", - "ს", - "ტ", - "უ", - "ფ", - "ქ", - "ღ", - "ყ", - "შ", - "ჩ", - "ც", - "ძ", - "წ", - "ჭ", - "ხ", - "ჯ", - "ჰ", - "ჱ", - "ჲ", - "ჳ", - "ჴ", - "ჵ", - "ჶ", - "ჷ", - "ჸ", - "ჹ", - "ჺ", - None, - "ჽ", - "ჾ", - "ჿ", - None, - None, - None, - None, - None, - "a", - "æ", - "b", - None, - "d", - "e", - "ǝ", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - None, - "o", - "ȣ", - "p", - "r", - "t", - "u", - "w", - "a", - "ɐ", - "ɑ", - "ᴂ", - "b", - "d", - "e", - "ə", - "ɛ", - "ɜ", - "g", - None, - "k", - "m", - "ŋ", - "o", - "ɔ", - "ᴖ", - "ᴗ", - "p", - "t", - "u", - "ᴝ", - "ɯ", - "v", - "ᴥ", - "β", - "γ", - "δ", - "φ", - "χ", - "i", - "r", - "u", - "v", - "β", - "γ", - "ρ", - "φ", - "χ", - None, - "н", - None, - "ɒ", - "c", - "ɕ", - "ð", - "ɜ", - "f", - "ɟ", - "ɡ", - "ɥ", - "ɨ", - "ɩ", - "ɪ", - "ᵻ", - "ʝ", - "ɭ", - "ᶅ", - "ʟ", - "ɱ", - "ɰ", - "ɲ", - "ɳ", - "ɴ", - "ɵ", - "ɸ", - "ʂ", - "ʃ", - "ƫ", - "ʉ", - "ʊ", - "ᴜ", - "ʋ", - "ʌ", - "z", - "ʐ", - "ʑ", - "ʒ", - "θ", - None, - "ḁ", - None, - "ḃ", - None, - "ḅ", - None, - "ḇ", - None, - "ḉ", - None, - "ḋ", - None, - "ḍ", - None, - "ḏ", - None, - "ḑ", - None, - "ḓ", - None, - "ḕ", - None, - "ḗ", - None, - "ḙ", - None, - "ḛ", - None, - "ḝ", - None, - "ḟ", - None, - "ḡ", - None, - "ḣ", - None, - "ḥ", - None, - "ḧ", - None, - "ḩ", - None, - "ḫ", - None, - "ḭ", - None, - "ḯ", - None, - "ḱ", - None, - "ḳ", - None, - "ḵ", - None, - "ḷ", - None, - "ḹ", - None, - "ḻ", - None, - "ḽ", - None, - "ḿ", - None, - "ṁ", - None, - "ṃ", - None, - "ṅ", - None, - "ṇ", - None, - "ṉ", - None, - "ṋ", - None, - "ṍ", - None, - "ṏ", - None, - "ṑ", - None, - "ṓ", - None, - "ṕ", - None, - "ṗ", - None, - "ṙ", - None, - "ṛ", - None, - "ṝ", - None, - "ṟ", - None, - "ṡ", - None, - "ṣ", - None, - "ṥ", - None, - "ṧ", - None, - "ṩ", - None, - "ṫ", - None, - "ṭ", - None, - "ṯ", - None, - "ṱ", - None, - "ṳ", - None, - "ṵ", - None, - "ṷ", - None, - "ṹ", - None, - "ṻ", - None, - "ṽ", - None, - "ṿ", - None, - "ẁ", - None, - "ẃ", - None, - "ẅ", - None, - "ẇ", - None, - "ẉ", - None, - "ẋ", - None, - "ẍ", - None, - "ẏ", - None, - "ẑ", - None, - "ẓ", - None, - "ẕ", - None, - "aʾ", - "ṡ", - None, - "ß", - None, - "ạ", - None, - "ả", - None, - "ấ", - None, - "ầ", - None, - "ẩ", - None, - "ẫ", - None, - "ậ", - None, - "ắ", - None, - "ằ", - None, - "ẳ", - None, - "ẵ", - None, - "ặ", - None, - "ẹ", - None, - "ẻ", - None, - "ẽ", - None, - "ế", - None, - "ề", - None, - "ể", - None, - "ễ", - None, - "ệ", - None, - "ỉ", - None, - "ị", - None, - "ọ", - None, - "ỏ", - None, - "ố", - None, - "ồ", - None, - "ổ", - None, - "ỗ", - None, - "ộ", - None, - "ớ", - None, - "ờ", - None, - "ở", - None, - "ỡ", - None, - "ợ", - None, - "ụ", - None, - "ủ", - None, - "ứ", - None, - "ừ", - None, - "ử", - None, - "ữ", - None, - "ự", - None, - "ỳ", - None, - "ỵ", - None, - "ỷ", - None, - "ỹ", - None, - "ỻ", - None, - "ỽ", - None, - "ỿ", - None, - "ἀ", - "ἁ", - "ἂ", - "ἃ", - "ἄ", - "ἅ", - "ἆ", - "ἇ", - None, - None, - "ἐ", - "ἑ", - "ἒ", - "ἓ", - "ἔ", - "ἕ", - None, - None, - "ἠ", - "ἡ", - "ἢ", - "ἣ", - "ἤ", - "ἥ", - "ἦ", - "ἧ", - None, - "ἰ", - "ἱ", - "ἲ", - "ἳ", - "ἴ", - "ἵ", - "ἶ", - "ἷ", - None, - None, - "ὀ", - "ὁ", - "ὂ", - "ὃ", - "ὄ", - "ὅ", - None, - None, - None, - "ὑ", - None, - "ὓ", - None, - "ὕ", - None, - "ὗ", - None, - "ὠ", - "ὡ", - "ὢ", - "ὣ", - "ὤ", - "ὥ", - "ὦ", - "ὧ", - None, - "ά", - None, - "έ", - None, - "ή", - None, - "ί", - None, - "ό", - None, - "ύ", - None, - "ώ", - None, - "ἀι", - "ἁι", - "ἂι", - "ἃι", - "ἄι", - "ἅι", - "ἆι", - "ἇι", - "ἀι", - "ἁι", - "ἂι", - "ἃι", - "ἄι", - "ἅι", - "ἆι", - "ἇι", - "ἠι", - "ἡι", - "ἢι", - "ἣι", - "ἤι", - "ἥι", - "ἦι", - "ἧι", - "ἠι", - "ἡι", - "ἢι", - "ἣι", - "ἤι", - "ἥι", - "ἦι", - "ἧι", - "ὠι", - "ὡι", - "ὢι", - "ὣι", - "ὤι", - "ὥι", - "ὦι", - "ὧι", - "ὠι", - "ὡι", - "ὢι", - "ὣι", - "ὤι", - "ὥι", - "ὦι", - "ὧι", - None, - "ὰι", - "αι", - "άι", - None, - None, - "ᾶι", - "ᾰ", - "ᾱ", - "ὰ", - "ά", - "αι", - " ̓", - "ι", - " ̓", - " ͂", - " ̈͂", - "ὴι", - "ηι", - "ήι", - None, - None, - "ῆι", - "ὲ", - "έ", - "ὴ", - "ή", - "ηι", - " ̓̀", - " ̓́", - " ̓͂", - None, - "ΐ", - None, - None, - "ῐ", - "ῑ", - "ὶ", - "ί", - None, - " ̔̀", - " ̔́", - " ̔͂", - None, - "ΰ", - None, - "ῠ", - "ῡ", - "ὺ", - "ύ", - "ῥ", - " ̈̀", - " ̈́", - "`", - None, - "ὼι", - "ωι", - "ώι", - None, - None, - "ῶι", - "ὸ", - "ό", - "ὼ", - "ώ", - "ωι", - " ́", - " ̔", - None, - " ", - None, - "", - None, - None, - "‐", - None, - " ̳", - None, - None, - None, - None, - " ", - None, - "′′", - "′′′", - None, - "‵‵", - "‵‵‵", - None, - "!!", - None, - " ̅", - None, - "??", - "?!", - "!?", - None, - "′′′′", - None, - " ", - None, - None, - None, - "0", - "i", - None, - "4", - "5", - "6", - "7", - "8", - "9", - "+", - "−", - "=", - "(", - ")", - "n", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "+", - "−", - "=", - "(", - ")", - None, - "a", - "e", - "o", - "x", - "ə", - "h", - "k", - "l", - "m", - "n", - "p", - "s", - "t", - None, - None, - "rs", - None, - None, - None, - None, - "a/c", - "a/s", - "c", - "°c", - None, - "c/o", - "c/u", - "ɛ", - None, - "°f", - "g", - "h", - "ħ", - "i", - "l", - None, - "n", - "no", - None, - "p", - "q", - "r", - None, - "sm", - "tel", - "tm", - None, - "z", - None, - "ω", - None, - "z", - None, - "k", - "å", - "b", - "c", - None, - "e", - "f", - "ⅎ", - "m", - "o", - "א", - "ב", - "ג", - "ד", - "i", - None, - "fax", - "π", - "γ", - "π", - "∑", - None, - "d", - "e", - "i", - "j", - None, - "1⁄7", - "1⁄9", - "1⁄10", - "1⁄3", - "2⁄3", - "1⁄5", - "2⁄5", - "3⁄5", - "4⁄5", - "1⁄6", - "5⁄6", - "1⁄8", - "3⁄8", - "5⁄8", - "7⁄8", - "1⁄", - "i", - "ii", - "iii", - "iv", - "v", - "vi", - "vii", - "viii", - "ix", - "x", - "xi", - "xii", - "l", - "c", - "d", - "m", - "i", - "ii", - "iii", - "iv", - "v", - "vi", - "vii", - "viii", - "ix", - "x", - "xi", - "xii", - "l", - "c", - "d", - "m", - None, - "ↄ", - None, - "0⁄3", - None, - None, - None, - "∫∫", - "∫∫∫", - None, - "∮∮", - "∮∮∮", - None, - "〈", - "〉", - None, - None, - None, - None, - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "10", - "11", - "12", - "13", - "14", - "15", - "16", - "17", - "18", - "19", - "20", - "(1)", - "(2)", - "(3)", - "(4)", - "(5)", - "(6)", - "(7)", - "(8)", - "(9)", - "(10)", - "(11)", - "(12)", - "(13)", - "(14)", - "(15)", - "(16)", - "(17)", - "(18)", - "(19)", - "(20)", - None, - "(a)", - "(b)", - "(c)", - "(d)", - "(e)", - "(f)", - "(g)", - "(h)", - "(i)", - "(j)", - "(k)", - "(l)", - "(m)", - "(n)", - "(o)", - "(p)", - "(q)", - "(r)", - "(s)", - "(t)", - "(u)", - "(v)", - "(w)", - "(x)", - "(y)", - "(z)", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "0", - None, - "∫∫∫∫", - None, - "::=", - "==", - "===", - None, - "⫝̸", - None, - None, - None, - "ⰰ", - "ⰱ", - "ⰲ", - "ⰳ", - "ⰴ", - "ⰵ", - "ⰶ", - "ⰷ", - "ⰸ", - "ⰹ", - "ⰺ", - "ⰻ", - "ⰼ", - "ⰽ", - "ⰾ", - "ⰿ", - "ⱀ", - "ⱁ", - "ⱂ", - "ⱃ", - "ⱄ", - "ⱅ", - "ⱆ", - "ⱇ", - "ⱈ", - "ⱉ", - "ⱊ", - "ⱋ", - "ⱌ", - "ⱍ", - "ⱎ", - "ⱏ", - "ⱐ", - "ⱑ", - "ⱒ", - "ⱓ", - "ⱔ", - "ⱕ", - "ⱖ", - "ⱗ", - "ⱘ", - "ⱙ", - "ⱚ", - "ⱛ", - "ⱜ", - "ⱝ", - "ⱞ", - "ⱟ", - None, - "ⱡ", - None, - "ɫ", - "ᵽ", - "ɽ", - None, - "ⱨ", - None, - "ⱪ", - None, - "ⱬ", - None, - "ɑ", - "ɱ", - "ɐ", - "ɒ", - None, - "ⱳ", - None, - "ⱶ", - None, - "j", - "v", - "ȿ", - "ɀ", - "ⲁ", - None, - "ⲃ", - None, - "ⲅ", - None, - "ⲇ", - None, - "ⲉ", - None, - "ⲋ", - None, - "ⲍ", - None, - "ⲏ", - None, - "ⲑ", - None, - "ⲓ", - None, - "ⲕ", - None, - "ⲗ", - None, - "ⲙ", - None, - "ⲛ", - None, - "ⲝ", - None, - "ⲟ", - None, - "ⲡ", - None, - "ⲣ", - None, - "ⲥ", - None, - "ⲧ", - None, - "ⲩ", - None, - "ⲫ", - None, - "ⲭ", - None, - "ⲯ", - None, - "ⲱ", - None, - "ⲳ", - None, - "ⲵ", - None, - "ⲷ", - None, - "ⲹ", - None, - "ⲻ", - None, - "ⲽ", - None, - "ⲿ", - None, - "ⳁ", - None, - "ⳃ", - None, - "ⳅ", - None, - "ⳇ", - None, - "ⳉ", - None, - "ⳋ", - None, - "ⳍ", - None, - "ⳏ", - None, - "ⳑ", - None, - "ⳓ", - None, - "ⳕ", - None, - "ⳗ", - None, - "ⳙ", - None, - "ⳛ", - None, - "ⳝ", - None, - "ⳟ", - None, - "ⳡ", - None, - "ⳣ", - None, - "ⳬ", - None, - "ⳮ", - None, - "ⳳ", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "ⵡ", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "母", - None, - "龟", - None, - "一", - "丨", - "丶", - "丿", - "乙", - "亅", - "二", - "亠", - "人", - "儿", - "入", - "八", - "冂", - "冖", - "冫", - "几", - "凵", - "刀", - "力", - "勹", - "匕", - "匚", - "匸", - "十", - "卜", - "卩", - "厂", - "厶", - "又", - "口", - "囗", - "土", - "士", - "夂", - "夊", - "夕", - "大", - "女", - "子", - "宀", - "寸", - "小", - "尢", - "尸", - "屮", - "山", - "巛", - "工", - "己", - "巾", - "干", - "幺", - "广", - "廴", - "廾", - "弋", - "弓", - "彐", - "彡", - "彳", - "心", - "戈", - "戶", - "手", - "支", - "攴", - "文", - "斗", - "斤", - "方", - "无", - "日", - "曰", - "月", - "木", - "欠", - "止", - "歹", - "殳", - "毋", - "比", - "毛", - "氏", - "气", - "水", - "火", - "爪", - "父", - "爻", - "爿", - "片", - "牙", - "牛", - "犬", - "玄", - "玉", - "瓜", - "瓦", - "甘", - "生", - "用", - "田", - "疋", - "疒", - "癶", - "白", - "皮", - "皿", - "目", - "矛", - "矢", - "石", - "示", - "禸", - "禾", - "穴", - "立", - "竹", - "米", - "糸", - "缶", - "网", - "羊", - "羽", - "老", - "而", - "耒", - "耳", - "聿", - "肉", - "臣", - "自", - "至", - "臼", - "舌", - "舛", - "舟", - "艮", - "色", - "艸", - "虍", - "虫", - "血", - "行", - "衣", - "襾", - "見", - "角", - "言", - "谷", - "豆", - "豕", - "豸", - "貝", - "赤", - "走", - "足", - "身", - "車", - "辛", - "辰", - "辵", - "邑", - "酉", - "釆", - "里", - "金", - "長", - "門", - "阜", - "隶", - "隹", - "雨", - "靑", - "非", - "面", - "革", - "韋", - "韭", - "音", - "頁", - "風", - "飛", - "食", - "首", - "香", - "馬", - "骨", - "高", - "髟", - "鬥", - "鬯", - "鬲", - "鬼", - "魚", - "鳥", - "鹵", - "鹿", - "麥", - "麻", - "黃", - "黍", - "黑", - "黹", - "黽", - "鼎", - "鼓", - "鼠", - "鼻", - "齊", - "齒", - "龍", - "龜", - "龠", - None, - " ", - None, - ".", - None, - "〒", - None, - "十", - "卄", - "卅", - None, - None, - None, - None, - None, - " ゙", - " ゚", - None, - "より", - None, - "コト", - None, - None, - None, - "ᄀ", - "ᄁ", - "ᆪ", - "ᄂ", - "ᆬ", - "ᆭ", - "ᄃ", - "ᄄ", - "ᄅ", - "ᆰ", - "ᆱ", - "ᆲ", - "ᆳ", - "ᆴ", - "ᆵ", - "ᄚ", - "ᄆ", - "ᄇ", - "ᄈ", - "ᄡ", - "ᄉ", - "ᄊ", - "ᄋ", - "ᄌ", - "ᄍ", - "ᄎ", - "ᄏ", - "ᄐ", - "ᄑ", - "ᄒ", - "ᅡ", - "ᅢ", - "ᅣ", - "ᅤ", - "ᅥ", - "ᅦ", - "ᅧ", - "ᅨ", - "ᅩ", - "ᅪ", - "ᅫ", - "ᅬ", - "ᅭ", - "ᅮ", - "ᅯ", - "ᅰ", - "ᅱ", - "ᅲ", - "ᅳ", - "ᅴ", - "ᅵ", - None, - "ᄔ", - "ᄕ", - "ᇇ", - "ᇈ", - "ᇌ", - "ᇎ", - "ᇓ", - "ᇗ", - "ᇙ", - "ᄜ", - "ᇝ", - "ᇟ", - "ᄝ", - "ᄞ", - "ᄠ", - "ᄢ", - "ᄣ", - "ᄧ", - "ᄩ", - "ᄫ", - "ᄬ", - "ᄭ", - "ᄮ", - "ᄯ", - "ᄲ", - "ᄶ", - "ᅀ", - "ᅇ", - "ᅌ", - "ᇱ", - "ᇲ", - "ᅗ", - "ᅘ", - "ᅙ", - "ᆄ", - "ᆅ", - "ᆈ", - "ᆑ", - "ᆒ", - "ᆔ", - "ᆞ", - "ᆡ", - None, - None, - "一", - "二", - "三", - "四", - "上", - "中", - "下", - "甲", - "乙", - "丙", - "丁", - "天", - "地", - "人", - None, - None, - None, - "(ᄀ)", - "(ᄂ)", - "(ᄃ)", - "(ᄅ)", - "(ᄆ)", - "(ᄇ)", - "(ᄉ)", - "(ᄋ)", - "(ᄌ)", - "(ᄎ)", - "(ᄏ)", - "(ᄐ)", - "(ᄑ)", - "(ᄒ)", - "(가)", - "(나)", - "(다)", - "(라)", - "(마)", - "(바)", - "(사)", - "(아)", - "(자)", - "(차)", - "(카)", - "(타)", - "(파)", - "(하)", - "(주)", - "(오전)", - "(오후)", - None, - "(一)", - "(二)", - "(三)", - "(四)", - "(五)", - "(六)", - "(七)", - "(八)", - "(九)", - "(十)", - "(月)", - "(火)", - "(水)", - "(木)", - "(金)", - "(土)", - "(日)", - "(株)", - "(有)", - "(社)", - "(名)", - "(特)", - "(財)", - "(祝)", - "(労)", - "(代)", - "(呼)", - "(学)", - "(監)", - "(企)", - "(資)", - "(協)", - "(祭)", - "(休)", - "(自)", - "(至)", - "問", - "幼", - "文", - "箏", - None, - "pte", - "21", - "22", - "23", - "24", - "25", - "26", - "27", - "28", - "29", - "30", - "31", - "32", - "33", - "34", - "35", - "ᄀ", - "ᄂ", - "ᄃ", - "ᄅ", - "ᄆ", - "ᄇ", - "ᄉ", - "ᄋ", - "ᄌ", - "ᄎ", - "ᄏ", - "ᄐ", - "ᄑ", - "ᄒ", - "가", - "나", - "다", - "라", - "마", - "바", - "사", - "아", - "자", - "차", - "카", - "타", - "파", - "하", - "참고", - "주의", - "우", - None, - "一", - "二", - "三", - "四", - "五", - "六", - "七", - "八", - "九", - "十", - "月", - "火", - "水", - "木", - "金", - "土", - "日", - "株", - "有", - "社", - "名", - "特", - "財", - "祝", - "労", - "秘", - "男", - "女", - "適", - "優", - "印", - "注", - "項", - "休", - "写", - "正", - "上", - "中", - "下", - "左", - "右", - "医", - "宗", - "学", - "監", - "企", - "資", - "協", - "夜", - "36", - "37", - "38", - "39", - "40", - "41", - "42", - "43", - "44", - "45", - "46", - "47", - "48", - "49", - "50", - "1月", - "2月", - "3月", - "4月", - "5月", - "6月", - "7月", - "8月", - "9月", - "10月", - "11月", - "12月", - "hg", - "erg", - "ev", - "ltd", - "ア", - "イ", - "ウ", - "エ", - "オ", - "カ", - "キ", - "ク", - "ケ", - "コ", - "サ", - "シ", - "ス", - "セ", - "ソ", - "タ", - "チ", - "ツ", - "テ", - "ト", - "ナ", - "ニ", - "ヌ", - "ネ", - "ノ", - "ハ", - "ヒ", - "フ", - "ヘ", - "ホ", - "マ", - "ミ", - "ム", - "メ", - "モ", - "ヤ", - "ユ", - "ヨ", - "ラ", - "リ", - "ル", - "レ", - "ロ", - "ワ", - "ヰ", - "ヱ", - "ヲ", - "令和", - "アパート", - "アルファ", - "アンペア", - "アール", - "イニング", - "インチ", - "ウォン", - "エスクード", - "エーカー", - "オンス", - "オーム", - "カイリ", - "カラット", - "カロリー", - "ガロン", - "ガンマ", - "ギガ", - "ギニー", - "キュリー", - "ギルダー", - "キロ", - "キログラム", - "キロメートル", - "キロワット", - "グラム", - "グラムトン", - "クルゼイロ", - "クローネ", - "ケース", - "コルナ", - "コーポ", - "サイクル", - "サンチーム", - "シリング", - "センチ", - "セント", - "ダース", - "デシ", - "ドル", - "トン", - "ナノ", - "ノット", - "ハイツ", - "パーセント", - "パーツ", - "バーレル", - "ピアストル", - "ピクル", - "ピコ", - "ビル", - "ファラッド", - "フィート", - "ブッシェル", - "フラン", - "ヘクタール", - "ペソ", - "ペニヒ", - "ヘルツ", - "ペンス", - "ページ", - "ベータ", - "ポイント", - "ボルト", - "ホン", - "ポンド", - "ホール", - "ホーン", - "マイクロ", - "マイル", - "マッハ", - "マルク", - "マンション", - "ミクロン", - "ミリ", - "ミリバール", - "メガ", - "メガトン", - "メートル", - "ヤード", - "ヤール", - "ユアン", - "リットル", - "リラ", - "ルピー", - "ルーブル", - "レム", - "レントゲン", - "ワット", - "0点", - "1点", - "2点", - "3点", - "4点", - "5点", - "6点", - "7点", - "8点", - "9点", - "10点", - "11点", - "12点", - "13点", - "14点", - "15点", - "16点", - "17点", - "18点", - "19点", - "20点", - "21点", - "22点", - "23点", - "24点", - "hpa", - "da", - "au", - "bar", - "ov", - "pc", - "dm", - "dm2", - "dm3", - "iu", - "平成", - "昭和", - "大正", - "明治", - "株式会社", - "pa", - "na", - "μa", - "ma", - "ka", - "kb", - "mb", - "gb", - "cal", - "kcal", - "pf", - "nf", - "μf", - "μg", - "mg", - "kg", - "hz", - "khz", - "mhz", - "ghz", - "thz", - "μl", - "ml", - "dl", - "kl", - "fm", - "nm", - "μm", - "mm", - "cm", - "km", - "mm2", - "cm2", - "m2", - "km2", - "mm3", - "cm3", - "m3", - "km3", - "m∕s", - "m∕s2", - "pa", - "kpa", - "mpa", - "gpa", - "rad", - "rad∕s", - "rad∕s2", - "ps", - "ns", - "μs", - "ms", - "pv", - "nv", - "μv", - "mv", - "kv", - "mv", - "pw", - "nw", - "μw", - "mw", - "kw", - "mw", - "kω", - "mω", - None, - "bq", - "cc", - "cd", - "c∕kg", - None, - "db", - "gy", - "ha", - "hp", - "in", - "kk", - "km", - "kt", - "lm", - "ln", - "log", - "lx", - "mb", - "mil", - "mol", - "ph", - None, - "ppm", - "pr", - "sr", - "sv", - "wb", - "v∕m", - "a∕m", - "1日", - "2日", - "3日", - "4日", - "5日", - "6日", - "7日", - "8日", - "9日", - "10日", - "11日", - "12日", - "13日", - "14日", - "15日", - "16日", - "17日", - "18日", - "19日", - "20日", - "21日", - "22日", - "23日", - "24日", - "25日", - "26日", - "27日", - "28日", - "29日", - "30日", - "31日", - "gal", - None, - None, - None, - None, - None, - None, - "ꙁ", - None, - "ꙃ", - None, - "ꙅ", - None, - "ꙇ", - None, - "ꙉ", - None, - "ꙋ", - None, - "ꙍ", - None, - "ꙏ", - None, - "ꙑ", - None, - "ꙓ", - None, - "ꙕ", - None, - "ꙗ", - None, - "ꙙ", - None, - "ꙛ", - None, - "ꙝ", - None, - "ꙟ", - None, - "ꙡ", - None, - "ꙣ", - None, - "ꙥ", - None, - "ꙧ", - None, - "ꙩ", - None, - "ꙫ", - None, - "ꙭ", - None, - "ꚁ", - None, - "ꚃ", - None, - "ꚅ", - None, - "ꚇ", - None, - "ꚉ", - None, - "ꚋ", - None, - "ꚍ", - None, - "ꚏ", - None, - "ꚑ", - None, - "ꚓ", - None, - "ꚕ", - None, - "ꚗ", - None, - "ꚙ", - None, - "ꚛ", - None, - "ъ", - "ь", - None, - None, - None, - "ꜣ", - None, - "ꜥ", - None, - "ꜧ", - None, - "ꜩ", - None, - "ꜫ", - None, - "ꜭ", - None, - "ꜯ", - None, - "ꜳ", - None, - "ꜵ", - None, - "ꜷ", - None, - "ꜹ", - None, - "ꜻ", - None, - "ꜽ", - None, - "ꜿ", - None, - "ꝁ", - None, - "ꝃ", - None, - "ꝅ", - None, - "ꝇ", - None, - "ꝉ", - None, - "ꝋ", - None, - "ꝍ", - None, - "ꝏ", - None, - "ꝑ", - None, - "ꝓ", - None, - "ꝕ", - None, - "ꝗ", - None, - "ꝙ", - None, - "ꝛ", - None, - "ꝝ", - None, - "ꝟ", - None, - "ꝡ", - None, - "ꝣ", - None, - "ꝥ", - None, - "ꝧ", - None, - "ꝩ", - None, - "ꝫ", - None, - "ꝭ", - None, - "ꝯ", - None, - "ꝯ", - None, - "ꝺ", - None, - "ꝼ", - None, - "ᵹ", - "ꝿ", - None, - "ꞁ", - None, - "ꞃ", - None, - "ꞅ", - None, - "ꞇ", - None, - "ꞌ", - None, - "ɥ", - None, - "ꞑ", - None, - "ꞓ", - None, - "ꞗ", - None, - "ꞙ", - None, - "ꞛ", - None, - "ꞝ", - None, - "ꞟ", - None, - "ꞡ", - None, - "ꞣ", - None, - "ꞥ", - None, - "ꞧ", - None, - "ꞩ", - None, - "ɦ", - "ɜ", - "ɡ", - "ɬ", - "ɪ", - None, - "ʞ", - "ʇ", - "ʝ", - "ꭓ", - "ꞵ", - None, - "ꞷ", - None, - "ꞹ", - None, - "ꞻ", - None, - "ꞽ", - None, - "ꞿ", - None, - "ꟁ", - None, - "ꟃ", - None, - "ꞔ", - "ʂ", - "ᶎ", - "ꟈ", - None, - "ꟊ", - None, - "ɤ", - "ꟍ", - None, - "꟏", - None, - "ꟑ", - None, - "ꟓ", - None, - "ꟕ", - None, - "ꟗ", - None, - "ꟙ", - None, - "ꟛ", - None, - "ƛ", - None, - "s", - "c", - "f", - "q", - "ꟶ", - None, - "ħ", - "œ", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "ꜧ", - "ꬷ", - "ɫ", - "ꭒ", - None, - "ʍ", - None, - None, - "Ꭰ", - "Ꭱ", - "Ꭲ", - "Ꭳ", - "Ꭴ", - "Ꭵ", - "Ꭶ", - "Ꭷ", - "Ꭸ", - "Ꭹ", - "Ꭺ", - "Ꭻ", - "Ꭼ", - "Ꭽ", - "Ꭾ", - "Ꭿ", - "Ꮀ", - "Ꮁ", - "Ꮂ", - "Ꮃ", - "Ꮄ", - "Ꮅ", - "Ꮆ", - "Ꮇ", - "Ꮈ", - "Ꮉ", - "Ꮊ", - "Ꮋ", - "Ꮌ", - "Ꮍ", - "Ꮎ", - "Ꮏ", - "Ꮐ", - "Ꮑ", - "Ꮒ", - "Ꮓ", - "Ꮔ", - "Ꮕ", - "Ꮖ", - "Ꮗ", - "Ꮘ", - "Ꮙ", - "Ꮚ", - "Ꮛ", - "Ꮜ", - "Ꮝ", - "Ꮞ", - "Ꮟ", - "Ꮠ", - "Ꮡ", - "Ꮢ", - "Ꮣ", - "Ꮤ", - "Ꮥ", - "Ꮦ", - "Ꮧ", - "Ꮨ", - "Ꮩ", - "Ꮪ", - "Ꮫ", - "Ꮬ", - "Ꮭ", - "Ꮮ", - "Ꮯ", - "Ꮰ", - "Ꮱ", - "Ꮲ", - "Ꮳ", - "Ꮴ", - "Ꮵ", - "Ꮶ", - "Ꮷ", - "Ꮸ", - "Ꮹ", - "Ꮺ", - "Ꮻ", - "Ꮼ", - "Ꮽ", - "Ꮾ", - "Ꮿ", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "豈", - "更", - "車", - "賈", - "滑", - "串", - "句", - "龜", - "契", - "金", - "喇", - "奈", - "懶", - "癩", - "羅", - "蘿", - "螺", - "裸", - "邏", - "樂", - "洛", - "烙", - "珞", - "落", - "酪", - "駱", - "亂", - "卵", - "欄", - "爛", - "蘭", - "鸞", - "嵐", - "濫", - "藍", - "襤", - "拉", - "臘", - "蠟", - "廊", - "朗", - "浪", - "狼", - "郎", - "來", - "冷", - "勞", - "擄", - "櫓", - "爐", - "盧", - "老", - "蘆", - "虜", - "路", - "露", - "魯", - "鷺", - "碌", - "祿", - "綠", - "菉", - "錄", - "鹿", - "論", - "壟", - "弄", - "籠", - "聾", - "牢", - "磊", - "賂", - "雷", - "壘", - "屢", - "樓", - "淚", - "漏", - "累", - "縷", - "陋", - "勒", - "肋", - "凜", - "凌", - "稜", - "綾", - "菱", - "陵", - "讀", - "拏", - "樂", - "諾", - "丹", - "寧", - "怒", - "率", - "異", - "北", - "磻", - "便", - "復", - "不", - "泌", - "數", - "索", - "參", - "塞", - "省", - "葉", - "說", - "殺", - "辰", - "沈", - "拾", - "若", - "掠", - "略", - "亮", - "兩", - "凉", - "梁", - "糧", - "良", - "諒", - "量", - "勵", - "呂", - "女", - "廬", - "旅", - "濾", - "礪", - "閭", - "驪", - "麗", - "黎", - "力", - "曆", - "歷", - "轢", - "年", - "憐", - "戀", - "撚", - "漣", - "煉", - "璉", - "秊", - "練", - "聯", - "輦", - "蓮", - "連", - "鍊", - "列", - "劣", - "咽", - "烈", - "裂", - "說", - "廉", - "念", - "捻", - "殮", - "簾", - "獵", - "令", - "囹", - "寧", - "嶺", - "怜", - "玲", - "瑩", - "羚", - "聆", - "鈴", - "零", - "靈", - "領", - "例", - "禮", - "醴", - "隸", - "惡", - "了", - "僚", - "寮", - "尿", - "料", - "樂", - "燎", - "療", - "蓼", - "遼", - "龍", - "暈", - "阮", - "劉", - "杻", - "柳", - "流", - "溜", - "琉", - "留", - "硫", - "紐", - "類", - "六", - "戮", - "陸", - "倫", - "崙", - "淪", - "輪", - "律", - "慄", - "栗", - "率", - "隆", - "利", - "吏", - "履", - "易", - "李", - "梨", - "泥", - "理", - "痢", - "罹", - "裏", - "裡", - "里", - "離", - "匿", - "溺", - "吝", - "燐", - "璘", - "藺", - "隣", - "鱗", - "麟", - "林", - "淋", - "臨", - "立", - "笠", - "粒", - "狀", - "炙", - "識", - "什", - "茶", - "刺", - "切", - "度", - "拓", - "糖", - "宅", - "洞", - "暴", - "輻", - "行", - "降", - "見", - "廓", - "兀", - "嗀", - None, - "塚", - None, - "晴", - None, - "凞", - "猪", - "益", - "礼", - "神", - "祥", - "福", - "靖", - "精", - "羽", - None, - "蘒", - None, - "諸", - None, - "逸", - "都", - None, - "飯", - "飼", - "館", - "鶴", - "郞", - "隷", - "侮", - "僧", - "免", - "勉", - "勤", - "卑", - "喝", - "嘆", - "器", - "塀", - "墨", - "層", - "屮", - "悔", - "慨", - "憎", - "懲", - "敏", - "既", - "暑", - "梅", - "海", - "渚", - "漢", - "煮", - "爫", - "琢", - "碑", - "社", - "祉", - "祈", - "祐", - "祖", - "祝", - "禍", - "禎", - "穀", - "突", - "節", - "練", - "縉", - "繁", - "署", - "者", - "臭", - "艹", - "著", - "褐", - "視", - "謁", - "謹", - "賓", - "贈", - "辶", - "逸", - "難", - "響", - "頻", - "恵", - "𤋮", - "舘", - None, - "並", - "况", - "全", - "侀", - "充", - "冀", - "勇", - "勺", - "喝", - "啕", - "喙", - "嗢", - "塚", - "墳", - "奄", - "奔", - "婢", - "嬨", - "廒", - "廙", - "彩", - "徭", - "惘", - "慎", - "愈", - "憎", - "慠", - "懲", - "戴", - "揄", - "搜", - "摒", - "敖", - "晴", - "朗", - "望", - "杖", - "歹", - "殺", - "流", - "滛", - "滋", - "漢", - "瀞", - "煮", - "瞧", - "爵", - "犯", - "猪", - "瑱", - "甆", - "画", - "瘝", - "瘟", - "益", - "盛", - "直", - "睊", - "着", - "磌", - "窱", - "節", - "类", - "絛", - "練", - "缾", - "者", - "荒", - "華", - "蝹", - "襁", - "覆", - "視", - "調", - "諸", - "請", - "謁", - "諾", - "諭", - "謹", - "變", - "贈", - "輸", - "遲", - "醙", - "鉶", - "陼", - "難", - "靖", - "韛", - "響", - "頋", - "頻", - "鬒", - "龜", - "𢡊", - "𢡄", - "𣏕", - "㮝", - "䀘", - "䀹", - "𥉉", - "𥳐", - "𧻓", - "齃", - "龎", - None, - "ff", - "fi", - "fl", - "ffi", - "ffl", - "st", - None, - "մն", - "մե", - "մի", - "վն", - "մխ", - None, - "יִ", - None, - "ײַ", - "ע", - "א", - "ד", - "ה", - "כ", - "ל", - "ם", - "ר", - "ת", - "+", - "שׁ", - "שׂ", - "שּׁ", - "שּׂ", - "אַ", - "אָ", - "אּ", - "בּ", - "גּ", - "דּ", - "הּ", - "וּ", - "זּ", - None, - "טּ", - "יּ", - "ךּ", - "כּ", - "לּ", - None, - "מּ", - None, - "נּ", - "סּ", - None, - "ףּ", - "פּ", - None, - "צּ", - "קּ", - "רּ", - "שּ", - "תּ", - "וֹ", - "בֿ", - "כֿ", - "פֿ", - "אל", - "ٱ", - "ٻ", - "پ", - "ڀ", - "ٺ", - "ٿ", - "ٹ", - "ڤ", - "ڦ", - "ڄ", - "ڃ", - "چ", - "ڇ", - "ڍ", - "ڌ", - "ڎ", - "ڈ", - "ژ", - "ڑ", - "ک", - "گ", - "ڳ", - "ڱ", - "ں", - "ڻ", - "ۀ", - "ہ", - "ھ", - "ے", - "ۓ", - None, - "ڭ", - "ۇ", - "ۆ", - "ۈ", - "ۇٴ", - "ۋ", - "ۅ", - "ۉ", - "ې", - "ى", - "ئا", - "ئە", - "ئو", - "ئۇ", - "ئۆ", - "ئۈ", - "ئې", - "ئى", - "ی", - "ئج", - "ئح", - "ئم", - "ئى", - "ئي", - "بج", - "بح", - "بخ", - "بم", - "بى", - "بي", - "تج", - "تح", - "تخ", - "تم", - "تى", - "تي", - "ثج", - "ثم", - "ثى", - "ثي", - "جح", - "جم", - "حج", - "حم", - "خج", - "خح", - "خم", - "سج", - "سح", - "سخ", - "سم", - "صح", - "صم", - "ضج", - "ضح", - "ضخ", - "ضم", - "طح", - "طم", - "ظم", - "عج", - "عم", - "غج", - "غم", - "فج", - "فح", - "فخ", - "فم", - "فى", - "في", - "قح", - "قم", - "قى", - "قي", - "كا", - "كج", - "كح", - "كخ", - "كل", - "كم", - "كى", - "كي", - "لج", - "لح", - "لخ", - "لم", - "لى", - "لي", - "مج", - "مح", - "مخ", - "مم", - "مى", - "مي", - "نج", - "نح", - "نخ", - "نم", - "نى", - "ني", - "هج", - "هم", - "هى", - "هي", - "يج", - "يح", - "يخ", - "يم", - "يى", - "يي", - "ذٰ", - "رٰ", - "ىٰ", - " ٌّ", - " ٍّ", - " َّ", - " ُّ", - " ِّ", - " ّٰ", - "ئر", - "ئز", - "ئم", - "ئن", - "ئى", - "ئي", - "بر", - "بز", - "بم", - "بن", - "بى", - "بي", - "تر", - "تز", - "تم", - "تن", - "تى", - "تي", - "ثر", - "ثز", - "ثم", - "ثن", - "ثى", - "ثي", - "فى", - "في", - "قى", - "قي", - "كا", - "كل", - "كم", - "كى", - "كي", - "لم", - "لى", - "لي", - "ما", - "مم", - "نر", - "نز", - "نم", - "نن", - "نى", - "ني", - "ىٰ", - "ير", - "يز", - "يم", - "ين", - "يى", - "يي", - "ئج", - "ئح", - "ئخ", - "ئم", - "ئه", - "بج", - "بح", - "بخ", - "بم", - "به", - "تج", - "تح", - "تخ", - "تم", - "ته", - "ثم", - "جح", - "جم", - "حج", - "حم", - "خج", - "خم", - "سج", - "سح", - "سخ", - "سم", - "صح", - "صخ", - "صم", - "ضج", - "ضح", - "ضخ", - "ضم", - "طح", - "ظم", - "عج", - "عم", - "غج", - "غم", - "فج", - "فح", - "فخ", - "فم", - "قح", - "قم", - "كج", - "كح", - "كخ", - "كل", - "كم", - "لج", - "لح", - "لخ", - "لم", - "له", - "مج", - "مح", - "مخ", - "مم", - "نج", - "نح", - "نخ", - "نم", - "نه", - "هج", - "هم", - "هٰ", - "يج", - "يح", - "يخ", - "يم", - "يه", - "ئم", - "ئه", - "بم", - "به", - "تم", - "ته", - "ثم", - "ثه", - "سم", - "سه", - "شم", - "شه", - "كل", - "كم", - "لم", - "نم", - "نه", - "يم", - "يه", - "ـَّ", - "ـُّ", - "ـِّ", - "طى", - "طي", - "عى", - "عي", - "غى", - "غي", - "سى", - "سي", - "شى", - "شي", - "حى", - "حي", - "جى", - "جي", - "خى", - "خي", - "صى", - "صي", - "ضى", - "ضي", - "شج", - "شح", - "شخ", - "شم", - "شر", - "سر", - "صر", - "ضر", - "طى", - "طي", - "عى", - "عي", - "غى", - "غي", - "سى", - "سي", - "شى", - "شي", - "حى", - "حي", - "جى", - "جي", - "خى", - "خي", - "صى", - "صي", - "ضى", - "ضي", - "شج", - "شح", - "شخ", - "شم", - "شر", - "سر", - "صر", - "ضر", - "شج", - "شح", - "شخ", - "شم", - "سه", - "شه", - "طم", - "سج", - "سح", - "سخ", - "شج", - "شح", - "شخ", - "طم", - "ظم", - "اً", - None, - "تجم", - "تحج", - "تحم", - "تخم", - "تمج", - "تمح", - "تمخ", - "جمح", - "حمي", - "حمى", - "سحج", - "سجح", - "سجى", - "سمح", - "سمج", - "سمم", - "صحح", - "صمم", - "شحم", - "شجي", - "شمخ", - "شمم", - "ضحى", - "ضخم", - "طمح", - "طمم", - "طمي", - "عجم", - "عمم", - "عمى", - "غمم", - "غمي", - "غمى", - "فخم", - "قمح", - "قمم", - "لحم", - "لحي", - "لحى", - "لجج", - "لخم", - "لمح", - "محج", - "محم", - "محي", - "مجح", - "مجم", - "مخج", - "مخم", - None, - "مجخ", - "همج", - "همم", - "نحم", - "نحى", - "نجم", - "نجى", - "نمي", - "نمى", - "يمم", - "بخي", - "تجي", - "تجى", - "تخي", - "تخى", - "تمي", - "تمى", - "جمي", - "جحى", - "جمى", - "سخى", - "صحي", - "شحي", - "ضحي", - "لجي", - "لمي", - "يحي", - "يجي", - "يمي", - "ممي", - "قمي", - "نحي", - "قمح", - "لحم", - "عمي", - "كمي", - "نجح", - "مخي", - "لجم", - "كمم", - "لجم", - "نجح", - "جحي", - "حجي", - "مجي", - "فمي", - "بحي", - "كمم", - "عجم", - "صمم", - "سخي", - "نجي", - None, - None, - "صلے", - "قلے", - "الله", - "اكبر", - "محمد", - "صلعم", - "رسول", - "عليه", - "وسلم", - "صلى", - "صلى الله عليه وسلم", - "جل جلاله", - "ریال", - None, - None, - ",", - "、", - None, - ":", - ";", - "!", - "?", - "〖", - "〗", - None, - None, - None, - "—", - "–", - "_", - "(", - ")", - "{", - "}", - "〔", - "〕", - "【", - "】", - "《", - "》", - "〈", - "〉", - "「", - "」", - "『", - "』", - None, - "[", - "]", - " ̅", - "_", - ",", - "、", - None, - ";", - ":", - "?", - "!", - "—", - "(", - ")", - "{", - "}", - "〔", - "〕", - "#", - "&", - "*", - "+", - "-", - "<", - ">", - "=", - None, - "\\", - "$", - "%", - "@", - None, - " ً", - "ـً", - " ٌ", - None, - " ٍ", - None, - " َ", - "ـَ", - " ُ", - "ـُ", - " ِ", - "ـِ", - " ّ", - "ـّ", - " ْ", - "ـْ", - "ء", - "آ", - "أ", - "ؤ", - "إ", - "ئ", - "ا", - "ب", - "ة", - "ت", - "ث", - "ج", - "ح", - "خ", - "د", - "ذ", - "ر", - "ز", - "س", - "ش", - "ص", - "ض", - "ط", - "ظ", - "ع", - "غ", - "ف", - "ق", - "ك", - "ل", - "م", - "ن", - "ه", - "و", - "ى", - "ي", - "لآ", - "لأ", - "لإ", - "لا", - None, - None, - None, - "!", - '"', - "#", - "$", - "%", - "&", - "'", - "(", - ")", - "*", - "+", - ",", - "-", - ".", - "/", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - ":", - ";", - "<", - "=", - ">", - "?", - "@", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "[", - "\\", - "]", - "^", - "_", - "`", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "{", - "|", - "}", - "~", - "⦅", - "⦆", - ".", - "「", - "」", - "、", - "・", - "ヲ", - "ァ", - "ィ", - "ゥ", - "ェ", - "ォ", - "ャ", - "ュ", - "ョ", - "ッ", - "ー", - "ア", - "イ", - "ウ", - "エ", - "オ", - "カ", - "キ", - "ク", - "ケ", - "コ", - "サ", - "シ", - "ス", - "セ", - "ソ", - "タ", - "チ", - "ツ", - "テ", - "ト", - "ナ", - "ニ", - "ヌ", - "ネ", - "ノ", - "ハ", - "ヒ", - "フ", - "ヘ", - "ホ", - "マ", - "ミ", - "ム", - "メ", - "モ", - "ヤ", - "ユ", - "ヨ", - "ラ", - "リ", - "ル", - "レ", - "ロ", - "ワ", - "ン", - "゙", - "゚", - None, - "ᄀ", - "ᄁ", - "ᆪ", - "ᄂ", - "ᆬ", - "ᆭ", - "ᄃ", - "ᄄ", - "ᄅ", - "ᆰ", - "ᆱ", - "ᆲ", - "ᆳ", - "ᆴ", - "ᆵ", - "ᄚ", - "ᄆ", - "ᄇ", - "ᄈ", - "ᄡ", - "ᄉ", - "ᄊ", - "ᄋ", - "ᄌ", - "ᄍ", - "ᄎ", - "ᄏ", - "ᄐ", - "ᄑ", - "ᄒ", - None, - "ᅡ", - "ᅢ", - "ᅣ", - "ᅤ", - "ᅥ", - "ᅦ", - None, - "ᅧ", - "ᅨ", - "ᅩ", - "ᅪ", - "ᅫ", - "ᅬ", - None, - "ᅭ", - "ᅮ", - "ᅯ", - "ᅰ", - "ᅱ", - "ᅲ", - None, - "ᅳ", - "ᅴ", - "ᅵ", - None, - "¢", - "£", - "¬", - " ̄", - "¦", - "¥", - "₩", - None, - "│", - "←", - "↑", - "→", - "↓", - "■", - "○", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "𐐨", - "𐐩", - "𐐪", - "𐐫", - "𐐬", - "𐐭", - "𐐮", - "𐐯", - "𐐰", - "𐐱", - "𐐲", - "𐐳", - "𐐴", - "𐐵", - "𐐶", - "𐐷", - "𐐸", - "𐐹", - "𐐺", - "𐐻", - "𐐼", - "𐐽", - "𐐾", - "𐐿", - "𐑀", - "𐑁", - "𐑂", - "𐑃", - "𐑄", - "𐑅", - "𐑆", - "𐑇", - "𐑈", - "𐑉", - "𐑊", - "𐑋", - "𐑌", - "𐑍", - "𐑎", - "𐑏", - None, - None, - None, - None, - "𐓘", - "𐓙", - "𐓚", - "𐓛", - "𐓜", - "𐓝", - "𐓞", - "𐓟", - "𐓠", - "𐓡", - "𐓢", - "𐓣", - "𐓤", - "𐓥", - "𐓦", - "𐓧", - "𐓨", - "𐓩", - "𐓪", - "𐓫", - "𐓬", - "𐓭", - "𐓮", - "𐓯", - "𐓰", - "𐓱", - "𐓲", - "𐓳", - "𐓴", - "𐓵", - "𐓶", - "𐓷", - "𐓸", - "𐓹", - "𐓺", - "𐓻", - None, - None, - None, - None, - None, - None, - None, - None, - "𐖗", - "𐖘", - "𐖙", - "𐖚", - "𐖛", - "𐖜", - "𐖝", - "𐖞", - "𐖟", - "𐖠", - "𐖡", - None, - "𐖣", - "𐖤", - "𐖥", - "𐖦", - "𐖧", - "𐖨", - "𐖩", - "𐖪", - "𐖫", - "𐖬", - "𐖭", - "𐖮", - "𐖯", - "𐖰", - "𐖱", - None, - "𐖳", - "𐖴", - "𐖵", - "𐖶", - "𐖷", - "𐖸", - "𐖹", - None, - "𐖻", - "𐖼", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "ː", - "ˑ", - "æ", - "ʙ", - "ɓ", - None, - "ʣ", - "ꭦ", - "ʥ", - "ʤ", - "ɖ", - "ɗ", - "ᶑ", - "ɘ", - "ɞ", - "ʩ", - "ɤ", - "ɢ", - "ɠ", - "ʛ", - "ħ", - "ʜ", - "ɧ", - "ʄ", - "ʪ", - "ʫ", - "ɬ", - "𝼄", - "ꞎ", - "ɮ", - "𝼅", - "ʎ", - "𝼆", - "ø", - "ɶ", - "ɷ", - "q", - "ɺ", - "𝼈", - "ɽ", - "ɾ", - "ʀ", - "ʨ", - "ʦ", - "ꭧ", - "ʧ", - "ʈ", - "ⱱ", - None, - "ʏ", - "ʡ", - "ʢ", - "ʘ", - "ǀ", - "ǁ", - "ǂ", - "𝼊", - "𝼞", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "𐳀", - "𐳁", - "𐳂", - "𐳃", - "𐳄", - "𐳅", - "𐳆", - "𐳇", - "𐳈", - "𐳉", - "𐳊", - "𐳋", - "𐳌", - "𐳍", - "𐳎", - "𐳏", - "𐳐", - "𐳑", - "𐳒", - "𐳓", - "𐳔", - "𐳕", - "𐳖", - "𐳗", - "𐳘", - "𐳙", - "𐳚", - "𐳛", - "𐳜", - "𐳝", - "𐳞", - "𐳟", - "𐳠", - "𐳡", - "𐳢", - "𐳣", - "𐳤", - "𐳥", - "𐳦", - "𐳧", - "𐳨", - "𐳩", - "𐳪", - "𐳫", - "𐳬", - "𐳭", - "𐳮", - "𐳯", - "𐳰", - "𐳱", - "𐳲", - None, - None, - None, - None, - None, - None, - None, - None, - "𐵰", - "𐵱", - "𐵲", - "𐵳", - "𐵴", - "𐵵", - "𐵶", - "𐵷", - "𐵸", - "𐵹", - "𐵺", - "𐵻", - "𐵼", - "𐵽", - "𐵾", - "𐵿", - "𐶀", - "𐶁", - "𐶂", - "𐶃", - "𐶄", - "𐶅", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "𑣀", - "𑣁", - "𑣂", - "𑣃", - "𑣄", - "𑣅", - "𑣆", - "𑣇", - "𑣈", - "𑣉", - "𑣊", - "𑣋", - "𑣌", - "𑣍", - "𑣎", - "𑣏", - "𑣐", - "𑣑", - "𑣒", - "𑣓", - "𑣔", - "𑣕", - "𑣖", - "𑣗", - "𑣘", - "𑣙", - "𑣚", - "𑣛", - "𑣜", - "𑣝", - "𑣞", - "𑣟", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "𖹠", - "𖹡", - "𖹢", - "𖹣", - "𖹤", - "𖹥", - "𖹦", - "𖹧", - "𖹨", - "𖹩", - "𖹪", - "𖹫", - "𖹬", - "𖹭", - "𖹮", - "𖹯", - "𖹰", - "𖹱", - "𖹲", - "𖹳", - "𖹴", - "𖹵", - "𖹶", - "𖹷", - "𖹸", - "𖹹", - "𖹺", - "𖹻", - "𖹼", - "𖹽", - "𖹾", - "𖹿", - None, - None, - "𖺻", - "𖺼", - "𖺽", - "𖺾", - "𖺿", - "𖻀", - "𖻁", - "𖻂", - "𖻃", - "𖻄", - "𖻅", - "𖻆", - "𖻇", - "𖻈", - "𖻉", - "𖻊", - "𖻋", - "𖻌", - "𖻍", - "𖻎", - "𖻏", - "𖻐", - "𖻑", - "𖻒", - "𖻓", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "𝅗𝅥", - "𝅘𝅥", - "𝅘𝅥𝅮", - "𝅘𝅥𝅯", - "𝅘𝅥𝅰", - "𝅘𝅥𝅱", - "𝅘𝅥𝅲", - None, - None, - None, - "𝆹𝅥", - "𝆺𝅥", - "𝆹𝅥𝅮", - "𝆺𝅥𝅮", - "𝆹𝅥𝅯", - "𝆺𝅥𝅯", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - None, - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - None, - "c", - "d", - None, - "g", - None, - "j", - "k", - None, - "n", - "o", - "p", - "q", - None, - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - None, - "f", - None, - "h", - "i", - "j", - "k", - "l", - "m", - "n", - None, - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - None, - "d", - "e", - "f", - "g", - None, - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - None, - "s", - "t", - "u", - "v", - "w", - "x", - "y", - None, - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - None, - "d", - "e", - "f", - "g", - None, - "i", - "j", - "k", - "l", - "m", - None, - "o", - None, - "s", - "t", - "u", - "v", - "w", - "x", - "y", - None, - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "ı", - "ȷ", - None, - "α", - "β", - "γ", - "δ", - "ε", - "ζ", - "η", - "θ", - "ι", - "κ", - "λ", - "μ", - "ν", - "ξ", - "ο", - "π", - "ρ", - "θ", - "σ", - "τ", - "υ", - "φ", - "χ", - "ψ", - "ω", - "∇", - "α", - "β", - "γ", - "δ", - "ε", - "ζ", - "η", - "θ", - "ι", - "κ", - "λ", - "μ", - "ν", - "ξ", - "ο", - "π", - "ρ", - "σ", - "τ", - "υ", - "φ", - "χ", - "ψ", - "ω", - "∂", - "ε", - "θ", - "κ", - "φ", - "ρ", - "π", - "α", - "β", - "γ", - "δ", - "ε", - "ζ", - "η", - "θ", - "ι", - "κ", - "λ", - "μ", - "ν", - "ξ", - "ο", - "π", - "ρ", - "θ", - "σ", - "τ", - "υ", - "φ", - "χ", - "ψ", - "ω", - "∇", - "α", - "β", - "γ", - "δ", - "ε", - "ζ", - "η", - "θ", - "ι", - "κ", - "λ", - "μ", - "ν", - "ξ", - "ο", - "π", - "ρ", - "σ", - "τ", - "υ", - "φ", - "χ", - "ψ", - "ω", - "∂", - "ε", - "θ", - "κ", - "φ", - "ρ", - "π", - "α", - "β", - "γ", - "δ", - "ε", - "ζ", - "η", - "θ", - "ι", - "κ", - "λ", - "μ", - "ν", - "ξ", - "ο", - "π", - "ρ", - "θ", - "σ", - "τ", - "υ", - "φ", - "χ", - "ψ", - "ω", - "∇", - "α", - "β", - "γ", - "δ", - "ε", - "ζ", - "η", - "θ", - "ι", - "κ", - "λ", - "μ", - "ν", - "ξ", - "ο", - "π", - "ρ", - "σ", - "τ", - "υ", - "φ", - "χ", - "ψ", - "ω", - "∂", - "ε", - "θ", - "κ", - "φ", - "ρ", - "π", - "α", - "β", - "γ", - "δ", - "ε", - "ζ", - "η", - "θ", - "ι", - "κ", - "λ", - "μ", - "ν", - "ξ", - "ο", - "π", - "ρ", - "θ", - "σ", - "τ", - "υ", - "φ", - "χ", - "ψ", - "ω", - "∇", - "α", - "β", - "γ", - "δ", - "ε", - "ζ", - "η", - "θ", - "ι", - "κ", - "λ", - "μ", - "ν", - "ξ", - "ο", - "π", - "ρ", - "σ", - "τ", - "υ", - "φ", - "χ", - "ψ", - "ω", - "∂", - "ε", - "θ", - "κ", - "φ", - "ρ", - "π", - "α", - "β", - "γ", - "δ", - "ε", - "ζ", - "η", - "θ", - "ι", - "κ", - "λ", - "μ", - "ν", - "ξ", - "ο", - "π", - "ρ", - "θ", - "σ", - "τ", - "υ", - "φ", - "χ", - "ψ", - "ω", - "∇", - "α", - "β", - "γ", - "δ", - "ε", - "ζ", - "η", - "θ", - "ι", - "κ", - "λ", - "μ", - "ν", - "ξ", - "ο", - "π", - "ρ", - "σ", - "τ", - "υ", - "φ", - "χ", - "ψ", - "ω", - "∂", - "ε", - "θ", - "κ", - "φ", - "ρ", - "π", - "ϝ", - None, - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "а", - "б", - "в", - "г", - "д", - "е", - "ж", - "з", - "и", - "к", - "л", - "м", - "о", - "п", - "р", - "с", - "т", - "у", - "ф", - "х", - "ц", - "ч", - "ш", - "ы", - "э", - "ю", - "ꚉ", - "ә", - "і", - "ј", - "ө", - "ү", - "ӏ", - "а", - "б", - "в", - "г", - "д", - "е", - "ж", - "з", - "и", - "к", - "л", - "о", - "п", - "с", - "у", - "ф", - "х", - "ц", - "ч", - "ш", - "ъ", - "ы", - "ґ", - "і", - "ѕ", - "џ", - "ҫ", - "ꙑ", - "ұ", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "𞤢", - "𞤣", - "𞤤", - "𞤥", - "𞤦", - "𞤧", - "𞤨", - "𞤩", - "𞤪", - "𞤫", - "𞤬", - "𞤭", - "𞤮", - "𞤯", - "𞤰", - "𞤱", - "𞤲", - "𞤳", - "𞤴", - "𞤵", - "𞤶", - "𞤷", - "𞤸", - "𞤹", - "𞤺", - "𞤻", - "𞤼", - "𞤽", - "𞤾", - "𞤿", - "𞥀", - "𞥁", - "𞥂", - "𞥃", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "ا", - "ب", - "ج", - "د", - None, - "و", - "ز", - "ح", - "ط", - "ي", - "ك", - "ل", - "م", - "ن", - "س", - "ع", - "ف", - "ص", - "ق", - "ر", - "ش", - "ت", - "ث", - "خ", - "ذ", - "ض", - "ظ", - "غ", - "ٮ", - "ں", - "ڡ", - "ٯ", - None, - "ب", - "ج", - None, - "ه", - None, - "ح", - None, - "ي", - "ك", - "ل", - "م", - "ن", - "س", - "ع", - "ف", - "ص", - "ق", - None, - "ش", - "ت", - "ث", - "خ", - None, - "ض", - None, - "غ", - None, - "ج", - None, - "ح", - None, - "ي", - None, - "ل", - None, - "ن", - "س", - "ع", - None, - "ص", - "ق", - None, - "ش", - None, - "خ", - None, - "ض", - None, - "غ", - None, - "ں", - None, - "ٯ", - None, - "ب", - "ج", - None, - "ه", - None, - "ح", - "ط", - "ي", - "ك", - None, - "م", - "ن", - "س", - "ع", - "ف", - "ص", - "ق", - None, - "ش", - "ت", - "ث", - "خ", - None, - "ض", - "ظ", - "غ", - "ٮ", - None, - "ڡ", - None, - "ا", - "ب", - "ج", - "د", - "ه", - "و", - "ز", - "ح", - "ط", - "ي", - None, - "ل", - "م", - "ن", - "س", - "ع", - "ف", - "ص", - "ق", - "ر", - "ش", - "ت", - "ث", - "خ", - "ذ", - "ض", - "ظ", - "غ", - None, - "ب", - "ج", - "د", - None, - "و", - "ز", - "ح", - "ط", - "ي", - None, - "ل", - "م", - "ن", - "س", - "ع", - "ف", - "ص", - "ق", - "ر", - "ش", - "ت", - "ث", - "خ", - "ذ", - "ض", - "ظ", - "غ", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "0,", - "1,", - "2,", - "3,", - "4,", - "5,", - "6,", - "7,", - "8,", - "9,", - None, - "(a)", - "(b)", - "(c)", - "(d)", - "(e)", - "(f)", - "(g)", - "(h)", - "(i)", - "(j)", - "(k)", - "(l)", - "(m)", - "(n)", - "(o)", - "(p)", - "(q)", - "(r)", - "(s)", - "(t)", - "(u)", - "(v)", - "(w)", - "(x)", - "(y)", - "(z)", - "〔s〕", - "c", - "r", - "cd", - "wz", - None, - "a", - "b", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "hv", - "mv", - "sd", - "ss", - "ppv", - "wc", - None, - "mc", - "md", - "mr", - None, - "dj", - None, - None, - None, - "ほか", - "ココ", - "サ", - None, - "手", - "字", - "双", - "デ", - "二", - "多", - "解", - "天", - "交", - "映", - "無", - "料", - "前", - "後", - "再", - "新", - "初", - "終", - "生", - "販", - "声", - "吹", - "演", - "投", - "捕", - "一", - "三", - "遊", - "左", - "中", - "右", - "指", - "走", - "打", - "禁", - "空", - "合", - "満", - "有", - "月", - "申", - "割", - "営", - "配", - None, - "〔本〕", - "〔三〕", - "〔二〕", - "〔安〕", - "〔点〕", - "〔打〕", - "〔盗〕", - "〔勝〕", - "〔敗〕", - None, - "得", - "可", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - None, - "丽", - "丸", - "乁", - "𠄢", - "你", - "侮", - "侻", - "倂", - "偺", - "備", - "僧", - "像", - "㒞", - "𠘺", - "免", - "兔", - "兤", - "具", - "𠔜", - "㒹", - "內", - "再", - "𠕋", - "冗", - "冤", - "仌", - "冬", - "况", - "𩇟", - "凵", - "刃", - "㓟", - "刻", - "剆", - "割", - "剷", - "㔕", - "勇", - "勉", - "勤", - "勺", - "包", - "匆", - "北", - "卉", - "卑", - "博", - "即", - "卽", - "卿", - "𠨬", - "灰", - "及", - "叟", - "𠭣", - "叫", - "叱", - "吆", - "咞", - "吸", - "呈", - "周", - "咢", - "哶", - "唐", - "啓", - "啣", - "善", - "喙", - "喫", - "喳", - "嗂", - "圖", - "嘆", - "圗", - "噑", - "噴", - "切", - "壮", - "城", - "埴", - "堍", - "型", - "堲", - "報", - "墬", - "𡓤", - "売", - "壷", - "夆", - "多", - "夢", - "奢", - "𡚨", - "𡛪", - "姬", - "娛", - "娧", - "姘", - "婦", - "㛮", - "㛼", - "嬈", - "嬾", - "𡧈", - "寃", - "寘", - "寧", - "寳", - "𡬘", - "寿", - "将", - "当", - "尢", - "㞁", - "屠", - "屮", - "峀", - "岍", - "𡷤", - "嵃", - "𡷦", - "嵮", - "嵫", - "嵼", - "巡", - "巢", - "㠯", - "巽", - "帨", - "帽", - "幩", - "㡢", - "𢆃", - "㡼", - "庰", - "庳", - "庶", - "廊", - "𪎒", - "廾", - "𢌱", - "舁", - "弢", - "㣇", - "𣊸", - "𦇚", - "形", - "彫", - "㣣", - "徚", - "忍", - "志", - "忹", - "悁", - "㤺", - "㤜", - "悔", - "𢛔", - "惇", - "慈", - "慌", - "慎", - "慌", - "慺", - "憎", - "憲", - "憤", - "憯", - "懞", - "懲", - "懶", - "成", - "戛", - "扝", - "抱", - "拔", - "捐", - "𢬌", - "挽", - "拼", - "捨", - "掃", - "揤", - "𢯱", - "搢", - "揅", - "掩", - "㨮", - "摩", - "摾", - "撝", - "摷", - "㩬", - "敏", - "敬", - "𣀊", - "旣", - "書", - "晉", - "㬙", - "暑", - "㬈", - "㫤", - "冒", - "冕", - "最", - "暜", - "肭", - "䏙", - "朗", - "望", - "朡", - "杞", - "杓", - "𣏃", - "㭉", - "柺", - "枅", - "桒", - "梅", - "𣑭", - "梎", - "栟", - "椔", - "㮝", - "楂", - "榣", - "槪", - "檨", - "𣚣", - "櫛", - "㰘", - "次", - "𣢧", - "歔", - "㱎", - "歲", - "殟", - "殺", - "殻", - "𣪍", - "𡴋", - "𣫺", - "汎", - "𣲼", - "沿", - "泍", - "汧", - "洖", - "派", - "海", - "流", - "浩", - "浸", - "涅", - "𣴞", - "洴", - "港", - "湮", - "㴳", - "滋", - "滇", - "𣻑", - "淹", - "潮", - "𣽞", - "𣾎", - "濆", - "瀹", - "瀞", - "瀛", - "㶖", - "灊", - "災", - "灷", - "炭", - "𠔥", - "煅", - "𤉣", - "熜", - "𤎫", - "爨", - "爵", - "牐", - "𤘈", - "犀", - "犕", - "𤜵", - "𤠔", - "獺", - "王", - "㺬", - "玥", - "㺸", - "瑇", - "瑜", - "瑱", - "璅", - "瓊", - "㼛", - "甤", - "𤰶", - "甾", - "𤲒", - "異", - "𢆟", - "瘐", - "𤾡", - "𤾸", - "𥁄", - "㿼", - "䀈", - "直", - "𥃳", - "𥃲", - "𥄙", - "𥄳", - "眞", - "真", - "睊", - "䀹", - "瞋", - "䁆", - "䂖", - "𥐝", - "硎", - "碌", - "磌", - "䃣", - "𥘦", - "祖", - "𥚚", - "𥛅", - "福", - "秫", - "䄯", - "穀", - "穊", - "穏", - "𥥼", - "𥪧", - "竮", - "䈂", - "𥮫", - "篆", - "築", - "䈧", - "𥲀", - "糒", - "䊠", - "糨", - "糣", - "紀", - "𥾆", - "絣", - "䌁", - "緇", - "縂", - "繅", - "䌴", - "𦈨", - "𦉇", - "䍙", - "𦋙", - "罺", - "𦌾", - "羕", - "翺", - "者", - "𦓚", - "𦔣", - "聠", - "𦖨", - "聰", - "𣍟", - "䏕", - "育", - "脃", - "䐋", - "脾", - "媵", - "𦞧", - "𦞵", - "𣎓", - "𣎜", - "舁", - "舄", - "辞", - "䑫", - "芑", - "芋", - "芝", - "劳", - "花", - "芳", - "芽", - "苦", - "𦬼", - "若", - "茝", - "荣", - "莭", - "茣", - "莽", - "菧", - "著", - "荓", - "菊", - "菌", - "菜", - "𦰶", - "𦵫", - "𦳕", - "䔫", - "蓱", - "蓳", - "蔖", - "𧏊", - "蕤", - "𦼬", - "䕝", - "䕡", - "𦾱", - "𧃒", - "䕫", - "虐", - "虜", - "虧", - "虩", - "蚩", - "蚈", - "蜎", - "蛢", - "蝹", - "蜨", - "蝫", - "螆", - "䗗", - "蟡", - "蠁", - "䗹", - "衠", - "衣", - "𧙧", - "裗", - "裞", - "䘵", - "裺", - "㒻", - "𧢮", - "𧥦", - "䚾", - "䛇", - "誠", - "諭", - "變", - "豕", - "𧲨", - "貫", - "賁", - "贛", - "起", - "𧼯", - "𠠄", - "跋", - "趼", - "跰", - "𠣞", - "軔", - "輸", - "𨗒", - "𨗭", - "邔", - "郱", - "鄑", - "𨜮", - "鄛", - "鈸", - "鋗", - "鋘", - "鉼", - "鏹", - "鐕", - "𨯺", - "開", - "䦕", - "閷", - "𨵷", - "䧦", - "雃", - "嶲", - "霣", - "𩅅", - "𩈚", - "䩮", - "䩶", - "韠", - "𩐊", - "䪲", - "𩒖", - "頋", - "頩", - "𩖶", - "飢", - "䬳", - "餩", - "馧", - "駂", - "駾", - "䯎", - "𩬰", - "鬒", - "鱀", - "鳽", - "䳎", - "䳭", - "鵧", - "𪃎", - "䳸", - "𪄅", - "𪈎", - "𪊑", - "麻", - "䵖", - "黹", - "黾", - "鼅", - "鼏", - "鼖", - "鼻", - "𪘀", - None, - None, - None, - None, - None, - None, - None, -) diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/INSTALLER b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/INSTALLER deleted file mode 100755 index a1b589e..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/METADATA b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/METADATA deleted file mode 100755 index 29576e2..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/METADATA +++ /dev/null @@ -1,110 +0,0 @@ -Metadata-Version: 2.4 -Name: pip -Version: 26.2.1 -Summary: The PyPA recommended tool for installing Python packages. -Author-email: The pip developers -Requires-Python: >=3.10 -Description-Content-Type: text/x-rst -License-Expression: MIT -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Topic :: Software Development :: Build Tools -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.13 -Classifier: Programming Language :: Python :: 3.14 -Classifier: Programming Language :: Python :: 3.15 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -License-File: AUTHORS.txt -License-File: LICENSE.txt -License-File: src/pip/_vendor/cachecontrol/LICENSE.txt -License-File: src/pip/_vendor/certifi/LICENSE -License-File: src/pip/_vendor/distlib/LICENSE.txt -License-File: src/pip/_vendor/distro/LICENSE -License-File: src/pip/_vendor/idna/LICENSE.md -License-File: src/pip/_vendor/msgpack/COPYING -License-File: src/pip/_vendor/packaging/LICENSE -License-File: src/pip/_vendor/packaging/LICENSE.APACHE -License-File: src/pip/_vendor/packaging/LICENSE.BSD -License-File: src/pip/_vendor/pkg_resources/LICENSE -License-File: src/pip/_vendor/platformdirs/LICENSE -License-File: src/pip/_vendor/pygments/LICENSE -License-File: src/pip/_vendor/pyproject_hooks/LICENSE -License-File: src/pip/_vendor/requests/LICENSE -License-File: src/pip/_vendor/resolvelib/LICENSE -License-File: src/pip/_vendor/rich/LICENSE -License-File: src/pip/_vendor/tomli/LICENSE -License-File: src/pip/_vendor/tomli_w/LICENSE -License-File: src/pip/_vendor/truststore/LICENSE -License-File: src/pip/_vendor/urllib3/LICENSE.txt -Project-URL: Changelog, https://pip.pypa.io/en/stable/news/ -Project-URL: Documentation, https://pip.pypa.io -Project-URL: Homepage, https://pip.pypa.io/ -Project-URL: Source, https://github.com/pypa/pip - -pip - The Python Package Installer -================================== - -.. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg - :target: https://pypi.org/project/pip/ - :alt: PyPI - -.. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip - :target: https://pypi.org/project/pip - :alt: PyPI - Python Version - -.. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest - :target: https://pip.pypa.io/en/latest - :alt: Documentation - -|pypi-version| |python-versions| |docs-badge| - -Pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. - -Please take a look at our documentation for how to install and use pip: - -* `Installation`_ -* `Usage`_ - -We release updates regularly, with a new version every 3 months. Find more details in our documentation: - -* `Release notes`_ -* `Release process`_ - -If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms: - -* `Issue tracking`_ -* `Discourse channel`_ -* `User IRC`_ - -If you want to get involved, head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms: - -* `GitHub page`_ -* `Development documentation`_ -* `Development IRC`_ - -Code of Conduct ---------------- - -Everyone interacting in the pip project's codebases, issue trackers, chat -rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_. - -.. _package installer: https://packaging.python.org/guides/tool-recommendations/ -.. _Python Package Index: https://pypi.org -.. _Installation: https://pip.pypa.io/en/stable/installation/ -.. _Usage: https://pip.pypa.io/en/stable/ -.. _Release notes: https://pip.pypa.io/en/stable/news.html -.. _Release process: https://pip.pypa.io/en/latest/development/release-process/ -.. _GitHub page: https://github.com/pypa/pip -.. _Development documentation: https://pip.pypa.io/en/latest/development -.. _Issue tracking: https://github.com/pypa/pip/issues -.. _Discourse channel: https://discuss.python.org/c/packaging -.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa -.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev -.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md - diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/RECORD b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/RECORD deleted file mode 100755 index 3bd8ca0..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/RECORD +++ /dev/null @@ -1,885 +0,0 @@ -../../../bin/pip,sha256=XQfzLn8O7EY4mErOjo4Q349U6H-b9qya3hAUGb9uoOE,243 -../../../bin/pip3,sha256=XQfzLn8O7EY4mErOjo4Q349U6H-b9qya3hAUGb9uoOE,243 -../../../bin/pip3.11,sha256=XQfzLn8O7EY4mErOjo4Q349U6H-b9qya3hAUGb9uoOE,243 -pip-26.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip-26.2.1.dist-info/METADATA,sha256=OlYQBYIoQfLEX0QvbHp1BRcsjDdsn-J02HbIrJEpaMs,4617 -pip-26.2.1.dist-info/RECORD,, -pip-26.2.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip-26.2.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82 -pip-26.2.1.dist-info/entry_points.txt,sha256=Vhf8s0IYgX37mtd4vGL73BPcxdKnqeCFPzB5-d30x8o,84 -pip-26.2.1.dist-info/licenses/AUTHORS.txt,sha256=TrH7FwXi3viY6BvLoZw6rIBiDSe6NWnWpt97RinRtcI,12139 -pip-26.2.1.dist-info/licenses/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt,sha256=hu7uh74qQ_P_H1ZJb0UfaSQ5JvAl_tuwM2ZsMExMFhs,558 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/certifi/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt,sha256=gI4QyKarjesUn_mz-xn0R6gICUYG1xKpylf-rTVSWZ0,14531 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/distro/LICENSE,sha256=y16Ofl9KOYjhBjwULGDcLfdWBfTEZRXnduOspt-XbhQ,11325 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md,sha256=GppPDj1HmickDd1ZqRN6ZqtKD539yMphiMwL_YUYfwQ,1541 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/msgpack/COPYING,sha256=SS3tuoXaWHL3jmCRvNH-pHTWYNNay03ulkuKqz8AdCc,614 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE,sha256=ytHvW9NA1z4HS6YU0m996spceUDD2MNIUuZcSQlobEg,197 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD,sha256=tw5-m3QvHMb5SLNMFqo5_-zpQZY2S8iP8NIYDwAo-sU,1344 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE,sha256=htoPAa6uRjSKPD1GUZXcHOzN55956HdppkuNoEsqR0E,1023 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE,sha256=KeD9YukphQ6G6yjD_czwzv30-pSHkBHP-z0NS-1tTbY,1089 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/pygments/LICENSE,sha256=qdZvHVJt8C4p3Oc0NtNOVuhjL0bCdbvf_HBWnogvnxc,1331 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE,sha256=GyKwSbUmfW38I6Z79KhNjsBLn9-xpR02DkK0NCyLQVQ,1081 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/requests/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE,sha256=84j9OMrRMRLB3A9mm76A5_hFQe26-3LzAw0sp2QsPJ0,751 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/rich/LICENSE,sha256=3u18F6QxgVgZCj6iOcyHmlpQJxzruYrnAl9I--WNyhU,1056 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/tomli/LICENSE,sha256=uAgWsNUwuKzLTCIReDeQmEpuO2GSLCte6S8zcqsnQv4,1072 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE,sha256=uAgWsNUwuKzLTCIReDeQmEpuO2GSLCte6S8zcqsnQv4,1072 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/truststore/LICENSE,sha256=M757fo-k_Rmxdg4ajtimaL2rhSyRtpLdQUJLy3Jan8o,1086 -pip-26.2.1.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt,sha256=Ew46ZNX91dCWp1JpRjSn2d8oRGnehuVzIQAmgEHj1oY,1093 -pip/__init__.py,sha256=BKp2zqsPQ0HiktquNWN_L4cYsYMxPML7WI0TBMucBEM,355 -pip/__main__.py,sha256=rOZRtrXjDBzY24niaxTnd9ZHHWL7B0EawVdLoJ3nI6c,874 -pip/__pip-runner__.py,sha256=720Mt6h07Uce52v80EOF__JYauoLw9b7Pfs_5B91isg,1451 -pip/__pycache__/__init__.cpython-311.pyc,, -pip/__pycache__/__main__.cpython-311.pyc,, -pip/__pycache__/__pip-runner__.cpython-311.pyc,, -pip/_internal/__init__.py,sha256=S7i9Dn9aSZS0MG-2Wrve3dV9TImPzvQn5jjhp9t_uf0,511 -pip/_internal/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/__pycache__/cache.cpython-311.pyc,, -pip/_internal/__pycache__/configuration.cpython-311.pyc,, -pip/_internal/__pycache__/exceptions.cpython-311.pyc,, -pip/_internal/__pycache__/main.cpython-311.pyc,, -pip/_internal/__pycache__/pyproject.cpython-311.pyc,, -pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc,, -pip/_internal/__pycache__/wheel_builder.cpython-311.pyc,, -pip/_internal/build_env/__init__.py,sha256=AI5x2Kfv1exG1IbsNHuIV1agqNgstTj_LWpbwWLq8ok,788 -pip/_internal/build_env/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/build_env/__pycache__/base.cpython-311.pyc,, -pip/_internal/build_env/__pycache__/installer.cpython-311.pyc,, -pip/_internal/build_env/__pycache__/noop.cpython-311.pyc,, -pip/_internal/build_env/__pycache__/venv.cpython-311.pyc,, -pip/_internal/build_env/__pycache__/virtual.cpython-311.pyc,, -pip/_internal/build_env/base.py,sha256=7RHW5X-QSVWHeK7_5Uei9Gbq0q1pAXHF9tq7Mj3wtTs,3440 -pip/_internal/build_env/installer.py,sha256=eMUytQCdBiQ9TgkaGeTAzq_IVBqLHyD9OJ_kNTIjjcM,13046 -pip/_internal/build_env/noop.py,sha256=FXk9ZFTTN0s1cecZE6ycN2ZznBh75Ok2I3QXF8HTo6I,1001 -pip/_internal/build_env/venv.py,sha256=PsDl0PpmB9jRNaIawhy6Xk9R8WcYoAogLS2afmZ9AQc,5692 -pip/_internal/build_env/virtual.py,sha256=HsVRzzhgBGyy06DZBoO0PW_3kIEacy9S4TI5H1q72Hk,4858 -pip/_internal/cache.py,sha256=eqMQVfpD8x7GcCO0V0z73mnjPIuSapMFoQ_WRE7iLY8,10457 -pip/_internal/cli/__init__.py,sha256=Iqg_tKA771XuMO1P4t_sDHnSKPzkUb9D0DqunAmw_ko,131 -pip/_internal/cli/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc,, -pip/_internal/cli/__pycache__/base_command.cpython-311.pyc,, -pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc,, -pip/_internal/cli/__pycache__/command_context.cpython-311.pyc,, -pip/_internal/cli/__pycache__/index_command.cpython-311.pyc,, -pip/_internal/cli/__pycache__/main.cpython-311.pyc,, -pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc,, -pip/_internal/cli/__pycache__/parser.cpython-311.pyc,, -pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc,, -pip/_internal/cli/__pycache__/req_command.cpython-311.pyc,, -pip/_internal/cli/__pycache__/spinners.cpython-311.pyc,, -pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc,, -pip/_internal/cli/autocompletion.py,sha256=gFtmiFhHccizyx4JPJnEKik-uftU7kwrUvm72cSFPHI,7353 -pip/_internal/cli/base_command.py,sha256=yF5_mQEIrLG2G0nvymZS0nLhiDg4B0T89W5iX78H558,9431 -pip/_internal/cli/cmdoptions.py,sha256=aBNxaIy4YV4AfjAqrG8RoZFcv7kwWzRAzg5mnZmOGDw,41180 -pip/_internal/cli/command_context.py,sha256=kmu3EWZbfBega1oDamnGJTA_UaejhIQNuMj2CVmMXu0,817 -pip/_internal/cli/index_command.py,sha256=_Qzc9oHnButVvD0wxYcHfe0uJZqRWOtIg5HaQpnSNeM,7504 -pip/_internal/cli/main.py,sha256=O10guzBqF2MykAaZYo6sua097dXqC3nozKodtTOpHDc,3209 -pip/_internal/cli/main_parser.py,sha256=7PhEfZ8AXiWUpTfB_KJMngI2sF8XIXl52alI1LZ_e_M,4368 -pip/_internal/cli/parser.py,sha256=WvRHuI2MdFp187BWrY_D17L02asq9jmCnng81af52SQ,14147 -pip/_internal/cli/progress_bars.py,sha256=13U3AY3DYwdEIwPYLtUn5B4QcpJUApLWCkfJ-u_PqzY,4706 -pip/_internal/cli/req_command.py,sha256=wW-mRcPqPczeqxp9SQ_yh3YfrRAYAlEAZextlLcDbUc,18952 -pip/_internal/cli/spinners.py,sha256=EJzZIZNyUtJljp3-WjcsyIrqxW-HUsfWzhuW84n_Tqw,7362 -pip/_internal/cli/status_codes.py,sha256=9QhNe6hHqsiw5y5wufiNKBOgJjV0HF3I3P2K21nj-OM,136 -pip/_internal/commands/__init__.py,sha256=aNeCbQurGWihfhQq7BqaLXHqWDQ0i3I04OS7kxK6plQ,4026 -pip/_internal/commands/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/commands/__pycache__/cache.cpython-311.pyc,, -pip/_internal/commands/__pycache__/check.cpython-311.pyc,, -pip/_internal/commands/__pycache__/completion.cpython-311.pyc,, -pip/_internal/commands/__pycache__/configuration.cpython-311.pyc,, -pip/_internal/commands/__pycache__/debug.cpython-311.pyc,, -pip/_internal/commands/__pycache__/download.cpython-311.pyc,, -pip/_internal/commands/__pycache__/freeze.cpython-311.pyc,, -pip/_internal/commands/__pycache__/hash.cpython-311.pyc,, -pip/_internal/commands/__pycache__/help.cpython-311.pyc,, -pip/_internal/commands/__pycache__/index.cpython-311.pyc,, -pip/_internal/commands/__pycache__/inspect.cpython-311.pyc,, -pip/_internal/commands/__pycache__/install.cpython-311.pyc,, -pip/_internal/commands/__pycache__/list.cpython-311.pyc,, -pip/_internal/commands/__pycache__/lock.cpython-311.pyc,, -pip/_internal/commands/__pycache__/search.cpython-311.pyc,, -pip/_internal/commands/__pycache__/show.cpython-311.pyc,, -pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc,, -pip/_internal/commands/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/commands/cache.py,sha256=YLZrLWNvChl0pImBkoSZGGD3fb2MfdYGpYF4J0aQs6w,9251 -pip/_internal/commands/check.py,sha256=hVFBQezQ3zj4EydoWbFQj_afPUppMt7r9JPAlY22U6Y,2244 -pip/_internal/commands/completion.py,sha256=LjvRIZ6QUiDXJL3IOMFeD-_J97HfjMGgEk0j2tWGu1U,4565 -pip/_internal/commands/configuration.py,sha256=5M6KM30G3i6oMHAsVUSWP4E93cSSJQoJ6evURC754E8,10132 -pip/_internal/commands/debug.py,sha256=tCWUOEyz2HdlLGTvzNqSZIAJQkQYCy58zBTdfIWyzSo,6556 -pip/_internal/commands/download.py,sha256=cuXEj9PmoZ4kCsxm_BaZ_OkmIsV_gluLiOVSuOO2MS0,5404 -pip/_internal/commands/freeze.py,sha256=Lg8EOokxnRZrwdLWJgLpBWxNUt7-HrkWlEC05e-vBww,3100 -pip/_internal/commands/hash.py,sha256=GO9pRN3wXC2kQaovK57TaLYBMc3IltOH92O6QEw6YE0,1679 -pip/_internal/commands/help.py,sha256=Bz3LcjNQXkz4Cu__pL4CZ86o4-HNLZj1NZWdlJhjuu0,1108 -pip/_internal/commands/index.py,sha256=ny_hGzXuZHzjsq4CIJh_6YfZGVJm7G7LqQQdKTibJ_Q,5608 -pip/_internal/commands/inspect.py,sha256=iiAM-JuL_Z1-QP34cgAloZPSr50Mc7wAvuFDRzHQrQk,3185 -pip/_internal/commands/install.py,sha256=DREULA-TGbCKhqBBLkrbDKztyQ557QbDe6ZJUYuh2yk,33761 -pip/_internal/commands/list.py,sha256=W-FyxXTrHJhqRl4ZoqFp68_5GAwC9GYuY6fhFTJdHzU,13908 -pip/_internal/commands/lock.py,sha256=VhpNRWItLdqywSOIqXg3vuIyf59cozh09-Z6Z9cMiLM,5987 -pip/_internal/commands/search.py,sha256=zbMsX_YASj6kXA6XIBgTDv0bGK51xG-CV3IynZJcE-c,5782 -pip/_internal/commands/show.py,sha256=91_XljhCHWyCNfoFBa4XdacbumQgoNbhkcHHk_gcW9Y,8247 -pip/_internal/commands/uninstall.py,sha256=CsOihqvb6ZA6O67L70oXeoLHeOfNzMM88H9g-9aocgw,3868 -pip/_internal/commands/wheel.py,sha256=5m3NvVKatqLDOVoC_4WOFiDDrvQRjB52jkbvpbZApug,6187 -pip/_internal/configuration.py,sha256=0eEdh1xTlOHhoCrTtwHYM5DEj7BbTmhIaCaNNj3srBM,14562 -pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858 -pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/distributions/__pycache__/base.cpython-311.pyc,, -pip/_internal/distributions/__pycache__/installed.cpython-311.pyc,, -pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc,, -pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/distributions/base.py,sha256=BjYazg2EhbEgrO1W_JD6jEZIDVlUpA_WZkqU-NvCBkQ,1907 -pip/_internal/distributions/installed.py,sha256=QPDhCqc-GTGiWZAAOFaVKMETg1m_kYuf6RBO9ZZlDqY,994 -pip/_internal/distributions/sdist.py,sha256=hof85VbuXa_NydvFZj6zOtnxuPY15tsuCJVirLuNT-U,7783 -pip/_internal/distributions/wheel.py,sha256=qOMVYzKT3tJsO0QundLjADcFiW_RODui4K51XRqMru8,1429 -pip/_internal/exceptions.py,sha256=Zdu17pVbD1eI_yjg52Zd0ygAWDy8LtXS1Atfvn1pPts,38302 -pip/_internal/index/__init__.py,sha256=tzwMH_fhQeubwMqHdSivasg1cRgTSbNg2CiMVnzMmyU,29 -pip/_internal/index/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/index/__pycache__/collector.cpython-311.pyc,, -pip/_internal/index/__pycache__/package_finder.cpython-311.pyc,, -pip/_internal/index/__pycache__/sources.cpython-311.pyc,, -pip/_internal/index/collector.py,sha256=bu-NBVToIeyYEbcv0_gtInAxsCK3E0yI6Je6yxAwE5k,16578 -pip/_internal/index/package_finder.py,sha256=RoWK5rPkOcmOdiWEXhnk9aaFDgaj4QEE70FeQokqZf4,43149 -pip/_internal/index/sources.py,sha256=fqqVli93Lr-HNk-wFD67yyfZzS6WeDkSZGv1RFw63QE,8621 -pip/_internal/locations/__init__.py,sha256=iP9yVZn_4iPuNcaUNh2A_vJLcvUZ-8y4zvKLDVEqaM0,14022 -pip/_internal/locations/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc,, -pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc,, -pip/_internal/locations/__pycache__/base.cpython-311.pyc,, -pip/_internal/locations/_distutils.py,sha256=jpFj4V00rD9IR3vA9TqrGkwcdNVFc58LsChZavge9JY,5975 -pip/_internal/locations/_sysconfig.py,sha256=HoZYQ1sVQD3IRpQCp4TpdTQLNrDFFzI9zRjXrTYnJWY,7788 -pip/_internal/locations/base.py,sha256=5mVcXh9jnSepEO25aG2U-qZWguzeoOPIbT0mRiBDDME,2548 -pip/_internal/main.py,sha256=1cHqjsfFCrMFf3B5twzocxTJUdHMLoXUpy5lJoFqUi8,338 -pip/_internal/metadata/__init__.py,sha256=vp-JAxiWg_-l5F8AT0Jcey72uUnh8CDwwol9-KktHZ8,5824 -pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/metadata/__pycache__/_json.cpython-311.pyc,, -pip/_internal/metadata/__pycache__/base.cpython-311.pyc,, -pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc,, -pip/_internal/metadata/_json.py,sha256=hNvnMHOXLAyNlzirWhPL9Nx2CvCqa1iRma6Osq1YfV8,2711 -pip/_internal/metadata/base.py,sha256=_o9lMyHmia4Ea9fhceyB9rp3jUUU8k7FmlhXB7N9_tM,25642 -pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135 -pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc,, -pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc,, -pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc,, -pip/_internal/metadata/importlib/_compat.py,sha256=sneVh4_6WxQZK4ljdl3ylVuP-q0ttSqbgl9mWt0HnOg,2804 -pip/_internal/metadata/importlib/_dists.py,sha256=akX5xiLB_3dvbeb2gHL8i7wORi01_Cnty0HnKFQAF0Y,8717 -pip/_internal/metadata/importlib/_envs.py,sha256=ulCRDEXYeinwS5AXL-Quj7C4Erk20kHhIwBmE2P3BYA,5590 -pip/_internal/metadata/pkg_resources.py,sha256=NO76ZrfR2-LKJTyaXrmQoGhmJMArALvacrlZHViSDT8,10544 -pip/_internal/models/__init__.py,sha256=AjmCEBxX_MH9f_jVjIGNCFJKYCYeSEe18yyvNx4uRKQ,62 -pip/_internal/models/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/models/__pycache__/candidate.cpython-311.pyc,, -pip/_internal/models/__pycache__/direct_url.cpython-311.pyc,, -pip/_internal/models/__pycache__/format_control.cpython-311.pyc,, -pip/_internal/models/__pycache__/index.cpython-311.pyc,, -pip/_internal/models/__pycache__/installation_report.cpython-311.pyc,, -pip/_internal/models/__pycache__/link.cpython-311.pyc,, -pip/_internal/models/__pycache__/release_control.cpython-311.pyc,, -pip/_internal/models/__pycache__/scheme.cpython-311.pyc,, -pip/_internal/models/__pycache__/search_scope.cpython-311.pyc,, -pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc,, -pip/_internal/models/__pycache__/target_python.cpython-311.pyc,, -pip/_internal/models/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/models/candidate.py,sha256=MvANZJiHkw6Y4T-oYSM8710G6yYB4_DwofoD7BAmrnM,824 -pip/_internal/models/direct_url.py,sha256=9RS3TQAXknwLd8JOOZWlbBV6WZFs9qn-YAYk0VQ8R_Q,944 -pip/_internal/models/format_control.py,sha256=PwemYG1L27BM0f1KP61rm24wShENFyxqlD1TWu34alc,2471 -pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030 -pip/_internal/models/installation_report.py,sha256=U4MlXWFB-8ev_yheuMO9T2m_y5b4C-hOzVaoHVobl38,2846 -pip/_internal/models/link.py,sha256=SSXtFO3YAreUYY2R0PqtKXbAe1vV9Bqt5r_qPN218zE,23474 -pip/_internal/models/release_control.py,sha256=31Jh-ZHsTIBZLe-7uPNoYLiRSWXAjEI1jGNxwqLKd4A,3365 -pip/_internal/models/scheme.py,sha256=G-O9KElabcXqbPwfE_66lzX5fGahh3Gu6DAkz_9ZhJw,558 -pip/_internal/models/search_scope.py,sha256=_i-Gj_w_FwZAvTs7WhjslBDD70J-8hmIdjXByI8uEZQ,4461 -pip/_internal/models/selection_prefs.py,sha256=0teekwSVxW5MOk0WPG5Novw5q_XJjxijcd75kZO6E9g,1503 -pip/_internal/models/target_python.py,sha256=I0eFS-eia3kwhrOvgsphFZtNAB2IwXZ9Sr9fp6IjBP4,4243 -pip/_internal/models/wheel.py,sha256=1SdfDvN7ALTsbyZ9EOsNy1GPirP1n6EjHyzPrZyLSh8,2920 -pip/_internal/network/__init__.py,sha256=FMy06P__y6jMjUc8z3ZcQdKF-pmZ2zM14_vBeHPGhUI,49 -pip/_internal/network/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/network/__pycache__/auth.cpython-311.pyc,, -pip/_internal/network/__pycache__/cache.cpython-311.pyc,, -pip/_internal/network/__pycache__/download.cpython-311.pyc,, -pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc,, -pip/_internal/network/__pycache__/session.cpython-311.pyc,, -pip/_internal/network/__pycache__/utils.cpython-311.pyc,, -pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc,, -pip/_internal/network/auth.py,sha256=TBpwe7zcaPuBdBldjAOZhf20lmkacpIgGA-AqLcr8eU,21545 -pip/_internal/network/cache.py,sha256=6DlMXJ7pb35M1vgtTK0-L_kiHJFxf7t9zrfeJ9vqO34,4862 -pip/_internal/network/download.py,sha256=SVrmKao567lfs8RaCdyuOitzIRCZp9Rf3RcDj_o8vkg,14618 -pip/_internal/network/lazy_wheel.py,sha256=y9gVksdJCSjnLfYzs_m3DYUAtl3hc_k-xFPDBd9DgOs,7646 -pip/_internal/network/session.py,sha256=2KqMv5Hu_PFRYRkDBhSjIbqbsBp0lXv4tqoLKnM2K6o,19924 -pip/_internal/network/utils.py,sha256=OTA1vwFtu2Ee1zWrqLysBpRQGTjvXxCJJUTEqy7hNcA,8128 -pip/_internal/network/xmlrpc.py,sha256=_-Rnk3vOff8uF9hAGmT6SLALflY1gMBcbGwS12fb_Y4,1830 -pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/operations/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/operations/__pycache__/check.cpython-311.pyc,, -pip/_internal/operations/__pycache__/freeze.cpython-311.pyc,, -pip/_internal/operations/__pycache__/prepare.cpython-311.pyc,, -pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc,, -pip/_internal/operations/build/build_tracker.py,sha256=W3b5cmkMWPaE6QIwfzsTayJo7-OlxFHWDxfPuax1KcE,4771 -pip/_internal/operations/build/metadata.py,sha256=INHaeiRfOiLYCXApfDNRo9Cw2xI4VwTc0KItvfdfOjk,1421 -pip/_internal/operations/build/metadata_editable.py,sha256=oWudMsnjy4loO_Jy7g4N9nxsnaEX_iDlVRgCy7pu1rs,1509 -pip/_internal/operations/build/wheel.py,sha256=3bP-nNiJ4S8JvMaBnyessXQUBhxTqt1GBx6DQ1iPJDY,1136 -pip/_internal/operations/build/wheel_editable.py,sha256=q3kfElclM6FutVbFwE87JOTpVWt5ixDf3_UkHAIVfz4,1478 -pip/_internal/operations/check.py,sha256=k7mTjLb5yZbidYw8Nt9vu7_u1L1ekLOzUECeN4qcNsA,5891 -pip/_internal/operations/freeze.py,sha256=PDdY-y_ZtZZJLAKcaWPIGRKAGW7DXR48f0aMRU0j7BA,9854 -pip/_internal/operations/install/__init__.py,sha256=ak-UETcQPKlFZaWoYKWu5QVXbpFBvg0sXc3i0O4vSYY,50 -pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/operations/install/wheel.py,sha256=qhFwJSShLm4quY8zIss_t-bff0YV49HTNAKfu4fSpic,29078 -pip/_internal/operations/prepare.py,sha256=zLkVMSDu9cUR0KnDm3bZ3QvIeaErhJKrr109UyDMlKQ,35030 -pip/_internal/pyproject.py,sha256=J-sTWqC-XfsKQgz9m1bypMWZPHItsSHzIN_NWeIRmhM,4555 -pip/_internal/req/__init__.py,sha256=x3uB7ZW-l_MOPm8ldF8Gi0dh5C8W23dB_wOH2NmWpFc,3140 -pip/_internal/req/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/req/__pycache__/constructors.cpython-311.pyc,, -pip/_internal/req/__pycache__/pep723.cpython-311.pyc,, -pip/_internal/req/__pycache__/req_dependency_group.cpython-311.pyc,, -pip/_internal/req/__pycache__/req_file.cpython-311.pyc,, -pip/_internal/req/__pycache__/req_install.cpython-311.pyc,, -pip/_internal/req/__pycache__/req_set.cpython-311.pyc,, -pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc,, -pip/_internal/req/constructors.py,sha256=fwILg3OiIK_f13RUGX5zQyz4YasUMp7MC6u9uPvoGzw,22276 -pip/_internal/req/pep723.py,sha256=JsG1p3CaVcW8cjclD2kDj7d9qtVrNQaevY_UnKh00tk,1242 -pip/_internal/req/req_dependency_group.py,sha256=PrWKtlwI8xbWnWEKjXs9RkrpQx2_h02ABefYT0ZdeQg,3145 -pip/_internal/req/req_file.py,sha256=dmGBSxZ9dj1eOq2NXv94bor0u1n8P4-AvmJL-vYzIsE,20644 -pip/_internal/req/req_install.py,sha256=r289__WNVaTxpRtLFUz3FpNvdGv8yYa87G-QkP5DsJc,32173 -pip/_internal/req/req_set.py,sha256=awkqIXnYA4Prmsj0Qb3zhqdbYUmXd-1o0P-KZ3mvRQs,2828 -pip/_internal/req/req_uninstall.py,sha256=t5HSYuLoLxnF7jrcIBDjTEP-sjjr8O4fZouEqOkVM_c,24276 -pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/resolution/__pycache__/base.cpython-311.pyc,, -pip/_internal/resolution/base.py,sha256=J9Fq3kFOjFj9gBShYQtldEFPrRGSWtsp-rO9rIc4W4g,573 -pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc,, -pip/_internal/resolution/legacy/resolver.py,sha256=2CVLIZLm_nXkfJTt5RKtIbIxvCkn9Gavf4Yp9c1IjDU,24110 -pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/base.py,sha256=fo7ojoQtgjmQH5ca3VyKJAO3p5sHnihMDw79Z8_31-U,5900 -pip/_internal/resolution/resolvelib/candidates.py,sha256=SEkpEH6T6zl7Ve7Dw9oIS6tnREj-1U_q4U-2xEH0ISc,20848 -pip/_internal/resolution/resolvelib/factory.py,sha256=rqwnD4GWEdVgG7nGP6OGj493yiGW6jZr0cW_msMOK_U,36162 -pip/_internal/resolution/resolvelib/found_candidates.py,sha256=F55YtXekKUbVwphlXska01LkdTGVgx1qONlLK7BX-HM,6005 -pip/_internal/resolution/resolvelib/provider.py,sha256=Nkx4A16MOAxjCj9jFm8wmlMk5cbWh1YK2-UYWTKEJCw,12310 -pip/_internal/resolution/resolvelib/reporter.py,sha256=tEC7MF8IqGU4Ww9t61YVfNFKtoaQpb6-AwLZptJz1VE,3918 -pip/_internal/resolution/resolvelib/requirements.py,sha256=Izl9n8nc188lA1BSPS8QxfudfDQPHgngw-ij6hXt0nQ,8239 -pip/_internal/resolution/resolvelib/resolver.py,sha256=wM3CcRTYPdjnQ1ai3YP6htFmkE32o1xx2RgjU-ykAjc,13849 -pip/_internal/self_outdated_check.py,sha256=9XxOXPqsZlKceTP2tZS7I7rXjodnqd3GrIQ8U0_L8BM,8097 -pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/utils/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc,, -pip/_internal/utils/__pycache__/_log.cpython-311.pyc,, -pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc,, -pip/_internal/utils/__pycache__/compat.cpython-311.pyc,, -pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc,, -pip/_internal/utils/__pycache__/datetime.cpython-311.pyc,, -pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc,, -pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc,, -pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc,, -pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc,, -pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc,, -pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc,, -pip/_internal/utils/__pycache__/glibc.cpython-311.pyc,, -pip/_internal/utils/__pycache__/hashes.cpython-311.pyc,, -pip/_internal/utils/__pycache__/logging.cpython-311.pyc,, -pip/_internal/utils/__pycache__/misc.cpython-311.pyc,, -pip/_internal/utils/__pycache__/packaging.cpython-311.pyc,, -pip/_internal/utils/__pycache__/pylock.cpython-311.pyc,, -pip/_internal/utils/__pycache__/retry.cpython-311.pyc,, -pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc,, -pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc,, -pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc,, -pip/_internal/utils/__pycache__/urls.cpython-311.pyc,, -pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc,, -pip/_internal/utils/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/utils/_jaraco_text.py,sha256=M15uUPIh5NpP1tdUGBxRau6q1ZAEtI8-XyLEETscFfE,3350 -pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015 -pip/_internal/utils/appdirs.py,sha256=LrzDPZMKVh0rubtCx9vu3XlZbLCSug6VSj4Qsvt66BA,1681 -pip/_internal/utils/compat.py,sha256=i2JUZXGrqP-ZoD8t4gwckBA3KYNUWCluvRDXScts5fE,2601 -pip/_internal/utils/compatibility_tags.py,sha256=DiNSLqpuruXUamGQwOJ2WZByDGLTGaXi9O-Xf8fOi34,6630 -pip/_internal/utils/datetime.py,sha256=kuJOf1mW8G5tRFN6jWardddS-9qSaR53lK1jmx3NTZY,868 -pip/_internal/utils/deprecation.py,sha256=IQFumZa-XWJ3UoPnX4duwbf79CTzOZD_Vk1PkivAu4g,4537 -pip/_internal/utils/direct_url_helpers.py,sha256=WCCPJnmoPHz7kiYePrEcVAen2lDpCT9WQVImoHHWCO8,3363 -pip/_internal/utils/egg_link.py,sha256=YWfsrbmfcrfWgqQYy6OuIjsyb9IfL1q_2v4zsms1WjI,2459 -pip/_internal/utils/entrypoints.py,sha256=uPjAyShKObdotjQjJUzprQ6r3xQvDIZwUYfHHqZ7Dok,3324 -pip/_internal/utils/filesystem.py,sha256=gig73bOOS1NnDB94EDDvdDnHjQoeRz_TlfQPiCV7Me0,6812 -pip/_internal/utils/filetypes.py,sha256=sEMa38qaqjvx1Zid3OCAUja31BOBU-USuSMPBvU3yjo,689 -pip/_internal/utils/glibc.py,sha256=sEh8RJJLYSdRvTqAO4THVPPA-YSDVLD4SI9So-bxX1U,3726 -pip/_internal/utils/hashes.py,sha256=38-bCOJSHippQ7r9RttrMHxb2mv3EARt1Gw8kFmW73g,5040 -pip/_internal/utils/logging.py,sha256=hGTjBuIjNZxydV6vs4woxAbhkHI8L-9uCO14OCvPlA8,13919 -pip/_internal/utils/misc.py,sha256=28LWQFvFWmrpJqMcV0soif1xnl3_gb25B3gG_iU5zhM,25408 -pip/_internal/utils/packaging.py,sha256=s5tpUmFumwV0H9JSTzryrIY4JwQM8paGt7Sm7eNwt2Y,1601 -pip/_internal/utils/pylock.py,sha256=XQTZ1ggh7yfpHfRdbvjSAe1peOtg2Z2xFrUeZ7wl4Ts,10290 -pip/_internal/utils/retry.py,sha256=oOK3VGgKRKxSkXDPARf73cnQS3hDtnE9-feAg4AlNZE,1488 -pip/_internal/utils/subprocess.py,sha256=nqNz2p3G4QANCCBcaJkqIQvQUYA50TwjZnoYjiyPxs8,9001 -pip/_internal/utils/temp_dir.py,sha256=TDiL9BzEp2eHalQLH0rhyM3m2xuydEg9c6t1h4bT5l8,9303 -pip/_internal/utils/unpacking.py,sha256=5i9Sn__SNElhoCXnLt2SvQaQ-SnTzcUaDH1_JI1THUw,14789 -pip/_internal/utils/urls.py,sha256=JQWrRAoXHBpPsY9Aij61bsZjMQLCcuyrUO1R6W_BwIo,1647 -pip/_internal/utils/virtualenv.py,sha256=9od4LsceDynUSsLTEXXgtumlUQ8VvKp86b2xzK0Yu3g,2272 -pip/_internal/utils/wheel.py,sha256=YdRuj6MicG-Q9Mg03FbUv1WTLam6Lc7AgijY4voVyis,4468 -pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596 -pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/git.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc,, -pip/_internal/vcs/bazaar.py,sha256=3W1eHjkYx2vc6boeb2NBh4I_rlGAXM-vrzfNhLm1Rxg,3734 -pip/_internal/vcs/git.py,sha256=L52rqJN--Kq0kjAR8_9Si8RJEcNlULJdk6Vipg8ZlfA,19273 -pip/_internal/vcs/mercurial.py,sha256=w1ZJWLKqNP1onEjkfjlwBVnMqPZNSIER8ayjQcnTq4w,5575 -pip/_internal/vcs/subversion.py,sha256=uUgdPvxmvEB8Qwtjr0Hc0XgFjbiNi5cbvI4vARLOJXo,11787 -pip/_internal/vcs/versioncontrol.py,sha256=JsUgTG53DkJPy5mXVBH7uqeFQyaL69707ibts5uCBYA,22579 -pip/_internal/wheel_builder.py,sha256=kdPvAcxfknA8B_4g6hPDjB7C4uzL_cV5Vde2Oj2Ipzk,9146 -pip/_vendor/README.rst,sha256=t7IinjaiuwUh812XmVApQHJb8pTw33U8A9URqy6GlF4,9222 -pip/_vendor/__init__.py,sha256=WzusPTGWIMeQQWSVJ0h2rafGkVTa9WKJ2HT-2-EoZrU,4907 -pip/_vendor/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/bom.cdx.json,sha256=eX4gCqf_8W-tn7Le6uzlCisr7GI-tsN1kXbu5s7hkyg,5319 -pip/_vendor/cachecontrol/LICENSE.txt,sha256=hu7uh74qQ_P_H1ZJb0UfaSQ5JvAl_tuwM2ZsMExMFhs,558 -pip/_vendor/cachecontrol/__init__.py,sha256=GxwRkm_TQBtPZpfpVK9r6S9dAy2DVnVgDVHJKTiPZ1k,820 -pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc,, -pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737 -pip/_vendor/cachecontrol/adapter.py,sha256=W-HW-l01gyCsnxkOyCbqx7sxrWYoBbKrDsKkVVQN6NE,6586 -pip/_vendor/cachecontrol/cache.py,sha256=OXwv7Fn2AwnKNiahJHnjtvaKLndvVLv_-zO-ltlV9qI,1953 -pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303 -pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc,, -pip/_vendor/cachecontrol/caches/file_cache.py,sha256=d8upFmy_zwaCmlbWEVBlLXFddt8Zw8c5SFpxeOZsdfw,4117 -pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386 -pip/_vendor/cachecontrol/controller.py,sha256=xBauC-vUSu5GsJsxD4-W-JaKqqbBz0MN6Zv8PA2N8hI,19102 -pip/_vendor/cachecontrol/filewrapper.py,sha256=DhxC_rSk-beKdbsYhfvBUDovQHX9r3gHH_jP9-q_mKk,4354 -pip/_vendor/cachecontrol/heuristics.py,sha256=gqMXU8w0gQuEQiSdu3Yg-0vd9kW7nrWKbLca75rheGE,4881 -pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/cachecontrol/serialize.py,sha256=HQd2IllQ05HzPkVLMXTF2uX5mjEQjDBkxCqUJUODpZk,5163 -pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417 -pip/_vendor/certifi/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989 -pip/_vendor/certifi/__init__.py,sha256=-W1R_y8WCaSkT1tdjuxH_zTBZY1YH6xQgdN1nbBajOE,94 -pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255 -pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/certifi/__pycache__/core.cpython-311.pyc,, -pip/_vendor/certifi/cacert.pem,sha256=u8fpwB11UbuKFZtd7dmJuO484QWv9SK2jrGwG_hUyrA,234354 -pip/_vendor/certifi/core.py,sha256=gu_ECVI1m3Rq0ytpsNE61hgQGcKaOAt9Rs9G8KsTCOI,3442 -pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/distlib/LICENSE.txt,sha256=gI4QyKarjesUn_mz-xn0R6gICUYG1xKpylf-rTVSWZ0,14531 -pip/_vendor/distlib/__init__.py,sha256=tmYThB1xmgfRjRtyy8YP0i0ymrF2n6eVswcwK6OYbcc,625 -pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/util.cpython-311.pyc,, -pip/_vendor/distlib/compat.py,sha256=HTzhOY98c_fyMVE7xtVuZZ-AVkN4-RGes-hWmvuwquk,40605 -pip/_vendor/distlib/resources.py,sha256=wZt_Ako8TY-L6ZIAmP42J7MNX0XTEF6gkM0Om5F7UPY,11350 -pip/_vendor/distlib/scripts.py,sha256=rVm4A-YfGQDpsORwOy7AwepyRTayuy6rc-MnaCMBAcM,18835 -pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792 -pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784 -pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032 -pip/_vendor/distlib/util.py,sha256=n2QDXvB0XtwrtehygnwdLgLkLia58sZjzgZPKyD6rAE,68167 -pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648 -pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448 -pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888 -pip/_vendor/distro/LICENSE,sha256=y16Ofl9KOYjhBjwULGDcLfdWBfTEZRXnduOspt-XbhQ,11325 -pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981 -pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64 -pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/distro/__pycache__/distro.cpython-311.pyc,, -pip/_vendor/distro/distro.py,sha256=XqbefacAhDT4zr_trnbA15eY8vdK4GTghgmvUGrEM_4,49430 -pip/_vendor/distro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/idna/LICENSE.md,sha256=GppPDj1HmickDd1ZqRN6ZqtKD539yMphiMwL_YUYfwQ,1541 -pip/_vendor/idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868 -pip/_vendor/idna/__main__.py,sha256=4JMK66Wj4uLZTKbF-sT3LAxOsr6buig77PmOkJCRRxw,83 -pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/cli.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/codec.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/compat.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/core.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc,, -pip/_vendor/idna/cli.py,sha256=swqJLMNc8Uzs60KziNpbWnHuqlG3WRQwJSbo4n8xDAo,4139 -pip/_vendor/idna/codec.py,sha256=JRbo-f7pEkLdWeiH89Z72UR4VBYhvKDFrQBeNX6sRDE,5040 -pip/_vendor/idna/compat.py,sha256=AepA39ceRHxkfHP41-FvKW5Ki-f4PfUZ90RUMlCNdmo,1353 -pip/_vendor/idna/core.py,sha256=SfOr1xO3PoE0RDYx7bMciAnjiyjJPbPw_93AB5IUYOw,24685 -pip/_vendor/idna/idnadata.py,sha256=Af-mo8WBmkhAK6TyXKOQH88OX0mQNDKtdL7UWtQpppk,44862 -pip/_vendor/idna/intranges.py,sha256=g49scLSkqJtAhLmOODa7hVHriSjmb60tiTsEoocJdBI,1851 -pip/_vendor/idna/package_data.py,sha256=TeI94EqAFAFaXfBJwsOPUMLn2969uirPa-DaeaceAyU,21 -pip/_vendor/idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/idna/uts46data.py,sha256=jujNz5QqWMcJf-XYLv4X1jBvb5FlI0t6-e1mILsgbPk,234325 -pip/_vendor/msgpack/COPYING,sha256=SS3tuoXaWHL3jmCRvNH-pHTWYNNay03ulkuKqz8AdCc,614 -pip/_vendor/msgpack/__init__.py,sha256=RA8gcqK17YpkxBnNwXJVa1oa2LygWDgfF1nA1NPw3mo,1109 -pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc,, -pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc,, -pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc,, -pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 -pip/_vendor/msgpack/ext.py,sha256=kteJv03n9tYzd5oo3xYopVTo4vRaAxonBQQJhXohZZo,5726 -pip/_vendor/msgpack/fallback.py,sha256=0g1Pzp0vtmBEmJ5w9F3s_-JMVURP8RS4G1cc5TRaAsI,32390 -pip/_vendor/packaging/LICENSE,sha256=ytHvW9NA1z4HS6YU0m996spceUDD2MNIUuZcSQlobEg,197 -pip/_vendor/packaging/LICENSE.APACHE,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174 -pip/_vendor/packaging/LICENSE.BSD,sha256=tw5-m3QvHMb5SLNMFqo5_-zpQZY2S8iP8NIYDwAo-sU,1344 -pip/_vendor/packaging/__init__.py,sha256=QhMEdPu2XogrJzV3S0KWS6t7l0I9k8EeDRJl4fnw87s,494 -pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/_elffile.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/_parser.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/_tokenizer.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/dependency_groups.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/direct_url.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/errors.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/metadata.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/pylock.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/version.cpython-311.pyc,, -pip/_vendor/packaging/_elffile.py,sha256=-sKkptYqzYw2-x3QByJa5mB4rfPWu1pxkZHRx1WAFCY,3211 -pip/_vendor/packaging/_manylinux.py,sha256=Hf6nB0cOrayEs96-p3oIXAgGnFquv20DO5l-o2_Xnv0,9559 -pip/_vendor/packaging/_musllinux.py,sha256=Z6swjH3MA7XS3qXnmMN7QPhqP3fnoYI0eQ18e9-HgAE,2707 -pip/_vendor/packaging/_parser.py,sha256=Kf2nsDw4c54X82pY8ba4F02Bve6OygGMAjL-Begqcew,11698 -pip/_vendor/packaging/_structures.py,sha256=60jRbF78p8z5MKnNd6cAprgOadCJHV0DlmUmRBqFZcs,1109 -pip/_vendor/packaging/_tokenizer.py,sha256=tFU2Wr-ZZJdAbkXLEJo7qUQDJaIkfft9DqaifiEND7A,5391 -pip/_vendor/packaging/dependency_groups.py,sha256=XZIAVFK9uHG4RCGprmJn3VInUWMesxha_kytJuMO9eY,10218 -pip/_vendor/packaging/direct_url.py,sha256=eKmbDiPP1sLV4Mj_kCSZqqknrIyVO9Sr7JpF8KCjp4U,10917 -pip/_vendor/packaging/errors.py,sha256=6hfEYXAf8v_IF65-lFadJOMIieBP2xIKtyEXjG1nGIs,2680 -pip/_vendor/packaging/licenses/__init__.py,sha256=_Jx0XRiD_58palsWnyLrLuh59ZpGCPIPXLKdZo9OJvQ,7293 -pip/_vendor/packaging/licenses/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/packaging/licenses/__pycache__/_spdx.cpython-311.pyc,, -pip/_vendor/packaging/licenses/_spdx.py,sha256=WW7DXiyg68up_YND_wpRYlr1SHhiV4FfJLQffghhMxQ,51122 -pip/_vendor/packaging/markers.py,sha256=QixBVcb9D2HjwEYiuhpNkbqk9znPRbU8zNX0kR1RIrU,17067 -pip/_vendor/packaging/metadata.py,sha256=crAh0E3GVGVqPlu6EdRFsaG-Y6UYznTUqjuGKRGPv6c,38770 -pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/packaging/pylock.py,sha256=G_1gncTmDbRLY1jo4VDI9Uw-b5IErh_Q9V_BbVJTmD8,33890 -pip/_vendor/packaging/requirements.py,sha256=Q-BdEHVW5K785GBXt7RcP4UEsdIKWoWFqlrHjR4WV50,4395 -pip/_vendor/packaging/specifiers.py,sha256=3XBcSslm-YQEEEO_zrv4F6dR5wRxs4ErJvJ0vjNBfGM,71550 -pip/_vendor/packaging/tags.py,sha256=ANYHZxYQVp9BlOQYOHU5ArDNVIpTFl4KlbocYVBWnFs,34236 -pip/_vendor/packaging/utils.py,sha256=M7-JMKic2sP1YtV_8aW7eVGB-x3ADuKCiSrsVeCd2Uo,9848 -pip/_vendor/packaging/version.py,sha256=Mcu7Tf6Y1i0gQ4FXv4t0g8cbL5joAEshjgIpz_2vISI,38393 -pip/_vendor/pkg_resources/LICENSE,sha256=htoPAa6uRjSKPD1GUZXcHOzN55956HdppkuNoEsqR0E,1023 -pip/_vendor/pkg_resources/__init__.py,sha256=vbTJ0_ruUgGxQjlEqsruFmiNPVyh2t9q-zyTDT053xI,124451 -pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/platformdirs/LICENSE,sha256=KeD9YukphQ6G6yjD_czwzv30-pSHkBHP-z0NS-1tTbY,1089 -pip/_vendor/platformdirs/__init__.py,sha256=gBmL_J_KdPgKiwM3dHCo-y-8CbS06QCa1XIhJ9bIgew,32389 -pip/_vendor/platformdirs/__main__.py,sha256=DQ1o1E1l0Ghuitj4uQJKAPwkcKbGzkzO0sbhzd9RbUc,1773 -pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/_xdg.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc,, -pip/_vendor/platformdirs/_xdg.py,sha256=5w6S07vVabEROhaUB_X7i0hmLNbdYtC9aEvPbsEIS8M,7894 -pip/_vendor/platformdirs/android.py,sha256=BBj3wfw-dfuVxsCsKsvFByKVspRDgfv8gwIzhpE1JRQ,11566 -pip/_vendor/platformdirs/api.py,sha256=EaIsFgXGu8cDTb41WM3hse_SrIoOUht8_TCo5XdOOSM,14887 -pip/_vendor/platformdirs/macos.py,sha256=PWudeDZAY9UuwLP_5rN3exSRFtYdY542hDhjah4dSWA,9538 -pip/_vendor/platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/platformdirs/unix.py,sha256=X7Cip1xOHFOnSVveqKWzU1P7jn4zuDGpRgmVxJnk4vk,13317 -pip/_vendor/platformdirs/version.py,sha256=dJvdm7L_7wobEcxrNoJtH7CtmYcG_VR5yNmtBshJ-xs,522 -pip/_vendor/platformdirs/windows.py,sha256=YOdSGNhdpxm_ydZq7uG74i9mX2_WWbcMSA4fobXwL0M,15798 -pip/_vendor/pygments/LICENSE,sha256=qdZvHVJt8C4p3Oc0NtNOVuhjL0bCdbvf_HBWnogvnxc,1331 -pip/_vendor/pygments/__init__.py,sha256=Xnd_7fJUqU_6D0bxXW0qS9M_OE9G6VW8YNPbGLWoKwQ,2986 -pip/_vendor/pygments/__main__.py,sha256=IqAQ_836Kv2CTx8r6Ie6duRQuYSPl85sbYomEwIsY14,356 -pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/console.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/style.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/token.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/util.cpython-311.pyc,, -pip/_vendor/pygments/console.py,sha256=C189JAwhC1Qh0AKgshzb1wVDzFqBnv1VZ45kTEDIO30,1721 -pip/_vendor/pygments/filter.py,sha256=1dnbkq2AdC3AkHt3DaXwnOkTBLChl1kR6naSLwnr_tc,1913 -pip/_vendor/pygments/filters/__init__.py,sha256=Prd6xUK_7kw0rQv_OXPY3871RzwtWKGp_g7SddYHBXg,40397 -pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/formatter.py,sha256=EuAXPX6c3XQkCt3lD0VhSPSZByG7YQk8HrCwxlf-CZQ,4393 -pip/_vendor/pygments/formatters/__init__.py,sha256=EYLDCIgBHL_DkuhNRQZlHpS2_UE5-MfsGL1hMcOa95w,5388 -pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc,, -pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176 -pip/_vendor/pygments/lexer.py,sha256=wSXDzt2fNZJSrlfdIfnKVlheRpFkszkPmgwBJevbBNo,35394 -pip/_vendor/pygments/lexers/__init__.py,sha256=s8I_tVlotrM8cFTGlnjw45UY5sj5jhDwdQzOOjhzgNg,12118 -pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc,, -pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc,, -pip/_vendor/pygments/lexers/_mapping.py,sha256=wGAYjOBprDVZA01eocwcLJ6L8biM9rP2jxwr1bQJ96M,77934 -pip/_vendor/pygments/lexers/python.py,sha256=TqyfQOPhCYPx35apQL65CAj9k-4BxuzLq8MDfdm2jvE,54250 -pip/_vendor/pygments/modeline.py,sha256=me8g5rySidvPtMBOrDy2O1sMqZd02lBHMY5KDZefUws,1008 -pip/_vendor/pygments/plugin.py,sha256=P6zIw-vkSQ0k1WKHrzbBTjpwlCZPbR-6Qe_dO9Bjdu0,1928 -pip/_vendor/pygments/regexopt.py,sha256=d2hTvazlow5zzZIOCVnfeEG2CY0GrY_igH1kCSSf7ow,3308 -pip/_vendor/pygments/scanner.py,sha256=DtoLi1pOKpNu-6jiakJpSQLUi_ep29SQQhv7oAwYWME,3095 -pip/_vendor/pygments/sphinxext.py,sha256=RflpnfXB4rZLYyZ-OQ_igntVOlB8jG42xFYgEVIyHf8,7984 -pip/_vendor/pygments/style.py,sha256=wJSXOXjehGYxI6e3DGaUtONeWuhmTfswfkysrL9Was0,6423 -pip/_vendor/pygments/styles/__init__.py,sha256=kYdCGK8gZ1V8wfFQETOzpPmZTJ1nMB0b1iNlU8dHQ9E,2045 -pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-311.pyc,, -pip/_vendor/pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312 -pip/_vendor/pygments/token.py,sha256=DVil5T2ltHkTgQTUYy1dMtgyigjavCs1ypE4Qf2CrGo,6229 -pip/_vendor/pygments/unistring.py,sha256=Z4w4HfOVUhueCURRkfhAqQ2b-69UzkhY4xuHevYEy5g,63211 -pip/_vendor/pygments/util.py,sha256=zk935tJSpwSA9zxNmV1TuhcEP0MfboXiRZSGQnLPEqk,10046 -pip/_vendor/pyproject_hooks/LICENSE,sha256=GyKwSbUmfW38I6Z79KhNjsBLn9-xpR02DkK0NCyLQVQ,1081 -pip/_vendor/pyproject_hooks/__init__.py,sha256=cPB_a9LXz5xvsRbX1o2qyAdjLatZJdQ_Lc5McNX-X7Y,691 -pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc,, -pip/_vendor/pyproject_hooks/_impl.py,sha256=jY-raxnmyRyB57ruAitrJRUzEexuAhGTpgMygqx67Z4,14936 -pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=MJNPpfIxcO-FghxpBbxkG1rFiQf6HOUbV4U5mq0HFns,557 -pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc,, -pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=qcXMhmx__MIJq10gGHW3mA4Tl8dy8YzHMccwnNoKlw0,12216 -pip/_vendor/pyproject_hooks/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/requests/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142 -pip/_vendor/requests/__init__.py,sha256=nC2attFwdoYN-oE6-vQW4ciuvIu7J2P_TU1qQ2DcueE,5873 -pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/_types.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/api.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/auth.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/certs.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/compat.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/help.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/models.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/packages.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/structures.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/utils.cpython-311.pyc,, -pip/_vendor/requests/__version__.py,sha256=q7qQZwsDcKPcQNl8LepGo11L7JQf8Q18PPMJjvBKF_k,435 -pip/_vendor/requests/_internal_utils.py,sha256=TH2NEyyYmPx9cV5HPzrHR4XdxKuW0skkD4eDXcbZgf8,1542 -pip/_vendor/requests/_types.py,sha256=0G33n1SiecDMP67FlsRGJG1a0U7f1SnrMo3vvWKkSok,5838 -pip/_vendor/requests/adapters.py,sha256=5kSKhXlJuR_enrOjd3khSGpRBj1WqCh08Qssu0CEZ8M,28208 -pip/_vendor/requests/api.py,sha256=TRVICsBG8Ikgl5joZQR270oo6-b4G0AHWPjvQuxrVQk,7152 -pip/_vendor/requests/auth.py,sha256=6TlRpVLUw8X9m4Sl4dSbA8qrpHI8T_ES2mBTYA7IWmU,12233 -pip/_vendor/requests/certs.py,sha256=eD1G0RoMZ3kA0lydkw7oo0lmcKqvD1hhz6yOlgSKm8w,442 -pip/_vendor/requests/compat.py,sha256=1UheFGomceWe7aysgboYWxcEOH_HpQFmKhIyPiAanog,2035 -pip/_vendor/requests/cookies.py,sha256=ChzmFA8rlCBSLFCA41bmifp5bCUi9VyhCCb17Y4Kcjw,21549 -pip/_vendor/requests/exceptions.py,sha256=Am6y4ncoBptpmesOjRxc5iiuBDYjx3UN1oRVBlNgRyE,4576 -pip/_vendor/requests/help.py,sha256=TVWejkCROwKexHHB44KCZSr-c0o5XakNL7LT1UJlRy8,4114 -pip/_vendor/requests/hooks.py,sha256=69igJHXTGg5HOo9VPpUB_0NkW5VjiFrVKETnpj8Ndqs,1138 -pip/_vendor/requests/models.py,sha256=99d7WF4pR35NHo9jrbGiBocZ3LCMsloVU0DAcQ49x3Q,41848 -pip/_vendor/requests/packages.py,sha256=_ZQDCJTJ8SP3kVWunSqBsRZNPzj2c1WFVqbdr08pz3U,1057 -pip/_vendor/requests/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/requests/sessions.py,sha256=lvuzC7vwalmlJo0TtXiFFJdWqj8xaVtcFeQd17svZ6Y,34248 -pip/_vendor/requests/status_codes.py,sha256=GVD0fInPGAGXh-B9jOSPZtazjmIvfZTXCpAkf-5sBA4,4351 -pip/_vendor/requests/structures.py,sha256=upRgw5B48l5vHSokrJQaxvjS7pcZf6jI0MJi2KHmegI,4134 -pip/_vendor/requests/utils.py,sha256=u7MICyzQTvfUa3asg9nBvcrnhSIPEc6qhJSxiGGwTOk,36334 -pip/_vendor/resolvelib/LICENSE,sha256=84j9OMrRMRLB3A9mm76A5_hFQe26-3LzAw0sp2QsPJ0,751 -pip/_vendor/resolvelib/__init__.py,sha256=yoX-d4STvwGGCiQRE5cJC9Cter69SgVgqClxOCvSP7M,541 -pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc,, -pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc,, -pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc,, -pip/_vendor/resolvelib/providers.py,sha256=pIWJbIdJJ9GFtNbtwTH0Ia43Vj6hYCEJj2DOLue15FM,8914 -pip/_vendor/resolvelib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/resolvelib/reporters.py,sha256=pNJf4nFxLpAeKxlBUi2GEj0a2Ij1nikY0UabTKXesT4,2037 -pip/_vendor/resolvelib/resolvers/__init__.py,sha256=728M3EvmnPbVXS7ExXlv2kMu6b7wEsoPutEfl-uVk_I,640 -pip/_vendor/resolvelib/resolvers/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/resolvelib/resolvers/__pycache__/abstract.cpython-311.pyc,, -pip/_vendor/resolvelib/resolvers/__pycache__/criterion.cpython-311.pyc,, -pip/_vendor/resolvelib/resolvers/__pycache__/exceptions.cpython-311.pyc,, -pip/_vendor/resolvelib/resolvers/__pycache__/resolution.cpython-311.pyc,, -pip/_vendor/resolvelib/resolvers/abstract.py,sha256=CNeQPnpAudY77nmzOkONSmAgRlzIf06X-X9mvRYODms,1543 -pip/_vendor/resolvelib/resolvers/criterion.py,sha256=lcmZGv5sKHOnFD_RzZwvlGSj19MeA-5rCMpdf2Sgw7Y,1768 -pip/_vendor/resolvelib/resolvers/exceptions.py,sha256=ln_jaQtgLlRUSFY627yiHG2gD7AgaXzRKaElFVh7fDQ,1768 -pip/_vendor/resolvelib/resolvers/resolution.py,sha256=3J_zkW-sD3EY-BlNXjyln__njpyH5n0UZJT6uV7CheA,24212 -pip/_vendor/resolvelib/structs.py,sha256=pu-EJiR2IBITr2SQeNPRa0rXhjlStfmO_GEgAhr3004,6420 -pip/_vendor/rich/LICENSE,sha256=3u18F6QxgVgZCj6iOcyHmlpQJxzruYrnAl9I--WNyhU,1056 -pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090 -pip/_vendor/rich/__main__.py,sha256=e_aVC-tDzarWQW9SuZMuCgBr6ODV_iDNV2Wh2xkxOlw,7896 -pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/abc.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/align.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/bar.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/box.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/cells.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/color.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/columns.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/console.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/containers.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/control.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/errors.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/json.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/layout.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/live.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/logging.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/markup.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/measure.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/padding.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/pager.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/palette.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/panel.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/progress.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/region.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/repr.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/rule.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/scope.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/screen.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/segment.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/status.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/style.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/styled.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/table.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/text.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/theme.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/themes.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/tree.cpython-311.pyc,, -pip/_vendor/rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209 -pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235 -pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064 -pip/_vendor/rich/_export_format.py,sha256=RI08pSrm5tBSzPMvnbTqbD9WIalaOoN5d4M1RTmLq1Y,2128 -pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265 -pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799 -pip/_vendor/rich/_inspect.py,sha256=ROT0PLC2GMWialWZkqJIjmYq7INRijQQkoSokWTaAiI,9656 -pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225 -pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236 -pip/_vendor/rich/_null_file.py,sha256=ADGKp1yt-k70FMKV6tnqCqecB-rSJzp-WQsD7LPL-kg,1394 -pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063 -pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423 -pip/_vendor/rich/_ratio.py,sha256=IOtl78sQCYZsmHyxhe45krkb68u9xVz7zFsXVJD-b2Y,5325 -pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919 -pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351 -pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417 -pip/_vendor/rich/_win32_console.py,sha256=BSaDRIMwBLITn_m0mTRLPqME5q-quGdSMuYMpYeYJwc,22755 -pip/_vendor/rich/_windows.py,sha256=aBwaD_S56SbgopIvayVmpk0Y28uwY2C5Bab1wl3Bp-I,1925 -pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783 -pip/_vendor/rich/_wrap.py,sha256=FlSsom5EX0LVkA3KWy34yHnCfLtqX-ZIepXKh-70rpc,3404 -pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890 -pip/_vendor/rich/align.py,sha256=dg-7uY0ukMLLlUEsBDRLva22_sQgIJD4BK0dmZHFHug,10324 -pip/_vendor/rich/ansi.py,sha256=Avs1LHbSdcyOvDOdpELZUoULcBiYewY76eNBp6uFBhs,6921 -pip/_vendor/rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263 -pip/_vendor/rich/box.py,sha256=kmavBc_dn73L_g_8vxWSwYJD2uzBXOUFTtJOfpbczcM,10686 -pip/_vendor/rich/cells.py,sha256=KrQkj5-LghCCpJLSNQIyAZjndc4bnEqOEmi5YuZ9UCY,5130 -pip/_vendor/rich/color.py,sha256=3HSULVDj7qQkXUdFWv78JOiSZzfy5y1nkcYhna296V0,18211 -pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054 -pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131 -pip/_vendor/rich/console.py,sha256=t9azZpmRMVU5cphVBZSShNsmBxd2-IAWcTTlhor-E1s,100849 -pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288 -pip/_vendor/rich/containers.py,sha256=c_56TxcedGYqDepHBMTuZdUIijitAQgnox-Qde0Z1qo,5502 -pip/_vendor/rich/control.py,sha256=EUTSUFLQbxY6Zmo_sdM-5Ls323vIHTBfN8TPulqeHUY,6487 -pip/_vendor/rich/default_styles.py,sha256=khQFqqaoDs3bprMqWpHw8nO5UpG2DN6QtuTd6LzZwYc,8257 -pip/_vendor/rich/diagnose.py,sha256=fJl1TItRn19gGwouqTg-8zPUW3YqQBqGltrfPQs1H9w,1025 -pip/_vendor/rich/emoji.py,sha256=Wd4bQubZdSy6-PyrRQNuMHtn2VkljK9uPZPVlu2cmx0,2367 -pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642 -pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683 -pip/_vendor/rich/filesize.py,sha256=_iz9lIpRgvW7MNSeCZnLg-HwzbP4GETg543WqD8SFs0,2484 -pip/_vendor/rich/highlighter.py,sha256=G_sn-8DKjM1sEjLG_oc4ovkWmiUpWvj8bXi0yed2LnY,9586 -pip/_vendor/rich/json.py,sha256=vVEoKdawoJRjAFayPwXkMBPLy7RSTs-f44wSQDR2nJ0,5031 -pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252 -pip/_vendor/rich/layout.py,sha256=ajkSFAtEVv9EFTcFs-w4uZfft7nEXhNzL7ZVdgrT5rI,14004 -pip/_vendor/rich/live.py,sha256=tF3ukAAJZ_N2ZbGclqZ-iwLoIoZ8f0HHUz79jAyJqj8,15180 -pip/_vendor/rich/live_render.py,sha256=It_39YdzrBm8o3LL0kaGorPFg-BfZWAcrBjLjFokbx4,3521 -pip/_vendor/rich/logging.py,sha256=5KaPPSMP9FxcXPBcKM4cGd_zW78PMgf-YbMVnvfSw0o,12468 -pip/_vendor/rich/markup.py,sha256=3euGKP5s41NCQwaSjTnJxus5iZMHjxpIM0W6fCxra38,8451 -pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305 -pip/_vendor/rich/padding.py,sha256=KVEI3tOwo9sgK1YNSuH__M1_jUWmLZwRVV_KmOtVzyM,4908 -pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828 -pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396 -pip/_vendor/rich/panel.py,sha256=9sQl00hPIqH5G2gALQo4NepFwpP0k9wT-s_gOms5pIc,11157 -pip/_vendor/rich/pretty.py,sha256=gy3S72u4FRg2ytoo7N1ZDWDIvB4unbzd5iUGdgm-8fc,36391 -pip/_vendor/rich/progress.py,sha256=CUc2lkU-X59mVdGfjMCBkZeiGPL3uxdONjhNJF2T7wY,60408 -pip/_vendor/rich/progress_bar.py,sha256=mZTPpJUwcfcdgQCTTz3kyY-fc79ddLwtx6Ghhxfo064,8162 -pip/_vendor/rich/prompt.py,sha256=l0RhQU-0UVTV9e08xW1BbIj0Jq2IXyChX4lC0lFNzt4,12447 -pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391 -pip/_vendor/rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166 -pip/_vendor/rich/repr.py,sha256=5MZJZmONgC6kud-QW-_m1okXwL2aR6u6y-pUcUCJz28,4431 -pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602 -pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843 -pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591 -pip/_vendor/rich/segment.py,sha256=otnKeKGEV-WRlQVosfJVeFDcDxAKHpvJ_hLzSu5lumM,24743 -pip/_vendor/rich/spinner.py,sha256=onIhpKlljRHppTZasxO8kXgtYyCHUkpSgKglRJ3o51g,4214 -pip/_vendor/rich/status.py,sha256=kkPph3YeAZBo-X-4wPp8gTqZyU466NLwZBA4PZTTewo,4424 -pip/_vendor/rich/style.py,sha256=W9Ccy8Py8lNICtlfcp-ryzMTuQaGxAU3av7-g5fHu0s,26990 -pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258 -pip/_vendor/rich/syntax.py,sha256=eDKIRwl--eZ0Lwo2da2RRtfutXGavrJO61Cl5OkS59U,36371 -pip/_vendor/rich/table.py,sha256=ZmT7V7MMCOYKw7TGY9SZLyYDf6JdM-WVf07FdVuVhTI,40049 -pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370 -pip/_vendor/rich/text.py,sha256=AO7JPCz6-gaN1thVLXMBntEmDPVYFgFNG1oM61_sanU,47552 -pip/_vendor/rich/theme.py,sha256=oNyhXhGagtDlbDye3tVu3esWOWk0vNkuxFw-_unlaK0,3771 -pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102 -pip/_vendor/rich/traceback.py,sha256=c0WmB_L04_UfZbLaoH982_U_s7eosxKMUiAVmDPdRYU,35861 -pip/_vendor/rich/tree.py,sha256=yWnQ6rAvRGJ3qZGqBrxS2SW2TKBTNrP0SdY8QxOFPuw,9451 -pip/_vendor/tomli/LICENSE,sha256=uAgWsNUwuKzLTCIReDeQmEpuO2GSLCte6S8zcqsnQv4,1072 -pip/_vendor/tomli/__init__.py,sha256=nrBC18DbXRTCFo7ElG5BDeWpHJzOhokvXk215GM8Z2I,314 -pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc,, -pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc,, -pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc,, -pip/_vendor/tomli/_parser.py,sha256=pBIjTIa_cQs2HglDJ2lh8OJfptfDa6eg5-7Iej4BjHs,26440 -pip/_vendor/tomli/_re.py,sha256=oSNZ_ilFI6chEuQ01YRSoUydBQr_okF_mSdHTkFmv90,3396 -pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254 -pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26 -pip/_vendor/tomli_w/LICENSE,sha256=uAgWsNUwuKzLTCIReDeQmEpuO2GSLCte6S8zcqsnQv4,1072 -pip/_vendor/tomli_w/__init__.py,sha256=0F8yDtXx3Uunhm874KrAcP76srsM98y7WyHQwCulZbo,169 -pip/_vendor/tomli_w/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/tomli_w/__pycache__/_writer.cpython-311.pyc,, -pip/_vendor/tomli_w/_writer.py,sha256=dsifFS2xYf1i76mmRyfz9y125xC7Z_HQ845ZKhJsYXs,6961 -pip/_vendor/tomli_w/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26 -pip/_vendor/truststore/LICENSE,sha256=M757fo-k_Rmxdg4ajtimaL2rhSyRtpLdQUJLy3Jan8o,1086 -pip/_vendor/truststore/__init__.py,sha256=Bu7kqkmpunhLsj5xCu8gT_25ktoPXcSnwe8VHk1GmJo,1320 -pip/_vendor/truststore/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/truststore/__pycache__/_api.cpython-311.pyc,, -pip/_vendor/truststore/__pycache__/_macos.cpython-311.pyc,, -pip/_vendor/truststore/__pycache__/_openssl.cpython-311.pyc,, -pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-311.pyc,, -pip/_vendor/truststore/__pycache__/_windows.cpython-311.pyc,, -pip/_vendor/truststore/_api.py,sha256=CYJCV5BTfttZYfqY3movdMBE-8az7uhET_LYbKT2Nn4,11413 -pip/_vendor/truststore/_macos.py,sha256=nZlLkOmszUE0g6ryRwBVGY5COzPyudcsiJtDWarM5LQ,20503 -pip/_vendor/truststore/_openssl.py,sha256=zB-SQvJydks7tQ0yIwrP6GD3fQNSSaPiq7zw4yF5T40,2412 -pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130 -pip/_vendor/truststore/_windows.py,sha256=rAHyKYD8M7t-bXfG8VgOVa3TpfhVhbt4rZQlO45YuP8,17993 -pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/LICENSE.txt,sha256=Ew46ZNX91dCWp1JpRjSn2d8oRGnehuVzIQAmgEHj1oY,1093 -pip/_vendor/urllib3/__init__.py,sha256=JMo1tg1nIV1AeJ2vENC_Txfl0e5h6Gzl9DGVk1rWRbo,6979 -pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/_base_connection.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/_request_methods.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc,, -pip/_vendor/urllib3/_base_connection.py,sha256=HzcSEHexgDrRUr60jNniB2KQjdw97SedD5luRfHtCXg,5580 -pip/_vendor/urllib3/_collections.py,sha256=aOVm2mKilvuvT1efAGtkA7pi65C1NC3HJfpFxvYBS8A,17522 -pip/_vendor/urllib3/_request_methods.py,sha256=gCeF85SO_UU4WoPwYHIoz_tw-eM_EVOkLFp8OFsC7DA,9931 -pip/_vendor/urllib3/_version.py,sha256=-gMrKhsPiOj0XzUezVFa59d1S6QgQiKgQT5gGgyM8-w,520 -pip/_vendor/urllib3/connection.py,sha256=Zos3qxKDW9-GQ6aVqfBQVRM5soB0IjHxY_xXWpJaFTI,42786 -pip/_vendor/urllib3/connectionpool.py,sha256=sGFnddXYwlx7KC4JCP1gKvdNGLNK-YTCJDdGACGj3Y8,44164 -pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/emscripten/__init__.py,sha256=ZruXaWKVzAEJdqNH3NEh0mrHrw--2VZYb0zX0RonNZA,870 -pip/_vendor/urllib3/contrib/emscripten/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/emscripten/__pycache__/connection.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/emscripten/__pycache__/fetch.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/emscripten/__pycache__/request.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/emscripten/__pycache__/response.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/emscripten/connection.py,sha256=giElsBoUsKVURbZzb8GCrJmqW23Xnvj2aNyQVF42slg,8960 -pip/_vendor/urllib3/contrib/emscripten/emscripten_fetch_worker.js,sha256=z1k3zZ4_hDKd3-tN7wzz8LHjHC2pxN_uu8B3k9D9A3c,3677 -pip/_vendor/urllib3/contrib/emscripten/fetch.py,sha256=5xcd--viFxZd2nBy0aK73dtJ9Tsh1yYZU_SUXwnwibk,23520 -pip/_vendor/urllib3/contrib/emscripten/request.py,sha256=mL28szy1KvE3NJhWor5jNmarp8gwplDU-7gwGZY5g0Q,566 -pip/_vendor/urllib3/contrib/emscripten/response.py,sha256=CDpY0GFoluR3IxECkM2gH5uDfYDM0EL1FWr7B76wtgM,9719 -pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=Pi_qwvdl83tNpuj1k5pCpP_gmxlk4BfFrTlAeg-qZ_U,19760 -pip/_vendor/urllib3/contrib/socks.py,sha256=rSuklfha4-vto-8qSLhSPmf5lmRPIYuqdAxKe9bg2RA,7639 -pip/_vendor/urllib3/exceptions.py,sha256=hQPHoqo4yw46esNSVkciVQXVUgAxWAglsh6MbyQta-Q,9945 -pip/_vendor/urllib3/fields.py,sha256=aGLFAVZpVU-FbJlllve4Ahg0-pH9ZZBQ2Iz7lfpkjkM,10801 -pip/_vendor/urllib3/filepost.py,sha256=U8eNZ-mpKKHhrlbHEEiTxxgK16IejhEa7uz42yqA_dI,2388 -pip/_vendor/urllib3/http2/__init__.py,sha256=xzrASH7R5ANRkPJOot5lGnATOq3KKuyXzI42rcnwmqs,1741 -pip/_vendor/urllib3/http2/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/http2/__pycache__/connection.cpython-311.pyc,, -pip/_vendor/urllib3/http2/__pycache__/probe.cpython-311.pyc,, -pip/_vendor/urllib3/http2/connection.py,sha256=bHMH6fNvatwXPrKqrcn74yA3pUWcqPDppnK1LcKCbP8,12578 -pip/_vendor/urllib3/http2/probe.py,sha256=nnAkqbhAakOiF75rz7W0udZ38Eeh_uD8fjV74N73FEI,3014 -pip/_vendor/urllib3/poolmanager.py,sha256=grIrETG1rgHYBaQau1yN4xxfK8U9CKVRYmwBXW_kdSo,23929 -pip/_vendor/urllib3/py.typed,sha256=UaCuPFa3H8UAakbt-5G8SPacldTOGvJv18pPjUJ5gDY,93 -pip/_vendor/urllib3/response.py,sha256=DzBM-dzl6x_h2EZGc9iw0gbOkQ36bolC7WESH4TurH8,53031 -pip/_vendor/urllib3/util/__init__.py,sha256=-qeS0QceivazvBEKDNFCAI-6ACcdDOE4TMvo7SLNlAQ,1001 -pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/util.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc,, -pip/_vendor/urllib3/util/connection.py,sha256=JjO722lzHlzLXPTkr9ZWBdhseXnMVjMSb1DJLVrXSnQ,4444 -pip/_vendor/urllib3/util/proxy.py,sha256=seP8-Q5B6bB0dMtwPj-YcZZQ30vHuLqRu-tI0JZ2fzs,1148 -pip/_vendor/urllib3/util/request.py,sha256=p9Ki9eo1tFBO-jqV_7KmmJ60RKqoY2r4ao0SmaHLyOs,8086 -pip/_vendor/urllib3/util/response.py,sha256=vQE639uoEhj1vpjEdxu5lNIhJCSUZkd7pqllUI0BZOA,3374 -pip/_vendor/urllib3/util/retry.py,sha256=2YnSX-_FecMShD61Mx5s68J0_btUHZrrc_BkFVRS1P4,19577 -pip/_vendor/urllib3/util/ssl_.py,sha256=Oqe3rIhUU3e3GVgZob2hxmR8Q0ZDhrhESPlPP_GLaVQ,17742 -pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ft44KJzTzGMmKff_ZXP91li2V4WhmvEy16PKBcv4vZk,5479 -pip/_vendor/urllib3/util/ssltransport.py,sha256=Ez4O8pR_vT8dan_FvqBYS6dgDfBXEMfVfrzcdUoWfi4,8847 -pip/_vendor/urllib3/util/timeout.py,sha256=vsUJRpO0nfKk-y1OKlgFGY1ONJGPgkaZ7B7kruEpVYw,10363 -pip/_vendor/urllib3/util/url.py,sha256=PEDQMypidude0nAZctLLiFK9epN-LPnSH7KpOLLwqH0,15256 -pip/_vendor/urllib3/util/util.py,sha256=j3lbZK1jPyiwD34T8IgJzdWEZVT-4E-0vYIJi9UjeNA,1146 -pip/_vendor/urllib3/util/wait.py,sha256=_ph8IrUR3sqPqi0OopQgJUlH4wzkGeM5CiyA7XGGtmI,4423 -pip/_vendor/vendor.txt,sha256=PfDJYBv6Lg3KI8xXSk-QCk1_2tBgqyA_q4NUNQ7ZMyA,317 -pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286 diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/REQUESTED b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/REQUESTED deleted file mode 100755 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/WHEEL b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/WHEEL deleted file mode 100755 index d8b9936..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.12.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/entry_points.txt b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/entry_points.txt deleted file mode 100755 index c6436d2..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/entry_points.txt +++ /dev/null @@ -1,4 +0,0 @@ -[console_scripts] -pip=pip._internal.cli.main:main -pip3=pip._internal.cli.main:main - diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/AUTHORS.txt b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/AUTHORS.txt deleted file mode 100755 index 691991f..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/AUTHORS.txt +++ /dev/null @@ -1,888 +0,0 @@ -@Switch01 -A_Rog -Aakanksha Agrawal -Aarni Koskela -abdul rawoof -Abdul Rawoof Khan -Abhinav Sagar -ABHYUDAY PRATAP SINGH -abs51295 -AceGentile -Adam Chainz -Adam Tse -Adam Turner -Adam Wentz -admin -Adolfo Ochagavía -Adrien Morison -Agus -ahayrapetyan -Ahilya -AinsworthK -Akash Srivastava -Alan Yee -Albert Tugushev -Albert-Guan -albertg -Alberto Sottile -Aleks Bunin -Ales Erjavec -Alessandro Molina -Alethea Flowers -Alex Gaynor -Alex Grönholm -Alex Hedges -Alex Loosley -Alex Morega -Alex Stachowiak -Alexander Regueiro -Alexander Shtyrov -Alexandre Conrad -Alexey Popravka -Aleš Erjavec -Alli -Aman -Ami Fischman -Ananya Maiti -Anatoly Techtonik -Anders Kaseorg -Andre Aguiar -Andrea Corna -Andreas Lutro -Andrei Geacar -Andrew Gaul -Andrew Shymanel -Andrey Bienkowski -Andrey Bulgakov -Andrés Delfino -Andy Freeland -Andy Kluger -Ani Hayrapetyan -Aniruddha Basak -Anish Tambe -Anrs Hu -Anthony Sottile -Antoine Lambert -Antoine Musso -Anton Ovchinnikov -Anton Patrushev -Anton Zelenov -Antonio Alvarado Hernandez -Antony Lee -Antti Kaihola -Anubhav Patel -Anudit Nagar -Anuj Godase -AQNOUCH Mohammed -AraHaan -Aren Siekmeier -arena -arenasys -Arindam Choudhury -Armin Ronacher -Arnon Yaari -Artem -Arun Babu Neelicattu -Ashley Manton -Ashwin Ramaswami -atse -Atsushi Odagiri -Avinash Karhana -Avner Cohen -Awit (Ah-Wit) Ghirmai -Baptiste Mispelon -Barney Gale -barneygale -Bartek Ogryczak -Bastian Venthur -Ben Bodenmiller -Ben Darnell -Ben Hoyt -Ben Mares -Ben Rosser -Bence Nagy -Benjamin Peterson -Benjamin VanEvery -Benoit Pierre -Berker Peksag -Bernard -Bernard Tyers -Bernardo B. Marques -Bernhard M. Wiedemann -Bertil Hatt -Bhavam Vidyarthi -Blazej Michalik -Bogdan Opanchuk -BorisZZZ -Brad Erickson -Bradley Ayers -Bradley Reynolds -Branch Vincent -Brandon L. Reiss -Brandt Bucher -Brannon Dorsey -Brett Randall -Brett Rosen -Brian Cristante -Brian Rosner -briantracy -BrownTruck -Bruno Oliveira -Bruno Renié -Bruno S -Bstrdsmkr -Buck Golemon -burrows -Bussonnier Matthias -bwoodsend -c22 -Caleb Brown -Caleb Martinez -Calvin Smith -Carl Meyer -Carlos Liam -Carol Willing -Carter Thayer -Cass -Chandrasekhar Atina -Charlie Marsh -charwick -Chih-Hsuan Yen -Chris Brinker -Chris Hunt -Chris Jerdonek -Chris Kuehl -Chris Markiewicz -Chris McDonough -Chris Pawley -Chris Pryer -Chris Wolfe -Christian Clauss -Christian Heimes -Christian Oudard -Christoph Reiter -Christopher Hunt -Christopher Snyder -chrysle -cjc7373 -Clark Boylan -Claudio Jolowicz -Clay McClure -Cody -Cody Soyland -Colin Watson -Collin Anderson -Connor Osborn -Cooper Lees -Cooper Ry Lees -Cory Benfield -Cory Wright -Craig Kerstiens -Cristian Sorinel -Cristina -Cristina Muñoz -ctg123 -Curtis Doty -cytolentino -Daan De Meyer -Dale -Damian -Damian Quiroga -Damian Shaw -Dan Black -Dan Savilonis -Dan Sully -Dane Hillard -daniel -Daniel Collins -Daniel Hahler -Daniel Hollas -Daniel Holth -Daniel Jost -Daniel Katz -Daniel Shaulov -Daniele Esposti -Daniele Nicolodi -Daniele Procida -Daniil Konovalenko -Danny Hermes -Danny McClanahan -Darren Kavanagh -Dav Clark -Dave Abrahams -Dave Jones -David Aguilar -David Black -David Bordeynik -David Caro -David D Lowe -David Evans -David Hewitt -David Linke -David Poggi -David Poznik -David Pursehouse -David Runge -David Tucker -David Wales -Davidovich -Dayna Blackwell -ddelange -Deepak Sharma -Deepyaman Datta -Denis Roussel (ACSONE) -Denise Yu -dependabot[bot] -dereksz -derwolfe -Desetude -developer -Devesh Kumar -Devesh Kumar Singh -devsagul -Dewank Pant -Diego Caraballo -Diego Ramirez -DiegoCaraballo -Dimitri Merejkowsky -Dimitri Papadopoulos -Dimitri Papadopoulos Orfanos -Dirk Stolle -dkjsone -Dmitrii Sutiagin -Dmitry Gladkov -Dmitry Volodin -Domen Kožar -Dominic Davis-Foster -Donald Stufft -Dongweiming -doron zarhi -Dos Moonen -Douglas Thor -DrFeathers -Dustin Ingram -Dustin Rodrigues -Dwayne Bailey -Ed Morley -Edgar Ramírez -Edgar Ramírez Mondragón -Ee Durbin -Efflam Lemaillet -efflamlemaillet -Eitan Adler -ekristina -elainechan -Eli Schwartz -Elisha Hollander -Ellen Marie Dash -Emil Burzo -Emil Styrke -Emmanuel Arias -Endoh Takanao -enoch -Erdinc Mutlu -Eric Cousineau -Eric Gillingham -Eric Hanchrow -Eric Hopper -Erik M. Bray -Erik Rose -Erwin Janssen -Eugene Vereshchagin -everdimension -Federico -Felipe Peter -Felix Yan -fiber-space -Filip Kokosiński -Filipe Laíns -Finn Womack -finnagin -Flavio Amurrio -Florian Briand -Florian Rathgeber -Francesco -Francesco Montesano -Fredrik Orderud -Fredrik Roubert -Frost Ming -Gabriel Curio -Gabriel de Perthuis -Garry Polley -gavin -gdanielson -Gene Wood -Geoffrey Sneddon -George Margaritis -George Song -Georgi Valkov -Georgy Pchelkin -Gertjan van Zwieten -ghost -Giancarlo Cicellyn Comneno -Giftlin Rajaiah -gizmoguy1 -gkdoc -Godefroid Chapelle -Gopinath M -GOTO Hayato -gousaiyang -gpiks -Greg Roodt -Greg Ward -Guido Diepen -Guilherme Espada -Guillaume Seguin -gutsytechster -Guy Rozendorn -Guy Tuval -gzpan123 -Hanjun Kim -Hari Charan -Harsh Vardhan -Harsha Sai -harupy -Harutaka Kawamura -Hasan-8326 -hauntsaninja -Henrich Hartzer -Henry Schreiner -Herbert Pfennig -Holly Stotelmyer -Honnix -Hsiaoming Yang -Hugo -Hugo Lopes Tavares -Hugo van Kemenade -Hugues Bruant -Hynek Schlawack -iamsrp-deshaw -Ian Bicking -Ian Cordasco -Ian Lee -Ian Stapleton Cordasco -Ian Wienand -Igor Kuzmitshov -Igor Sobreira -Ikko Ashimine -Ilan Schnell -Illia Volochii -Ilya Abdolmanafi -Ilya Baryshev -Inada Naoki -Ionel Cristian Mărieș -Ionel Maries Cristian -Itamar Turner-Trauring -iTrooz -Ivan Pozdeev -J. Nick Koston -Jacob Kim -Jacob Walls -Jaime Sanz -Jake Lishman -jakirkham -Jakub Kuczys -Jakub Stasiak -Jakub Vysoky -Jakub Wilk -James -James Cleveland -James Curtin -James Firth -James Gerity -James Polley -Jan Pokorný -Jannis Leidel -Jarek Potiuk -jarondl -Jason Curtis -Jason R. Coombs -JasonMo -JasonMo1 -Jay Graves -Jean Abou Samra -Jean-Christophe Fillion-Robin -Jeff Barber -Jeff Dairiki -Jeff Widman -Jelmer Vernooij -jenix21 -Jeremy Fleischman -Jeremy Stanley -Jeremy Zafran -Jesse Rittner -Jiashuo Li -Jim Fisher -Jim Garrison -Jinzhe Zeng -Jiun Bae -Jivan Amara -Joa -Joe Bylund -Joe Michelini -Johannes Altmanninger -John Paton -John Sirois -John T. Wodder II -John-Scott Atlakson -johnthagen -Jon Banafato -Jon Dufresne -Jon Parise -Jonas Nockert -Jonathan Herbert -Joonatan Partanen -Joost Molenaar -Jorge Niedbalski -Joseph Bylund -Joseph Long -Josh Bronson -Josh Cannon -Josh Hansen -Josh Schneier -Joshua -JoshuaPerdue -Jost Migenda -Juan Luis Cano Rodríguez -Juanjo Bazán -Judah Rand -Julian Berman -Julian Gethmann -Julien Demoor -Julien Stephan -July Tikhonov -Jussi Kukkonen -Justin van Heek -jwg4 -Jyrki Pulliainen -Kai Chen -Kai Mueller -Kamal Bin Mustafa -Karolina Surma -kasium -kaustav haldar -Kaz Nishimura -keanemind -Keith Maxwell -Kelsey Hightower -Kenneth Belitzky -Kenneth Reitz -Kevin Burke -Kevin Carter -Kevin Frommelt -Kevin R Patterson -Kevin Turcios -Kexuan Sun -Kit Randel -Klaas van Schelven -KOLANICH -konstin -kpinc -Krishan Bhasin -Krishna Oza -Kumar McMillan -Kuntal Majumder -Kurt McKee -Kyle Persohn -lakshmanaram -Laszlo Kiss-Kollar -Laurent Bristiel -Laurent LAPORTE -Laurie O -Laurie Opperman -layday -Leon Sasson -Lev Givon -Lincoln de Sousa -Lipis -lorddavidiii -Loren Carvalho -Louis Liu -Lucas Cimon -Ludovic Gasc -Luis Carlos -Luis Medel -Lukas Geiger -Lukas Juhrich -Luke Macken -Luo Jiebin -luojiebin -luz.paz -László Kiss Kollár -M00nL1ght -MajorTanya -Malcolm Smith -Marc Abramowitz -Marc Tamlyn -Marcus Smith -Mariatta -Mark Kohler -Mark McLoughlin -Mark Williams -Markus Hametner -Martey Dodoo -Martin Fischer -Martin Häcker -Martin Pavlasek -Masaki -Masklinn -Matej Stuchlik -Mateusz Sokół -Mathew Jennings -Mathieu Bridon -Mathieu Kniewallner -Matt Bacchi -Matt Good -Matt Maker -Matt Robenolt -Matt Wozniski -matthew -Matthew Einhorn -Matthew Feickert -Matthew Gilliard -Matthew Hughes -Matthew Iversen -Matthew Treinish -Matthew Trumbell -Matthew Willson -Matthias Bussonnier -mattip -Maurits van Rees -Max W Chase -Maxim Kurnikov -Maxime Rouyrre -mayeut -mbaluna -Md Sujauddin Sekh -mdebi -Meet Vasita -memoselyk -meowmeowcat -Michael -Michael Aquilina -Michael E. Karpeles -Michael Klich -Michael Mintz -Michael Williamson -michaelpacer -Michał Górny -Mickaël Schoentgen -Miguel Araujo Perez -Mihir Singh -Mike -Mike Hendricks -Min RK -MinRK -Miro Hrončok -Mohsen Fooladnezhad -Monica Baluna -montefra -Monty Taylor -morotti -mrKazzila -Muha Ajjan -MUTHUSRIHEMADHARSHINI S A -Nadav Wexler -Nahuel Ambrosini -Nate Coraor -Nate Prewitt -Nathan Houghton -Nathaniel J. Smith -Nehal J Wani -Neil Botelho -Nguyễn Gia Phong -Nicholas Serra -Nick Coghlan -Nick Stenning -Nick Timkovich -Nicolas Bock -Nicole Harris -Nikhil Benesch -Nikhil Ladha -Nikita Chepanov -Nikolay Korolev -Nipunn Koorapati -Nitesh Sharma -Niyas Sait -Noah -Noah Gorny -Nok Lam Chan -Norbert Manthey -Nothing-991 -Nowell Strite -NtaleGrey -nucccc -nvdv -OBITORASU -Ofek Lev -ofrinevo -Oleg Burnaev -Oliver Freund -Oliver Jeeves -Oliver Mannion -Oliver Tonnhofer -Olivier Girardot -Olivier Grisel -Ollie Rutherfurd -Omar Abdalgwad -OMOTO Kenji -Omry Yadan -onlinejudge95 -Oren Held -Oscar Benjamin -oxygen dioxide -Oz N Tiram -Pachwenko -Paresh Joshi -Patrick Dubroy -Patrick Jenkins -Patrick Lawson -patricktokeeffe -Patrik Kopkan -Paul Ganssle -Paul Kehrer -Paul Moore -Paul Nasrat -Paul Oswald -Paul van der Linden -Paulus Schoutsen -Pavel Safronov -Pavithra Eswaramoorthy -Pawel Jasinski -Paweł Szramowski -Pekka Klärck -Peter Gessler -Peter Lisák -Peter Shen -Peter Waller -Petr Viktorin -petr-tik -Phaneendra Chiruvella -Phil Elson -Phil Freo -Phil Pennock -Phil Whelan -Philip Jägenstedt -Philip Molloy -Philippe Ombredanne -Pi Delport -Pierre-Yves Rofes -Pieter Degroote -pip -Prabakaran Kumaresshan -Prabhjyotsing Surjit Singh Sodhi -Prabhu Marappan -Pradyun Gedam -Prashant Sharma -Pratik Mallya -pre-commit-ci[bot] -Preet Thakkar -Preston Holmes -Przemek Wrzos -Pulkit Goyal -q0w -Qiangning Hong -Qiming Xu -qraqras -Quentin Lee -Quentin Pradet -R. David Murray -Rafael Caricio -RAHUL KUMAR -rahulkotargasthi -Ralf Schmitt -Ran Benita -Randy Döring -Razzi Abuissa -rdb -Reece Dunham -Remi Rampin -Rene Dudfield -Riccardo Magliocchetti -Riccardo Schirone -Richard Jones -Richard Si -Ricky Ng-Adam -Rishi -rmorotti -RobberPhex -Robert Collins -Robert McGibbon -Robert Pollak -Robert T. McGibbon -robin elisha robinson -Rodney, Tiara -Roey Berman -Rohan Jain -Roman Bogorodskiy -Roman Donchenko -Romuald Brunet -ronaudinho -Ronny Pfannschmidt -Rory McCann -Ross Brattain -Roy Wellington Ⅳ -RoyS -Ruairidh MacLeod -Russell Keith-Magee -Ryan Shepherd -Ryan Wooden -ryneeverett -Ryuma Asai -S. Guliaev -Sachi King -Sai Sridhar Tarra -Salvatore Rinchiera -sandeepkiran-js -Sander Van Balen -Savio Jomton -schlamar -Scott Kitterman -Sean -seanj -Sebastian Höffner -Sebastian Jordan -Sebastian Schaetz -Segev Finer -SeongSoo Cho -Sepehr Rasouli -sepehrrasooli -Sergey Vasilyev -Seth Michael Larson -Seth Woodworth -Shahar Epstein -Shantanu -shenxianpeng -shireenrao -Shivam Shrey -Shivansh-007 -Shixian Sheng -Shlomi Fish -Shovan Maity -Shubham Nagure -Simeon Visser -Simon Cross -Simon Pichugin -sinoroc -sinscary -snook92 -socketubs -Sorin Sbarnea -Srinivas Nyayapati -Srishti Hegde -Stavros Korokithakis -Stefan Scherfke -Stefano Rivera -Stephan Erb -Stephane Chazelas -Stephen Payne -Stephen Rosen -stepshal -Steve (Gadget) Barnes -Steve Barnes -Steve Dower -Steve Kowalik -Steven Myint -Steven Silvester -stonebig -studioj -Stéphane Bidoul -Stéphane Bidoul (ACSONE) -Stéphane Klein -Sumana Harihareswara -Surbhi Sharma -Sviatoslav Sydorenko -Sviatoslav Sydorenko (Святослав Сидоренко) -Swat009 -Sylvain -S​age Abdullah -Takayuki SHIMIZUKAWA -Taneli Hukkinen -tbeswick -Terrance -Thiago -Thijs Triemstra -Thomas Fenzl -Thomas Grainger -Thomas Guettler -Thomas Johansson -Thomas Kluyver -Thomas Smith -Thomas VINCENT -Tim D. Smith -Tim Gates -Tim Harder -Tim Heap -tim smith -tinruufu -Tobias Hermann -Tom Forbes -Tom Freudenheim -Tom V -Tomas Hrnciar -Tomas Orsava -Tomer Chachamu -Tommi Enenkel | AnB -Tomáš Hrnčiar -Tony Beswick -Tony Narlock -Tony Zhaocheng Tan -TonyBeswick -toonarmycaptain -Toshio Kuratomi -toxinu -Travis Swicegood -Tushar Sadhwani -Tzu-ping Chung -Valentin Haenel -Victor Stinner -victorvpaulo -Vikram - Google -Viktor Szépe -Ville Skyttä -Vinay Sajip -Vincent Fazio -Vincent Philippon -Vinicyus Macedo -Vipul Kumar -Vitaly Babiy -Vladimir Fokow -Vladimir Rutsky -W. Trevor King -Weida Hong -Wil Tan -Wilfred Hughes -William Edwards -William ML Leslie -William T Olson -William Woodruff -Wilson Mo -wim glenn -Winson Luk -Wolfgang Maier -Wu Zhenyu -XAMES3 -Xavier Fernandez -Xianpeng Shen -xoviat -xtreak -YAMAMOTO Takashi -Yash -Yashraj -Yen Chi Hsuan -Yeray Diaz Diaz -Youngkwang Yang -Yoval P -Yu Jian -Yuan Jing Vincent Yan -Yuki Kobayashi -Yusuke Hayashi -Zachary Ware -zackzack38 -Zearin -Zhiping Deng -ziebam -Zvezdan Petkovic -Łukasz Langa -Роман Донченко -Семён Марьясин diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/LICENSE.txt b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/LICENSE.txt deleted file mode 100755 index 8e7b65e..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2008-present The pip developers (see AUTHORS.txt file) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt deleted file mode 100755 index d8b3b56..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2012-2021 Eric Larson - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/certifi/LICENSE b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/certifi/LICENSE deleted file mode 100755 index 62b076c..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/certifi/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -This package contains a modified version of ca-bundle.crt: - -ca-bundle.crt -- Bundle of CA Root Certificates - -This is a bundle of X.509 certificates of public Certificate Authorities -(CA). These were automatically extracted from Mozilla's root certificates -file (certdata.txt). This file can be found in the mozilla source tree: -https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt -It contains the certificates in PEM format and therefore -can be directly used with curl / libcurl / php_curl, or with -an Apache+mod_ssl webserver for SSL client authentication. -Just configure this file as the SSLCACertificateFile.# - -***** BEGIN LICENSE BLOCK ***** -This Source Code Form is subject to the terms of the Mozilla Public License, -v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain -one at http://mozilla.org/MPL/2.0/. - -***** END LICENSE BLOCK ***** -@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $ diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt deleted file mode 100755 index c31ac56..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt +++ /dev/null @@ -1,284 +0,0 @@ -A. HISTORY OF THE SOFTWARE -========================== - -Python was created in the early 1990s by Guido van Rossum at Stichting -Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands -as a successor of a language called ABC. Guido remains Python's -principal author, although it includes many contributions from others. - -In 1995, Guido continued his work on Python at the Corporation for -National Research Initiatives (CNRI, see http://www.cnri.reston.va.us) -in Reston, Virginia where he released several versions of the -software. - -In May 2000, Guido and the Python core development team moved to -BeOpen.com to form the BeOpen PythonLabs team. In October of the same -year, the PythonLabs team moved to Digital Creations (now Zope -Corporation, see http://www.zope.com). In 2001, the Python Software -Foundation (PSF, see http://www.python.org/psf/) was formed, a -non-profit organization created specifically to own Python-related -Intellectual Property. Zope Corporation is a sponsoring member of -the PSF. - -All Python releases are Open Source (see http://www.opensource.org for -the Open Source Definition). Historically, most, but not all, Python -releases have also been GPL-compatible; the table below summarizes -the various releases. - - Release Derived Year Owner GPL- - from compatible? (1) - - 0.9.0 thru 1.2 1991-1995 CWI yes - 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes - 1.6 1.5.2 2000 CNRI no - 2.0 1.6 2000 BeOpen.com no - 1.6.1 1.6 2001 CNRI yes (2) - 2.1 2.0+1.6.1 2001 PSF no - 2.0.1 2.0+1.6.1 2001 PSF yes - 2.1.1 2.1+2.0.1 2001 PSF yes - 2.2 2.1.1 2001 PSF yes - 2.1.2 2.1.1 2002 PSF yes - 2.1.3 2.1.2 2002 PSF yes - 2.2.1 2.2 2002 PSF yes - 2.2.2 2.2.1 2002 PSF yes - 2.2.3 2.2.2 2003 PSF yes - 2.3 2.2.2 2002-2003 PSF yes - 2.3.1 2.3 2002-2003 PSF yes - 2.3.2 2.3.1 2002-2003 PSF yes - 2.3.3 2.3.2 2002-2003 PSF yes - 2.3.4 2.3.3 2004 PSF yes - 2.3.5 2.3.4 2005 PSF yes - 2.4 2.3 2004 PSF yes - 2.4.1 2.4 2005 PSF yes - 2.4.2 2.4.1 2005 PSF yes - 2.4.3 2.4.2 2006 PSF yes - 2.4.4 2.4.3 2006 PSF yes - 2.5 2.4 2006 PSF yes - 2.5.1 2.5 2007 PSF yes - 2.5.2 2.5.1 2008 PSF yes - 2.5.3 2.5.2 2008 PSF yes - 2.6 2.5 2008 PSF yes - 2.6.1 2.6 2008 PSF yes - 2.6.2 2.6.1 2009 PSF yes - 2.6.3 2.6.2 2009 PSF yes - 2.6.4 2.6.3 2009 PSF yes - 2.6.5 2.6.4 2010 PSF yes - 3.0 2.6 2008 PSF yes - 3.0.1 3.0 2009 PSF yes - 3.1 3.0.1 2009 PSF yes - 3.1.1 3.1 2009 PSF yes - 3.1.2 3.1 2010 PSF yes - 3.2 3.1 2010 PSF yes - -Footnotes: - -(1) GPL-compatible doesn't mean that we're distributing Python under - the GPL. All Python licenses, unlike the GPL, let you distribute - a modified version without making your changes open source. The - GPL-compatible licenses make it possible to combine Python with - other software that is released under the GPL; the others don't. - -(2) According to Richard Stallman, 1.6.1 is not GPL-compatible, - because its license has a choice of law clause. According to - CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1 - is "not incompatible" with the GPL. - -Thanks to the many outside volunteers who have worked under Guido's -direction to make these releases possible. - - -B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON -=============================================================== - -PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 --------------------------------------------- - -1. This LICENSE AGREEMENT is between the Python Software Foundation -("PSF"), and the Individual or Organization ("Licensee") accessing and -otherwise using this software ("Python") in source or binary form and -its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby -grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, -analyze, test, perform and/or display publicly, prepare derivative works, -distribute, and otherwise use Python alone or in any derivative version, -provided, however, that PSF's License Agreement and PSF's notice of copyright, -i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 -Python Software Foundation; All Rights Reserved" are retained in Python alone or -in any derivative version prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python. - -4. PSF is making Python available to Licensee on an "AS IS" -basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any -relationship of agency, partnership, or joint venture between PSF and -Licensee. This License Agreement does not grant permission to use PSF -trademarks or trade name in a trademark sense to endorse or promote -products or services of Licensee, or any third party. - -8. By copying, installing or otherwise using Python, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0 -------------------------------------------- - -BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1 - -1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an -office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the -Individual or Organization ("Licensee") accessing and otherwise using -this software in source or binary form and its associated -documentation ("the Software"). - -2. Subject to the terms and conditions of this BeOpen Python License -Agreement, BeOpen hereby grants Licensee a non-exclusive, -royalty-free, world-wide license to reproduce, analyze, test, perform -and/or display publicly, prepare derivative works, distribute, and -otherwise use the Software alone or in any derivative version, -provided, however, that the BeOpen Python License is retained in the -Software, alone or in any derivative version prepared by Licensee. - -3. BeOpen is making the Software available to Licensee on an "AS IS" -basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE -SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS -AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY -DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -5. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -6. This License Agreement shall be governed by and interpreted in all -respects by the law of the State of California, excluding conflict of -law provisions. Nothing in this License Agreement shall be deemed to -create any relationship of agency, partnership, or joint venture -between BeOpen and Licensee. This License Agreement does not grant -permission to use BeOpen trademarks or trade names in a trademark -sense to endorse or promote products or services of Licensee, or any -third party. As an exception, the "BeOpen Python" logos available at -http://www.pythonlabs.com/logos.html may be used according to the -permissions granted on that web page. - -7. By copying, installing or otherwise using the software, Licensee -agrees to be bound by the terms and conditions of this License -Agreement. - - -CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1 ---------------------------------------- - -1. This LICENSE AGREEMENT is between the Corporation for National -Research Initiatives, having an office at 1895 Preston White Drive, -Reston, VA 20191 ("CNRI"), and the Individual or Organization -("Licensee") accessing and otherwise using Python 1.6.1 software in -source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, CNRI -hereby grants Licensee a nonexclusive, royalty-free, world-wide -license to reproduce, analyze, test, perform and/or display publicly, -prepare derivative works, distribute, and otherwise use Python 1.6.1 -alone or in any derivative version, provided, however, that CNRI's -License Agreement and CNRI's notice of copyright, i.e., "Copyright (c) -1995-2001 Corporation for National Research Initiatives; All Rights -Reserved" are retained in Python 1.6.1 alone or in any derivative -version prepared by Licensee. Alternately, in lieu of CNRI's License -Agreement, Licensee may substitute the following text (omitting the -quotes): "Python 1.6.1 is made available subject to the terms and -conditions in CNRI's License Agreement. This Agreement together with -Python 1.6.1 may be located on the Internet using the following -unique, persistent identifier (known as a handle): 1895.22/1013. This -Agreement may also be obtained from a proxy server on the Internet -using the following URL: http://hdl.handle.net/1895.22/1013". - -3. In the event Licensee prepares a derivative work that is based on -or incorporates Python 1.6.1 or any part thereof, and wants to make -the derivative work available to others as provided herein, then -Licensee hereby agrees to include in any such work a brief summary of -the changes made to Python 1.6.1. - -4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS" -basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND -DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS -FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT -INFRINGE ANY THIRD PARTY RIGHTS. - -5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON -1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS -A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1, -OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material -breach of its terms and conditions. - -7. This License Agreement shall be governed by the federal -intellectual property law of the United States, including without -limitation the federal copyright law, and, to the extent such -U.S. federal law does not apply, by the law of the Commonwealth of -Virginia, excluding Virginia's conflict of law provisions. -Notwithstanding the foregoing, with regard to derivative works based -on Python 1.6.1 that incorporate non-separable material that was -previously distributed under the GNU General Public License (GPL), the -law of the Commonwealth of Virginia shall govern this License -Agreement only as to issues arising under or with respect to -Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this -License Agreement shall be deemed to create any relationship of -agency, partnership, or joint venture between CNRI and Licensee. This -License Agreement does not grant permission to use CNRI trademarks or -trade name in a trademark sense to endorse or promote products or -services of Licensee, or any third party. - -8. By clicking on the "ACCEPT" button where indicated, or by copying, -installing or otherwise using Python 1.6.1, Licensee agrees to be -bound by the terms and conditions of this License Agreement. - - ACCEPT - - -CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2 --------------------------------------------------- - -Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam, -The Netherlands. All rights reserved. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the name of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior -permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/distro/LICENSE b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/distro/LICENSE deleted file mode 100755 index e06d208..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/distro/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md deleted file mode 100755 index f706835..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md +++ /dev/null @@ -1,31 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2013-2026, Kim Davies and contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/msgpack/COPYING b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/msgpack/COPYING deleted file mode 100755 index f067af3..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/msgpack/COPYING +++ /dev/null @@ -1,14 +0,0 @@ -Copyright (C) 2008-2011 INADA Naoki - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE deleted file mode 100755 index 6f62d44..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE +++ /dev/null @@ -1,3 +0,0 @@ -This software is made available under the terms of *either* of the licenses -found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made -under the terms of *both* these licenses. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE deleted file mode 100755 index f433b1a..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE +++ /dev/null @@ -1,177 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD deleted file mode 100755 index 42ce7b7..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) Donald Stufft and individual contributors. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE deleted file mode 100755 index 1bb5a44..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE +++ /dev/null @@ -1,17 +0,0 @@ -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to -deal in the Software without restriction, including without limitation the -rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -sell copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -IN THE SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE deleted file mode 100755 index f35fed9..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2010-202x The platformdirs developers - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pygments/LICENSE b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pygments/LICENSE deleted file mode 100755 index 446a1a8..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pygments/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2006-2022 by the respective authors (see AUTHORS file). -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE deleted file mode 100755 index b0ae9db..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2017 Thomas Kluyver - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/requests/LICENSE b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/requests/LICENSE deleted file mode 100755 index 67db858..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/requests/LICENSE +++ /dev/null @@ -1,175 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE deleted file mode 100755 index b907776..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ -Copyright (c) 2018, Tzu-ping Chung - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/rich/LICENSE b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/rich/LICENSE deleted file mode 100755 index 4415505..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/rich/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2020 Will McGugan - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/tomli/LICENSE b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/tomli/LICENSE deleted file mode 100755 index e859590..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/tomli/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 Taneli Hukkinen - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE deleted file mode 100755 index e859590..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 Taneli Hukkinen - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/truststore/LICENSE b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/truststore/LICENSE deleted file mode 100755 index 7ec568c..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/truststore/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2022 Seth Michael Larson - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt b/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt deleted file mode 100755 index e6183d0..0000000 --- a/venv/lib/python3.11/site-packages/pip-26.2.1.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2008-2020 Andrey Petrov and contributors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/venv/lib/python3.11/site-packages/pip/__init__.py b/venv/lib/python3.11/site-packages/pip/__init__.py deleted file mode 100755 index 451ca2f..0000000 --- a/venv/lib/python3.11/site-packages/pip/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -from __future__ import annotations - -__version__ = "26.2.1" - - -def main(args: list[str] | None = None) -> int: - """This is an internal API only meant for use by pip's own console scripts. - - For additional details, see https://github.com/pypa/pip/issues/7498. - """ - from pip._internal.utils.entrypoints import _wrapper - - return _wrapper(args) diff --git a/venv/lib/python3.11/site-packages/pip/__main__.py b/venv/lib/python3.11/site-packages/pip/__main__.py deleted file mode 100755 index 094361c..0000000 --- a/venv/lib/python3.11/site-packages/pip/__main__.py +++ /dev/null @@ -1,24 +0,0 @@ -import os -import sys - -# Remove '' and current working directory from the first entry -# of sys.path, if present to avoid using current directory -# in pip commands check, freeze, install, list and show, -# when invoked as python -m pip -if sys.path[0] in ("", os.getcwd()): - sys.path.pop(0) - -# If we are running from a wheel, add the wheel to sys.path -# This allows the usage python pip-*.whl/pip install pip-*.whl -if not __spec__ or __spec__.parent == "": - # __file__ is pip-*.whl/pip/__main__.py - # first dirname call strips of '/__main__.py', second strips off '/pip' - # Resulting path is the name of the wheel itself - # Add that to sys.path so we can import pip - path = os.path.dirname(os.path.dirname(__file__)) - sys.path.insert(0, path) - -if __name__ == "__main__": - from pip._internal.cli.main import main as _main - - sys.exit(_main()) diff --git a/venv/lib/python3.11/site-packages/pip/__pip-runner__.py b/venv/lib/python3.11/site-packages/pip/__pip-runner__.py deleted file mode 100755 index a1aee81..0000000 --- a/venv/lib/python3.11/site-packages/pip/__pip-runner__.py +++ /dev/null @@ -1,50 +0,0 @@ -"""Execute exactly this copy of pip, within a different environment. - -This file is named as it is, to ensure that this module can't be imported via -an import statement. -""" - -# /!\ This version compatibility check section must be Python 2 compatible. /!\ - -import sys - -# Copied from pyproject.toml -PYTHON_REQUIRES = (3, 10) - - -def version_str(version): # type: ignore - return ".".join(str(v) for v in version) - - -if sys.version_info[:2] < PYTHON_REQUIRES: - raise SystemExit( - "This version of pip does not support python {} (requires >={}).".format( - version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES) - ) - ) - -# From here on, we can use Python 3 features, but the syntax must remain -# Python 2 compatible. - -import runpy # noqa: E402 -from importlib.machinery import PathFinder # noqa: E402 -from os.path import dirname # noqa: E402 - -PIP_SOURCES_ROOT = dirname(dirname(__file__)) - - -class PipImportRedirectingFinder: - @classmethod - def find_spec(self, fullname, path=None, target=None): # type: ignore - if fullname != "pip": - return None - - spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target) - assert spec, (PIP_SOURCES_ROOT, fullname) - return spec - - -sys.meta_path.insert(0, PipImportRedirectingFinder()) - -assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module" -runpy.run_module("pip", run_name="__main__", alter_sys=True) diff --git a/venv/lib/python3.11/site-packages/pip/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index f367e03f97334cd72de3d4e30b4b8a12aed1bcd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 735 zcmaJ;L5mYH6i#NQ-R_JPMG*925J3t$p}V48k%}OS9*Ur+iVWFKw#_<|3`wR-mkN9E zpy0uSu;33+#6Q!M$eb2Dc`NkRlP_I%(Tk6l%uD9I@B7}%*Jd+BU_U;6-W_0se!0Vm z`NsiX5C{%Yic*}R9QQFssn_??^)yTyZ)<%&^`E0w^xLJka1}8rm1R~aY4+RGbTWIN6?%LKN2xQG1dMK) zF#|0MYvM2@V2>b`rKxbO08q*;6PdX|4CiEIZDHZ%8*?K?K{faW7YCnenbZ4@dW)=00q5A7lIzU7h{w UM`te{MDzL@zC1_&+g1dB0KXN)mjD0& diff --git a/venv/lib/python3.11/site-packages/pip/__pycache__/__main__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/__pycache__/__main__.cpython-311.pyc deleted file mode 100755 index d94b105c924c3ad4f2d98c82851bd7c0d118a0a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 914 zcma)4%WD%s82@H>@@O9QQKF=+Ab4pG&C(YwD2Ae7k!lW73b`!X>@?kUv%BoB)!0ic zL8BC0A)pk&o~qJ+W>bQMITbv43-s2LGf6ijH@|s(-+YhXZ$9QnG8qFVzne$pvIy{p z8-awbl#6!=;0vgrA{`3-6BQ6aWg!SvAswio3IY(|)%tS6j?=(^ZD9}W$>H2%Ja7&v zDx5IXQ?~kofQ0Ng36;aajVkQ+@a<;|ZNTI>68MMD|A>f=;*DAbVTAG6aP2@>fe0sz z$LW9z;~Z1PE0%Xz|F9mfBnn9ctV5_g9%M2rIohRBbi_LUqPH@kzdY$V1sav*ilP~^ zoIwQHPc?hXx?h+BN6QqeLk9`9JBD9bc#DK;@&8c{XdP%4DGwl$q_ zmu5J`cKHqWu$xx~Y?YQ51-0FKmG8msmD-n>`!>}K`zeskZydCwR5>@e@z z`}Ko$@5bAFJzvXrqY%B`g)q9~tu%ATTW1q9{=`f-28r>*qnC{?3e{`PXMD0<1t+CPA Z_^^4n*}|zdPWi#?MgUK;JUhjn_YcOQ(U<@L diff --git a/venv/lib/python3.11/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc deleted file mode 100755 index ad5ce97687090d66c7e8a7a5e5d889b3b8e63bd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2506 zcmaJ?%}*Og6rb5$f3Cp=;=efoKnUOtT zGp8Ff+n`vL$W`F}ex3up)#g5Isln;7e z)}ITc0+{;Y&jxdRipK~f^7JF2_LJ?iR0o6ZAvv&)Nut%YoZr(IZD6;6z!7U(wK)eP0@gg(psDwU2?GbCgKZpuD zeuxvt&~uE@w>>ffnRq;kZPqaLC}T5;4{W?> z&?^*#!%vfQT8<=hlAhL*542hBT2jjAlZz1JWL9~c%ooi$O}&;F7)Tn5N#c1ay&%mJ zBMFz26h)wMy`ZW@7sW)rco-O(B`R6U>%+_MEE3&NG*tw(iJ`2Pma@ihqPb52Xj}&J z7t}RWiNv67KKbF!CjS2Jv%BuRl^y^ucw%$&nxaDQJCbkEAP71S)aF}s>Qn;-ym0}@ z8mjS~-`)7;hAVRG9`w~n%mT{CEIwA@VtNPg?a{a_-*iBAB9VaPH#&DCI-9M@1M;*vc5s*sKrlQWeipJ9vij4w^(uJi71Aq*qm<30r z&QMUaf@i)7q!Kn;WX$3c+x~P{xe{lbcz{~DN;t!`8~YTOI53tOw^=|)l+|fMumc$g zhiK$U+U}YhofM}h9!=dDnHHxeCT5}@n=?o@WBW6OY?g+~=JF6h+iObtEHPmh&KcAv zffnb!^*)#`U;OWYB$^uE15RTU$QpXXN6Lj={%nOmTZ{CT2mcJ8w!#;-?!QXjtR!yz zcBvX3wZfwtTrC`__y?f9I(2EsUpYBY^$%Fi0_<$?4qU*+aWLI4iqvFLw1cAP<`)=; zMDa;Ma-4w~pUz5#kt6V)WXJHIkt4$O4UDC==IN?4UQbUQHOM}T zyeHPb_}8i{jtZd$l(jT?#KPPTPkugge_~vm8hQ9=bZTVUd3JWF@ema?quIgfq5-*d zWJxh?Z${H|l4*NDc)n;y-0TafCXtiUkm-qDbkX9|j08o19yxM|=6F%m>5toqlpTOz zN}`JrMKy?S>gOqMklKCZ%LU3!AGQOjfKfecWG&RY zF}BHCeV2E-ci!FUw)$e#P}~Z|cUE>*e!W>uj# int: - """This is preserved for old console scripts that may still be referencing - it. - - For additional details, see https://github.com/pypa/pip/issues/7498. - """ - from pip._internal.utils.entrypoints import _wrapper - - return _wrapper(args) diff --git a/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index f713c067f44d4e30ef3879df0ad11870b032a1f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 849 zcmaKqF^dyH6o6-TH!&tTQMb~@L9Pkt4#x@RL{iBW76H*JBFkiVvYB&tXPKEqA`z~z zP_VEN1PjX(xjz%(5ZUU$$}W&DjlRi|;DPvf`}Vz^H*dc;Z@z48)e*?|51$TxV}yR% zU@h*MgBSbYd_*ydaf&kB!`S*x>SS)u#mGV2J@D3>j=(uy2M97R#`U=Ny3(t}?qk$y z{IY8;TsByqOT&zixrWdSQ<-#2kEuj2FQ-DAr`o7zWJm9efjyxP-p^LD6Y90^Oy{zA~KCh1T-?`L`O;# zMiVn+hGc9)v=M1a`kW{};ELyw$dft&5hkdwoP8+4;#k;@SW04Um`L?4qB$o+V+wtb z(nOfys2@Z!qs63Pv=9XqT93GvMZs0eDQ`e#5JK}@LGfS& zG&v@4`m{EDb%E6o{woN`ha1EGT#k$ zcBmGH-!546oF%|x(KbJ%A-KYXVNgs;FJmHCTTtKrRNI3;MDr%9?9IIP-+J2c-?ZO9 zc-wi`nR(Y1kOysbTizLE6+(5vnwnjxmh~_kj9|(<43!;g>Hni?WiMLUT+zUdNni{s zl&?r#vbCCEmbLqtj7KT&C?7&Qd>w+ByBOmi=;rLao}%s9d7ak~zIy1Lpex^ye}eoO P^5@kWzCK6)Gb?~U#ChX3 diff --git a/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc deleted file mode 100755 index f05a243c1244abae1fee70fcf4f6ac1846fefc2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14140 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 IAtoLEAIOdE@&Et; diff --git a/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc deleted file mode 100755 index 9b90ec6b3dd8c62d2d7510456335cd2ed0622eed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20402 zcmch9du$xnx!=sbxa2Om%jc35A0s|Ytt2iOrDNul} z6TlFPw!iPp?(EER6)XLt!{Ik)&YU@O9^dwF<10>eq>EkMlWtsH3D0cBWCbhZPIzZ4Co5;G zCac)JC*hm*Px@!8C#%_gMWSXlFd1NJZz4EbJ6SthH(AH-D--pz4U-KlU6p8@ZJKPF z4NZo4PI6vrE;Mtp*}+LwqEBl1(7|yZ;omqWTcujrA^MZNSUtH*teI>>xsVtTgJP{% zC)R)5@Sz*!@t-f>F126lDBL04X-Nx~^lnSKtB{^{Pj;8QW39`4f7&_OgLX7Xy&qy! zKf=FpOgh%u}h$bQNNXlA4Og(vm3LjHj;(F{6@x;kvYdLSv{A zHOyX#CkrLw={^OGm}2ePlTSqG(_vP-9FHZ_)Cxg~Cub6pa5E)i1SDljj-#3x;pSCI zM$@lS#nwLJi~X!|!dxsa3sdyzX*o4p^*b8SFt7V!$z&?c21FUdz4sjYAG?x}!VcXz zoLtZ=#-y8<7Ut-_&NhCdvYe9j-L||l7?9Jc`Gh!@N}rN0redNbqSA`k+?*Jf71UAj z;<>Sr@fRob`WY!5O{At`2`MTir&1!ifufbjzL=Vskz^FEl9I~2EJg9I?vj%8v%2d- zJSk=>=Hhdacru>xQi6I+HQ$hA1@o%Au1bkH-8HXBvhJBlq^`sgx=V?tCEY0{Z)7R} zFeY-?t-D^B7=2#%oV_@HYWSk=nmBi9RCkV!UDhiAqL+uC*IhIRx>HG`Dj7&3C#Otg z!~nYR@8mfC%Oxc4a*NzLt~-wpk@b<8y>6|+%mqVm*irWu)n^i_Sr7@)X(tOR2_$!A zhM$dH2mUd9BTP`@3NSV;$kI$q7J;makeU{h)Vw?;341UQaXFP_6p)e`HivaS`jGF> zIQsj;PTieI-NYbP$kJRQHYMqPS(;7Vkmh7*I{r$Smv^Bp3iU>KczNI|h-Y9nCQqdX z&ZlNl2L~|e12^!Efkgbuz}!OmYASg!GBh+mQ_(*co4O9_QwA`D1JQUASeJ|?252r# z3XRMy=z(Z5CC|nZ@r)FuxsZGDxkL2bBLGX>17F~+W4DjJd3@#gmalWu*SYRopUC>c znlHRGlJf<&d~KV)wzW%HUzg_VVp&TUzQn8C!^#9k=R26%m&?!T_fQB7onPc`@N%Q* zSmb_&k$=y5i%(l-aFMsq#Sc;bku&VF&oJi9J@$}~WG-Kj76dURDFTR*CN3QVml2Ux zq`4UQ6&OW%LR6?w`Xexw3-3cJAk>NiCdjo z8_N3HHD9~xYL}ltoevwu_*D8kMCkhkbBbP`!XxvbPB6OrJ$glR^af|0lWXSufTocC z$h;rn?6i1`OA`&}k87yYIMyw>g*=W+Gc~}tzve0Ar)vr+j2d-8Fw9 zy~x?}tId3VhPOR2$9K`O=$vuHNuayOY(z_wQBREc+eqByX21|%?!)jG>cq8(6y=%f zBA+&=v~(hW>{!_|!Tk~}R(GTn-8C0WU)5dLQt_l7I6Xdg=G@unso{yyvEgS&A&DH3 zLHQuQXr-iwRmTaJA@=8<$?PN9XJd6yLzOtr1fudxq*(Y2Rdg6&iQDEJyF5jZ8$9$6 z94i%X`EUDIFTHmn>)oe$_ia0EWf(>2PB7Vr{HqyP1c`7!u0(Zukoa)E6(nI5`2ez6 z!)0Qyka`P>?lG9XOf7&seq|2qha{^^h@b~3X{keZUkBMLa)@do-BYHS$EejC9H~&0 z_14}3%F^o+5L8nO)?#`fDc!VYC`2X#4ueC59x;~k2#Ss3U-@?c7(7Q|VD2A1p&flr z{nq8|(HFI&FR~H)f`<0@1XNcDtg5;7&ds}vZ!dmu`u+2N8OVlCYN3;=tKojju6IK} zZ+oZhzPD1|y*nDusQ-p>2A&8oL&*}d#uo4)T2eNo|RMU4QetLYC_T&U&F z%-zJ>i4Trw-N$})INLp}br1jbiEPt^)-kq#V5rETr0&RVk53qDBpyu57!W`eyLhKDz?1g`Ve0# zYBZBIcuwkgKzvH<#5E`$69rsrk-r<)I`L_-7uS06xY&nlgZK?GjBBI#jJOxqCh>&0 zAJ>q0QjFl*EDnnUxV9{Fuke$tp!ZXH^=Yea5c@lDrEdZmq10G4d8juw!irQuZ5D** z99;fEuR=(@^nZXt`t?0%kZs*Pu^dNx@j5M4>ur zTHzCgPYW>^8ej?_{2S0X@G9z)V#)%IreRXir)KF1)m3IBS(Ed13t}uCGy0FpFd7LZ zB_!ihQiPQn)4g#el^_L3cU?)P5_)9msBjHYsh zBW+4PXc(rfLpo2_RL-tf*maseb_Z<~`e@YDAs|7yD6xNbh)(ED4TU?7E7gur)>n8c zy1uroDcMQmQ_%pLP{``$KT|uAdpR%YwKPVcN zjrfjk$Yb zQJ6JgA&Op+m+g9ObQVs4>9`~ooM8Y;47J?^3ynt zXUcyB_-cuRP<^w4M0fM1w>j%=)x52$xAlRqLG=miFa2do?H$E=zpf`2Ji8Sf+YFB7 z8k+B(d;8pbQy=tv63BKO)jE!58=le{p8CS+sI7y}P+Rwf(^X#sSzliR30+;YUB$KR zUUsci=UTdOsoC}v(cyj{3?#aR#sP@e0jVqs5nSRJuqRiun9MRcQs0fU-+a?xzIN8N> zFR^*J$-UxyiMz?e4Rqvr=BhFj3R0{MKjhW;%vDKALwd(k@MSKLh&F~i?-Cu$gvTVq zjQ|#`%t=#>9)%dwfJne2TN2}Gs7Nv)Ti9ukcVm>aaD$|y>6Agq3wqT#XeqBSN1+@; zaqD~q=?!Wdm8Uv09d_z1ef~OC@FD=_5wrHH8VJ+5?{YQ})>wMm<*aPZ)rYp~`#0py9Uwx&J`1(mpKle%1)6T!*pLRZM zDfmLa1MhG`B3IFV0Y1@}?G7W8>d0!c&-~-eFDQu5e6KKLq-GTzwh9~|aOjcniNIQ$ zRrZA8%VXMCk|u#^ScK$~$kZiLDs3}r=E5xX!OCME=9s*oyIFOmvm#$d7c%wsiC`sf zg{9Xp*zt5xeeuH(sib2YzhZuFba8y1jdPn z8^R(HOC4#qKp}DNmeb0e%3JPs${OKb4&8DsI@j^7oyVfft}gN1O7o&~kuRY!Q(@vb z&{!AGrAE4_9@dPd1Z95e zDp?6ojlvbo^(hlu(LD@BV4cs;L4THX?*(bWAT!cTm{1P88H!- zLFW1x0UDJlG(Utud4@`!craTmXkz&P9Fmd$10yFK#Lg}nS<$Nsu&E%^|2a4l7$6Ul^ zvD1#pe}=biIf2Wr*C*1Z(!LY_SULAC&!VfmfwAbeT2wUWN0U3j50YWOZYDHkn6sy zF(sO}qp`>)isp?Ii;eOm3hGrziPCgzK9MHvHzr??;-!KX41y;ehY_$$3cT)~W~)&i zL(b|I`Ra{j7@8$Uy(ayl_VV;=KKMD_QMLh=xX-PmnybX>CJqJ_}pu67<%F)~)*9 z&HCQ;nQVPTtB(-f@6QFBwt`)o!LIcq+2B4cxK9o4%lYfxI)D58>dkf6x|H?r*Zlic z|9)s~EAVjM`L5>e+42r-dI#>g@5x#3G0l5S^&ZO|JWBd;zQFnmaDr}}&Uyz~CptF0 z9c%OJ(^+r7=IvJtr=dEV=!p?<;UCD%f4PC&#}Q8d--sV<<{Gt*9p#D2N(S&oJV7@9 z*S&*sbylJFD6s|Rvtku*rEJi`d>+9l?94}Q0!uN;y3jAW5=*iBIh25{g(a(=V56=_ zu#<8OuRL2QDM>7B-6HCX?JLJXNQM8pakkFQBL58-0!)cF12dR{fnbfts0nXF)yMm$ zD&fj>zmNnu|8d?WC((_u%%L-IwIzge`L$L7PJFmuz7rR}G4wK46X6)d(jm0Vl+2us zG2zPmOe9=ws2#7M3JZ@T{>9V`#_i+<-0IcF>TonQM_~+1mDFqUc?DK=i{AS_fQ`G! zl=~`y*9a^TU~9`en3`{%x|?TfEq1lU^5~zV2IX~#@N$aD{}Xou8>uF-ZKQG;}TUS1b@1dn`B$_uxhp6a^X;FDW}Bb$RG zzkczzVs>ys8=PSISe^)la}DR=e+ZHPAyfx0f>{OKnD^06&`9pLq@`!41FS=l|l$b_8MCjTr*Q>6Zrs={$sXUq86Ht8&lVx6( zDZV70?4Lzwh`az#KJ1Z5rus!V7?^>Y5_%P#zd4pUHjH%w#&S|qQ}iC9qpmXFM6qc3 z1p^`DI3|SsGUGwtLCbXyqO%Ypq`TrtxE{&VTwJ`=E3lZ!6eU+`PD<)-irbR(it!1< zLL#10Fpf-~qw~|co3*ag400*xY^h&~^8N<(DE$VH*{LtJ@7CH6ZgVx2AWi`2LZhos z-iLm3;r4~Kz(!-%KcM*sRQ~{3F`=KzSZ;jn?bp`lv!Q-1)SvZ7G=D_(N47l`)phq9 zTh@Bl>$8o$T4OJWueN8SHV0b2`1Zy1+8>YK8DAX-xz+ZtM+|&Hg?>+i%lmiP!1cSQrR} zl=M%-!Bc&XPoHW!wafikz>oB2yIiL_D?jUWQo4($bT>=)Rh{;^KO1U1?Q#Dbj~i(l z=Po>Dl(5-RsTRT&o*b{p0t&H55dkHa`8UOaJ=2S?@*7 zdr>W%hS#%&Tt|ijteD#A3Ny{;@8Wy3He(OL0GIB%Wh^Za z4rEGn4T~%7f6@z20l+g>#nm+|dp-{ll~$5}qjG5ZELk7NX1d6_`@GrMm=rO(XY|G zvSWt7&gMvNOPi~Gkh0X?9Y<-55~P=F0?xDY+P_`815>`w<@U#D6=dB`$HmIfBOM2hQpdq9H(Fxa2v$s8w~R?~IPg99bcs6$OTN-DeE$(5w;+Rh)9O#-m-*(SmWo; zJr~UfE}c1daTIKcUQa0zQM!?wPb9`Nf>}9RK)h?c1UYG zlnou$LWh_AIbY~K_q&yd9bF$<|JM3J&DZzIsgKWZ9N+XEQGG{9qF=my5t6ZXn1=wY z#xfuP1R#KytFB)@^PpqzR>$CG$6&VOfYt%!*;jdjfj7tCA9*3y(y`4|RU->v)lKe_ z<~z@*_5Jtyh#PMnxS$@maNm&j>h9COe&M%gvkjNDhD&P0rCdYXgO>K6cfQlP5xUo# zZ8@s799{LGirU6I)oU|a@QJNp|7Ng%WB%UsMk*V8MhiZpvU9tUKItqpg>fLp`s4rx zh1p_y;Q821V+fyPYqd5X$ZsuQ=sf{rJ+qwko=XDBEjDXvciJa z{8VAxPWR@Gbj2V}X5ufRSxi4x)SqnVIHtL`me_ zh`CliK@nP`uX(HHc8wZ3`Rl&l9?p8drFp-ldcT#cZQQEu+pO)|aA#{HT5V+6^B~kt zYI8QUM+-qCbymKJ6#{~gx_JdTlx+xW4dLZcSiLJ3*Fsn;*z)h+^uxTpcPi^YqWO=g z{v*YQ>%E$P&z65+(?4*}wKX`pIXL?3ncvQ52Vc+zU|YyQhBJ1wHyio(Q-nCL!b z5Qd4u)(BKP(%MbdqHta>kHjUatemhq$x3Q=!bRnH1TyoB&X0GP!O2mWjFuoIn2b#@ zjx8oE0^yxTAp9c#afweIYBjoFIEvyLwKT%;wA8Zb`nbgP26L0Mo12Spb%i}_S4v@r zNTwEOOTqDq8A+7!2~$@QBR>TxL_18dPa~$l|3oN>JqmBpr3&j_Of(vnODRdUA$52rVT_BN9QwawKZi-7LM+fDDxEWnmvKF(&0dM-7?I5)wem zY=kHfCHx1J1SQnAYqkB^+5xS0VA+ExQh&|Lk++_?{mfc#)+cB_VVm<;j`H_AhO!+8 zwT^?!QNqEpS!-deQTo|ZCfvP~me(})@zVWyv(ijnQ-;et)e z)k-sZ^r<5>+{%60+JCCe`B_EqRLJ>R$c?nks53>2mr;<_2uoWit!OM1mDutkLgdS` zZM4TYzOGi$vO4?-n&ir_yg}%3<*Cn3r+=K?lgl^k%tRikCR%hmLl|JQhLUj~L;kTb zcv=}NXF6FcdMukvUH%K)>MRl?Uj>V<*zt{9Z{w?ppP47YGo7}zW-@V?qacFDb z$<2Kyv-?hI`@pJCYyQ*lc~(+PR3(M5S%IO!EaA&cdOfVMo2fS4#k5i>u8vu$@W8>w z=wud$3t9m$@)v&#x+PjxUer0xhbyh2ci|XdW=$l4u^1x!tr7xQWCCjwkaQslxGfyGZPG z4Wt?^xTRtEIt#T}ucfXjc^^56MW@vmFVA)C-y#*+>bS-Np9je4n08#|?($F?&oK9` zD|50CYZMb^Bt%Zf5PWVpqYx=>oqH@6QLvry%-9FQ3`gBX=Hu^Zq{g5H9>7(nU6r(% zFpmvz10yh=&|BV3k85c|C2fzHh@Lw;HvatR2s~ZncQKZ?{~4v&iVsy<#FT%GyHZS{ z=o2fqI!~BFQ}o~PhlT9s)_1G6n)hrr@5wgr)tV8z=cNb-Sm7w|$Uz9Z z#rPb=RZQngaVY^;PQfChO%7oF z)~HzWTh?PQUFhCo4Jyj6@uASe(mFJniD$?(~JaN1Ft?89pA z^fdOCLwsOc3djeWfMEv8aZ!|#^e%E~PYV=lIh9CQLJ6-d2==(`i11D92*%5hFnERS zSk1r3WDaWsr4UUc7o`vOkYWSzf)QCtYdo}VECQ;5CklIKu7GqFgxM5AQzdyOl}ydX zr$}h#Uo-oJZzg9*@i*n0(P`QmV{fPViXJHObd6yhi5QmrF9CEXMuTk>GdxzbFlGds zAEeXoroGf_N$R>>#){3yd1b6iey8BT4-?D|9MUQN@DHeCygJsX>Cuc zHBYME{0SAjZ{Pc~Y8O_d9Nkqp|1Q;k;seL~6~CzYM>QL-WrY)(0B?}vsVddmiNgMF z60%st4&B+imiXlG$H%meC)K(qRe%1(qE(<_<=Wc*59Z&`Xsrj-nggmge?IWFs=g=g zbYX0KX0nI*`so{a%|vf7LmL%r0m)Brrt7qogd^q3P-L@0 zt~2Pp2u@yHJF5kHupQ8l54$Y!!zE5NyJ#Q#p}}w7P-iid>+HgnJDlE^@&$un%Y_1^_S^F4!tA z7+RHAet+nLCYO~(2qis8n#huIbh}frv!e8=Z zz&TpFmVX9N(0xp=nO;jSFf)LjqRmTq1_jQP@{AoJgFm7nJBgB5>TB;>KeILt?KkIZ zTOZMSj;TI6VP9$ft}TCf6B``%KArU+*ZjxT!ny6_{7<8lL5bE*5(i_LIf#TEGm97r zw-801nMV50uoL|~TH|oyR}S_(L0rYQGlbmxv9BmXva zbhpt_U_(T!!(M=4oEszB{^LfHpm*4q^?!?^&{PSVMa{rOnJm}6}5ii)Wz%;^MGa)rPQ0oLSsO1)0tM+8<0yaJ$m zp&4NFS$e_15n9rb-y!hl1inY$F9?v0Ad^UyKP5o?MZQIVTxfcAe#6+5lt@IQ;Qucp zm+eD2X&9qts3-xVe}xC`ezgSpG5)q4KDQT(H2|&k?z8ZEJqFzCa+A?v1O5s(cAnTl zoy!fMwH^4Y-4x`$19sH85jJZFdjvODlk8xGuXDqEVJ}R51i3p|l z$to^H6Vvnf)ga<@BxvMc5McV})AT$rMG80Dl%qsqSEgiQv$`j}K&!e27a`kAZ>HZl zGJho}BE2#tu^>yuh{5zynR`c@gr2#cr4ctV0?lxB+`c1&qm1qic-w|$P{e5MlH9}QzAb35&_~R#yW8? zrTPhs5MYElM5!kT^Z-2c9yeIdGxC4JEsuZYe*q#UiRVGPybIU?(8}@MD%WK_A8_?* z;mmQBOYASlRV}f<9M_}T&m7mOmOHWMjCTOvz7}{neviuaS)I=bxM&Hvu~zgYNn?{E6m+VQ2D9J2_d zcM}_y}$qk7g^|w92+6&$ida2f@^Apr(Sy8n+!Z1bO_Ng&jPhxOn1z RkG_0iJp270DZ;Sh{{q<>TaW+% diff --git a/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc deleted file mode 100755 index 8bdaf0bff21dd42a6f9cd5853c7bdbd6d59a58f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58817 zcmce<3v?Xkbtc%2exMs@yq^U4Xub&&Xuc^vM2atnghYZAA9_Hh!3L^Hwg{l%>V``` or ```` - if completion_type: - paths = auto_complete_paths(current, completion_type) - options = [(path, 0) for path in paths] - for option in options: - opt_label = option[0] - # append '=' to options which require args - if option[1] and option[0][:2] == "--": - opt_label += "=" - print(opt_label) - - # Complete sub-commands (unless one is already given). - if not any(name in cwords for name in subcommand.handler_map()): - for handler_name in subcommand.handler_map(): - if handler_name.startswith(current): - print(handler_name) - else: - # show main parser options only when necessary - - opts = [i.option_list for i in parser.option_groups] - opts.append(parser.option_list) - flattened_opts = chain.from_iterable(opts) - if current.startswith("-"): - for opt in flattened_opts: - if opt.help != optparse.SUPPRESS_HELP: - subcommands += opt._long_opts + opt._short_opts - else: - # get completion type given cwords and all available options - completion_type = get_path_completion_type(cwords, cword, flattened_opts) - if completion_type: - subcommands = list(auto_complete_paths(current, completion_type)) - - print(" ".join([x for x in subcommands if x.startswith(current)])) - sys.exit(1) - - -def get_path_completion_type( - cwords: list[str], cword: int, opts: Iterable[Any] -) -> str | None: - """Get the type of path completion (``file``, ``dir``, ``path`` or None) - - :param cwords: same as the environmental variable ``COMP_WORDS`` - :param cword: same as the environmental variable ``COMP_CWORD`` - :param opts: The available options to check - :return: path completion type (``file``, ``dir``, ``path`` or None) - """ - if cword < 2 or not cwords[cword - 2].startswith("-"): - return None - for opt in opts: - if opt.help == optparse.SUPPRESS_HELP: - continue - for o in str(opt).split("/"): - if cwords[cword - 2].split("=")[0] == o: - if not opt.metavar or any( - x in ("path", "file", "dir") for x in opt.metavar.split("/") - ): - return opt.metavar - return None - - -def auto_complete_paths(current: str, completion_type: str) -> Iterable[str]: - """If ``completion_type`` is ``file`` or ``path``, list all regular files - and directories starting with ``current``; otherwise only list directories - starting with ``current``. - - :param current: The word to be completed - :param completion_type: path completion type(``file``, ``path`` or ``dir``) - :return: A generator of regular files and/or directories - """ - directory, filename = os.path.split(current) - current_path = os.path.abspath(directory) - # Don't complete paths if they can't be accessed - if not os.access(current_path, os.R_OK): - return - filename = os.path.normcase(filename) - # list all files that start with ``filename`` - file_list = ( - x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename) - ) - for f in file_list: - opt = os.path.join(current_path, f) - comp_file = os.path.normcase(os.path.join(directory, f)) - # complete regular files when there is not ```` after option - # complete directories when there is ````, ```` or - # ````after option - if completion_type != "dir" and os.path.isfile(opt): - yield comp_file - elif os.path.isdir(opt): - yield os.path.join(comp_file, "") diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/base_command.py b/venv/lib/python3.11/site-packages/pip/_internal/cli/base_command.py deleted file mode 100755 index d74d192..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/cli/base_command.py +++ /dev/null @@ -1,261 +0,0 @@ -"""Base Command class, and related routines""" - -from __future__ import annotations - -import contextlib -import logging -import logging.config -import optparse -import os -import sys -import traceback -from collections.abc import Callable, Iterator -from optparse import Values - -from pip._vendor.rich import reconfigure -from pip._vendor.rich import traceback as rich_traceback - -from pip._internal.cli import cmdoptions -from pip._internal.cli.command_context import CommandContextMixIn -from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter -from pip._internal.cli.status_codes import ( - BROKEN_STDOUT, - ERROR, - PREVIOUS_BUILD_DIR_ERROR, - UNKNOWN_ERROR, - VIRTUALENV_NOT_FOUND, -) -from pip._internal.exceptions import ( - BadCommand, - CommandError, - DiagnosticPipError, - InstallationError, - NetworkConnectionError, - PreviousBuildDirError, -) -from pip._internal.utils.filesystem import check_path_owner -from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging -from pip._internal.utils.misc import get_prog, normalize_path -from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry -from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry -from pip._internal.utils.virtualenv import running_under_virtualenv - -__all__ = ["Command"] - -logger = logging.getLogger(__name__) - - -class Command(CommandContextMixIn): - usage: str = "" - ignore_require_venv: bool = False - - def __init__(self, name: str, summary: str, isolated: bool = False) -> None: - super().__init__() - - self.name = name - self.summary = summary - self.parser = ConfigOptionParser( - usage=self.usage, - prog=f"{get_prog()} {name}", - formatter=UpdatingDefaultsHelpFormatter(), - add_help_option=False, - name=name, - description=self.__doc__, - isolated=isolated, - ) - - self.tempdir_registry: TempDirRegistry | None = None - - # Commands should add options to this option group - optgroup_name = f"{self.name.capitalize()} Options" - self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name) - - # Add the general options - gen_opts = cmdoptions.make_option_group( - cmdoptions.general_group, - self.parser, - ) - self.parser.add_option_group(gen_opts) - - self.add_options() - - def add_options(self) -> None: - pass - - @contextlib.contextmanager - def pip_version_check(self, options: Values, args: list[str]) -> Iterator[None]: - """ - This is a no-op so that commands by default do not do the pip version - check. - """ - # Make sure we do the pip version check if the index_group options - # are present. - assert not hasattr(options, "no_index") - yield - - def run(self, options: Values, args: list[str]) -> int: - raise NotImplementedError - - def _run_wrapper(self, level_number: int, options: Values, args: list[str]) -> int: - def _inner_run() -> int: - with self.pip_version_check(options, args): - return self.run(options, args) - - if options.debug_mode: - rich_traceback.install(show_locals=True) - return _inner_run() - - try: - status = _inner_run() - assert isinstance(status, int) - return status - except DiagnosticPipError as exc: - logger.error("%s", exc, extra={"rich": True}) - logger.debug("Exception information:", exc_info=True) - - return ERROR - except PreviousBuildDirError as exc: - logger.critical(str(exc)) - logger.debug("Exception information:", exc_info=True) - - return PREVIOUS_BUILD_DIR_ERROR - except ( - InstallationError, - BadCommand, - NetworkConnectionError, - ) as exc: - logger.critical(str(exc)) - logger.debug("Exception information:", exc_info=True) - - return ERROR - except CommandError as exc: - logger.critical("%s", exc) - logger.debug("Exception information:", exc_info=True) - - return ERROR - except BrokenStdoutLoggingError: - # stdout is broken; write to stderr directly. Use os.write, not - # sys.stderr.write, so a full pipe buffer returns EPIPE instead - # of deadlocking (Windows anonymous pipes are ~4KB). - try: - os.write(2, b"ERROR: Pipe to stdout was broken\n") - if level_number <= logging.DEBUG: - encoding = getattr(sys.stderr, "encoding", None) or "utf-8" - os.write( - 2, traceback.format_exc().encode(encoding, "backslashreplace") - ) - except OSError: - pass - - # redirect stdout to os.devnull so that the exit cleanup doesn't - # produce "BrokenPipeError" when exiting. - devnull = os.open(os.devnull, os.O_WRONLY) - try: - os.dup2(devnull, 1) - finally: - os.close(devnull) - - return BROKEN_STDOUT - except KeyboardInterrupt: - logger.critical("Operation cancelled by user") - logger.debug("Exception information:", exc_info=True) - - return ERROR - except BaseException: - logger.critical("Exception:", exc_info=True) - - return UNKNOWN_ERROR - - def parse_args(self, args: list[str]) -> tuple[Values, list[str]]: - # factored out for testability - return self.parser.parse_args(args) - - def main(self, args: list[str]) -> int: - try: - with self.main_context(): - return self._main(args) - finally: - logging.shutdown() - - def _main(self, args: list[str]) -> int: - # We must initialize this before the tempdir manager, otherwise the - # configuration would not be accessible by the time we clean up the - # tempdir manager. - self.tempdir_registry = self.enter_context(tempdir_registry()) - # Intentionally set as early as possible so globally-managed temporary - # directories are available to the rest of the code. - self.enter_context(global_tempdir_manager()) - - options, args = self.parse_args(args) - - # Set verbosity so that it can be used elsewhere. - self.verbosity = options.verbose - options.quiet - if options.debug_mode: - self.verbosity = 2 - - if hasattr(options, "progress_bar") and options.progress_bar == "auto": - options.progress_bar = "on" if self.verbosity >= 0 else "off" - - reconfigure(no_color=options.no_color) - level_number = setup_logging( - verbosity=self.verbosity, - no_color=options.no_color, - user_log_file=options.log, - ) - - always_enabled_features = set(options.features_enabled) & set( - cmdoptions.ALWAYS_ENABLED_FEATURES - ) - if always_enabled_features: - logger.warning( - "The following features are always enabled: %s. ", - ", ".join(sorted(always_enabled_features)), - ) - - # Make sure that the --python argument isn't specified after the - # subcommand. We can tell, because if --python was specified, - # we should only reach this point if we're running in the created - # subprocess, which has the _PIP_RUNNING_IN_SUBPROCESS environment - # variable set. - if options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ: - logger.critical( - "The --python option must be placed before the pip subcommand name" - ) - sys.exit(ERROR) - - # TODO: Try to get these passing down from the command? - # without resorting to os.environ to hold these. - # This also affects isolated builds and it should. - - if options.no_input: - os.environ["PIP_NO_INPUT"] = "1" - - if options.exists_action: - os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action) - - if options.require_venv and not self.ignore_require_venv: - # If a venv is required check if it can really be found - if not running_under_virtualenv(): - logger.critical("Could not find an activated virtualenv (required).") - sys.exit(VIRTUALENV_NOT_FOUND) - - if options.cache_dir: - options.cache_dir = normalize_path(options.cache_dir) - if not check_path_owner(options.cache_dir): - logger.warning( - "The directory '%s' or its parent directory is not owned " - "or is not writable by the current user. The cache " - "has been disabled. Check the permissions and owner of " - "that directory. If executing pip with sudo, you should " - "use sudo's -H flag.", - options.cache_dir, - ) - options.cache_dir = None - - return self._run_wrapper(level_number, options, args) - - def handler_map(self) -> dict[str, Callable[[Values, list[str]], None]]: - """ - map of names to handler actions for commands with sub-actions - """ - return {} diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/cmdoptions.py b/venv/lib/python3.11/site-packages/pip/_internal/cli/cmdoptions.py deleted file mode 100755 index 2b99c79..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/cli/cmdoptions.py +++ /dev/null @@ -1,1409 +0,0 @@ -""" -shared options and groups - -The principle here is to define options once, but *not* instantiate them -globally. One reason being that options with action='append' can carry state -between parses. pip parses general options twice internally, and shouldn't -pass on state. To be consistent, all options will follow this design. -""" - -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False -from __future__ import annotations - -import logging -import os -import pathlib -import re -import textwrap -from collections.abc import Callable -from datetime import datetime, timedelta, timezone -from functools import partial -from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values -from textwrap import dedent -from typing import Any - -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.cli.parser import ConfigOptionParser -from pip._internal.exceptions import CommandError -from pip._internal.locations import USER_CACHE_DIR, get_src_prefix -from pip._internal.models.format_control import FormatControl -from pip._internal.models.index import PyPI -from pip._internal.models.release_control import ReleaseControl -from pip._internal.models.target_python import TargetPython -from pip._internal.utils.datetime import parse_iso_datetime -from pip._internal.utils.hashes import STRONG_HASHES -from pip._internal.utils.misc import strtobool - -logger = logging.getLogger(__name__) - - -def raise_option_error(parser: OptionParser, option: Option, msg: str) -> None: - """ - Raise an option parsing error using parser.error(). - - Args: - parser: an OptionParser instance. - option: an Option instance. - msg: the error text. - """ - msg = f"{option} error: {msg}" - msg = textwrap.fill(" ".join(msg.split())) - parser.error(msg) - - -def make_option_group(group: dict[str, Any], parser: ConfigOptionParser) -> OptionGroup: - """ - Return an OptionGroup object - group -- assumed to be dict with 'name' and 'options' keys - parser -- an optparse Parser - """ - option_group = OptionGroup(parser, group["name"]) - for option in group["options"]: - option_group.add_option(option()) - return option_group - - -def check_only_deps_option_does_not_conflict(options: Values) -> None: - """Function for determining if --only-deps and other incompatible options are - specified. - - :param options: The OptionParser options. - """ - if not options.only_dependencies: - return - conflicts = [] - if options.ignore_dependencies: - conflicts.append("'--no-deps'") - if "legacy-resolver" in options.deprecated_features_enabled: - conflicts.append("'--use-deprecated legacy-resolver'") - if options.requirements: - conflicts.append("'--requirement'") - if options.requirements_from_scripts: - conflicts.append("'--requirements-from-script'") - if options.dependency_groups: - conflicts.append("'--group'") - if conflicts: - if len(conflicts) > 1: - conflicts[-1] = "or " + conflicts[-1] - conflict_message = ", ".join(conflicts) - raise CommandError( - f"Cannot use '--only-dependencies' in combination with {conflict_message}. " - "If this is unexpected, please refer to the user guide:\n" - "\n" - " https://pip.pypa.io/en/stable/user_guide/#installing-only-dependencies" - ) - - -def check_dist_restriction(options: Values, check_target: bool = False) -> None: - """Function for determining if custom platform options are allowed. - - :param options: The OptionParser options. - :param check_target: Whether or not to check if --target is being used. - """ - dist_restriction_set = any( - [ - options.python_version, - options.platforms, - options.abis, - options.implementation, - ] - ) - - binary_only = FormatControl(set(), {":all:"}) - sdist_dependencies_allowed = ( - options.format_control != binary_only and not options.ignore_dependencies - ) - - # Installations or downloads using dist restrictions must not combine - # source distributions and dist-specific wheels, as they are not - # guaranteed to be locally compatible. - if dist_restriction_set and sdist_dependencies_allowed: - raise CommandError( - "When restricting platform and interpreter constraints using " - "--python-version, --platform, --abi, or --implementation, " - "either --no-deps must be set, or --only-binary=:all: must be " - "set and --no-binary must not be set (or must be set to " - ":none:)." - ) - - if check_target: - if not options.dry_run and dist_restriction_set and not options.target_dir: - raise CommandError( - "Can not use any platform or abi specific options unless " - "installing via '--target' or using '--dry-run'" - ) - - if dist_restriction_set: - # Lazy import to keep CLI startup fast - from pip._internal.utils import pylock as pylock_utils - - for filename in options.requirements: - if pylock_utils.is_valid_pylock_filename(filename): - raise CommandError( - "Platform and interpreter constraints using " - "--python-version, --platform, --abi, or --implementation, " - f"are not supported when selecting requirements from {filename!r}" - ) - - -def check_build_constraints(options: Values) -> None: - """Function for validating build constraints options. - - :param options: The OptionParser options. - """ - if hasattr(options, "build_constraints") and options.build_constraints: - if not options.build_isolation: - raise CommandError( - "--build-constraint cannot be used with --no-build-isolation." - ) - - # Import here to avoid circular imports - from pip._internal.network.session import PipSession - from pip._internal.req.req_file import get_file_content - - # Eagerly check build constraints file contents - # is valid so that we don't fail in when trying - # to check constraints in isolated build process - with PipSession() as session: - for constraint_file in options.build_constraints: - get_file_content(constraint_file, session) - - -def _path_option_check(option: Option, opt: str, value: str) -> str: - return os.path.expanduser(value) - - -def _package_name_option_check(option: Option, opt: str, value: str) -> str: - return canonicalize_name(value) - - -class PipOption(Option): - TYPES = Option.TYPES + ("path", "package_name") - TYPE_CHECKER = Option.TYPE_CHECKER.copy() - TYPE_CHECKER["package_name"] = _package_name_option_check - TYPE_CHECKER["path"] = _path_option_check - - -########### -# options # -########### - -help_: Callable[..., Option] = partial( - Option, - "-h", - "--help", - dest="help", - action="help", - help="Show help.", -) - -debug_mode: Callable[..., Option] = partial( - Option, - "--debug", - dest="debug_mode", - action="store_true", - default=False, - help=( - "Let unhandled exceptions propagate outside the main subroutine, " - "instead of logging them to stderr." - ), -) - -isolated_mode: Callable[..., Option] = partial( - Option, - "--isolated", - dest="isolated_mode", - action="store_true", - default=False, - help=( - "Run pip in an isolated mode, ignoring environment variables and user " - "configuration." - ), -) - -require_virtualenv: Callable[..., Option] = partial( - Option, - "--require-virtualenv", - "--require-venv", - dest="require_venv", - action="store_true", - default=False, - help=( - "Allow pip to only run in a virtual environment; exit with an error otherwise." - ), -) - -override_externally_managed: Callable[..., Option] = partial( - Option, - "--break-system-packages", - dest="override_externally_managed", - action="store_true", - help="Allow pip to modify an EXTERNALLY-MANAGED Python installation", -) - -python: Callable[..., Option] = partial( - Option, - "--python", - dest="python", - help="Run pip with the specified Python interpreter.", -) - -verbose: Callable[..., Option] = partial( - Option, - "-v", - "--verbose", - dest="verbose", - action="count", - default=0, - help="Give more output. Option is additive, and can be used up to 3 times.", -) - -no_color: Callable[..., Option] = partial( - Option, - "--no-color", - dest="no_color", - action="store_true", - default=False, - help="Suppress colored output.", -) - -version: Callable[..., Option] = partial( - Option, - "-V", - "--version", - dest="version", - action="store_true", - help="Show version and exit.", -) - -quiet: Callable[..., Option] = partial( - Option, - "-q", - "--quiet", - dest="quiet", - action="count", - default=0, - help=( - "Give less output. Option is additive, and can be used up to 3" - " times (corresponding to WARNING, ERROR, and CRITICAL logging" - " levels)." - ), -) - -progress_bar: Callable[..., Option] = partial( - Option, - "--progress-bar", - dest="progress_bar", - type="choice", - choices=["auto", "on", "off", "raw"], - default="auto", - help=( - "Specify whether the progress bar should be used. In 'auto'" - " mode, --quiet will suppress all progress bars." - " [auto, on, off, raw] (default: auto)" - ), -) - -log: Callable[..., Option] = partial( - PipOption, - "--log", - "--log-file", - "--local-log", - dest="log", - metavar="path", - type="path", - help="Path to a verbose appending log.", -) - -no_input: Callable[..., Option] = partial( - Option, - # Don't ask for input - "--no-input", - dest="no_input", - action="store_true", - default=False, - help="Disable prompting for input.", -) - -keyring_provider: Callable[..., Option] = partial( - Option, - "--keyring-provider", - dest="keyring_provider", - choices=["auto", "disabled", "import", "subprocess"], - default="auto", - help=( - "Enable the credential lookup via the keyring library if user input is allowed." - " Specify which mechanism to use [auto, disabled, import, subprocess]." - " (default: %default)" - ), -) - -proxy: Callable[..., Option] = partial( - Option, - "--proxy", - dest="proxy", - type="str", - default=None, - help="Specify a proxy in the form scheme://[user:passwd@]proxy.server:port.", -) - -no_proxy_env: Callable[..., Option] = partial( - Option, - "--no-proxy-env", - dest="no_proxy_env", - action="store_true", - default=False, - help="Do not read proxy configuration from environment variables.", -) - -retries: Callable[..., Option] = partial( - Option, - "--retries", - dest="retries", - type="int", - default=5, - help="Maximum attempts to establish a new HTTP connection. (default: %default)", -) - -resume_retries: Callable[..., Option] = partial( - Option, - "--resume-retries", - dest="resume_retries", - type="int", - default=5, - help="Maximum attempts to resume or restart an incomplete download. " - "(default: %default)", -) - -timeout: Callable[..., Option] = partial( - Option, - "--timeout", - "--default-timeout", - metavar="sec", - dest="timeout", - type="float", - default=15, - help="Set the socket timeout (default %default seconds).", -) - - -def exists_action() -> Option: - return Option( - # Option when path already exist - "--exists-action", - dest="exists_action", - type="choice", - choices=["s", "i", "w", "b", "a"], - default=[], - action="append", - metavar="action", - help="Default action when a path already exists: " - "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.", - ) - - -cert: Callable[..., Option] = partial( - PipOption, - "--cert", - dest="cert", - type="path", - metavar="path", - help=( - "Path to PEM-encoded CA certificate bundle. " - "If provided, overrides the default. " - "See 'SSL Certificate Verification' in pip documentation " - "for more information." - ), -) - -client_cert: Callable[..., Option] = partial( - PipOption, - "--client-cert", - dest="client_cert", - type="path", - default=None, - metavar="path", - help="Path to SSL client certificate, a single file containing the " - "private key and the certificate in PEM format.", -) - -index_url: Callable[..., Option] = partial( - Option, - "-i", - "--index-url", - "--pypi-url", - dest="index_url", - metavar="URL", - default=PyPI.simple_url, - help="Base URL of the Python Package Index (default %default). " - "This should point to a repository compliant with PEP 503 " - "(the simple repository API) or a local directory laid out " - "in the same format.", -) - - -def extra_index_url() -> Option: - return Option( - "--extra-index-url", - dest="extra_index_urls", - metavar="URL", - action="append", - default=[], - help="Extra URLs of package indexes to use in addition to " - "--index-url. Should follow the same rules as " - "--index-url.", - ) - - -no_index: Callable[..., Option] = partial( - Option, - "--no-index", - dest="no_index", - action="store_true", - default=False, - help="Ignore package index (only looking at --find-links URLs instead).", -) - - -def find_links() -> Option: - return Option( - "-f", - "--find-links", - dest="find_links", - action="append", - default=[], - metavar="url", - help="If a URL or path to an html file, then parse for links to " - "archives such as sdist (.tar.gz) or wheel (.whl) files. " - "If a local path or file:// URL that's a directory, " - "then look for archives in the directory listing. " - "Links to VCS project URLs are not supported.", - ) - - -def _handle_uploaded_prior_to( - option: Option, opt: str, value: str, parser: OptionParser -) -> None: - """ - This is an optparse.Option callback for the --uploaded-prior-to option. - - Accepts either an ISO 8601 datetime string (e.g., '2023-01-01T00:00:00Z') - or a strict subset of ISO 8601 durations: PnD where n is a number of days - (e.g., 'P7D' for 7 days ago). - - Note: This option only works with indexes that provide upload-time metadata - as specified in the simple repository API: - https://packaging.python.org/en/latest/specifications/simple-repository-api/ - """ - if value is None: - return None - - # Try ISO 8601 duration in PnD format. The leading 'P' disambiguates - # from absolute datetimes. Only whole days are supported; the format may - # be extended to more of the ISO 8601 duration syntax in the future if - # a real need is presented. - match = re.match(r"^P(\d+)D$", value, re.ASCII) - if match: - days = int(match.group(1)) - parser.values.uploaded_prior_to = datetime.now(timezone.utc) - timedelta( - days=days - ) - return - - try: - uploaded_prior_to = parse_iso_datetime(value) - # Use local timezone if no offset is given in the ISO string. - if uploaded_prior_to.tzinfo is None: - uploaded_prior_to = uploaded_prior_to.astimezone() - parser.values.uploaded_prior_to = uploaded_prior_to - except ValueError as exc: - msg = ( - f"invalid value: {value!r}: {exc}. " - f"Expected an ISO 8601 datetime string " - f"(e.g., '2023-01-01' or '2023-01-01T00:00:00Z') " - f"or a duration in days (e.g., 'P3D')" - ) - raise_option_error(parser, option=option, msg=msg) - - -def uploaded_prior_to() -> Option: - return Option( - "--uploaded-prior-to", - dest="uploaded_prior_to", - metavar="datetime_or_duration", - action="callback", - callback=_handle_uploaded_prior_to, - type="str", - help=( - "Only consider packages uploaded prior to the given value. " - "Accepts an ISO 8601 datetime (e.g., '2023-01-01T00:00:00Z', " - "uses local timezone if none specified) or a duration in days " - "(e.g., 'P3D' for packages uploaded at least 3 days ago). " - "Only effective when using indexes that provide " - "upload-time metadata." - ), - ) - - -def trusted_host() -> Option: - return Option( - "--trusted-host", - dest="trusted_hosts", - action="append", - metavar="HOSTNAME", - default=[], - help="Mark this host or host:port pair as trusted, even though it " - "does not have valid or any HTTPS.", - ) - - -def constraints() -> Option: - return Option( - "-c", - "--constraint", - dest="constraints", - action="append", - default=[], - metavar="file", - help="Constrain versions using the given constraints file. " - "This option can be used multiple times.", - ) - - -def build_constraints() -> Option: - return Option( - "--build-constraint", - dest="build_constraints", - action="append", - type="str", - default=[], - metavar="file", - help=( - "Constrain build dependencies using the given constraints file. " - "This option can be used multiple times." - ), - ) - - -def requirements() -> Option: - return Option( - "-r", - "--requirement", - dest="requirements", - action="append", - default=[], - metavar="file", - help=( - "Install from the given requirements file. " - "The file or URL can be in pip's requirements.txt format, " - "or pylock.toml format. pylock.toml support is experimental. " - "This option can be used multiple times." - ), - ) - - -def requirements_from_scripts() -> Option: - return Option( - "--requirements-from-script", - action="append", - default=[], - dest="requirements_from_scripts", - metavar="file", - help="Install dependencies of the given script file " - "as defined by PEP 723 inline metadata. ", - ) - - -def editable() -> Option: - return Option( - "-e", - "--editable", - dest="editables", - action="append", - default=[], - metavar="path/url", - help=( - "Install a project in editable mode (i.e. setuptools " - '"develop mode") from a local project path or a VCS url.' - ), - ) - - -def _handle_src(option: Option, opt_str: str, value: str, parser: OptionParser) -> None: - value = os.path.abspath(value) - setattr(parser.values, option.dest, value) - - -src: Callable[..., Option] = partial( - PipOption, - "--src", - "--source", - "--source-dir", - "--source-directory", - dest="src_dir", - type="path", - metavar="dir", - default=get_src_prefix(), - action="callback", - callback=_handle_src, - help="Directory to check out editable projects into. " - 'The default in a virtualenv is "/src". ' - 'The default for global installs is "/src".', -) - - -def _get_format_control(values: Values, option: Option) -> Any: - """Get a format_control object.""" - return getattr(values, option.dest) - - -def _handle_no_binary( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, - existing.no_binary, - existing.only_binary, - ) - - -def _handle_only_binary( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - existing = _get_format_control(parser.values, option) - FormatControl.handle_mutual_excludes( - value, - existing.only_binary, - existing.no_binary, - ) - - -def no_binary() -> Option: - format_control = FormatControl(set(), set()) - return Option( - "--no-binary", - dest="format_control", - action="callback", - callback=_handle_no_binary, - type="str", - default=format_control, - help="Do not download binary packages. Cached binary packages may still " - "be used. Can be supplied multiple times, and each time adds to " - "the existing value. Accepts either ':all:' to disable all binary " - "packages, ':none:' to empty the set (notice the colons), or one " - "or more package names with commas between them (no colons). " - "Note that some packages are tricky to compile and may fail to " - "install when this option is used on them.", - ) - - -def only_binary() -> Option: - format_control = FormatControl(set(), set()) - return Option( - "--only-binary", - dest="format_control", - action="callback", - callback=_handle_only_binary, - type="str", - default=format_control, - help="Do not use source packages. Can be supplied multiple times, and " - 'each time adds to the existing value. Accepts either ":all:" to ' - 'disable all source packages, ":none:" to empty the set, or one ' - "or more package names with commas between them. Packages " - "without binary distributions will fail to install when this " - "option is used on them.", - ) - - -def _get_release_control(values: Values, option: Option) -> Any: - """Get a release_control object.""" - return getattr(values, option.dest) - - -def _handle_all_releases( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - existing = _get_release_control(parser.values, option) - existing.handle_mutual_excludes( - value, - existing.all_releases, - existing.only_final, - "all_releases", - ) - - -def _handle_only_final( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - existing = _get_release_control(parser.values, option) - existing.handle_mutual_excludes( - value, - existing.only_final, - existing.all_releases, - "only_final", - ) - - -def all_releases() -> Option: - release_control = ReleaseControl(set(), set()) - return Option( - "--all-releases", - dest="release_control", - action="callback", - callback=_handle_all_releases, - type="str", - default=release_control, - help="Allow all release types (including pre-releases) for a package. " - "Can be supplied multiple times, and each time adds to the existing " - 'value. Accepts either ":all:" to allow pre-releases for all ' - 'packages, ":none:" to empty the set (notice the colons), or one or ' - "more package names with commas between them (no colons). Cannot be " - "used with --pre.", - ) - - -def only_final() -> Option: - release_control = ReleaseControl(set(), set()) - return Option( - "--only-final", - dest="release_control", - action="callback", - callback=_handle_only_final, - type="str", - default=release_control, - help="Only allow final releases (no pre-releases) for a package. Can be " - "supplied multiple times, and each time adds to the existing value. " - 'Accepts either ":all:" to disable pre-releases for all packages, ' - '":none:" to empty the set, or one or more package names with commas ' - "between them. Cannot be used with --pre.", - ) - - -def check_release_control_exclusive(options: Values) -> None: - """ - Raise an error if --pre is used with --all-releases or --only-final, - and transform --pre into --all-releases :all: if used alone. - """ - if not hasattr(options, "pre") or not options.pre: - return - - release_control = options.release_control - if release_control.all_releases or release_control.only_final: - raise CommandError("--pre cannot be used with --all-releases or --only-final.") - - # Transform --pre into --all-releases :all: - release_control.all_releases.add(":all:") - - -platforms: Callable[..., Option] = partial( - Option, - "--platform", - dest="platforms", - metavar="platform", - action="append", - default=None, - help=( - "Only use wheels compatible with . Defaults to the " - "platform of the running system. Use this option multiple times to " - "specify multiple platforms supported by the target interpreter." - ), -) - - -# This was made a separate function for unit-testing purposes. -def _convert_python_version(value: str) -> tuple[tuple[int, ...], str | None]: - """ - Convert a version string like "3", "37", or "3.7.3" into a tuple of ints. - - :return: A 2-tuple (version_info, error_msg), where `error_msg` is - non-None if and only if there was a parsing error. - """ - if not value: - # The empty string is the same as not providing a value. - return (None, None) - - parts = value.split(".") - if len(parts) > 3: - return ((), "at most three version parts are allowed") - - if len(parts) == 1: - # Then we are in the case of "3" or "37". - value = parts[0] - if len(value) > 1: - parts = [value[0], value[1:]] - - try: - version_info = tuple(int(part) for part in parts) - except ValueError: - return ((), "each version part must be an integer") - - return (version_info, None) - - -def _handle_python_version( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - """ - Handle a provided --python-version value. - """ - version_info, error_msg = _convert_python_version(value) - if error_msg is not None: - msg = f"invalid --python-version value: {value!r}: {error_msg}" - raise_option_error(parser, option=option, msg=msg) - - parser.values.python_version = version_info - - -python_version: Callable[..., Option] = partial( - Option, - "--python-version", - dest="python_version", - metavar="python_version", - action="callback", - callback=_handle_python_version, - type="str", - default=None, - help=dedent("""\ - The Python interpreter version to use for wheel and "Requires-Python" - compatibility checks. Defaults to a version derived from the running - interpreter. The version can be specified using up to three dot-separated - integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor - version can also be given as a string without dots (e.g. "37" for 3.7.0). - """), -) - - -implementation: Callable[..., Option] = partial( - Option, - "--implementation", - dest="implementation", - metavar="implementation", - default=None, - help=( - "Only use wheels compatible with Python " - "implementation , e.g. 'pp', 'jy', 'cp', " - " or 'ip'. If not specified, then the current " - "interpreter implementation is used. Use 'py' to force " - "implementation-agnostic wheels." - ), -) - - -abis: Callable[..., Option] = partial( - Option, - "--abi", - dest="abis", - metavar="abi", - action="append", - default=None, - help=( - "Only use wheels compatible with Python abi , e.g. 'pypy_41'. " - "If not specified, then the current interpreter abi tag is used. " - "Use this option multiple times to specify multiple abis supported " - "by the target interpreter. Generally you will need to specify " - "--implementation, --platform, and --python-version when using this " - "option." - ), -) - - -def add_target_python_options(cmd_opts: OptionGroup) -> None: - cmd_opts.add_option(platforms()) - cmd_opts.add_option(python_version()) - cmd_opts.add_option(implementation()) - cmd_opts.add_option(abis()) - - -def make_target_python(options: Values) -> TargetPython: - target_python = TargetPython( - platforms=options.platforms, - py_version_info=options.python_version, - abis=options.abis, - implementation=options.implementation, - ) - - return target_python - - -def prefer_binary() -> Option: - return Option( - "--prefer-binary", - dest="prefer_binary", - action="store_true", - default=False, - help=( - "Prefer binary packages over source packages, even if the " - "source packages are newer." - ), - ) - - -cache_dir: Callable[..., Option] = partial( - PipOption, - "--cache-dir", - dest="cache_dir", - default=USER_CACHE_DIR, - metavar="dir", - type="path", - help="Store the cache data in .", -) - - -def _handle_no_cache_dir( - option: Option, opt: str, value: str, parser: OptionParser -) -> None: - """ - Process a value provided for the --no-cache-dir option. - - This is an optparse.Option callback for the --no-cache-dir option. - """ - # The value argument will be None if --no-cache-dir is passed via the - # command-line, since the option doesn't accept arguments. However, - # the value can be non-None if the option is triggered e.g. by an - # environment variable, like PIP_NO_CACHE_DIR=true. - if value is not None: - # Then parse the string value to get argument error-checking. - try: - strtobool(value) - except ValueError as exc: - raise_option_error(parser, option=option, msg=str(exc)) - - # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool() - # converted to 0 (like "false" or "no") caused cache_dir to be disabled - # rather than enabled (logic would say the latter). Thus, we disable - # the cache directory not just on values that parse to True, but (for - # backwards compatibility reasons) also on values that parse to False. - # In other words, always set it to False if the option is provided in - # some (valid) form. - parser.values.cache_dir = False - - -no_cache: Callable[..., Option] = partial( - Option, - "--no-cache-dir", - dest="cache_dir", - action="callback", - callback=_handle_no_cache_dir, - help="Disable the cache.", -) - -no_deps: Callable[..., Option] = partial( - Option, - "--no-deps", - "--no-dependencies", - dest="ignore_dependencies", - action="store_true", - default=False, - help="Don't install package dependencies.", -) - - -def _handle_refresh_package( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - if value.startswith("-"): - raise CommandError("--refresh-package option requires 1 argument.") - - existing: set[str] = getattr(parser.values, option.dest) - - new = value.split(",") - while ":all:" in new: - existing.clear() - existing.add(":all:") - del new[: new.index(":all:") + 1] - if ":none:" not in new: - return - - for name in new: - if name == ":none:": - existing.clear() - else: - existing.add(canonicalize_name(name)) - - -def refresh_package() -> Option: - return Option( - "--refresh-package", - dest="refresh_package", - action="callback", - callback=_handle_refresh_package, - type="str", - default=set(), - help="Refresh package index information for the given packages instead " - "of using cached responses. Accepts ':all:' to apply " - "to all packages, or a comma-separated list of package names.", - ) - - -only_deps: Callable[..., Option] = partial( - Option, - "--only-deps", - "--only-dependencies", - dest="only_dependencies", - action="store_true", - default=False, - help=( - "Take only the dependencies of the provided requirements into account, " - "not the requirements themselves. Cannot be used in combination with " - "--no-deps, --group, --requirement, or --requirements-from-script. " - "No user-supplied requirements will be handled, even if they were " - "dependencies of other user-supplied requirements." - ), -) - - -def _handle_dependency_group( - option: Option, opt: str, value: str, parser: OptionParser -) -> None: - """ - Process a value provided for the --group option. - - Splits on the rightmost ":", and validates that the path (if present) ends - in `pyproject.toml`. Defaults the path to `pyproject.toml` when one is not given. - - `:` cannot appear in dependency group names, so this is a safe and simple parse. - - This is an optparse.Option callback for the dependency_groups option. - """ - path, sep, groupname = value.rpartition(":") - if not sep: - path = "pyproject.toml" - else: - # check for 'pyproject.toml' filenames using pathlib - if pathlib.PurePath(path).name != "pyproject.toml": - msg = "group paths use 'pyproject.toml' filenames" - raise_option_error(parser, option=option, msg=msg) - - parser.values.dependency_groups.append((path, groupname)) - - -dependency_groups: Callable[..., Option] = partial( - Option, - "--group", - dest="dependency_groups", - default=[], - type=str, - action="callback", - callback=_handle_dependency_group, - metavar="[path:]group", - help='Install a named dependency-group from a "pyproject.toml" file. ' - 'If a path is given, the name of the file must be "pyproject.toml". ' - 'Defaults to using "pyproject.toml" in the current directory.', -) - -ignore_requires_python: Callable[..., Option] = partial( - Option, - "--ignore-requires-python", - dest="ignore_requires_python", - action="store_true", - help="Ignore the Requires-Python information.", -) - - -no_build_isolation: Callable[..., Option] = partial( - Option, - "--no-build-isolation", - dest="build_isolation", - action="store_false", - default=True, - help="Disable isolation when building a modern source distribution. " - "Build dependencies specified by PEP 518 must be already installed " - "if this option is used.", -) - -check_build_deps: Callable[..., Option] = partial( - Option, - "--check-build-dependencies", - dest="check_build_deps", - action="store_true", - default=False, - help="Check the build dependencies.", -) - - -use_pep517: Any = partial( - Option, - "--use-pep517", - dest="use_pep517", - action="store_true", - default=True, - help=SUPPRESS_HELP, -) - - -def _handle_config_settings( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - key, sep, val = value.partition("=") - if sep != "=": - parser.error(f"Arguments to {opt_str} must be of the form KEY=VAL") - dest = getattr(parser.values, option.dest) - if dest is None: - dest = {} - setattr(parser.values, option.dest, dest) - if key in dest: - if isinstance(dest[key], list): - dest[key].append(val) - else: - dest[key] = [dest[key], val] - else: - dest[key] = val - - -config_settings: Callable[..., Option] = partial( - Option, - "-C", - "--config-settings", - dest="config_settings", - type=str, - action="callback", - callback=_handle_config_settings, - metavar="settings", - help="Configuration settings to be passed to the build backend. " - "Settings take the form KEY=VALUE. Use multiple --config-settings options " - "to pass multiple keys to the backend.", -) - -no_clean: Callable[..., Option] = partial( - Option, - "--no-clean", - action="store_true", - default=False, - help="Don't clean up build directories.", -) - -pre: Callable[..., Option] = partial( - Option, - "--pre", - action="store_true", - default=False, - help="Include pre-release and development versions. By default, " - "pip only finds stable versions.", -) - -json: Callable[..., Option] = partial( - Option, - "--json", - action="store_true", - default=False, - help="Output data in a machine-readable JSON format.", -) - -disable_pip_version_check: Callable[..., Option] = partial( - Option, - "--disable-pip-version-check", - dest="disable_pip_version_check", - action="store_true", - default=False, - help="Don't periodically check PyPI to determine whether a new version " - "of pip is available for download. Implied with --no-index.", -) - -root_user_action: Callable[..., Option] = partial( - Option, - "--root-user-action", - dest="root_user_action", - default="warn", - choices=["warn", "ignore"], - help="Action if pip is run as a root user [warn, ignore] (default: warn)", -) - - -def _handle_merge_hash( - option: Option, opt_str: str, value: str, parser: OptionParser -) -> None: - """Given a value spelled "algo:digest", append the digest to a list - pointed to in a dict by the algo name.""" - if not parser.values.hashes: - parser.values.hashes = {} - try: - algo, digest = value.split(":", 1) - except ValueError: - parser.error( - f"Arguments to {opt_str} must be a hash name " - "followed by a value, like --hash=sha256:" - "abcde..." - ) - if algo not in STRONG_HASHES: - parser.error( - "Allowed hash algorithms for {} are {}.".format( - opt_str, ", ".join(STRONG_HASHES) - ) - ) - parser.values.hashes.setdefault(algo, []).append(digest) - - -hash: Callable[..., Option] = partial( - Option, - "--hash", - # Hash values eventually end up in InstallRequirement.hashes due to - # __dict__ copying in process_line(). - dest="hashes", - action="callback", - callback=_handle_merge_hash, - type="string", - help="Verify that the package's archive matches this " - "hash before installing. Example: --hash=sha256:abcdef...", -) - - -require_hashes: Callable[..., Option] = partial( - Option, - "--require-hashes", - dest="require_hashes", - action="store_true", - default=False, - help="Require a hash to check each requirement against, for " - "repeatable installs. This option is implied when any package in a " - "requirements file has a --hash option.", -) - - -no_require_hashes: Callable[..., Option] = partial( - Option, - "--no-require-hashes", - dest="no_require_hashes", - action="store_true", - default=False, - help="Do not automatically enable --require-hashes " - "when encountering a requirement with hashes.", -) - - -list_path: Callable[..., Option] = partial( - PipOption, - "--path", - dest="path", - type="path", - action="append", - help="Restrict to the specified installation path for listing " - "packages (can be used multiple times).", -) - - -def check_list_path_option(options: Values) -> None: - if options.path and (options.user or options.local): - raise CommandError("Cannot combine '--path' with '--user' or '--local'") - - -list_exclude: Callable[..., Option] = partial( - PipOption, - "--exclude", - dest="excludes", - action="append", - metavar="package", - type="package_name", - help="Exclude specified package from the output", -) - - -no_python_version_warning: Callable[..., Option] = partial( - Option, - "--no-python-version-warning", - dest="no_python_version_warning", - action="store_true", - default=False, - help=SUPPRESS_HELP, # No-op, a hold-over from the Python 2->3 transition. -) - - -# Features that are now always on. A warning is printed if they are used. -ALWAYS_ENABLED_FEATURES = [ - "truststore", # always on since 24.2 - "no-binary-enable-wheel-cache", # always on since 23.1 - "build-constraint", # always on since 26.2 -] - -use_new_feature: Callable[..., Option] = partial( - Option, - "--use-feature", - dest="features_enabled", - metavar="feature", - action="append", - default=[], - choices=[ - "fast-deps", - "inprocess-build-deps", - "venv-isolation", - ] - + ALWAYS_ENABLED_FEATURES, - help="Enable new functionality, that may be backward incompatible.", -) - -use_deprecated_feature: Callable[..., Option] = partial( - Option, - "--use-deprecated", - dest="deprecated_features_enabled", - metavar="feature", - action="append", - default=[], - choices=[ - "legacy-resolver", - "legacy-certs", - ], - help=("Enable deprecated functionality, that will be removed in the future."), -) - -########## -# groups # -########## - -general_group: dict[str, Any] = { - "name": "General Options", - "options": [ - help_, - debug_mode, - isolated_mode, - require_virtualenv, - python, - verbose, - version, - quiet, - log, - no_input, - keyring_provider, - proxy, - no_proxy_env, - retries, - timeout, - exists_action, - trusted_host, - cert, - client_cert, - cache_dir, - no_cache, - disable_pip_version_check, - no_color, - no_python_version_warning, - use_new_feature, - use_deprecated_feature, - resume_retries, - ], -} - -index_group: dict[str, Any] = { - "name": "Package Index Options", - "options": [ - index_url, - extra_index_url, - no_index, - refresh_package, - find_links, - uploaded_prior_to, - ], -} - -package_selection_group: dict[str, Any] = { - "name": "Package Selection Options", - "options": [ - pre, - all_releases, - only_final, - no_binary, - only_binary, - prefer_binary, - ], -} diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/command_context.py b/venv/lib/python3.11/site-packages/pip/_internal/cli/command_context.py deleted file mode 100755 index 9c167bd..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/cli/command_context.py +++ /dev/null @@ -1,28 +0,0 @@ -from collections.abc import Generator -from contextlib import AbstractContextManager, ExitStack, contextmanager -from typing import TypeVar - -_T = TypeVar("_T", covariant=True) - - -class CommandContextMixIn: - def __init__(self) -> None: - super().__init__() - self._in_main_context = False - self._main_context = ExitStack() - - @contextmanager - def main_context(self) -> Generator[None, None, None]: - assert not self._in_main_context - - self._in_main_context = True - try: - with self._main_context: - yield - finally: - self._in_main_context = False - - def enter_context(self, context_provider: AbstractContextManager[_T]) -> _T: - assert self._in_main_context - - return self._main_context.enter_context(context_provider) diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/index_command.py b/venv/lib/python3.11/site-packages/pip/_internal/cli/index_command.py deleted file mode 100755 index e1345ae..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/cli/index_command.py +++ /dev/null @@ -1,217 +0,0 @@ -""" -Contains command classes which may interact with an index / the network. - -Unlike its sister module, req_command, this module still uses lazy imports -so commands which don't always hit the network (e.g. list w/o --outdated or ---uptodate) don't need waste time importing PipSession and friends. -""" - -from __future__ import annotations - -import contextlib -import logging -import os -from collections.abc import Iterator -from functools import lru_cache -from optparse import Values -from typing import TYPE_CHECKING - -from pip._vendor import certifi - -from pip._internal.cli.base_command import Command -from pip._internal.cli.command_context import CommandContextMixIn - -if TYPE_CHECKING: - from ssl import SSLContext - - from pip._vendor.packaging.utils import NormalizedName - - from pip._internal.network.session import PipSession - from pip._internal.self_outdated_check import UpgradePrompt - -logger = logging.getLogger(__name__) - - -@lru_cache -def _create_truststore_ssl_context() -> SSLContext | None: - try: - import ssl - except ImportError: - logger.warning("Disabling truststore since ssl support is missing") - return None - - try: - from pip._vendor import truststore - except ImportError: - logger.warning("Disabling truststore because platform isn't supported") - return None - - ctx = truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT) - ctx.load_verify_locations(certifi.where()) - return ctx - - -class SessionCommandMixin(CommandContextMixIn): - """ - A class mixin for command classes needing _build_session(). - """ - - def __init__(self) -> None: - super().__init__() - self._session: PipSession | None = None - - @classmethod - def _get_index_urls(cls, options: Values) -> list[str] | None: - """Return a list of index urls from user-provided options.""" - index_urls = [] - if not getattr(options, "no_index", False): - url = getattr(options, "index_url", None) - if url: - index_urls.append(url) - urls = getattr(options, "extra_index_urls", None) - if urls: - index_urls.extend(urls) - # Return None rather than an empty list - return index_urls or None - - def get_default_session(self, options: Values) -> PipSession: - """Get a default-managed session.""" - if self._session is None: - self._session = self.enter_context(self._build_session(options)) - # there's no type annotation on requests.Session, so it's - # automatically ContextManager[Any] and self._session becomes Any, - # then https://github.com/python/mypy/issues/7696 kicks in - assert self._session is not None - return self._session - - def _build_session( - self, - options: Values, - retries: int | None = None, - timeout: int | None = None, - ) -> PipSession: - from pip._internal.network.session import PipSession - - cache_dir = options.cache_dir - assert not cache_dir or os.path.isabs(cache_dir) - - if "legacy-certs" not in options.deprecated_features_enabled: - ssl_context = _create_truststore_ssl_context() - else: - ssl_context = None - - session = PipSession( - cache=os.path.join(cache_dir, "http-v2") if cache_dir else None, - retries=retries if retries is not None else options.retries, - resume_retries=options.resume_retries, - trusted_hosts=options.trusted_hosts, - index_urls=self._get_index_urls(options), - ssl_context=ssl_context, - refresh_package=getattr(options, "refresh_package", set()), - ) - - # Handle custom ca-bundles from the user - if options.cert: - session.verify = options.cert - - # Handle SSL client certificate - if options.client_cert: - session.cert = options.client_cert - - # Handle timeouts - if options.timeout or timeout: - session.timeout = timeout if timeout is not None else options.timeout - - # An explicit --proxy (including "" to disable proxying) or --no-proxy-env - # makes the session ignore environment proxies; unset --proxy is None. - if options.proxy is not None or options.no_proxy_env: - if options.proxy: - session.proxies = { - "http": options.proxy, - "https": options.proxy, - } - session.trust_env = False - # Keep "" so an empty --proxy reaches build subprocesses. - session.pip_proxy = options.proxy - session.pip_no_proxy_env = options.no_proxy_env - - # Determine if we can prompt the user for authentication or not - session.auth.prompting = not options.no_input - session.auth.keyring_provider = options.keyring_provider - - return session - - -def _pip_self_version_check_fetch( - session: PipSession, options: Values -) -> UpgradePrompt | None: - from pip._internal.self_outdated_check import pip_self_version_check_fetch - - return pip_self_version_check_fetch(session, options) - - -def _pip_self_version_check_emit(upgrade_prompt: UpgradePrompt | None) -> None: - from pip._internal.self_outdated_check import pip_self_version_check_emit - - pip_self_version_check_emit(upgrade_prompt) - - -class IndexGroupCommand(Command, SessionCommandMixin): - """ - Abstract base class for commands with the index_group options. - - This also corresponds to the commands that permit the pip version check. - """ - - def should_exclude_prerelease( - self, options: Values, package_name: NormalizedName - ) -> bool: - """ - Determine if pre-releases should be excluded for a package. - """ - # Check per-package release control settings - if options.release_control: - allow_prereleases = options.release_control.allows_prereleases(package_name) - if allow_prereleases is True: - return False # Include pre-releases - elif allow_prereleases is False: - return True # Exclude pre-releases - - # No specific setting: exclude prereleases by default - return True - - @contextlib.contextmanager - def pip_version_check(self, options: Values, args: list[str]) -> Iterator[None]: - """ - Do the pip version check if not disabled. - - This overrides the default behavior of not doing the check. - """ - # Make sure the index_group options are present. - assert hasattr(options, "no_index") - - if options.disable_pip_version_check or options.no_index: - yield - return - - upgrade_prompt: UpgradePrompt | None = None - try: - session = self._build_session( - options, - retries=0, - timeout=min(5, options.timeout), - ) - with session: - upgrade_prompt = _pip_self_version_check_fetch(session, options) - except Exception: - logger.warning("There was an error checking the latest version of pip.") - logger.debug("See below for error", exc_info=True) - - try: - yield - finally: - try: - _pip_self_version_check_emit(upgrade_prompt) - except Exception: - logger.warning("There was an error checking the latest version of pip.") - logger.debug("See below for error", exc_info=True) diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/main.py b/venv/lib/python3.11/site-packages/pip/_internal/cli/main.py deleted file mode 100755 index 86ea4d5..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/cli/main.py +++ /dev/null @@ -1,86 +0,0 @@ -"""Primary application entrypoint.""" - -from __future__ import annotations - -import locale -import logging -import os -import sys -import warnings - -logger = logging.getLogger(__name__) - - -# Do not import and use main() directly! Using it directly is actively -# discouraged by pip's maintainers. The name, location and behavior of -# this function is subject to change, so calling it directly is not -# portable across different pip versions. - -# In addition, running pip in-process is unsupported and unsafe. This is -# elaborated in detail at -# https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program. -# That document also provides suggestions that should work for nearly -# all users that are considering importing and using main() directly. - -# However, we know that certain users will still want to invoke pip -# in-process. If you understand and accept the implications of using pip -# in an unsupported manner, the best approach is to use runpy to avoid -# depending on the exact location of this entry point. - -# The following example shows how to use runpy to invoke pip in that -# case: -# -# sys.argv = ["pip", your, args, here] -# runpy.run_module("pip", run_name="__main__") -# -# Note that this will exit the process after running, unlike a direct -# call to main. As it is not safe to do any processing after calling -# main, this should not be an issue in practice. - - -def main(args: list[str] | None = None) -> int: - # NOTE: Lazy imports to speed up import of this module, - # which is imported from the pip console script. This doesn't - # speed up normal pip execution, but might be important in the future - # if we use ``multiprocessing`` module, - # which imports __main__ for each spawned subprocess. - from pip._internal.cli.autocompletion import autocomplete - from pip._internal.cli.main_parser import parse_command - from pip._internal.commands import create_command - from pip._internal.exceptions import PipError - from pip._internal.utils import deprecation - - if args is None: - args = sys.argv[1:] - - # Suppress the pkg_resources deprecation warning - # Note - we use a module of .*pkg_resources to cover - # the normal case (pip._vendor.pkg_resources) and the - # devendored case (a bare pkg_resources) - warnings.filterwarnings( - action="ignore", category=DeprecationWarning, module=".*pkg_resources" - ) - - # Configure our deprecation warnings to be sent through loggers - deprecation.install_warning_logger() - - autocomplete() - - try: - cmd_name, cmd_args = parse_command(args) - except PipError as exc: - sys.stderr.write(f"ERROR: {exc}") - sys.stderr.write(os.linesep) - sys.exit(1) - - # Needed for locale encoding detection to work - # in pip._internal.utils.encoding.auto_decode - # TODO: Re-evaluate whether this is still needed once pip drops Python 3.10. - try: - locale.setlocale(locale.LC_ALL, "") - except locale.Error as e: - # setlocale can apparently crash if locale are uninitialized - logger.debug("Ignoring error %s when setting locale", e) - command = create_command(cmd_name, isolated=("--isolated" in cmd_args)) - - return command.main(cmd_args) diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/main_parser.py b/venv/lib/python3.11/site-packages/pip/_internal/cli/main_parser.py deleted file mode 100755 index 903c891..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/cli/main_parser.py +++ /dev/null @@ -1,135 +0,0 @@ -"""A single place for constructing and exposing the main parser""" - -from __future__ import annotations - -import os -import subprocess -import sys - -from pip._vendor.rich.markup import escape - -from pip._internal.cli import cmdoptions -from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter -from pip._internal.commands import commands_dict, get_similar_commands -from pip._internal.exceptions import CommandError -from pip._internal.utils.misc import get_pip_version, get_prog, get_runnable_pip - -__all__ = ["create_main_parser", "parse_command"] - - -def create_main_parser() -> ConfigOptionParser: - """Creates and returns the main parser for pip's CLI""" - - parser = ConfigOptionParser( - usage="\n%prog [options]", - add_help_option=False, - formatter=UpdatingDefaultsHelpFormatter(), - name="global", - prog=get_prog(), - ) - parser.disable_interspersed_args() - - parser.version = get_pip_version() - - # add the general options - gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser) - parser.add_option_group(gen_opts) - - # so the help formatter knows - parser.main = True # type: ignore - - # create command listing for description - description = [""] + [ - f"[optparse.longargs]{name:27}[/] {escape(command_info.summary)}" - for name, command_info in commands_dict.items() - ] - parser.description = "\n".join(description) - - return parser - - -def identify_python_interpreter(python: str) -> str | None: - # If the named file exists, use it. - # If it's a directory, assume it's a virtual environment and - # look for the environment's Python executable. - if os.path.exists(python): - if os.path.isdir(python): - # bin/python for Unix, Scripts/python.exe for Windows - # Try both in case of odd cases like cygwin. - for exe in ("bin/python", "Scripts/python.exe"): - py = os.path.join(python, exe) - if os.path.exists(py): - return py - else: - return python - - # Could not find the interpreter specified - return None - - -def parse_command(args: list[str]) -> tuple[str, list[str]]: - parser = create_main_parser() - - # Note: parser calls disable_interspersed_args(), so the result of this - # call is to split the initial args into the general options before the - # subcommand and everything else. - # For example: - # args: ['--timeout=5', 'install', '--user', 'INITools'] - # general_options: ['--timeout==5'] - # args_else: ['install', '--user', 'INITools'] - general_options, args_else = parser.parse_args(args) - - # --python - if general_options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ: - # Re-invoke pip using the specified Python interpreter - interpreter = identify_python_interpreter(general_options.python) - if interpreter is None: - raise CommandError( - f"Could not locate Python interpreter {general_options.python}" - ) - - pip_cmd = [ - interpreter, - get_runnable_pip(), - ] - pip_cmd.extend(args) - - # Set a flag so the child doesn't re-invoke itself, causing - # an infinite loop. - os.environ["_PIP_RUNNING_IN_SUBPROCESS"] = "1" - returncode = 0 - try: - proc = subprocess.run(pip_cmd) - returncode = proc.returncode - except (subprocess.SubprocessError, OSError) as exc: - raise CommandError(f"Failed to run pip under {interpreter}: {exc}") - sys.exit(returncode) - - # --version - if general_options.version: - sys.stdout.write(parser.version) - sys.stdout.write(os.linesep) - sys.exit() - - # pip || pip help -> print_help() - if not args_else or (args_else[0] == "help" and len(args_else) == 1): - parser.print_help() - sys.exit() - - # the subcommand name - cmd_name = args_else[0] - - if cmd_name not in commands_dict: - guess = get_similar_commands(cmd_name) - - msg = [f'unknown command "{cmd_name}"'] - if guess: - msg.append(f'maybe you meant "{guess}"') - - raise CommandError(" - ".join(msg)) - - # all the args without the subcommand - cmd_args = args[:] - cmd_args.remove(cmd_name) - - return cmd_name, cmd_args diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/parser.py b/venv/lib/python3.11/site-packages/pip/_internal/cli/parser.py deleted file mode 100755 index 4df249a..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/cli/parser.py +++ /dev/null @@ -1,366 +0,0 @@ -"""Base option parser setup""" - -from __future__ import annotations - -import logging -import optparse -import os -import re -import shutil -import sys -import textwrap -from collections.abc import Generator -from contextlib import suppress -from typing import Any, NoReturn - -from pip._vendor.rich.markup import escape -from pip._vendor.rich.theme import Theme - -from pip._internal.cli.status_codes import UNKNOWN_ERROR -from pip._internal.configuration import Configuration, ConfigurationError -from pip._internal.utils.logging import PipConsole -from pip._internal.utils.misc import redact_auth_from_url, strtobool - -logger = logging.getLogger(__name__) - - -class PrettyHelpFormatter(optparse.IndentedHelpFormatter): - """A prettier/less verbose help formatter for optparse.""" - - styles = { - "optparse.shortargs": "green", - "optparse.longargs": "cyan", - "optparse.groups": "bold blue", - "optparse.metavar": "yellow", - } - highlights = { - r"\s(-{1}[\w]+[\w-]*)": "shortargs", # highlight -letter as short args - r"\s(-{2}[\w]+[\w-]*)": "longargs", # highlight --words as long args - } - - def __init__(self, *args: Any, **kwargs: Any) -> None: - # help position must be aligned with __init__.parseopts.description - kwargs["max_help_position"] = 30 - kwargs["indent_increment"] = 1 - kwargs["width"] = shutil.get_terminal_size()[0] - 2 - super().__init__(*args, **kwargs) - - def format_option_strings(self, option: optparse.Option) -> str: - """Return a comma-separated list of option strings and metavars.""" - opts = [] - - if option._short_opts: - opts.append(f"[optparse.shortargs]{option._short_opts[0]}[/]") - if option._long_opts: - opts.append(f"[optparse.longargs]{option._long_opts[0]}[/]") - if len(opts) > 1: - opts.insert(1, ", ") - - if option.takes_value(): - assert option.dest is not None - metavar = option.metavar or option.dest.lower() - opts.append(f" [optparse.metavar]<{escape(metavar.lower())}>[/]") - - return "".join(opts) - - def format_option(self, option: optparse.Option) -> str: - """Overridden method with Rich support.""" - # fmt: off - result = [] - opts = self.option_strings[option] - opt_width = self.help_position - self.current_indent - 2 - # Remove the rich style tags before calculating width during - # text wrap calculations. Also store the length removed to adjust - # the padding in the else branch. - stripped = re.sub(r"(\[[a-z.]+\])|(\[\/\])", "", opts) - style_tag_length = len(opts) - len(stripped) - if len(stripped) > opt_width: - opts = "%*s%s\n" % (self.current_indent, "", opts) # noqa: UP031 - indent_first = self.help_position - else: # start help on same line as opts - opts = "%*s%-*s " % (self.current_indent, "", # noqa: UP031 - opt_width + style_tag_length, opts) - indent_first = 0 - result.append(opts) - if option.help: - help_text = self.expand_default(option) - help_lines = textwrap.wrap(help_text, self.help_width) - result.append("%*s%s\n" % (indent_first, "", help_lines[0])) # noqa: UP031 - result.extend(["%*s%s\n" % (self.help_position, "", line) # noqa: UP031 - for line in help_lines[1:]]) - elif opts[-1] != "\n": - result.append("\n") - return "".join(result) - # fmt: on - - def format_heading(self, heading: str) -> str: - if heading == "Options": - return "" - return "[optparse.groups]" + escape(heading) + ":[/]\n" - - def format_usage(self, usage: str) -> str: - """ - Ensure there is only one newline between usage and the first heading - if there is no description. - """ - contents = self.indent_lines(textwrap.dedent(usage), " ") - msg = f"\n[optparse.groups]Usage:[/] {escape(contents)}\n" - return msg - - def format_description(self, description: str | None) -> str: - # leave full control over description to us - if description: - if hasattr(self.parser, "main"): - label = "[optparse.groups]Commands:[/]" - else: - label = "[optparse.groups]Description:[/]" - - # some doc strings have initial newlines, some don't - description = description.lstrip("\n") - # some doc strings have final newlines and spaces, some don't - description = description.rstrip() - # dedent, then reindent - description = self.indent_lines(textwrap.dedent(description), " ") - description = f"{label}\n{description}\n" - return description - else: - return "" - - def format_epilog(self, epilog: str | None) -> str: - # leave full control over epilog to us - if epilog: - return escape(epilog) - else: - return "" - - def expand_default(self, option: optparse.Option) -> str: - """Overridden HelpFormatter.expand_default() which colorizes flags.""" - help = escape(super().expand_default(option)) - for regex, style in self.highlights.items(): - help = re.sub(regex, rf"[optparse.{style}] \1[/]", help) - return help - - def indent_lines(self, text: str, indent: str) -> str: - new_lines = [indent + line for line in text.split("\n")] - return "\n".join(new_lines) - - -class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter): - """Custom help formatter for use in ConfigOptionParser. - - This is updates the defaults before expanding them, allowing - them to show up correctly in the help listing. - - Also redact auth from url type options - """ - - def expand_default(self, option: optparse.Option) -> str: - default_values = None - if self.parser is not None: - assert isinstance(self.parser, ConfigOptionParser) - self.parser._update_defaults(self.parser.defaults) - assert option.dest is not None - default_values = self.parser.defaults.get(option.dest) - help_text = super().expand_default(option) - - if default_values and option.metavar == "URL": - if isinstance(default_values, str): - default_values = [default_values] - - # If its not a list, we should abort and just return the help text - if not isinstance(default_values, list): - default_values = [] - - for val in default_values: - help_text = help_text.replace(val, redact_auth_from_url(val)) - - return help_text - - -class CustomOptionParser(optparse.OptionParser): - def insert_option_group( - self, idx: int, *args: Any, **kwargs: Any - ) -> optparse.OptionGroup: - """Insert an OptionGroup at a given position.""" - group = self.add_option_group(*args, **kwargs) - - self.option_groups.pop() - self.option_groups.insert(idx, group) - - return group - - @property - def option_list_all(self) -> list[optparse.Option]: - """Get a list of all options, including those in option groups.""" - res = self.option_list[:] - for i in self.option_groups: - res.extend(i.option_list) - - return res - - -class ConfigOptionParser(CustomOptionParser): - """Custom option parser which updates its defaults by checking the - configuration files and environmental variables""" - - def __init__( - self, - *args: Any, - name: str, - isolated: bool = False, - **kwargs: Any, - ) -> None: - self.name = name - self.config = Configuration(isolated) - - assert self.name - super().__init__(*args, **kwargs) - - def check_default(self, option: optparse.Option, key: str, val: Any) -> Any: - try: - return option.check_value(key, val) - except optparse.OptionValueError as exc: - print(f"An error occurred during configuration: {exc}") - sys.exit(3) - - def _get_ordered_configuration_items( - self, - ) -> Generator[tuple[str, Any], None, None]: - # Configuration gives keys in an unordered manner. Order them. - override_order = ["global", self.name, ":env:"] - - # Pool the options into different groups - # Use a dict because we need to implement the fallthrough logic after PR 12201 - # was merged which removed the fallthrough logic for options - section_items_dict: dict[str, dict[str, Any]] = { - name: {} for name in override_order - } - - for _, value in self.config.items(): - for section_key, val in value.items(): - - section, key = section_key.split(".", 1) - if section in override_order: - section_items_dict[section][key] = val - - # Now that we a dict of items per section, convert to list of tuples - # Make sure we completely remove empty values again - section_items = { - name: [(k, v) for k, v in section_items_dict[name].items() if v] - for name in override_order - } - - # Yield each group in their override order - for section in override_order: - yield from section_items[section] - - def _update_defaults(self, defaults: dict[str, Any]) -> dict[str, Any]: - """Updates the given defaults with values from the config files and - the environ. Does a little special handling for certain types of - options (lists).""" - - # Accumulate complex default state. - self.values = optparse.Values(self.defaults) - late_eval = set() - # Then set the options with those values - for key, val in self._get_ordered_configuration_items(): - # '--' because configuration supports only long names - option = self.get_option("--" + key) - - # Ignore options not present in this parser. E.g. non-globals put - # in [global] by users that want them to apply to all applicable - # commands. - if option is None: - continue - - assert option.dest is not None - - if option.action in ("store_true", "store_false"): - try: - val = strtobool(val) - except ValueError: - self.error( - f"{val} is not a valid value for {key} option, " - "please specify a boolean value like yes/no, " - "true/false or 1/0 instead." - ) - elif option.action == "count": - with suppress(ValueError): - val = strtobool(val) - with suppress(ValueError): - val = int(val) - if not isinstance(val, int) or val < 0: - self.error( - f"{val} is not a valid value for {key} option, " - "please instead specify either a non-negative integer " - "or a boolean value like yes/no or false/true " - "which is equivalent to 1/0." - ) - elif option.action == "append": - val = val.split() - val = [self.check_default(option, key, v) for v in val] - elif option.action == "callback": - assert option.callback is not None - late_eval.add(option.dest) - opt_str = option.get_opt_string() - val = option.convert_value(opt_str, val) - # From take_action - args = option.callback_args or () - kwargs = option.callback_kwargs or {} - option.callback(option, opt_str, val, self, *args, **kwargs) - else: - val = self.check_default(option, key, val) - - defaults[option.dest] = val - - for key in late_eval: - defaults[key] = getattr(self.values, key) - self.values = None - return defaults - - def get_default_values(self) -> optparse.Values: - """Overriding to make updating the defaults after instantiation of - the option parser possible, _update_defaults() does the dirty work.""" - if not self.process_default_values: - # Old, pre-Optik 1.5 behaviour. - return optparse.Values(self.defaults) - - # Load the configuration, or error out in case of an error - try: - self.config.load() - except ConfigurationError as err: - self.exit(UNKNOWN_ERROR, str(err)) - - defaults = self._update_defaults(self.defaults.copy()) # ours - for option in self._get_all_options(): - assert option.dest is not None - default = defaults.get(option.dest) - if isinstance(default, str): - opt_str = option.get_opt_string() - defaults[option.dest] = option.check_value(opt_str, default) - return optparse.Values(defaults) - - def error(self, msg: str) -> NoReturn: - self.print_usage(sys.stderr) - self.exit(UNKNOWN_ERROR, f"{msg}\n") - - def _create_console_for_help(self, file: Any = None) -> PipConsole: - # This is unfortunate but necessary since arguments may have not been - # parsed yet at this point, so detect --no-color manually. - no_color = ( - "--no-color" in sys.argv - or bool(strtobool(os.environ.get("PIP_NO_COLOR", "no") or "no")) - or "NO_COLOR" in os.environ - ) - return PipConsole( - theme=Theme(PrettyHelpFormatter.styles), no_color=no_color, file=file - ) - - def print_usage(self, file: Any = None) -> None: - if self.usage: - console = self._create_console_for_help(file) - console.print(self.get_usage(), highlight=False) - - def print_help(self, file: Any = None) -> None: - console = self._create_console_for_help(file) - console.print(self.format_help().rstrip(), highlight=False) diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/progress_bars.py b/venv/lib/python3.11/site-packages/pip/_internal/cli/progress_bars.py deleted file mode 100755 index f276c7e..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/cli/progress_bars.py +++ /dev/null @@ -1,153 +0,0 @@ -from __future__ import annotations - -import functools -import sys -from collections.abc import Callable, Generator, Iterable, Iterator -from typing import TYPE_CHECKING, Literal, TypeVar - -from pip._vendor.rich.progress import ( - BarColumn, - DownloadColumn, - FileSizeColumn, - MofNCompleteColumn, - Progress, - ProgressColumn, - SpinnerColumn, - TextColumn, - TimeElapsedColumn, - TimeRemainingColumn, - TransferSpeedColumn, -) - -from pip._internal.cli.spinners import RateLimiter -from pip._internal.utils.logging import get_console, get_indentation - -if TYPE_CHECKING: - from pip._internal.req.req_install import InstallRequirement - -T = TypeVar("T") -ProgressRenderer = Callable[[Iterable[T]], Iterator[T]] -BarType = Literal["on", "off", "raw"] - - -def _rich_download_progress_bar( - iterable: Iterable[bytes], - *, - bar_type: BarType, - size: int | None, - initial_progress: int | None = None, -) -> Generator[bytes, None, None]: - assert bar_type == "on", "This should only be used in the default mode." - - if not size: - total = float("inf") - columns: tuple[ProgressColumn, ...] = ( - TextColumn("[progress.description]{task.description}"), - SpinnerColumn("line", speed=1.5), - FileSizeColumn(), - TransferSpeedColumn(), - TimeElapsedColumn(), - ) - else: - total = size - columns = ( - TextColumn("[progress.description]{task.description}"), - BarColumn(), - DownloadColumn(), - TransferSpeedColumn(), - TextColumn("{task.fields[time_description]}"), - TimeRemainingColumn(elapsed_when_finished=True), - ) - - progress = Progress(*columns, refresh_per_second=5) - task_id = progress.add_task( - " " * (get_indentation() + 2), total=total, time_description="eta" - ) - if initial_progress is not None: - progress.update(task_id, advance=initial_progress) - with progress: - for chunk in iterable: - yield chunk - progress.update(task_id, advance=len(chunk)) - progress.update(task_id, time_description="") - - -def _rich_install_progress_bar( - iterable: Iterable[InstallRequirement], *, total: int -) -> Iterator[InstallRequirement]: - columns = ( - TextColumn("{task.fields[indent]}"), - BarColumn(), - MofNCompleteColumn(), - TextColumn("{task.description}"), - ) - console = get_console() - - bar = Progress(*columns, refresh_per_second=6, console=console, transient=True) - # Hiding the progress bar at initialization forces a refresh cycle to occur - # until the bar appears, avoiding very short flashes. - task = bar.add_task("", total=total, indent=" " * get_indentation(), visible=False) - with bar: - for req in iterable: - bar.update(task, description=rf"\[{req.name}]", visible=True) - yield req - bar.advance(task) - - -def _raw_progress_bar( - iterable: Iterable[bytes], - *, - size: int | None, - initial_progress: int | None = None, -) -> Generator[bytes, None, None]: - def write_progress(current: int, total: int) -> None: - sys.stdout.write(f"Progress {current} of {total}\n") - sys.stdout.flush() - - current = initial_progress or 0 - total = size or 0 - rate_limiter = RateLimiter(0.25) - - write_progress(current, total) - for chunk in iterable: - current += len(chunk) - if rate_limiter.ready() or current == total: - write_progress(current, total) - rate_limiter.reset() - yield chunk - - -def get_download_progress_renderer( - *, bar_type: BarType, size: int | None = None, initial_progress: int | None = None -) -> ProgressRenderer[bytes]: - """Get an object that can be used to render the download progress. - - Returns a callable, that takes an iterable to "wrap". - """ - if bar_type == "on": - return functools.partial( - _rich_download_progress_bar, - bar_type=bar_type, - size=size, - initial_progress=initial_progress, - ) - elif bar_type == "raw": - return functools.partial( - _raw_progress_bar, - size=size, - initial_progress=initial_progress, - ) - else: - return iter # no-op, when passed an iterator - - -def get_install_progress_renderer( - *, bar_type: BarType, total: int -) -> ProgressRenderer[InstallRequirement]: - """Get an object that can be used to render the install progress. - Returns a callable, that takes an iterable to "wrap". - """ - if bar_type == "on": - return functools.partial(_rich_install_progress_bar, total=total) - else: - return iter diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/req_command.py b/venv/lib/python3.11/site-packages/pip/_internal/cli/req_command.py deleted file mode 100755 index f58a970..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/cli/req_command.py +++ /dev/null @@ -1,504 +0,0 @@ -"""Contains the RequirementCommand base class. - -This class is in a separate module so the commands that do not always -need PackageFinder capability don't unnecessarily import the -PackageFinder machinery and all its vendored dependencies, etc. -""" - -from __future__ import annotations - -import logging -import os -from collections.abc import Callable -from functools import partial -from optparse import Values -from typing import Any, TypeVar - -from pip._internal.build_env import ( - BuildEnvironmentInstaller, - BuildIsolationMode, - InprocessBuildEnvironmentInstaller, - SubprocessBuildEnvironmentInstaller, -) -from pip._internal.cache import WheelCache -from pip._internal.cli import cmdoptions -from pip._internal.cli.cmdoptions import make_target_python -from pip._internal.cli.index_command import IndexGroupCommand -from pip._internal.cli.index_command import SessionCommandMixin as SessionCommandMixin -from pip._internal.exceptions import ( - CommandError, - PreviousBuildDirError, - UnsupportedPythonVersion, -) -from pip._internal.index.collector import LinkCollector -from pip._internal.index.package_finder import PackageFinder -from pip._internal.models.selection_prefs import SelectionPreferences -from pip._internal.models.target_python import TargetPython -from pip._internal.network.session import PipSession -from pip._internal.operations.build.build_tracker import BuildTracker -from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req.constructors import ( - install_req_from_editable, - install_req_from_line, - install_req_from_parsed_requirement, - install_req_from_pylock_package, - install_req_from_req_string, -) -from pip._internal.req.pep723 import PEP723Exception, pep723_metadata -from pip._internal.req.req_dependency_group import parse_dependency_groups -from pip._internal.req.req_file import parse_requirements -from pip._internal.req.req_install import InstallRequirement -from pip._internal.resolution.base import BaseResolver -from pip._internal.utils.packaging import check_requires_python -from pip._internal.utils.pylock import ( - is_valid_pylock_filename, - select_from_pylock_path_or_url, -) -from pip._internal.utils.temp_dir import ( - TempDirectory, - TempDirectoryTypeRegistry, - tempdir_kinds, -) - -logger = logging.getLogger(__name__) - - -def should_ignore_regular_constraints() -> bool: - """ - Whether this process should ignore the regular constraints it inherits. - - The parent pip sets ``_PIP_IN_BUILD_IGNORE_CONSTRAINTS`` whenever it starts - an isolated build in a subprocess, so that regular constraints the build - inherits (such as via ``PIP_CONSTRAINT`` or config files) do not affect it. - Only build constraints apply there. - """ - - return os.environ.get("_PIP_IN_BUILD_IGNORE_CONSTRAINTS") == "1" - - -KEEPABLE_TEMPDIR_TYPES = [ - tempdir_kinds.BUILD_ENV, - tempdir_kinds.EPHEM_WHEEL_CACHE, - tempdir_kinds.REQ_BUILD, -] - - -_CommandT = TypeVar("_CommandT", bound="RequirementCommand") - - -def with_cleanup( - func: Callable[[_CommandT, Values, list[str]], int], -) -> Callable[[_CommandT, Values, list[str]], int]: - """Decorator for common logic related to managing temporary - directories. - """ - - def configure_tempdir_registry(registry: TempDirectoryTypeRegistry) -> None: - for t in KEEPABLE_TEMPDIR_TYPES: - registry.set_delete(t, False) - - def wrapper(self: _CommandT, options: Values, args: list[str]) -> int: - assert self.tempdir_registry is not None - if options.no_clean: - configure_tempdir_registry(self.tempdir_registry) - - try: - return func(self, options, args) - except PreviousBuildDirError: - # This kind of conflict can occur when the user passes an explicit - # build directory with a pre-existing folder. In that case we do - # not want to accidentally remove it. - configure_tempdir_registry(self.tempdir_registry) - raise - - return wrapper - - -def parse_constraint_files( - constraint_files: list[str], - finder: PackageFinder, - options: Values, - session: PipSession, -) -> list[InstallRequirement]: - requirements = [] - for filename in constraint_files: - for parsed_req in parse_requirements( - filename, - constraint=True, - finder=finder, - options=options, - session=session, - ): - req_to_add = install_req_from_parsed_requirement( - parsed_req, - isolated=options.isolated_mode, - user_supplied=False, - ) - requirements.append(req_to_add) - - return requirements - - -class RequirementCommand(IndexGroupCommand): - def __init__(self, *args: Any, **kw: Any) -> None: - super().__init__(*args, **kw) - - self.cmd_opts.add_option(cmdoptions.dependency_groups()) - self.cmd_opts.add_option(cmdoptions.no_clean()) - - @staticmethod - def determine_resolver_variant(options: Values) -> str: - """Determines which resolver should be used, based on the given options.""" - if "legacy-resolver" in options.deprecated_features_enabled: - return "legacy" - - return "resolvelib" - - @classmethod - def make_requirement_preparer( - cls, - temp_build_dir: TempDirectory, - options: Values, - build_tracker: BuildTracker, - session: PipSession, - finder: PackageFinder, - *, - allow_editables: bool, - use_user_site: bool, - download_dir: str | None = None, - verbosity: int = 0, - ) -> RequirementPreparer: - """ - Create a RequirementPreparer instance for the given parameters. - """ - temp_build_dir_path = temp_build_dir.path - assert temp_build_dir_path is not None - legacy_resolver = False - - resolver_variant = cls.determine_resolver_variant(options) - if resolver_variant == "resolvelib": - lazy_wheel = "fast-deps" in options.features_enabled - if lazy_wheel: - logger.warning( - "pip is using lazily downloaded wheels using HTTP " - "range requests to obtain dependency information. " - "This experimental feature is enabled through " - "--use-feature=fast-deps and it is not ready for " - "production." - ) - else: - legacy_resolver = True - lazy_wheel = False - if "fast-deps" in options.features_enabled: - logger.warning( - "fast-deps has no effect when used with the legacy resolver." - ) - - # Handle build constraints - build_constraints = getattr(options, "build_constraints", []) - - env_installer: BuildEnvironmentInstaller - if "inprocess-build-deps" in options.features_enabled: - build_constraint_reqs = parse_constraint_files( - build_constraints, finder, options, session - ) - env_installer = InprocessBuildEnvironmentInstaller( - finder=finder, - build_tracker=build_tracker, - build_constraints=build_constraint_reqs, - verbosity=verbosity, - wheel_cache=WheelCache(options.cache_dir), - ) - else: - env_installer = SubprocessBuildEnvironmentInstaller( - finder, - build_constraints=build_constraints, - ) - - if not options.build_isolation: - build_isolation: BuildIsolationMode = "off" - elif "venv-isolation" in options.features_enabled: - build_isolation = "venv" - if "inprocess-build-deps" in options.features_enabled: - logger.warning( - "Using --use-feature 'inprocess-build-deps' and 'venv-isolation'" - " together is currently partially supported. If you encounter" - " broken behaviour, use only one feature." - ) - else: - build_isolation = "virtual" - - return RequirementPreparer( - build_dir=temp_build_dir_path, - src_dir=options.src_dir, - download_dir=download_dir, - build_isolation=build_isolation, - build_isolation_installer=env_installer, - check_build_deps=options.check_build_deps, - build_tracker=build_tracker, - session=session, - progress_bar=options.progress_bar, - finder=finder, - require_hashes=options.require_hashes, - use_user_site=use_user_site, - lazy_wheel=lazy_wheel, - verbosity=verbosity, - legacy_resolver=legacy_resolver, - allow_editables=allow_editables, - ) - - @classmethod - def make_resolver( - cls, - preparer: RequirementPreparer, - finder: PackageFinder, - options: Values, - wheel_cache: WheelCache | None = None, - use_user_site: bool = False, - ignore_installed: bool = True, - ignore_requires_python: bool = False, - force_reinstall: bool = False, - upgrade_strategy: str = "to-satisfy-only", - py_version_info: tuple[int, ...] | None = None, - ) -> BaseResolver: - """ - Create a Resolver instance for the given parameters. - """ - make_install_req = partial( - install_req_from_req_string, - isolated=options.isolated_mode, - ) - resolver_variant = cls.determine_resolver_variant(options) - # The long import name and duplicated invocation is needed to convince - # Mypy into correctly typechecking. Otherwise it would complain the - # "Resolver" class being redefined. - if resolver_variant == "resolvelib": - import pip._internal.resolution.resolvelib.resolver - - return pip._internal.resolution.resolvelib.resolver.Resolver( - preparer=preparer, - finder=finder, - wheel_cache=wheel_cache, - make_install_req=make_install_req, - use_user_site=use_user_site, - ignore_dependencies=options.ignore_dependencies, - only_dependencies=options.only_dependencies, - ignore_installed=ignore_installed, - ignore_requires_python=ignore_requires_python, - force_reinstall=force_reinstall, - upgrade_strategy=upgrade_strategy, - py_version_info=py_version_info, - ) - import pip._internal.resolution.legacy.resolver - - return pip._internal.resolution.legacy.resolver.Resolver( - preparer=preparer, - finder=finder, - wheel_cache=wheel_cache, - make_install_req=make_install_req, - use_user_site=use_user_site, - ignore_dependencies=options.ignore_dependencies, - only_dependencies=options.only_dependencies, - ignore_installed=ignore_installed, - ignore_requires_python=ignore_requires_python, - force_reinstall=force_reinstall, - upgrade_strategy=upgrade_strategy, - py_version_info=py_version_info, - ) - - def get_requirements( - self, - args: list[str], - options: Values, - finder: PackageFinder, - session: PipSession, - ) -> list[InstallRequirement]: - """ - Parse command-line arguments into the corresponding requirements. - """ - requirements: list[InstallRequirement] = [] - - if should_ignore_regular_constraints(): - # Inside an isolated build subprocess: apply the build constraints - # (forwarded via --build-constraint) instead of the inherited ones. - constraint_files = getattr(options, "build_constraints", []) - else: - constraint_files = options.constraints - - constraints = parse_constraint_files(constraint_files, finder, options, session) - requirements.extend(constraints) - - for req in args: - if not req.strip(): - continue - req_to_add = install_req_from_line( - req, - comes_from=None, - isolated=options.isolated_mode, - user_supplied=True, - config_settings=getattr(options, "config_settings", None), - ) - requirements.append(req_to_add) - - if options.dependency_groups: - for req in parse_dependency_groups(options.dependency_groups): - req_to_add = install_req_from_req_string( - req, - isolated=options.isolated_mode, - user_supplied=True, - ) - requirements.append(req_to_add) - - for req in options.editables: - req_to_add = install_req_from_editable( - req, - user_supplied=True, - isolated=options.isolated_mode, - config_settings=getattr(options, "config_settings", None), - ) - requirements.append(req_to_add) - - # NOTE: options.require_hashes may be set if --require-hashes is True - for filename in options.requirements: - if is_valid_pylock_filename(filename): - logger.warning( - "Using pylock.toml as a requirements source " - "is an experimental feature. " - "It may be removed/changed in a future release " - "without prior warning." - ) - for package, package_dist in select_from_pylock_path_or_url( - filename, session=session - ): - req_to_add, locked_link = install_req_from_pylock_package( - package, - package_dist, - filename, - user_supplied=True, - ) - requirements.append(req_to_add) - if locked_link: - finder.add_locked_link(package.name, locked_link) - continue - for parsed_req in parse_requirements( - filename, finder=finder, options=options, session=session - ): - req_to_add = install_req_from_parsed_requirement( - parsed_req, - isolated=options.isolated_mode, - user_supplied=True, - config_settings=( - parsed_req.options.get("config_settings") - if parsed_req.options - else None - ), - ) - requirements.append(req_to_add) - - if options.requirements_from_scripts: - if len(options.requirements_from_scripts) > 1: - raise CommandError("--requirements-from-script can only be given once") - - script = options.requirements_from_scripts[0] - try: - script_metadata = pep723_metadata(script) - except PEP723Exception as exc: - raise CommandError(exc.msg) - - script_requires_python = script_metadata.get("requires-python", "") - - if script_requires_python and not options.ignore_requires_python: - target_python = make_target_python(options) - - if not check_requires_python( - requires_python=script_requires_python, - version_info=target_python.py_version_info, - ): - raise UnsupportedPythonVersion( - f"Script {script!r} requires a different Python: " - f"{target_python.py_version} not in {script_requires_python!r}" - ) - - for req in script_metadata.get("dependencies", []): - req_to_add = install_req_from_req_string( - req, - isolated=options.isolated_mode, - user_supplied=True, - ) - requirements.append(req_to_add) - - if options.require_hashes and options.no_require_hashes: - raise CommandError( - "--require-hashes and --no-require-hashes are mutually exclusive" - ) - - # If any requirement has hash options, enable hash checking for all - # requirements, unless this mechanism has been explicitly disabled - # with --no-require-hashes. - if not options.no_require_hashes and any( - req.has_hash_options for req in requirements - ): - options.require_hashes = True - - if not ( - args - or options.editables - or options.requirements - or options.dependency_groups - or options.requirements_from_scripts - ): - opts = {"name": self.name} - if options.find_links: - raise CommandError( - "You must give at least one requirement to {name} " - '(maybe you meant "pip {name} {links}"?)'.format( - **dict(opts, links=" ".join(options.find_links)) - ) - ) - else: - raise CommandError( - "You must give at least one requirement to {name} " - '(see "pip help {name}")'.format(**opts) - ) - - return requirements - - @staticmethod - def trace_basic_info(finder: PackageFinder) -> None: - """ - Trace basic information about the provided objects. - """ - # Display where finder is looking for packages - search_scope = finder.search_scope - locations = search_scope.get_formatted_locations() - if locations: - logger.info(locations) - - def _build_package_finder( - self, - options: Values, - session: PipSession, - target_python: TargetPython | None = None, - ignore_requires_python: bool = False, - ) -> PackageFinder: - """ - Create a package finder appropriate to this requirement command. - - :param ignore_requires_python: Whether to ignore incompatible - "Requires-Python" values in links. Defaults to False. - """ - link_collector = LinkCollector.create(session, options=options) - selection_prefs = SelectionPreferences( - allow_yanked=True, - format_control=options.format_control, - release_control=options.release_control, - prefer_binary=options.prefer_binary, - ignore_requires_python=ignore_requires_python, - ) - - return PackageFinder.create( - link_collector=link_collector, - selection_prefs=selection_prefs, - target_python=target_python, - uploaded_prior_to=options.uploaded_prior_to, - ) diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/spinners.py b/venv/lib/python3.11/site-packages/pip/_internal/cli/spinners.py deleted file mode 100755 index 58aad28..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/cli/spinners.py +++ /dev/null @@ -1,235 +0,0 @@ -from __future__ import annotations - -import contextlib -import itertools -import logging -import sys -import time -from collections.abc import Generator -from typing import IO, Final - -from pip._vendor.rich.console import ( - Console, - ConsoleOptions, - RenderableType, - RenderResult, -) -from pip._vendor.rich.live import Live -from pip._vendor.rich.measure import Measurement -from pip._vendor.rich.text import Text - -from pip._internal.utils.compat import WINDOWS -from pip._internal.utils.logging import get_console, get_indentation - -logger = logging.getLogger(__name__) - -SPINNER_CHARS: Final = r"-\|/" -SPINS_PER_SECOND: Final = 8 - - -class SpinnerInterface: - def spin(self) -> None: - raise NotImplementedError() - - def finish(self, final_status: str) -> None: - raise NotImplementedError() - - -class InteractiveSpinner(SpinnerInterface): - def __init__( - self, - message: str, - file: IO[str] | None = None, - spin_chars: str = SPINNER_CHARS, - # Empirically, 8 updates/second looks nice - min_update_interval_seconds: float = 1 / SPINS_PER_SECOND, - ): - self._message = message - if file is None: - file = sys.stdout - self._file = file - self._rate_limiter = RateLimiter(min_update_interval_seconds) - self._finished = False - - self._spin_cycle = itertools.cycle(spin_chars) - - self._file.write(" " * get_indentation() + self._message + " ... ") - self._width = 0 - - def _write(self, status: str) -> None: - assert not self._finished - # Erase what we wrote before by backspacing to the beginning, writing - # spaces to overwrite the old text, and then backspacing again - backup = "\b" * self._width - self._file.write(backup + " " * self._width + backup) - # Now we have a blank slate to add our status - self._file.write(status) - self._width = len(status) - self._file.flush() - self._rate_limiter.reset() - - def spin(self) -> None: - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._write(next(self._spin_cycle)) - - def finish(self, final_status: str) -> None: - if self._finished: - return - self._write(final_status) - self._file.write("\n") - self._file.flush() - self._finished = True - - -# Used for dumb terminals, non-interactive installs (no tty), etc. -# We still print updates occasionally (once every 60 seconds by default) to -# act as a keep-alive for systems like Travis-CI that take lack-of-output as -# an indication that a task has frozen. -class NonInteractiveSpinner(SpinnerInterface): - def __init__(self, message: str, min_update_interval_seconds: float = 60.0) -> None: - self._message = message - self._finished = False - self._rate_limiter = RateLimiter(min_update_interval_seconds) - self._update("started") - - def _update(self, status: str) -> None: - assert not self._finished - self._rate_limiter.reset() - logger.info("%s: %s", self._message, status) - - def spin(self) -> None: - if self._finished: - return - if not self._rate_limiter.ready(): - return - self._update("still running...") - - def finish(self, final_status: str) -> None: - if self._finished: - return - self._update(f"finished with status '{final_status}'") - self._finished = True - - -class RateLimiter: - def __init__(self, min_update_interval_seconds: float) -> None: - self._min_update_interval_seconds = min_update_interval_seconds - self._last_update: float = 0 - - def ready(self) -> bool: - now = time.time() - delta = now - self._last_update - return delta >= self._min_update_interval_seconds - - def reset(self) -> None: - self._last_update = time.time() - - -@contextlib.contextmanager -def open_spinner(message: str) -> Generator[SpinnerInterface, None, None]: - # Interactive spinner goes directly to sys.stdout rather than being routed - # through the logging system, but it acts like it has level INFO, - # i.e. it's only displayed if we're at level INFO or better. - # Non-interactive spinner goes through the logging system, so it is always - # in sync with logging configuration. - if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO: - spinner: SpinnerInterface = InteractiveSpinner(message) - else: - spinner = NonInteractiveSpinner(message) - try: - with hidden_cursor(sys.stdout): - yield spinner - except KeyboardInterrupt: - spinner.finish("canceled") - raise - except Exception: - spinner.finish("error") - raise - else: - spinner.finish("done") - - -class _PipRichSpinner: - """ - Custom rich spinner that matches the style of the legacy spinners. - - (*) Updates will be handled in a background thread by a rich live panel - which will call render() automatically at the appropriate time. - """ - - def __init__(self, label: str) -> None: - self.label = label - self._spin_cycle = itertools.cycle(SPINNER_CHARS) - self._spinner_text = "" - self._finished = False - self._indent = get_indentation() * " " - - def __rich_console__( - self, console: Console, options: ConsoleOptions - ) -> RenderResult: - yield self.render() - - def __rich_measure__( - self, console: Console, options: ConsoleOptions - ) -> Measurement: - text = self.render() - return Measurement.get(console, options, text) - - def render(self) -> RenderableType: - if not self._finished: - self._spinner_text = next(self._spin_cycle) - - return Text.assemble(self._indent, self.label, " ... ", self._spinner_text) - - def finish(self, status: str) -> None: - """Stop spinning and set a final status message.""" - self._spinner_text = status - self._finished = True - - -@contextlib.contextmanager -def open_rich_spinner(label: str, console: Console | None = None) -> Generator[None]: - if not logger.isEnabledFor(logging.INFO): - # Don't show spinner if --quiet is given. - yield - return - - console = console or get_console() - spinner = _PipRichSpinner(label) - with Live(spinner, refresh_per_second=SPINS_PER_SECOND, console=console): - try: - yield - except KeyboardInterrupt: - spinner.finish("canceled") - raise - except Exception: - spinner.finish("error") - raise - else: - spinner.finish("done") - - -HIDE_CURSOR = "\x1b[?25l" -SHOW_CURSOR = "\x1b[?25h" - - -@contextlib.contextmanager -def hidden_cursor(file: IO[str]) -> Generator[None, None, None]: - # The Windows terminal does not support the hide/show cursor ANSI codes, - # even via colorama. So don't even try. - if WINDOWS: - yield - # We don't want to clutter the output with control characters if we're - # writing to a file, or if the user is running with --quiet. - # See https://github.com/pypa/pip/issues/3418 - elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO: - yield - else: - file.write(HIDE_CURSOR) - try: - yield - finally: - file.write(SHOW_CURSOR) diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/status_codes.py b/venv/lib/python3.11/site-packages/pip/_internal/cli/status_codes.py deleted file mode 100755 index 2b2ecab..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/cli/status_codes.py +++ /dev/null @@ -1,7 +0,0 @@ -SUCCESS = 0 -ERROR = 1 -UNKNOWN_ERROR = 2 -VIRTUALENV_NOT_FOUND = 3 -PREVIOUS_BUILD_DIR_ERROR = 4 -NO_MATCHES_FOUND = 23 -BROKEN_STDOUT = 120 diff --git a/venv/lib/python3.11/site-packages/pip/_internal/commands/__init__.py b/venv/lib/python3.11/site-packages/pip/_internal/commands/__init__.py deleted file mode 100755 index bedeca9..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/commands/__init__.py +++ /dev/null @@ -1,139 +0,0 @@ -""" -Package containing all pip commands -""" - -from __future__ import annotations - -import importlib -from collections import namedtuple -from typing import Any - -from pip._internal.cli.base_command import Command - -CommandInfo = namedtuple("CommandInfo", "module_path, class_name, summary") - -# This dictionary does a bunch of heavy lifting for help output: -# - Enables avoiding additional (costly) imports for presenting `--help`. -# - The ordering matters for help display. -# -# Even though the module path starts with the same "pip._internal.commands" -# prefix, the full path makes testing easier (specifically when modifying -# `commands_dict` in test setup / teardown). -commands_dict: dict[str, CommandInfo] = { - "install": CommandInfo( - "pip._internal.commands.install", - "InstallCommand", - "Install packages.", - ), - "lock": CommandInfo( - "pip._internal.commands.lock", - "LockCommand", - "Generate a lock file.", - ), - "download": CommandInfo( - "pip._internal.commands.download", - "DownloadCommand", - "Download packages.", - ), - "uninstall": CommandInfo( - "pip._internal.commands.uninstall", - "UninstallCommand", - "Uninstall packages.", - ), - "freeze": CommandInfo( - "pip._internal.commands.freeze", - "FreezeCommand", - "Output installed packages in requirements format.", - ), - "inspect": CommandInfo( - "pip._internal.commands.inspect", - "InspectCommand", - "Inspect the python environment.", - ), - "list": CommandInfo( - "pip._internal.commands.list", - "ListCommand", - "List installed packages.", - ), - "show": CommandInfo( - "pip._internal.commands.show", - "ShowCommand", - "Show information about installed packages.", - ), - "check": CommandInfo( - "pip._internal.commands.check", - "CheckCommand", - "Verify installed packages have compatible dependencies.", - ), - "config": CommandInfo( - "pip._internal.commands.configuration", - "ConfigurationCommand", - "Manage local and global configuration.", - ), - "search": CommandInfo( - "pip._internal.commands.search", - "SearchCommand", - "Search PyPI for packages.", - ), - "cache": CommandInfo( - "pip._internal.commands.cache", - "CacheCommand", - "Inspect and manage pip's wheel cache.", - ), - "index": CommandInfo( - "pip._internal.commands.index", - "IndexCommand", - "Inspect information available from package indexes.", - ), - "wheel": CommandInfo( - "pip._internal.commands.wheel", - "WheelCommand", - "Build wheels from your requirements.", - ), - "hash": CommandInfo( - "pip._internal.commands.hash", - "HashCommand", - "Compute hashes of package archives.", - ), - "completion": CommandInfo( - "pip._internal.commands.completion", - "CompletionCommand", - "A helper command used for command completion.", - ), - "debug": CommandInfo( - "pip._internal.commands.debug", - "DebugCommand", - "Show information useful for debugging.", - ), - "help": CommandInfo( - "pip._internal.commands.help", - "HelpCommand", - "Show help for commands.", - ), -} - - -def create_command(name: str, **kwargs: Any) -> Command: - """ - Create an instance of the Command class with the given name. - """ - module_path, class_name, summary = commands_dict[name] - module = importlib.import_module(module_path) - command_class = getattr(module, class_name) - command = command_class(name=name, summary=summary, **kwargs) - - return command - - -def get_similar_commands(name: str) -> str | None: - """Command name auto-correct.""" - from difflib import get_close_matches - - name = name.lower() - - close_commands = get_close_matches(name, commands_dict.keys()) - - if close_commands: - return close_commands[0] - else: - return None diff --git a/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 55edb2ad0c2d425c800891c4f2e8d7563568360c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4621 zcmaJ^+iw%g8K3oaW5+hRatW8^7BCQ-a49VZNCTWe$RW@}DLo0)+IYtHlJ&07?3y&j zk^E3qZdLU}I!6LkeaJ&gTcJvQtom0ZRn)FlI#Q%Q_031LFFf^|S&xq$RA z0fnFUd@11=$Kp7F_jF+c92>+#c(@B2;n*nNi}!V5`#E+1kKuz|*ddM`#z(Nyg&pPC zF?<}K=)z8NY#g7$r@OEu$Ijrh_*@q@!Lbxh?-~UU+coIbL=Mu#Y)5gYV$GUDzzg?%_H7Nf&mXWApd{e%Og= z((k2(DEw(jX{)wo8rD3tBZgWe*e;iJ0xkcvu?nB?EpM0`ZB}ND zoLNzdCNAqFQ&R21IVG#BmX%?n&nZ?Jw9r*ItQnRKsw;;9r-T)$Cho>( zJz`UQWuVzsO5RkglpD~^>~dwShad*J(NCZhB1Y~IgHY8bimEVF$!R)CxiU6a4Bb?5 zpD8py+5btFH|H^(M(2{Gmy<81A0Of-FQ1wR+lQhH{jU3aK3GA<%=} z*bJu$QIikKcByPDO>+otNrWzilF!Q;B}HP`mXb4RQMFS%J|&X1|6hC<&f~)>Le~+9 z4{IxSfheU_yI>j$FKC2 z!x|vTnR=B)bJXp>#YjT@l^+qRsZO_<`Psr z+0DVA%OWbx7J4R-2fMLHoF=62_nOMX)rYezMOyj89HoLYdOM1t;3)PH(oTvLVP?Xf z!|aBspR$yd0wG{BBZFiOT=dhPk~!-3&oYvbd{Id52=WV6(^cm795su=bO;j+WbO}g ztv&T{)a`%5OcQ!e+$?K4_RNJf!^EzdW!kZnAU_MLRp^!>y^vsPlCuC(9!40r8$n^uy4K1&zG;h%$oON!961z+d8iGbv zV#i-MVfe^t^R3tNPx6)VD3kYeBnt z9b_V^!K%OWBDWUup=t>Gs;C;k(r37nvrL}N149B>?G80kYxkU*-!VGW2F|vdu z4BK^^F7VD>Wks_KygLsGWGKu9DJ~%CqZ6Rs4L8r^KcQrRo?|_ITCrqOTi2G{m{-ks z2f7>16SxuBG%543G|lMIw$mQ+vvu0j3k(f4hl*HaIKd5z(8xey^I^~Xg>=Czk~CZq zvS#|8nKv({)lw-9hQCOIIce`extN-qOk0{wCd4Hm4J#qtx<#ag>~seDG&_??l~&z& zmU}GI1nG59%pz(%hN6c4E2Gnw|MJ7_Q&+bFCu(!+2VOt32ZGW22;`emRpw2D zbR-u`JxCYn-B(a~<^2~xMQKfvAh|YL$-`ub=M7ZeiUwMP{{dC0ifopq&1WMZYVF_7 zal4YuSM^c3>ci5v3H=E18)KkyK;#lj8$~VK=0w({6wdb)WfsB>Z~#&QVrp6>12+fQ zx#6-Hbi-K7nH&+Ptk}I%GR;{Gp%O8%$z0o3Q7F$D*43ynu-C-u)(u%N! zQxQ6g&Hz+{pY?=Sb^^)G&UYu8_~Pm>um0lNuddZ@?~IIZj*M^Ee}4AQiK)L&Ol?g} zZ%<5bjojQGxmlav36C_8KRE0p4!u^l6UwHn>?DTjHoXC|lOfO06x4aP^BsepXHDjI zSTbx8QI7N8Db|~C!G&o(*8c9GJ)7cnIw7DrXmqpl-9Z;NJKvr7zWVdmhc-{& z+ltR^$LDI%#^9oq^f`f8{bl{7BcFEUeU3c#O*pV8^dAI8!_V+WKMF?cbM-k#KIzCK zj(h|dF~*368ZpioMZv^+bUo_GNk`uA$OnNjz!(Fe#$L`)P;k%s*!q|wpK;^^j(i9h zgN!j4Y8>T^Gbk9VFV~kH`IIB?b>xqLkzkBOsBxAvE}>w&-O?m5gr%1`i}xrCpRuZIoGwb3O%5e|@pO=*Z)aJnG2Pz=<YQ~&JdgXP^j^l$64B~i_Km5C+l(a-MWsp=_-00#H^~t8t|2T b?d3OKPu15a4K+|_u`enOH&Bm)FSq{zRK;MF diff --git a/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc deleted file mode 100755 index af01ba59509fc4cc73e450f4b58eb6f41e231a71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12840 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 Dwhmjy diff --git a/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc deleted file mode 100755 index 67ea9b7fb960d35cdf9a6816ba4923a710ee284d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2958 zcmb6bO>f&qb|_M$C{Z>YyS8J;4%^0U)lH?QS#0WJyJ+Ce2Nr1x#Qgx+1_VuxWjg%I zaOA*-1o+T{4h8B00UGSdCvSJNhaCF@`U9keuqzM{5TNLxHyO#Pd)YVChov+@vBTk; z_h#P5%$xTf`L}#Ni=h4c{$IC$$RPA1BL*$qN1prxkZ+NVY|ceG8&fXlrSufXaNgxT zK^GESaMPZsi=L!Q37vK`o~+9WF1lGSr{_FHSG>HQPv#_d!kg456FlRp-jqJYp%lVs z`_y0)c>0J#=pnqlrq86%HDt?QB0GzPBOcb^?XSILbL*&(`{u2LPs$D5Z+$<0@iDM zO`s#vRet>X6P|QUq=VoDQ7R2I04|^4k+L}vykL1-O~X-$v&lS6cNl(!(>+jB{4tZ@P{}6JoS>DZsgnE!s2m64RI+CjV}n0X$iXa}4Y6FXrJUVrfu4*k*e5 zVF-Wuth5z)xa66{3QB(o%E85w8HS}DsIMj0*(im(bSv;L7B5^VMc|mX2D(b26PCbB z;49yBOHh(n-Hu90AufiyV7lV(siSqR2s12gqOYO0?4!=g)#l3e*2?u}=9PNx;CAQi z+m9BTXWws~eZQGGQc7;hP4#+9z1~rmzL~r~d7S3+ z6HgIF-0a>I>11T>a+)0MR+sW{#M|Gy>>ormIdX<5R0boB8(Z>MxhfiC$+z>85URZ7jbKMk| zKfQmYD;Cm=5B|_aFnl-jo%PSt3Hm5Xh8KdKL1wEk8%u6bF0=H?z&DYlVQ;JPG6ZyS z7|=z_b&4BigpGb=69L4Z#{_>4v=RZEjiZwS5YLXQ^Ds4SlbXE}^Ng(^#00+QP+p2j z`XqI!SCLqmieDSo1(nDJ&i+q;<2rQLpk}#Wo93U#4E4q86)PEjZ*G7GFd?ro-6C@b z5XnsxVdms^e#!i?7XW`EtFXX+2%`T2=<*!Lwb8_W^0d)nW4u2`?=;4H8?82;*W2j5 z#(3|h1TF;;`+tBe;x2Oy^ucIvqYI7k{#ah9&$Z-*2k$oJb1nJYzStGt<`%o?*WlpN NF`Iq*oTbD${{xsW0gwOy diff --git a/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc deleted file mode 100755 index b24c07fafa4fca249c128ea15e6ffd412823f283..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5877 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 diff --git a/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc deleted file mode 100755 index 8ef74e56162e16467e2ce8c07bdaec0febae197f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11911 zcmbt4TWlQ1kuy89yR%P{ONkU8;*LmBz>$&e>I$-7 zzNCNBPx73Jnq=){9Z7SEK(ce*#GYjPWIIXMCOVRPC->5njS_9MouxsG``(4o zz7KyhOm+$Tg~m78$!?)n*agp!&?hv*vquOEyWzQC=of=g!tJ@D)Uymokog+ZYc zp8diBp&On9HtKmw2)#)OJ>t%H8E6Ck#Wn^7+j%N<@K5*}q76?pl}am7C7w>n6Y%bM zDVmrQWk|Wl)52Uryl^uk!W%P`x(N^a^%+sZcY7u($(V4*l0rH|>cg9JIGs#JQvxId z$>>!vqC}->QHf-3Dl_R6BAmZCJbdQ-c}V(()2XTW^qfRmhm0D;6jRsYQaY6sQ%cBY z)MHj69g8MJD2b(ocxu`Rq%&eFqKG$?h$PDCIVnau5>E+G39zS2v@-Eb=Y#KQc6`(zPw~rnZU9+ zDo0zV8ro)+=hFhLVUyqohZ-us6u+cUE3)C9x{@&;tqf6ZK-n?C7_v!3DwG=-C z3@V186maUu-25jb{<^ubvN}yEY>5~}&6e47wwyapDV_?(yO4ap{Q3+9^?l`65D+=) zU6{Q0%j-wB9nAgK-1AfiHAu06V_W1BFKU=@(wTI)EkXtJ%CiiiYT>1X%PN$ z9zc0<)Y{JS%B(f-)|-3v=0TNhTyxcbzx8(O21VNk2w39+ONZ5#u*UW4T))coZ!o1I zQvMh*KQE(KDsGqh;)^e~%dX_fIOKn?8`{NuvWp#Rb$$}00Y32y@tE>$*l)c&fJ@u+ z&&N;|_@`<=3AA9duG%xyJc#-?sT`HB!h?#%VC9Vw%KAP}gYe&m6H=b-`9LWiMMzv= zp;dY_MJp%6?zT^4J+Sq{AZt=WTFSc3XIQzR#HxFYy9PEp{h0)byVNv{=+YtVUyi;; z{nC-6^N_zaSjV&d9BiF6fkAFH!w+n?pMid|Pi!YoKB4(PVW%YAD%_E}5^rRrQ`zpnGz%rnek3vg;D6w^K&dr{A+E4X>|OT{-OGpa zby{tQUfW^jS3@%95F^z>UBd-)E|6t0Sln2!a`cp8Cppz!GaL?3l-=(BXlTPxTB5??Bfq=)o2$Q0ewf@~AoDRU-scDw?Hf)&CN&6n zjCDUpP|4daMWo19tUuRM-dc0ezp}$qt2wL#^c>bbhgJ5lTm!xRLGT3gdv=I&e!|cI z4NsCNCPbP(sjFxye2yoF_~tD~4yykJLdYR`cy0|}Z;QvgRaby;ZU+Y>EZY?-JrQF%jY*k-iSfic=CZiD*nT+z~vi(vlL1 z7|!WL`brcif=UA_nhY5t9GReEF+kIB7DYsemX1Jwt53cb)a#1tI3=Z%r8J(9(({0P z04pQ`EKuu#-46pDtAP$J(5VMH9|rnX1AQy8Umer}NA$pvh0%3qU@5WcY*(G_g@(>W z&m-2a*6d%t3IO5B?awrAeV=D?Ouo!G78;vJ!sb|Mhk|E( zG340UGUINdYRjQJ+p9j&A)SLYB{-bLGvHb{RbAFUw8U8D2Kg! zX_`FNYj)m#U9IUced*rye|i0%SePKJXw(Qj|wqi;qtsswDDp*^Mj`b(^9c?Goe^|E+Oz> zBlB0F9+7;a5GK_PDm%`1Ura@>Bt%|G^C$$Ba!*YDEOn@tpOe9Mg;!J&Q8nb{j2Meg z#YLfn6UrXoyNCaF;_TQ9!xxTQQ0Ks61m-Sb@?bb%x1dW;=unpHluw@QlsmzKw;Oga z36nBmY>@P5rI$FTV!yy9x(IV@?xb2!XvCNz3MD+lN9HU7#)=GfrQtW{wp6@%i?t9d zri_E*E2B!6p_wuG%fAHxY9L4ToO~EMy&5{Lg+}zy$Oh%NkI^R7I1t|I&d$QF=0)FH z(~*xnTGNQ$G_vR~)a>4%+%EqHOV-iw5o*2`@ z<9c{})iJWJ>Do|VfVUDCKwof}n2+}K^| zm8p6{@5=$Xmh8DdK;mm!zhy~IZMIjaYUyuP7>M0lmc4MUY?9Sq)9MB9M6=14z>DBu zkfPGf5~s<>fmh0QFHs{UV&dY$!oiMgRDH1TFkK9U%PU;)Dquws^Pd4!*|WVG+o!XA zD%(0scJ_hvtZSQ3uUO~^qpWHB7>16;}H{Wgg zN{{o>-(f}_xKcqgij%`7It|`KVw_$$oArdlVfVMs#wA(dvmsuALOc+zr^5V;QCa5u z`rs72l9tJ#gav#wkqBQ3xg<0pOgF0x8azmRtZR6u(o!<2M5f~)1q>!3rYbw0=v_$5 z-1Vr60Ug}Sh6^f367ghQF?<#`ufYRXB zp=iT%nFLdRa}jxhg;EAe*hwX5@CRdq=jR!)6*x@1N7Rm_=ra20tCQ)lY|#7I5w7DbymbfsY+rLsgQw z(zamVEENRD_OciJ`xZ%xI_QLDu&9s|C*MnuxJ%7|xV*Hlq-^JGAi~;+@l|QPDz()| zB~*#YA2PRtx4WQ8<_R4p!hl%o(g08hu~IKQq-PP3?a5pfZ^|fkaW|P>Jl6^E0+>#` zJ+Wxy%3MkSQw&w(D(_thWf7{%CjfxY%J;Gvf0oU^w$keFqk?5BvGZgq(VhNd zy67?GkO#hRGd-r@*>s(!-lL@N0t)!b$Q+!4w9!Hw7;;3J0m+sIfhffVF;a9`AV>22 z0+|&l3@_RCFP)FFH}f9>PezyE7sQV-YsaNG0Ofm# zhN>3yv_RJGS1u%eOS6aY3C6 zs$39^-8;u_9b0-y^R()oR+Vkts#zEH9r`nLzuu)pY7+b=aP>>WwXY4Xe3?nR;1?Wl z#pw`g1TQ?Df)6%Ct>GQPOD;Gv@%Ayhm)K_`ad2u!Z}Q~+i&%ho%z;P2G~cof1dHc8 zGZGk)CyE;0sS8pAv@SIQ*usuPjD1KtSFPmDmcA*acib=XzHz zJOE?tS)F@U<(@5Y-rJssT-PeswL-5PdT>(Xj_KSnl{-dCbgua!7hL6n8n;L1_Nb*u zSc}L(qOcn*j8cB$!o7@FQkM({Tm!N4Y(nd((vsEvIl%wFQ71gb?`yq<0MBlf;w>=M z>TP9}pIV2t)WMOE@YFi?YVUK!hiv7Wr&4fOD3sllUx9*CL0zI4zCt~V2{4N~GznXJ zi(9xDtkgHnxl5_oB52-}ua;-gNlAirFK=n7dIjA|Td5X!=W9#pe3c8elm}Og?yo@E z^OY!jz5->h(pl+~b*`Q|R-dx3Qg0Tm0}^KOa|RN&)b1;lY<7IWn&4GgF>F?}pcK`d zVgQlvpU8f6VJ0qv3y;Wr@aggCRN^L|6rlwQ7{eeLZ~9ZtwuZ{!$o#H6+;RlpPo}Pa|*#NN;p1^-o>g8 zCE@6a%|uhvB54k4U?1W!F-)$DOCFZ22fsKd`Yp45d=YPmu{j0ZirEHyhu#R{RCF$( zl)iz^lUBvqt2cIN<4r2tqb>^EF z&z!$-J~BKMIel?rWbBOLAHMjlvC4b4rTVG}X@LJSOg;(f4rO;%7ml1UNsNS=h%sq6 zuSca6Oey&`LJGh_O8A9?^dbPmT^X?v*g9HcC**A%sf6wVgDVY-d^JJz9|?6=ayUtN zuo%wbM@0q$bR^W!r85Z5Vxg-sSB@3UG6`7DOdf{$#?p-_Jex+L5(}4bB9#! z5PrCE@|}*i_iJ2O=fWx%h8(rN<{>-T?fUhf;$`p)QmXEg4t&Ye}cvjjQ( zTSgyvK^qv=2Szn+Oy|Z_ZVXBaUVhCRG!4qfb_TlxU;_dALhF}Ky>syG6B;+5a|0?j zuvT@ZKEh6Pe-Qp?$M0M8W20KnnBFs{apO8Su5#m~)vgZ$51N13_OET~(J?JFu7}1o zZbIiKRBoa;gm1k)`HRaxzpNe_(K^rQott_+@Y~K`cYWBUamRJ;xXK+Tm3lrHelV){ z4r$zJoja{^ryp^x8rP`#)`L2w7=~kH&=^i2#C#eI|EV&3UE0C!? zn7QQU0P9sq0tK>5*v+|U))0q)iA&r^2XLaN=HRnCyavQQWjOJZI1~=JU5Q*UI1sC* z>WM@Ry8_=K$`YQlh6B=w?7)}mFK@`MHtMV8P*F&cO>gY3E-}BF13D$yE1?P_O(M}c zf>`>JE*wk5O^vy2OMduD6fRhbXOM)dh|#(gsq&4a>4Mva4%oxWoD7r%7$%Az!xXla zPE>y_N#@jOu(p(hV@imELQk$%o2`X#m70*lX#7VNA~?3kWVFcohK=vu|Jud3Mv5dBUAAcj74t z?~Op5Qt~OVhQRYr(*>$swZ?VIzd(Kk%C$g#1 zSfDypYb;RDsn)nob*t7`pbn_kSfHL&t#Lb?XH?1(x5JrGscqtRn1@u#64zbLi;cRg zdHJa3+N-EpomS+D~x4Na4TGmh7irD@cNtPv9QY6c^EZec1WD>_aSSOjFX9I$6mL$sT zW>1kVTizC6EOO8x!0sWy1bfn9)~khmF!r*0TFh~dq`+Mf1q2W<@L_LlBm*pR+E-+g z&2BrMomrdBE>_k1saNk6tG+7!b0(AG;QFs`{&DlfF^>BKD|lC|nfd-dAoCke;-rwm z72Rj37=m(G36~?qNQl)%lxR6tj5+zJ5-%r;2`3*@P&rvlmQ%%)Q;sWL<#aLa&3H z6(@D!^DHmHNu!JuK)VS;x9i z-PSkM%0!s<{Wbn|O(wXEEBXz!Tox-5P2ZRG4WXo9u~MsoWa7?eH*Va#a|g1$O!#h1 zRwO|uV(A_x6A_xi6|F|FAjyPwS5#6K75O0+s-nIDx`?b}L9OZ4nhpvwpW2n#_mEQN{@DO`+7Nh$VKv>3y2DUK6T0wbIp_T{ArPOZfy z^i}jR)IIU*i(OI_+>@d`tLpuVqKZwrg+IS>hp!TK6S~XSh~n4Z zQcI%ZQ^0YKKV;m&pc2quR&~s4YK@dIFOt%Ryv5j@2C8zE7ZpwAwOX~R5?$k^W-pm( ztQ-8vfPv66S;5-LbNu}cxwOIB-;yQls1hqY7PW2uzPQcnpwQ{cHZKCJs$d>hwq&AK z*f3$_yV!3DOKxYyfY7Y)Ki%lE(iSc@uwTpGj1r6ZjL%Ht1nV_Yxn1(#YZ#?$c4F`H z_mARi(AT+5f9UQ7`TSblo3)^3)1L*}2YvhO5&CnrM!m+~s8-+ZH>wr9=3Z}9t2Y&K zZ&WLKE4C)zidJXUWSZZo2fE&ht?9R-HS<=qcE1&^J#R&8_DyM(LQ+_YNKq*!#r2b( zR+zu~yu6fniXOxJ@x*^eLR{NSm-9G-Gi2vH*Cx^LN$CE31}*v+3-k%!7tRXPAW zG&&qC2@D(wT8YR^bE2XO60T}AsaBM2HyhDNiFP+-gbh*Kz|aUVc2uPq)*)EaguBp( zK45SSku_Cu{6E&8dfzLFVzS*iw?7% zw?TL25eDpOuLJAdlCVzHT9tM=XsTI=S4E;>LI;~rOVF?aAp_YaLr$&$U2iIMD*@C; zfp3kbTvd+yyIYd1tTFHb@cGB$%!XRVGi5+M>dZ&#x;j52R;x2x02yZ#`R={6>GXlg8lZvR!l-%8iHscMX>FPG^YK2^Tc-$LLO$a|7Af5(ew7-WT z^N6!i`s>Ug;tvr2PkF0w!7N;~3Kvau$wHS5bg6@U#VlO43Rg{Z%|h1K(u6` zB?B$Bk$?M+S(vp7vnHCe(42wh+NjK?!m?FZHqjLeT`|y=4)Xu6Un^$enpL=FqU#pA zZlLQO$`{STl2uqT(M1bgG|>FAE}2aIz>)?_{y4xTa~3+c|LM~& z{RlljHfkN4{VqLVrB8youRnefiwuAeB)h3UrnvlRYk0vSPkZD%Bj;1Q-HjBN%zWK- zh{g`k*nVgq;vR@xs~)-*7)`DEcb{JIeFAQQ`+FFd98Gv{YZSKMTFHm)Kx2@|*#LYC zQyLsXgz6!I$vD?K2PJ$HK`bO6U3$d_Fw?6MR14eg&ToLpZQ| z(_hNl?Smfq6y0CeUnjwq#62I7di`O~P8)V2y1y{Lf*J)qK3HtmQ;*c6V6zYUo`xTT z=brf9+lhg!58i^Z`e>{4IS#g( ztOM|YX4(J=8Dm7`E#812;u0VY9nLEfCwS%eV`eJr{GTnh9_up3zNGlWVdM#G@#xWuq5l^T{!8Qh*4A} z7$6YHGQT)2xTf}0w*`=7T>%iXro!RmfD6u=hiO<6?r&hMXb5IxxKOpJT9P##kRE_m*}-6RFo*|(*mcw;5b&W0-35|P zR7JoKN(vl2Zecp^GWdYi18|axHKC&FOk_=gW(Zqi9M2IpiP9W9!)-!sK!Z*&342}X zv1TYdsMvJ66WI)${DH@r9r%Gx*fc@dY)KIyUgxYBLJW$7Ae#<5;51Mr_|dq*WHU`V zKxGI8?RKG}7Z#djXUrIIwI-LG7|{gyj`31Bx^u!RD01Z~p<@NkFF1(st& zlU!nnGq$cljwS)GH@8GlFiImgSuJYXO=wTRQt-Y`Q{F2Bqb9;6*eV0KI&hJBrXxaX zm4~@b3=EZj1yt>xgME)qjqN5Z#5dyH$SBJVKSzBQn%E!nVdQtL;_N=4&Up*X8))9C zn0p2lO^oYQT>f`JwW}6dHPGtw(W(7)Yx+HN^oBKhgQ-0MJpXXP%7NN(3ym9S{HSl> zuZu7Bt-cjh2>#y&Q}L_p9n-#&55 zIx*Mi;`)E~f{QZ&NI)P9K=Kfc9H5bJ*GzQALT3zg<|u#iFn{(Se|G=f-$#x7Su_8M zmH%Y7=LlsF(d+@5eKupw-9DWA>|pLQbMBYc+%HY^g@wK_&=*Ji$=#HlJ89)+4s(kK zxkWR#WaX9`Tr_#kNp^48J$+WssL?ZK59YslU<^*Wx1Ak2%$`5Uo`04zvkO*s!N@My z+5BO)aF8wRo%-##nVqz04I%mXW^oyk}syn=HVfn+OwjMs#~3O_3n5mr4+5N`UuIswpg=7KC5dM5Red2!f=R zpgLC5UxEmUI4=2rIWBmwK^n^{9hxS zilGL_lA&1U{G*$V?upo?2G^c^9^&GCjqv-S*xTg`3Ai*_^*#w6a2}NCBhi@)q9Lf{{+;_L#PRDv-qdV!D`~-vJtN#V|2~q(7 diff --git a/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc deleted file mode 100755 index 3c6fdd1e1fb1438f2d3531cfb5b0a8d9640f9bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4574 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 diff --git a/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc deleted file mode 100755 index 19e6a3845516550d4a139ab97544057e60677545..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3307 zcmZ`*O>7&-6`uX&E`RhB$=07MuPUoH(Tc2-)U6ChfGewUV?zcc)kRnYixqc7uChPO z?9z%E3D6-2AyARDC}5#L0UcUZg?-4SJvTk|NE$><3?RTj(L--^?E*&7L*MLDD-u;_ zcizl^P$Lybz|4IaIV%*3b2RIq#~fDUR$H)N`K*i1rA;o)`JOn)jC&Y9c_%4Yt_ zhAd?{D&IHkD)yn5SnwRjaLp`FrN!mtd&@Mj@{@&y#g!G1WPWt>{=MZNuP*AhZ?4>? znU&S$drR+z%p%jL2sTW;SgyJs`ZT>stN`m?HKFypk)o;FhF|XNy!P{?1_d}+7i)%A z2A$@uL(le#hOJeM;)g~FG^ALz9^hOu9KTw|KGuqctF2+J>SI&ew1ToWI~z{7T$oPq zM^%ep2fKlEYI~n&~C7) z^I9&KTct9=L6x{m#n_kdnHi`8)R+GP@(69A4QQis&^_)%2-q`uQwYRZfJ`wsIb{%< z(m|K5Ym|H-opPtWZcDvL>*by#4ikVis8QkAUgLESV)==lwWiYjJ%>EZhZ+@zd+?{a zRO4rjT55LIuuC4GsO(Vnv@7|6M{w;Dcr5a5tYZEE*Im~<7c-B4vR&i9qh%#3n%EC$ zqFDBnQJ zX~VNzDpw5RV?u|(?U)2?A`I6{#H&^yopt_E_VxXI*>iB-0pNN0_q>w#R^F&o z@(-~4Aa7f1`O3qf?745{u3pXi5IVCRp!)fWRmtm?8(`uZcD@)zsGn!Z%vB!J)af?; z+DKO@`%ye>ynd8W?`0 z{!;zTY-8X`bKuGgfq$d#6#~-kN9xoIlvIu27JmzU@Xc*8U{Tj8CbuPS2|@n}j}YT~v3dv*^*D|y4(&|`aehV&#r#rj zV8*|mj55eO(4FzKDj5f(G*uzsPQB_w9-@N(5FqIXCMJZioe{P$Vdp_JI&-q_t?Mjl z5EffmiCkcMjgcuv*l;RVjG*kZ=`8zc2z))zr$<`@(+8_Z zbANRHeCw~-#y}siNzy;b2{-NnLk5 zvud+`TGv0S8g@sM&~?)*f>?^qYRD?N5d3;473(Z^$Rrpf%=uKbEr@f$4+s_DfXNjQ z{sDyxhX+E^Y$zjrP<*fkuPrY z9}DlJO^!qFBMu(09fw_P7&?bgAIAa+9HBO~9NvmraFXFos{{!=y2M!^311NmMXK{1Q$ow#sO3^<{Z}gCFfuWGR z4IQ8T=*3oL*Z>L4gtkKRf?0jV$f@kC-s{(|&l0y41S`#d zHs451G*c6Gal#*jt^eZ2&2izYaq;G4;;ShRX!bn026CFPy;8|?OXL#c6iCp~jTQ#f zBwRhY`0B|OZ7a8C_*n1UL4=`&o-qjifP$(I!{FkLavDQ59q%<)4J`OgVjh4|44mOD zOGnQd#@8OhX2>fjVRB|lSPoR z!1DhC1iZj;E!4LYK3$#UPWZIYM7{TYj^3>IzAZFYKkIFwh5A`<3(eQhdY`M~yCY3? zeE$ax^-@#4v?I6WX>O#A{+E1l`2~}{I#u1}WbVSg&_>W4Ma`E{6N=6v;pzMrE4vsx diff --git a/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc deleted file mode 100755 index 2f47edb1a3924d8fed2154ff12f216607f7977b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1919 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 diff --git a/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc deleted file mode 100755 index 15bda76905167495e6edda04ece55e309d7026ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4414 zcma)9&2JmW6`x%$m&DZR&TBI$fjU78qUD;{u1WEz9Ey^I+uDC0T@{&u> zE?r2F0tGNo74X3Y9M}zf(4kdT*arjc!N>jyq(Ib*0R#vrdg!HCLn%=B)HlNqab*X{ zaQ5w+nK!d<-n`#?!#_u(Aq3?g55HNu6G7;ow9zU4HnYD2%p;^BjWbZ5zIlTy^Ld`5 zywC8Jg}lIc!SI*GyvTUJ5hzP}iSeQlEQj(T#s`dWIg*bsUNWNPSU$%1pb;-8@(IR= zjAXel-&gL>_p^4`7$^_s2N@qRhRVbFVGi*~M@u6eW%bc54xy*;v`T)AM?Xbc^d8b; zdTh%FWAL=cQW`ghGVy=Y=4^%|;xAOArdz=Iu2z=e)vxIbYR#|}y>hpN%}QCX*w7uS z;!?#{mMpUZt+1lp)v;AFD~dt~3uVo$+R&s61!l~0S*>W4o%{LB%=Njs3{Mh2Q7!#i z$+B^2zD7k!yr>`kO4zbBqcpEnZx`uG;i_scDz>TAuu*95fW5?aV}Bl)M_`RSr=dKr zae1G{=LOA|_iGVNyeH&EEuaT9Ntg8CXm=h-k8x^an7wq=lR`MYkO1o3G7j?N{R&219Y%a*E{Ig|y(X7ZlHk834auu6e zt)PPd)~hDAJ^w^oMOTb56Pd{O?qZQ3u0h;_S$E3<{}S;LkB z@X+(!AA;UTXcaAW_qo|C*X`9fjn{md@XWs@fN#LlD%|&(3-)BQrDwq{K*`e%QqcFA zZFi*+TB16$vIX>Mn@7m&%WT!IhMPU}yAzNW>fQ4e539k`Dik+xe&N}bz|@ps7F2_T zEZfAoV&j_r(aPM71$qXm48CsHR09qS4pX(|Mb(mvhB>bqvRWwUmUTwfOu1s(vH?Ea z9x|4vN)^ji4MT^sRSUP(qHbj~J|e0G=Hh`in24~b8`TwYYN}@Gm1Koj@U6#AdAua1$)uSg@$i$gh8uTQtjhuB_sMnY(Eg&GR|6 zTFu=B1LXjrxhiw;^VxIfa#X*m&hB&7QZ=VQsL*jmHFAYkD6n$yMGBv6b(w?@G_+R6 zZg_B&?HM})iddUK){!Gc?nhrr@{S}skwK?_+!+{k1umI$!zh@3g`{BUTS{C;`cN=> zAU@zEhg&n8Mg2~UJI!5;36BD6|_kY_I(vb%{5QRs@ZfTs|Hu3`dUNRWb}#R}H#Qk8J$ zJn@ijx*wkX_kn!PJwio@YhMhnalhj?q36wV*zCXO?~lx(zaT(FRM9ASAOmTof(?rB z*|UH{n#GR6LKZz_SzgEE@O~Y-Opyj2U%j$&>X2LGS|xj#ZNj<&Oh=BYXiWh5-#V&~ zUT@Xs_Tv*T$Ik4Go!P$C7@Ka6O?QWI8e}091lrjbGGwXRNyQ`xAZrC967I=76xo_; ztC?skAPf~2^}=nX8y4DO0K+8+5rGAYBLHa(C~hyutkB8Z7V)!Nfn8gEGBO=%pM-T2T(jGYXg0v!w8IW&2eh2#LVY7lm(4u*U6_5xp2_BFu&BC=$D(kjNy^kb2oI>4) zrN@v~!jKf`^^QooRlE27L)bMm8lV5D)n@AI-pKLIYp#z^54nE-$vzhWdEk5SX(N$#V`y;n;p|4x3CHhW zaS<2HIOCJBZnzOSvKNjw!;`c#>x{qiJsKz58={-Y>a`5(%Zo>%y?h zbJ5ZD>#o@6f8Rx3G8y*|KmL)6;I%!lU3fOi*yk2|9VW+9{{H&$X&1r!x&311@BJ@6 z{@a(V`JJStHB~rsgaiz;SS(eFM1o62>(a&yA==AT=w=%xM3W1*NNdS!5_u*iZl@j*8W*d)mWI`_3~!6>zo#IZN}v-9u=j>3rkx5GhDl)Oa< zGKO8VKnyOcEC-Mw?@ArWvh!=@oYdPT*aul|AtPQ1`2T2FS%?u911$-{KgmzQVmij3 zP`yNIK4`Gx_qxPu>2k{_uiyfR(gq1lDxWWZhdGG+p=BxAk1BqqkHCov(YVgU;5ybuT!!G29G}J-*Ngo@fS7tc$LA WgX8*L^mh8-m#^5!x8E_&9QFVEm~ol_ diff --git a/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc deleted file mode 100755 index d5faa897944fe44c9b6daf72958f668a445aecfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36760 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

Wf)|S?mHmnH6 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 diff --git a/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc deleted file mode 100755 index 1c3efecc0f1daaf39bf09dda18c4917cc605dde5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19947 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 L$mBRp9|5jtQ diff --git a/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc deleted file mode 100755 index 5186dd38d24595b69d11a5fe47bb73f53efd6057..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13120 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

$$^gK zbF|ot(uAE+N~7-$%69B7nh{*k89=7HwX zmVp+zuN-L|Z5wEl>%d6+=(2%javdD$80{SB99=%Je00UY3VBvFvT}6Qz$&?}9tn@G z9$4*m#hUd9z8xA_GrD$Qt%TK#tQ%cFuwJffM>dRZ9N0LzX<*Z6*Fcv%s~g!ox@BOC zT-T3ukM<1o$aTX=WOVDmR=I8***3a;V7uE@;fncR+F@2^Z0GmfF4y<*ua1FT+AnEs zuXqP`YyXqB62E&YTqj)Gs#jcEIQH20Jcx^bBko=aTaBO*;GZJ92_Kbv`N7#kfGev#roP=FO z*s~??otLoZ5cYg*A40tt5%@Po#03d`0igqBLN7|_iwONpNxIKU*d>I0wj}I12^&P% z<=AsYd3|2Oq6ix*341}ph7qQfgbheo3}IJF!d{fHs|dSR680GhizDo%l6+p0u~jdyOTvaEEQzpGN!YN2O(5*$ zk}yreZXoPtNmxw6CJ~k{3A-X;pGVkKN!V2hn?~3_DG9qKVP8Plt&*^~gnbcVUn&WE zNy7dq!d@u}yRLc8ySjck{a<@;4#&n*@x)j%JduoP;nX!fF>&=;Vj>kDj}BjtUX4Yn zsxDlMC&Qx&ZDJ%AK7H~0g>e6w3*nSL8BQg_@zL>wo(f;l6Qkki*ktNjeC%rYMx4Ll z%j5C!$Y6Xd71PI}BbO1qDls0@qp4UVENLRy*v;|SaEf0}gok2Aa?v4t$xL!Ll zMfI3`H(cyEd;wg;(gYyl*s`8b-PGPP~(3V&R4J zTdyTXV_Qd~`fy_FQ;DmIom->h<6B>jjlH}TRkL**oiQ=CGqQdA)+E}f$LKD}t>~3o ztzNk`W{rTz_+-9zFrFN|9vg}d4GyEi^tJd@gx~A{xaGQEUGwVROmo-0?Q_*V+3KEm zE@Z0rWxV@7La1w@imeo$3bUFjhgBo%H3-T3$Mx8i_|3dOjs_k}=?!=Y9HS2Yk|CA4 z1D9A-cT=vE855D5b*Fo#T+`mMmMQmLTO5@vA?h0G6h0=SLT5h?Bwmi`S4I*y7Ti@A za9@pXnz%7IG!jKu_T{VM$vFG&*lOi8cwb6jO#71KBk@$1Px_L+0pHL! z5^MsTg__tL(^D zcFemxzV*4f`Wf$x_d#9j2X(98uUmb0^<3S$Y~4CMs&4$Cdd2(ID`v0UyP2t8F;~4e zTfO()$38f4`uzi^bAgtbXJ=|=YVHQ+J+8<5-5*C9*8__q#Y__;r7#G}_;G1q__a~?Dx<~S9o zVoyGBHa^~~>j^#Gbm3YoJcQ04#y||#s&xTRfB_y8sIuKIQY4V z=!g+gIXI{#h6e}Va!DSf`t;rSrhsF(NVWppvi@@36&dqXuQ0YF?`#Yl?vG9Z{<1Ci z7coy`{$pOv^EkpZujZ3K{~KPdbH;VWtu?(;i&@)ptr@crzqUf_z;ES@>!y1kfKso_ zHy)2i(X*1N_^?_2=x?C1j*O{-ldeQT3iVhL!!{Y#tmxtR*p-A1v;V z$s}lTG7|2MA{}Xz@YNV{6b(;|#ewd_Krk`%^>q+B+M+L$9E$gQ0x?G>DGjfJJ85jxThz4<60aa1bH!Y2vW^qzyhnRp@c?;j9lVd zNPzecC4gV`Jh$wyiZc;@ABro*D+4@LlVxi00E4q@?NBRT|bPc3!MhxesQC` zv#~q8@kUf1!&f(6TBriL03z>CjK%VmMzPF?MDl{(S#b*uDkdMAF9cbW@;&_szN8-| zSOJjtGC_-GR^k!=J?z|P(d)k9e%&=yaci}ma!#R>JF#-I>M562@jblwef+EAOQ5O+ z8arK)G6oGprz)ISRo?fMypI$HkrQ=HRp8D*8b|?DX3%Sed2wf@Kjp_Ash1p6KHRZP z>aG%Z0rM`^WL|-a;j)nXyCSG5gsLkI-+8IpeEL$zyaL;guM|p)d;gsxIs$P8DMw|$ z^nmmV)w!&GA`IfVo_IN~#kAGwwZ*}s6Uh|0QDFpn$Ox=na6g`|*dJbSAL^>fS6+)I zqp6fGsSA%FeM;{|9`zFh((rw}V(WwEOn~tv3XPA&Q$U-+!NK8?XfioCs6U1XUBSFJ z85_Bxl3}m4r6tJ}deSopO$GrtoOs+)X!a}~r8`RzTEzV51-|$$z$dp{^X;xsOQw4H z{icrDU3WX@ntHNLJ(*BH&#nD)q5iB~=h~OQQ9ILjzi!2Be6DU&wr*1E` zSM0(S&Ud{(tW{TlbAhL_fu}O&spy*3Em0COS2BEbTtJS;VSp=jIJyWrG$usG@$Cw* zFs_%Z?v8tQHmi%{o?Xo9(-SXD5C+*x?yV7j8~P*U-s`Vvxb1zdHe0`O-i2!cxn(QfSUK-8Zy&UEzBV=QGjHepuJ+}4P-#5~xH?wi zg`oAINPG^AdkRg6JUJMBT^fghD7Gb6c(74VkTS#V!@r}A0X>u%tNfcl-PD0GSBRm8S( z@x|U0N0@OS#OexD5b4U-f_KdCR^9QuUF{U&sPv1{uu`|u2w7>=ESARD-lA0OIjPm^ z%71xmg+0$kY3=2!vFgC~)QV?y^jpB-FIo8fi(cDXR-7+(6y?wgK{@NShVnUdq+6VV z^+lx6xI_vTZTVuOnKP{kDO=AuOHrjFJrJ7E+^;`@cFlV*W6t|0W1K!LxL-{B!$XM? z?NYk>#jTh2hhJ1T9^B+z6U@)0AHR;9@C4Jo^f#}4i8oypg{i{?3Dl*(`Nlhc^V+RL z3`_?u0XfS%q+&1Pdqx`Rif}mH_TnfwIxvXpyW~+2cYhcekt5yw;_xK6H^~Swg%Qd* z`~GlOus|yERng>dJU*Bh8<|wphjSA}K%8`_%PZJJO?sY1q`ZGPF#=XINz}*BDwI+W zlmfPIkUSg&6+kU(%hDBRq-ms)T!yjvU+@PsQ|0Ph^+wm-8}D~SG98iIEw@|VIXUBh zP}_HVL#DP5=UwlcL3Q9&)v9E+n&)FYZ+5 zqa-7#VghJSYg4Xs)zTkVd8u_ZwY}Dz39VFT&M024wf%O0f4SC<*G4k+Yt;Fmy6)9O zndmN4n`-gR8aoKN zLiLiMCW&>S*)w@Y(bart?WF#&r4F(Pw zE`2Y-K7#!K`MSYDn_LjxpWKvwk>IlouQB+wVc-i)Z{0$wg$f^5+}A-yC1CE8{}KRP zR^e~HBH#J`R*#N0L*l1y7>*Oz8io6yy4Q>2~}w|suD zFuw#pDwp4_8Lx4w{4$~=zaBim;r@s9YGAR{Oui@+(JD07xoDhX`y1C{W8oW+nIkS`3lJ($Bpi;0AplU(!<*s}$Of*& zAV}pjAL0YH8D{yTu@q+Gsc2Wx6rF;bD*4C7-oypxx@YN<4#?1*PSEV0X{}aXuhVtzQR#FqE^3qNfVS@k^{<`z&+yVtvw@YyKJD zNNte$uYsIf?Nw zdbt~N$`nSr^Krx&Maj#N^u|&3xgIMmC6Y5z=rN<_D~-`u)DG4_i4Z7t9cxuMS~Ek2@JXKTf@!}Df#;s>Vbky3DPhGv*ENZ z;$Bl9$$CYMxY7oOt(sD`PEBS6D%BX~7;Gw|<}QU(A`YgeRaLRz)KOsSC{&V@;mc;# zUWQm|GO}<$zDY?cK9x*D0&I$9P0cM3yP$8-hbXbHh#x4_k1T9CAB%<0_MQ#z-o7^s z#46v?KnI8$!%3)Q<5%LtLI@*od2O<&BdAMZ%kb1fDtbMiQm57BQHW%m4@6MKe(gja z8Z*1q{VS8&;fE=VIjCIBmD2MU{bb;-Bj5Q{XtRaq8u2;(YD zVw7bqMjr`2B=}4GCr<*{&_~Yue8&6ygZh29`sTe(?yZQKD|4&x2a|q8{83;p3izWc zzrs*YFM>Y~ErCC5ecXXY9QeW*1)qj53N=p!b2OP4E8uPmXH=lj7S4DZH~)X&jHwFZ zk$)7-p;HK#etIcnu}DR7$djdZ;*v;}PKlnLBA6g}8Ni(6OJAl6RSiTUvLZ6RVac|) zM&kd4HCCc|q^_g*-1{K$nPYr;U^YtBA>qNlI_$un#0JbV&bbKr3p&d5-u zG)FXY!;=>G9do1`hE5_rnj{l>E&8(3?@>2r&Je^52NQ`aB!Asuos*C7<;%1l=})Ad zOiYYvQjp7+(OHFm?@}y9JSp5d-U>&DQ_vSnFIfpS77>!PH zBB6n{FU?SEFT18>&8EV`jE653r#Uk|XnAli}WMGU2(+Flf!7 zyDG2>Vxf}$pXJLKMdAIJUPVVS9ZIJ5hmSZbF)<`OR&iWMzV<^y91BxxPNlG;j)!8> z;L`NQ#8hV>F8pcPUyRY*~7v9(l*@~}fde}LR_S-Db45DjgTVZ4Gu`Caud zxNoPjZC#nV=W+h=g+F~kU11&~W$VWTLTZnFOntZr4bd#|ttDm|U*d~J;*V)QBlraW zNotaAS%32te$Fun>Z^TQ=3P$E;qkoyQPEORaSBX+82{G6ZjZzLQ3qfVrt)iE!BiAI zROZ_*!l1z}Kr!e=`sfju25{;v!<_bc;6uru!s-nCBP=4&Php1@*Aru8LWMP@O`*I) zYpjSGldMBWw_zJfxA9BnG{Z7%9dn|LQZ$&>4GTw%ZxW#x+-giywOiB`bk=)%)gmQ9 z7njZeTYFcMti>%?u5NdxZntW5T^iL_mH{l+p1*_?bb@B4N4v2?d*-~SGTu}3Ubk-# z$YOb*T8s&lZ?RT{*jmh|dC*!=L!q_&`F5jq&JWX4;#gvIC_W|}{32D&8kVYNNjO69 z;m@9~a3wb(J*Dx;bnM4@H+pC1?B~9@=Z!t; z-VUXKfA;q{($$znO81SW!f77{j22D@LFZuAb1kL=yKO_dd2dv|n#2voGkO0|40E-Z zy#%Uzhd(Xv%bC%qkp}vAL(A*SzP?Q5>fWxm_q}ueouPNmzkLW#<~sIg0UP#b8}`rm zb9F~&pUu=A#d&Yt+gu60BxHIcV)@;B>}ooT@;K_=pASI9HHsCdqxBjq1smuwLoo&SEJkFC_C6x`vgc z6#@d-A`4e(2o;E=lZv~8g;Xq3zFe=fTm)D~R9de7jMq3-xft;g%hh=l1jI0uJ~D!N zpf+icpP1$pWeLXwyS?zlcuy+PLwR@@hM}~uCPNjqWFQofsFZ{?B3lZ271I_e;x}1D z0<4O1C0F92&~y+o_@F#=0991J@Q6jNIvUl0qbc7>Z?iWUh$b0iP){=UQLw}ki4>My zQu<^0=J_`BP7o>AJo__V<5YQO#7E3?$jGqjXph-*O`HW5US=AqtBC?gvfjfk1rx%n z6VlDfXZ{W|Pq3q0=8t5&#;G#Th>w{07U)l2jwdFPA|O2;*HtO@my`mND|8EEpXXNNX;pY z=`JR2;eP$Q$P{KJzm6Zd)_;vx{REa|)>Q0BP$8yBW?3$#WLNC0DxXVhCU}s2dJHdq zB2&R-t1%UL)zBR?1hoX&*Si&+KC*K0QXw7zXNaJOr&zB^mr4O4)c4G_;R55I9R z+qrG#_^YQJ(%so*cTe8CIv3cJ4eZI7r;HT`XNXRuI?`rbI5l+kuHj@x&%5-0j_6>g zWbP)FQg*tqa?xs#*}^&2LL*XwWV){L_O90s&DE{R)~(3|)<{mVmZcx6DM??xBsKpg zUQi9i4ptZ-YLZc2%FLO$uy}fuS3>}HCDpI;A;Es;NW%r%#r(^8S7p4bU}LbpE4OR! ze6Y#)*t}~=u-WZfOZxUHKw&O^b{PNG!6w16h;qA1a8}Tv+^){I6p)lsDJrDgP{2|> zN?)7zV8N5ZPu^>w`^ttZXf0nWROhf)Hs zsCU{w>YJ`~yHd0pF%FDxRO|Qgua4_B&%w2ki#Y zQ$gpqv`WLs5wgRnpyn&gmnZ_A4vftd<)tWfecPgWL2AEXUVKwQEZuZXSK<37i@sm! zESV+-mRYUrpO~3$CYC2U7_)N^=nELC1BvE232FhLICt7F#>appRsRqQPpVlrmTwk8NZx1)cX{=nlby%V#Nj)(L&ov zbzyo#Au*6Gh;rjeSe1mwVmE9Y28=I{;ZMu$fdVzYu(B$Nq7@sV-JgRPYy z5cPnSkEB-?zG0-m9GPa5mlm36TZ#24Tq{be7P4sR&l~|CI+>U-KMHXaUScl#AX?VP zVyP#>eOJQC1VjzjV#C*IB0=Vr@91Hr2j}$9eBbfO^o#tYnuT)#tjwXVVgU>V)?|PU ziFFiHDLr^Aq*@kvbyiK}Esssl+Q)`z$X8!WrN$$}BXPW< zzk_G_mDJx3A_)!4vW!Kb5zFiHmu0UlR!Vp&&}%4v_a?UZH=TSIvdqg1!_> zsV-C1hsA9-<+{K`*wniwPY^I;MIX*rDs6Hy?*n(3O6J{zN_iu!2azmU z5A(3IAS(+QQ|&Lgu{e+y&}EbV3jioxF0doxJm*xQn_t^JQ+dC- z<#sHyV%uEx_H6a`c~?WQ751gCpZ@yk%$hy#HQYWu*L*D7d~BwdWPkUU)32sypZUrc zX1| z&DW}KyKg_Hl9-*ItLe$sK#dj*w!(t2rZu;0MV1{mD}+;3VoyY_1bUOPaoo_YkMo|a{^ZC^Y6+Ua?3MZ-n+{Vm(y zS@+iCZ$Cco;Vnct1*mlI)zrNMK$L9g5W8DQmOkP1_|#J<<$^?ooym>uM<4W&U6$P=uGBcu6`}m@|$Q``3OKU zMNIS&n4*v|k+WO;)#O_XBj7@OGzJ`LAaDZp^c^rl{jp$Z!S^*OEmny;ig#0Zks@10qGS?x2C)xXr4PBCkrs`n}TTC zU}IXQeC2K7w33xu_Q_lkA-A)3$eB7cf2!KN23uB2s4J#?TIJh;vcxvnkM(`Z4nN(7 zsl7I~F-4+>39wq{2r))F5KhKWm0D7k{c-vX1=S`+c`WKDw7{eqXriuk{YACH6ZA(} zU8Xap%??NcmY7os8iw5!JSaqA;ZtPA0}ldRgQ=(?=?Lis=ojbqw(mqp&Qg|LCDo+V z^1>N{qHjfS6)bZ9F=&?lE@~c=&<6bE16a=%8>J@&KNjMHLKTq^EO0u9c&g9Jh(65Q zKO~@mow8G)!Iq*6cB-(d{Ft!F!Y^|q-^QyL$-rr_sqe{Qk<-3RXhmk#Q}4C`sPjWl zMHA2vz)U6dexdr?``)i!j+Jn^P}5iYztW%Sd}1ziI2$^g2_1G!OmoeFxr@X^rb} zl%szF%v}NfDjpaXc(L$C6mX;I90l^viLvO*u%Z*=1{zZu0(ParrUdSM_~N-!Nf|ic z_$*0{Fj=OaUI?FXN^AtDh^D=$imf5=>+BJ|h>syq)N{}N;hsNU`=bLtIgn{Si!;~! z43?G5S4zJHuk>*lhDr5XZ@D%r-!uOVU)BlkmhG7<*fV|XnU4Te&t#&H&@;eFPHJ!p3EKo2-eSB(uQW!}jMl$g! zB{;%8a*X7?TvE3b#aU6V!&rmux7f*Pe22jXrn%;X`+ob%+0-{fZ-mHNp8)?W5BELs zp6B;Ef7oe%2;Mwc4-shnbM6_hW2D|~`<->alYDpgZ>N8dp4)LWyW{8|YcO}83!Kje z&S%V14b3IkkqFgtC3W zAQ_6!;L7s0W9Ro)Nb3}}x;6U#E&J@tco%)PXmtr^u&3Pjm#?|I`S{33ZKvk{)h!?#f6DZAgS@L&X}jlBqKgzCNZCa8x6Xfi)oV4bffKw%H$$> zyU)B4{7JdIEzfw3Q{{~j9eLxN7>8*o>TsU~ak`kyRcVz}#AQ8y*@rj9 zB3C0|Bz1jaJk@1nIUk^55f!zDf`gSj>`~to$nWFc{Qi=bs$gYJE!P9QrvEj7$yZtr z%GiIl*mG=+wD(zG%}4@m*d7*bpK{_c6PyXE+G0O<=;nyiB)7DT`gGGzNDgTJ1@^mA zS`{nTYBs`85~>8e0lY7zLo_UitK~EiXzy4g{Q*H)?Ok(GNknJ&mn_ICyn}+&otkZa zV_Bx|6wY^=f3QMb5e804nczT3r7uHTJ||a${N_I;I6$zDU=6{4GQpqoGbeFp@B14w z-i;8F`IgbX$qoW;-)SPJC7}8U(;vpabu85*YqToqk+oX2^vDouw=Um&+AuZm8v_D2 zTr)*mkzX1_qzVSN2vuIIu&~pLi0Zf2U)oK~(J;Dg2`YsRrkykAODZ9FMTD_{(fQfA zMaylN>vV~ZTik4E2{CaIUwBD7nbcWCTzU3GXFb&1p5A)3RJl9*ow6^va8vcvBs;V3e_p#a90( z9_d`np#K+wp8=T4{W3uoO%2;DyjPU#0oF+W8}?lGXt9SjjJ#VqFyyOpj-Q#T8RgN% zG3crHlp;Tgi-#HXP}5t*hCdw?yx@N2+ZA_+Mt%JYRfeGnT5+LKRxCPtWx9HQ!GmbJ zNi8<8Iv^L~>3@s-l*bdx7pV`y7yp&jL2gFz_b1&%8D#2D3TuDT4VM)!+3)EpsfujA z86mgt;14_O59U1{!xv6}SCwi|_Ab?`f?uR*<%;bq{jJc$#7>|r_W3Cz6Xcm`Hb4RU zIG3t+lAX7MdM{awMS#LROt?Jm`BVe)&hv1vH5}E;Rdn=aWR?;XVJ@H067b7`hwk}4qT1qLS)v)4CAlb$9 zYsS1k2IsMe43l+9$WVCdJ<%&yXgvizoeX|pi$c1{Ed-r0xI`v$F*A-FX$j;SW_prT z0gnmV!2-|g_>86IG~~O^A|+LY;Zq=d8a$M#ML3cxQTImhLBT-y8jvp$uKA9E+%8`h z)KmypRUx5<+dPtN>0QHU1MB!7Glcd3#*h6SK>8`PMd}8dgKK@vHnmz*+Ebc`r7G?g z`>k@aQRz&p(8Nm&^0iBJLEt_a>kIa=UQu)080)+O#RgPky>R~kj&1hO`)m((@B6`k z{lUBkay7+EsB!zttc4=3VV=(jK4b=V;KDv`3(G&2l9;J6%0$YKQL-ntB?EMrS$;WM zU15--tHiam#W2{pFB{r=0x1`vs9}qAA&l5vD1yquQbe#o=ql6)n6}BZ3VGv$GE8fG zQKl_w=EK)bzSZzgr-)d2>g6@_x&arTPQ8rPO47BVHe!b~*i(!9*&o(_j?kSw_YCn8QUBMTg>Qzv>NW};RDbo~-Q;Uz7ErJSu?WBCo z>~}fu%8Yj)fbtxqc0krLivR*Hfh!9+MveLgZi{uF=+LRL2IRO zuATNJNax}ATTcwb5Jd@smK_Px6}Wl?!wvchmsRYM^zuSLPwXZZ9cevWBHt6EDSW=k zFsvTb;ALBni$^-e;RP8PzOS@c-UA_FKBOF*4AP7_xlj*Nm(+`Bu1lq+t|m5RiT(JO z?yuu1rAJeqTlIF~F8q2TNaQS$OT8@?ybJ;O$_s zGX_B?mPlK8YSJ$`#3xEsf4aFp5iV$BR4Yc(e(}WiV!9sC^4Pk>B<+$nv7jachM9G3S*hF=o4e;hO%Vy$^;g-Myl9{Fay$JFoNnAL7H?s zOg-XPxh@NQf^Y&+Tla+*UVIN!-4M9Z-k+xE3FuTum8CGPe=r;9MJAQbl!ij$Z4{2J z8gQMjX0n6uihg}!T>pKBZX+lX%>Cbdwg3P;B1&27f&TyEX}-qj^Z5AaxFIKJj~30W zT~N1fiNR@M<3?hdzsBpIfSZQvu=Y&#s{6~snbnWYE#I46zIW#I%;}%|T@5YSdOSS; zn``fl%xyl9-FyHy>YS^;kgdOPzp?eU{`!rt-u*VB%xHD^`-T4B350#5<&6*-M1PFedkOXt>?bJL;CzXN@&x=K}Dzd-C_J&2U`k<`=f5a z5;~>a?})-%3o2Qkwdev~x=f0$oQqMIrv&Zkj!{GI(qlN>qWO*@QTaO4WtCwpSIkbC zJ%hg%JsH8xKY})*2;)LAPOX6#m>d7GwT4u^PF!dB;ZK$_%}R|j z&4zr{NzCJg4@{=_pT?#s@o^XfTMw0l5ANw821;|14sro2=|4t0n#jxNgVsw90~rns$q_NEla|oxqVy=%DXI}|>IbUX{(pkEKwyLk;I|#Ciy4@1 zuria3D8nvnm}M@G%mqTPR(}xact6lFyL&FMIvZG>F;7(>c2`Hek{^^(bm04}*J+2_ z?(!wk+^@K>KMCF_aLib)VdE`9Ns+KRurR)8ruil_h(Bx#+l^S*g3QD}cR%;$jay39 zfu8PxAEHOhln{Nr0lBwjNN>XZ!{r4Vo|$=hui+=1MqV75U}NrN%@FBXZUWlTt=xC< zr1bb69u+1ihQokm_92bkjkHM&i(f%Zy^)zmHb9h=IQ=%R)9aV4NfJi-6~Ml0uH_k4Mf_^Pb_6WWGk>roqG&Y&eiivVW6@SLOH;?$V8=-)aGZ}#F`)7os)+DvF|uC8H5S2eW~87=7#f?!zhkG?pN=}DCrBXsWHz+JE4SH_9e z)kC5eYgu5^?c=XKJy#db)`c?x<@mV&EyGVSS!c8rv8^6L(-!EDVyKO1%*P_kH7Seq z0<}00+kch_7lV98fL$0}NutJE)?ZE*A!BCa<6Or9{BGYGKC=UVfa~6!pxNzP&3I*j zY8QTd7~i!H1L>-rdYN@&VG=qIm8CS;t!a2(&C3~v&@ zs}O)wqi`+C#Nit&S=cy8bO*FPA4)*{twTD1eSr|!N(ziLJ?M;$$FYJNj&arYeApC^ z$_oh0uR#i_#js5syzkoY(k{P;I)}ju}Js`w+XtA z1Pl+o27g4+rlA{QfxyJm57!ukVDVv9NlK}pYK=IF4zXY|%Q+D871czC0)7j6o$(Ra z{HYniIE>q|4hjOhNmv4oO|<5A07k)<}WKCXn`P!KbZn2AHR2u&8v6ysdRW$JjCPHJ)- zzB0w7nPvJLi|SB4o4Y~vFDxsQRbzi4Y((%mLG=39(DBt=yPku$yq1Q82><3Tdz2vD z#iP>0N#y9nkaLzOmvEnxE&MPdk`wUIfZmCUhE|?TvDrv)x@Bn6j3zX+{w%PFv$WWi zD0(}0Y=m?QO(_;EP}1O@+gV}M(2;^ox~iH}DYT^CR4cK2pbE?uw0*~Lvi7OX4I$Ob ziR%~>h1Q042%XyMQ~VrtP9TieO@AQa@x=JVh!~k*_)_I$>i*EagJvM5zSlRIuCbZU zf|n4?Py_Z|v9hha%@qr0=vOLTYZ2H8xrzzmW8!wm!kS(6+iz&`8PhV?lXbz(h?x|ssu#n&JyU&c9Uj1FYn~U zvEz&K#dpu@#HC%#-k*vw0_@imnrAC6)sumLvCk#?OadLW{5Ohv8QHGz*aS4gx^5|VwnhrTZIXRjGB&y zXnmZ5V8Qf#%{>z}d)E_l6v07o&95a$-04;mSP?R^Yv4MFa6z_Z5;T8{7>q?Kn zHy9!tj0U4Y2IQlLOKv_ta-MV5*`aRZbV%nx5SGb|Qa$S@KZPrwTwbP=)S{{FYh zdo7e6A${Wj@}%l`4X?JaZxH+n`#~2T75V{vB%xUe{H~hXTfJa1gIG2S`P!}Hw~nh+ z`0g**QrO?j@V;|VA1P`wy_*^P0W0w0(iKRZewBl^F=ccV9uAtr=Q2hTocEm3-gH5$gtJ?vPBfQ>-mSez@J zq}~|cSng$5=V6atGX-(~6bYZ?N_l=0VfRzkRSrib)iH9SpBY4md%qYaSt7)D@dCy1hF2Fi1)S54z5etFm~>=qXh=~axo;q#J$O-o7bd>4erZ+ZHtdGg4!XU_Fq=p8(H z%=QJHrqcz zfyXn>^Fd?lOl1yxR_z6)57y3yT-dT}Z? znG91a2vykQipI@STFL^E6OoEAKt=d{J5wZhlSSof0Hyo}MTEY38^5u=h`{n)N5vZGpseP}B(Qa2MNf?r9qd)& zm*OUfpD=J6@>1bIVPfN%{yRZ{$3e|3529o-RGo|AB}6mA|4Dpf0-}T&rV5yr=cQi3 zO_7z@gWAO!Dsc<(g668E!%xam9oVRld%2;*ihvg~GcH)iI>a1ez>i2)Vwl3y@>FKb zO4)1dXKG~pXGE6i|NX+r-t)cTvqz3SedI*%`S9^G;r=rh!l#d1ICe6OurN^>oth$iOYhRV0a{ z&|M^a1~2G0;EBE)g1IO}Qz)=42{P$mZQynYyong+9DvvjZZ!~(D^OJ@6{3%in+(Tj zBwvY6jlGhzg=P)@A8GMLftq3abt&%!F@-f)A#9Li@KQmRJIq029_(?rf2b8aYJU6Q ztmZI?w~-x6*Z5JA?dZr=;PuqCQSl^?!9}i>@)Wc#`0MjDCdf+5P z!b7yMw#@-(F%f@D455~ufp)a7f@(DcM}+vnawT)Y66f9JxrqUUDC^I=xGFu0MJaH7 zBFo)BJ*H_fO3%3q75l4DTu!m`^}^`E*l-kXlH%O{pn{$Mj`+r)Xw=48CQ z?zW^k1Mp#kI`}^R)d9`zH7&3hi|33Bx=a^M|~ zB(*vTK0d7kdV$Y?`1bEFJmN^j(QCe#ycXTDdk^Ms!w}^^B(Ty~X*nUJ4BL0?+_n2* zLD|GkVB{MI^K|85L7|-aAgiQk508Z^*~Cw*Z%ewc=*E?3)NZ&s<+|#&ix!K`Zk9I`cF<}oK<>mZGG~P#X@eQ}7^Iisj`wp|+ zFBh3ih@cq$`0scPt#^m$&phb{v%RdIwcy4kBJR8wdh8T1vZV=^EsqV1e9NW}-}aCd zV0q6EvGlZL`NY(XU(B>$d@q{mIQ*O1JA2+5d3ywxINyCn{UWsJl$uGmn|YUCTi;VM zZm+bQZBp^VA3H_PoDt&)mAb z*>#BK!+eThE)<^WyFHm}S$+F6aI)Ldoo(r!dD2p@7i#Q}VP|l0uKi*bFmy2+x|j)F zG@|9|&&W;yFJ!ko@xhk9_qX)TZFxGo<>^fQ8FgZ|RfCQ-gzR%HUKq&>J-3hP!sO2GQmj}sJ`td-q}S1&gqV?7p2-Jakxg8#@GOrQn}v$FY$ zN{XTh8Vw<&C%9G3&1wT&f$Id&WtUxs>u>jk=Us~cHD_ZEhVgOhz&(#8*4nq*q|9e0 zA@&`6RynRupSFcyt1kwb95CctST!!HRPc7^l-?=Xquw{!WkJOdEz54Mi>!pd$a*7a zD&QWo<|w>v;AF}MR5AI2qnMllNHKQ-7Te0wO*tHuV|RL4*AWs&Jw_*%chvNrgly*DiR4k!55H zSl)rOWO_TKqQ6M7T8q^tNJDSh~Q&C^m~umPxTqDO~&_ z2D!zok+JP7`m;J@Q3Jmshb$DfzF)9a^4U!L(}=0Rz!s)$iMc-5`Ba(Ml7J9Z83dl|p9u}Y7$lnB~J(WnM#~PR-yKLt-V5=js3n ztGMHtc8@iK+e2B^ajW7f*O%bX+5QYMy^JZF&sf#^ZE&TArM^et#V!5)T(Y^jh@H*;O8MQ+n=dk zjVJGmHt?Xf* zfx|L}QH1AFTjH5qdW5JSrBv1+&B0xt@FVk7nCgtTK&Ew(DOYkRCtLwNUykn>Aryp?VC=ixn}xzscV3R3A{YQ zb{*Do`WTHh)M6X)K?P=YC{~3i@gjo&x)F$k&l;i!h#$I=eSUebRY9j!mGu_3@rs^Bb+fYJ z4o`KKGrWN%3eLDEwk zX`=QkHyklo&zxruCGJthcM;@*Dta zk8D72|3Xb4P&xO;R^kBFqZMRP)^bSv4KCE=IOrmqW*!B;VcIcWE+`78iiV2FwA>gl zjo665Z>A#~5nxdcl#XuuW&~62FKz|bLO!EHO|-QNNXFL7+5_gUC_UZ=BW26foG4!3}7ml^3t75_3qrZpb^FDb3>lVN4TNle$pE@>p zy7&BfO6&7MXaJ4pwMU={+P+X&}wz&+F%yh$rJ#9p#e+8wW8nKV|47wn^)!%xeSea>T-{Z2OcgDi zpY}W6vE`ufDumkZDgWCg?#u1yhINISaL{(3g&^g3HNtO>Clmvk_D!U&^z6m+0Ia|h zoIj@<3&Yf8K*S6Ukt(0AJT4S$DoZhq~8k5!dDrTJM>J}1|6{?LZvkjZyZO$|tnrk?e zZ8$XJpRWi7pLXX$jbDBGD^Jh*@3qZ5Jr~-Z4QGcb|;^5ml!bw8>^1(^ZdceBklP4@m@Eexq9a~5-QA>Aruf6ouYcgVBgYp0(p9w zPs`ilQfndmRpdipU|}ex>_gR%sg^}1#uNIv*Q1O+1R&Z7L)gsZb%H(YW|Y?3X5GlcpdCyn^hKhXHL%nl8WM}bZpZG$n zv9;vjFButR$^Fqv+^NY_LH`L}3>qO2LbtK2Mfa4uKx8SG!o5W@DPx-U*xhayR+qw* z%sb^FKd1SMH@t!$m?ryM8or3MD~olLAgeY*H7D6Eud#Hb8c^J+lW1tcq7qfz0SSJ) z+G)B*ei!5=)SveN2d66z9!z(0vNRgMdQCRX74P>Db+8FAc`~IWn4`TMkHR5J7hZ!L zMC2l{Z;M|Y!?wmf#sf^Zd)R(htCS4qed2CK$#_hw5ZWyjB4b{a-l=A5No*(up|5fu z9=`$u7MZ|V-9jdAMkIl8qcymovxiL*{reSAQtiaP-~tnTDe{-#d}1KlP!{(+s5$09j{D z;F{Z^L1=)xv>?d>ou?Jxhn_;@BL58co7*$X4&3_;0M5DQ$Ft3k)9Xr~JGbre?6zJK zt3FB0f__XEAHqlTTV7pivW@j;Nl)}2@wOO${xeoN!53ItM^$ZE63zO}#F;I`nU4Sz z&SRp(NY6U(0UnQr^G?OCMu#VlLsTKwo_(rkrPo`%w}&`R!U`j)$LP!Ds-ZmI8%M@| z5oLybCB8ZHEy68e*caV;L%)qmN`Ji%>&Ym{v5I0F=Mc=i1Y-%qLEr?mKoCT#5e((n z1VjOJQf{tKqyxeD@HH8tTqGgpVkXO$sfdYR#0uT0mb@v)Hfe6H@Yt^5}jjvpn>dd&h&NaDHlXFhk@9TmiVRAp0VR7A(xw!De_FuV^?{$y?QT zJX+}Onz97Gwm)BOv+C9V1)4a$+Mt>kj>Fsz(j;-#isZ0-vPjEQ7%N{D33R!<4~+Cucz zPW1H%K%p-tI*jVJ4t#)z`=d>OWi@WfBbaF1M1w}3EkU9%nthF6o&0fQos!5a(ow@l zv883Q*3WQ7`*2K_F0KYsmN&kSb`NrBI4eVkH*3D`GJO&k&566^IbI+;R*i{S) zF42ZsD&0iq*y`IoX6pHXd8HF26l%D<7;zWsfhf;fQUh_CeO9CN><~C{u4B|uF=_!a z@)$9QPUUbSA2l~Z3KsIy8!#iX-D^IgETrVeEXu1@PW#5ZS^!r;Y<^^$_h<$h<7`R` z-6<8Y*#vP#b0ix|HZqByDZf^Od{C(-M?vJr*&22dti`sy$o2QFoEx*D!nVEDYE8{x z65GBnxVNVL%I;pROss;MW~dynheYEWB7p-p3R=Hbe7OENtpQ#jJikT zSf%$OvX(xCPC(bsI&_jmo8=NRR;-ylKqV)xP9y31<3{&19F~RCn@mK_Sy5~(F>&>p z(G}4tnHTA#T6oifyDRO(HfEU0?J{+{#OicAq14*N`xL$$PeJ3Z7MqMm^uI>|y5Kdh zoCps}ykY&j=!WokgBr}&%4onkX!Z4c6{Lwq6)JRGaBWG1kPpE}9h81CZ4jIOz<8V8P%*w!O_GoG%$@tjH*SJ$ttzNz&Y#sZ7A^Nk=xPZRRfo9gC3~~#7{~7U< z2OkCceh}E3ah?zA+FqT`)NNAdgSw8H&(H47cJ7#~+nKG~nF*c4`OfusuD`eGCp~j} z&Sv+VRnK6;7Hr2tmr!%I8afPr@Pa$ndE)NL?7GL^T|Kw%K&JDAI$;RXbV?K&e%cS> z?mT2}jo3uiU9)|53i!H)t8{C&=T`OrgBv&U1QRuGkO(kSSu|0DvM$%WclP8Pr?boV zWSaNlgoDgn>#2FQ1>#cP^dJwDHgMt~{RV4#2*57N`ZYEd!5^^}`w{98Wx0Lpky8M8 z4BbGCzl<3F5rD$@{J=2MwhjZEErIdjl^9H`4@_&pj;%7^dd}L6`$8gd93E5@!arGp z@Zp>V>mSC3Cpi$g1Gf(SHW?M=$Q`?I$44hdInX8`=!W$lCjW5Fl5Udd;{Uw|mM0L6 zKqz35N{e@8Nh|>tyZtXRkt5=#cgq|+!5Ip*|t#_ zUCtJv^OxnXW`vEAaC(sYbSJT-oCs}vay%M|C$`4MwgSb#eq?JZf#ojAt=88jiSv#9 z+qbR-nb&AcWP50}vT|0P#OM*6bOMd4_Yn})LEdcPKEohQVJ%YKupM8mI%j>)-bF2R z^>-X-OcDdlF&E7>AEhYfiTQx+qvdxsCLe~o)59FXWe4{=3?bm6LUBKC8{9eXxs3PR zgZlLx)*%k-M*wPAGwJffdL7DF!pN21$F$Yp%VB;R8{z&qni|q8mE+bP@Nlt_o*@SG zfZCh0QY@zx-{TAIvQW%O#5M!9FArlQnFm=BREPVcui)Yr9ku0`)zB5A0^TbvG6&gbF6FZvC$jA3dI0j=WoUtT4ZgXXzc~+t2Fnh2-Sz}PG6);v&|A75`G11VcWY5LC82(rt!;xcg z8|Yrkve)~*-lsBkkNKNhu{#UcygS>xn@+1AV*fg?E?N8?=F_4j<)uddnsEsJyA4ki zWTV?SS_2%dj{sB^GSNpEt>vXgjfPaG_v+Or_2^ZKdeY6tM7#$(KlNNOo(k5~+u3UZ z*0bffEmXiTN@yKa_sg)XLN?W`XxalUPsPh{NeQtGf4!Ku;8%wx2Vv0F;2Qp+<(E64 z2hx~*?fDmLgVo`q>OcRcoY zi>;8}t}Tle>iU(#veU@tg8QI;3cu+-L#SpN$zoB1*z6~vfFofJD>aYudV|RW*qkev zR?t0f1S=Xwx#Aeae>4)-2PEA~>BFStYIZ}mK>2>*{>gaP^1KyJPQuFXCMY&7`d@@` zfgZgSKFnwv(_7Iepng)FLP?B7)C(~X{P=L66FT=1xw35imG)i0hc>2{Z49I1SZ|U6 zF*;P*FD9KE7u*|_n#XHH0JIyCg+`|BJ!z```)FC44yT;$J@&Ye+}OIXg{*3c4gMVx z0->baOK+~a_V%WkCuW|Q9lrbgY+^R?PSd-AcUHZ#is*sfWojB|z*J{MO5VLT`-Ryr zK<}Pues(VO?9A~8bxq))gT3xt6Erstp;4~+#GNPa?wwoSon79YX+ELOT=Vuj&wlsV zJ@2pfz1cUnB9es*(B|#xyx+Qf_QKajUK@Fs4W<2sA*iawIr_?@pMT5xBdBIg7;H)b z{m2}kf#~NEfI>e^v^@G*RO(YJbATGh9H1`WDNMp~lb4+|5WM0VcG@QbiildQAh}+H zJ4T<38~Q?sF;^L^hGH_T_>(5DAuc}jH7G#7O5)H{SkkbH1k)*2k$Imuhthuwy(b@p zMU2|Sq{xlGh4V;{EmnliG>ci0DUZXL7%>VaVj}MLiMZQ0<;7knmZ4Xv5%9Es>_6Bs z;gabtn_6TC6H|xo#A`YUobKOT*MY_JKXipjmu#_?e{=m8g%uEW?XdoH=tH2a# zpUiQU_^n1MICdjpB}e-cUUeXv@Ui(IOCK9T4dm+$iKgW?Bwqzru5noLA)C6GF#JAW zwm4yIMk8XkwM^{~2!2BFhX7bm49~A>^O|11Bs?-XEkn-cn7FPx%951Fs}_OWNU}g{ zD-g(^*SkWkw_|snpR3-Gt=>Q(S#7TAfRcr|8;;7BFb%K>3$UU=AcV^_I5UNAP$ThdV ze&XvV?({)A_RhrI@`Kss2j`j(Wt$Iu(A@WabKhL^)7j>yv6Qx<5ld+s;8GcYcFLWv zjppk2%npC&+PALVP0y{|kzKhXQ@=-@xrV*pI6u4WYoC4Xvzdmy>U?*7rv7lQzWMdw z*MqZNbM@=8_3Lu=-5&;hZP3mD%$)dnt*fam)3*QJ6LXEnvyI2;hY5>!-9dU%`bKK@ z^xb2#r)N*kwQbI}ZJrBlE-}sTy!+g{-aqzI!PYl|imA+B#AE8M6dOL~V_%cE_lC0C6GpM>mq;9f-AwB9|iFRx=4`j|dEHT~`9tjn; zf?T#$kFZ3;`~;Qe;R*zyy>2^JF2c4F*Ori6QrJgVWpDe-V%y4o@h3lVGkqKDZny-7 z%rK<=XU_M4byj{c)!LeFSXTgd8aP>87RkyREU~e4un@h;=DnC4i02)_BgRrWybFQZ zm|^g&ugO%e!M?RKeKURY{)&c8oI13Y2>mZ`TCp66uI)K@u65P?Ll~ee zF8=#d4sn8WWrz6IjCbpU`n41&JOVQ>oWC04O!^UrczHc;18edabxjb&m*L|veT?fV z_D78Z)~&MXq@tEGlN(zIOVx(-g5)3Sq=Huds(8VRQgR z7`=+kaW-^$()T{c1;O>Q<3f=>5sN>9WtNz6sd2%iQEiM8bm@ZdyW*D1w6s5u2zeDds%+73CvB9Y>{`&N+#pnl=*Cf%d`lk3nY>Q?*me zuhubQn>{g!Xzaa6Sx~;EB$TUPq!Z^W=?aK+u8}dTZ87yGKIybQky6lITZ9gGQ5(&O zp>r0f)7@FVRpQE0AFOV-wp3Pjam$JVC4~r>_v=a)y3!eL=1#9b!0^EU@o|*@RTgOQ7*^7#3o+LOhU@<5-Ef(^NoYN)d;Q-Tq8&jOcG2J{1U;J z3BEz_I>9#yzD;n4;5!7rO7MMx9~1l;!5qO~68sgxeS-f)@Kb_$f{zG3A@DMjvRg`s zS6c|^l39Fyir-1`Gb2t@^ye6`k*^K$>N0^?4%7TmER#fWEebA?n2X#>cv_))GQ^8~ z*n=oy6Q`BGvRk_^fJG}G^6|%ou+O-c zF>WcytU!z6F_SeS><#d$6l7Xab9fB@JhAOWzYf49Oz|F;--?O*_GLI;zJ4j z*dFJcyWWkhNJ~Lx)%MKJ;~z5Q<3jL;X7_5Awisj@)_lmvEUgh1+2ZCVB;{eIel@${ zVHDy2tK)1|6NZ8)>=h|ROQBGLprnKnv<0&$s3_eOqz_QK?4oPeK8VXMT=bFdvX9Zg zJb>p6F%vSnIfQdQ@-yMiO#(L!;455*D_(V5e(*UBE(>2pNxfwrw|<`-IpGcRvIhxQ zEc(23`2EW5bQ$oQJ1->RibcDC^AIRr)!q@4JB&;MKACD zrP*PN-^1s4=s8L3WdFDCAz-!Xd5w?rQX^>sAKf9VM%30o|Cxzs3z&+Vzc?j-ukdIV%Hz&HQ^ diff --git a/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc deleted file mode 100755 index d667fab5f3e9578e9aafa582c854d03fad09da61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 718 zcmaJ;F^dyH6rR~^?sCZm4y+WxL2LrL!*PPSLsE%_U<$Q5k!7+o$&T*M3^TKlNCXQD z1q%y7u&`9bKa)yiE5XVxkS>*Pau~Gn@%HUEyYGG9d-FbbyKMya?cImR_b@^~!{LuL z&H!Fr1n?el#BqU2e2OvRExyNhUp7x89^FU1_OFoI!*z!#r9JafD>tlTW+!faP)O$= zI&UA5IT>mt>K!Y5WmVmf%4eXuwV((OUR?nIikL@1@i{0)XpZOT6J&qgR)BKj*~bUD zbOhX3;e?$EPR802U2u{?7rGF{WmX#Rh|ifPC7TiFWl@lkAXbcp6)KZz(k5WiC+!Wm z4HS%X875%`;leXnxU0koL2~bnJE3$UeO`@{OqbNm45LOGDxIr@qc^S}_md5gjbIeG znO6GLGGm18MfD}fOi~zLSRhX-=*A^Nc{?*2zB;=XY9brMYlB@NA!L1*=DHNLWH!_E zj-Kcv3Y>H*)RY!-1a0_StE1%bkUHtbHN&zeYy$m+*0zFBFI8e@bsT`*2kxNc!ll1J z%YD>5Uc~*s{YU5AtNzJ1| vM&b*y-GDm~)~%bR=2amE_5hAyq3#62vVk%FjxI0$_2o_rUs$65g$?&_s6oH; diff --git a/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc deleted file mode 100755 index a8b7e845cca3035e59883a84d44528046236f8cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4647 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 Dl6{&= diff --git a/venv/lib/python3.11/site-packages/pip/_internal/build_env/__pycache__/virtual.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/build_env/__pycache__/virtual.cpython-311.pyc deleted file mode 100755 index f0030a0b704b077f808a4044e02f5eb5f237d824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8263 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 A1^@s6 diff --git a/venv/lib/python3.11/site-packages/pip/_internal/build_env/base.py b/venv/lib/python3.11/site-packages/pip/_internal/build_env/base.py deleted file mode 100755 index ce26d9c..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/build_env/base.py +++ /dev/null @@ -1,103 +0,0 @@ -from __future__ import annotations - -import abc -from collections.abc import Iterable -from contextlib import AbstractContextManager as ContextManager -from typing import TYPE_CHECKING, Literal, Protocol - -from pip._vendor.packaging.version import Version - -from pip._internal.locations import get_scheme -from pip._internal.metadata import get_default_environment, get_environment -from pip._internal.utils.packaging import get_requirement - -if TYPE_CHECKING: - from pip._internal.req.req_install import InstallRequirement - - -BuildIsolationMode = Literal["off", "virtual", "venv"] - - -def _dedup(a: str, b: str) -> tuple[str] | tuple[str, str]: - return (a, b) if a != b else (a,) - - -class Prefix: - # TODO: simplify this data model when the legacy subprocess installer is removed - def __init__(self, path: str, *, venv_executable: str | None = None) -> None: - self.path = path - self.setup = False - scheme = get_scheme("", prefix=path) - self.bin_dir = scheme.scripts - self.lib_dirs = _dedup(scheme.purelib, scheme.platlib) - self.venv_executable = venv_executable - - -class BuildEnvironmentInstaller(Protocol): - """ - Interface for installing build dependencies into an isolated build - environment. - """ - - def install( - self, - requirements: Iterable[str], - prefix: Prefix, - *, - kind: str, - for_req: InstallRequirement | None, - ) -> None: ... - - -class BuildEnvironment(ContextManager[None], metaclass=abc.ABCMeta): - """Creates and manages an isolated environment to install build deps""" - - lib_dirs: list[str] - python_executable: str - - @abc.abstractmethod - def __init__(self, installer: BuildEnvironmentInstaller): ... - - def check_requirements( - self, reqs: Iterable[str] - ) -> tuple[set[tuple[str, str]], set[str]]: - """Return 2 sets: - - conflicting requirements: set of (installed, wanted) reqs tuples - - missing requirements: set of reqs - """ - missing = set() - conflicting = set() - if reqs: - env = ( - get_environment(self.lib_dirs) - if hasattr(self, "lib_dirs") - else get_default_environment() - ) - for req_str in reqs: - req = get_requirement(req_str) - # We're explicitly evaluating with an empty extra value, since build - # environments are not provided any mechanism to select specific extras. - if req.marker is not None and not req.marker.evaluate({"extra": ""}): - continue - dist = env.get_distribution(req.name) - if not dist: - missing.add(req_str) - continue - if isinstance(dist.version, Version): - installed_req_str = f"{req.name}=={dist.version}" - else: - installed_req_str = f"{req.name}==={dist.version}" - if not req.specifier.contains(dist.version, prereleases=True): - conflicting.add((installed_req_str, req_str)) - # FIXME: Consider direct URL? - return conflicting, missing - - @abc.abstractmethod - def install_requirements( - self, - requirements: Iterable[str], - prefix_as_string: str, - *, - kind: str, - for_req: InstallRequirement | None = None, - ) -> None: ... diff --git a/venv/lib/python3.11/site-packages/pip/_internal/build_env/installer.py b/venv/lib/python3.11/site-packages/pip/_internal/build_env/installer.py deleted file mode 100755 index 790ad5f..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/build_env/installer.py +++ /dev/null @@ -1,333 +0,0 @@ -from __future__ import annotations - -import logging -import sys -import textwrap -from collections.abc import Iterable, Sequence -from contextlib import AbstractContextManager as ContextManager -from contextlib import nullcontext -from io import StringIO -from typing import TYPE_CHECKING - -from pip._internal.build_env.base import Prefix -from pip._internal.cli.spinners import open_rich_spinner, open_spinner -from pip._internal.exceptions import ( - BuildDependencyInstallError, - DiagnosticPipError, - InstallWheelBuildError, - PipError, -) -from pip._internal.metadata import get_environment -from pip._internal.utils.logging import VERBOSE, capture_logging -from pip._internal.utils.misc import get_runnable_pip -from pip._internal.utils.subprocess import call_subprocess -from pip._internal.utils.temp_dir import TempDirectory - -if TYPE_CHECKING: - from pip._internal.cache import WheelCache - from pip._internal.index.package_finder import PackageFinder - from pip._internal.operations.build.build_tracker import BuildTracker - from pip._internal.req.req_install import InstallRequirement - from pip._internal.resolution.base import BaseResolver - - -logger = logging.getLogger(__name__) - - -class SubprocessBuildEnvironmentInstaller: - """ - Install build dependencies by calling pip in a subprocess. - """ - - def __init__( - self, - finder: PackageFinder, - build_constraints: list[str] | None = None, - ) -> None: - self.finder = finder - self._build_constraints = build_constraints or [] - - def install( - self, - requirements: Iterable[str], - prefix: Prefix, - *, - kind: str, - for_req: InstallRequirement | None, - ) -> None: - finder = self.finder - args: list[str] = [ - get_runnable_pip(), - "install", - # HACK: --prefix shouldn't be necessary for venv environments, but - # we set it anyway so if it's set via an envvar or configuration - # file, it won't break things, *sigh*. - "--prefix", - prefix.path, - "--no-user", - "--no-warn-script-location", - "--disable-pip-version-check", - # As the build environment is ephemeral, it's wasteful to - # pre-compile everything, especially as not every Python - # module will be used/compiled in most cases. - "--no-compile", - # The prefix specified two lines above, thus - # target from config file or env var should be ignored - "--target", - "", - ] - if prefix.venv_executable: - args.insert(0, prefix.venv_executable) - else: - args.insert(0, sys.executable) - args.append("--ignore-installed") - - if logger.getEffectiveLevel() <= logging.DEBUG: - args.append("-vv") - elif logger.getEffectiveLevel() <= VERBOSE: - args.append("-v") - for format_control in ("no_binary", "only_binary"): - formats = getattr(finder.format_control, format_control) - args.extend( - ( - "--" + format_control.replace("_", "-"), - ",".join(sorted(formats or {":none:"})), - ) - ) - - if finder.release_control is not None: - # Use ordered args to preserve the user's original command-line order - # This is important because later flags can override earlier ones - for attr_name, value in finder.release_control.get_ordered_args(): - args.extend(("--" + attr_name.replace("_", "-"), value)) - - index_urls = finder.index_urls - if index_urls: - args.extend(["-i", index_urls[0]]) - for extra_index in index_urls[1:]: - args.extend(["--extra-index-url", extra_index]) - else: - args.append("--no-index") - for link in finder.find_links: - args.extend(["--find-links", link]) - - # is not None: forward an empty --proxy "" (disable proxying) too. - if finder.proxy is not None: - args.extend(["--proxy", finder.proxy]) - if finder.no_proxy_env: - args.append("--no-proxy-env") - for host in finder.trusted_hosts: - args.extend(["--trusted-host", host]) - if finder.custom_cert: - args.extend(["--cert", finder.custom_cert]) - if finder.client_cert: - args.extend(["--client-cert", finder.client_cert]) - if finder.prefer_binary: - args.append("--prefer-binary") - if finder.refresh_package: - args.extend(["--refresh-package", ",".join(finder.refresh_package)]) - - # Only build constraints apply in the isolated build environment. - # _PIP_IN_BUILD_IGNORE_CONSTRAINTS tells the subprocess to ignore the - # regular constraints it inherits (via PIP_CONSTRAINT or config files). - # Build constraints reach it through --build-constraint, which also - # constrains any nested builds. - for constraint_file in self._build_constraints: - args.extend(["--build-constraint", constraint_file]) - - if finder.uploaded_prior_to: - args.extend(["--uploaded-prior-to", finder.uploaded_prior_to.isoformat()]) - args.append("--") - args.extend(requirements) - - identify_requirement = ( - f" for {for_req.name}" if for_req and for_req.name else "" - ) - with open_spinner(f"Installing {kind}") as spinner: - call_subprocess( - args, - command_desc=f"installing {kind}{identify_requirement}", - spinner=spinner, - extra_environ={"_PIP_IN_BUILD_IGNORE_CONSTRAINTS": "1"}, - ) - - -class InprocessBuildEnvironmentInstaller: - """ - Install build dependencies via the already running pip process. - - This contains a stripped down version of the install command with - only the logic necessary for installing build dependencies. The - finder, session, build tracker, and wheel cache are reused, but new - instances of everything else are created as needed. - - Options are inherited from the parent install command unless - they don't make sense for build dependencies (in which case, they - are hard-coded, see comments below). - """ - - # TODO: this plays poorly with venv-based build environments, but cannot be - # fixed until pip gains better support for operating within a Python - # environment that isn't the running environment. - - def __init__( - self, - *, - finder: PackageFinder, - build_tracker: BuildTracker, - wheel_cache: WheelCache, - build_constraints: Sequence[InstallRequirement] = (), - verbosity: int = 0, - ) -> None: - from pip._internal.operations.prepare import RequirementPreparer - - self._finder = finder - self._build_constraints = build_constraints - self._wheel_cache = wheel_cache - self._level = 0 - - build_dir = TempDirectory(kind="build-env-install", globally_managed=True) - self._preparer = RequirementPreparer( - build_isolation_installer=self, - # Inherited options or state. - finder=finder, - session=finder._link_collector.session, - build_dir=build_dir.path, - build_tracker=build_tracker, - verbosity=verbosity, - # This is irrelevant as it only applies to editable requirements. - src_dir="", - # Hard-coded options (that should NOT be inherited). - download_dir=None, - build_isolation="virtual", - check_build_deps=False, - progress_bar="off", - # TODO: hash-checking should be extended to build deps, but that is - # deferred for later as it'd be a breaking change. - require_hashes=False, - use_user_site=False, - lazy_wheel=False, - legacy_resolver=False, - allow_editables=True, - ) - - def install( - self, - requirements: Iterable[str], - prefix: Prefix, - *, - kind: str, - for_req: InstallRequirement | None, - ) -> None: - """Install entrypoint. Manages output capturing and error handling.""" - capture_logs = not logger.isEnabledFor(VERBOSE) and self._level == 0 - if capture_logs: - # Hide the logs from the installation of build dependencies. - # They will be shown only if an error occurs. - capture_ctx: ContextManager[StringIO] = capture_logging() - spinner: ContextManager[None] = open_rich_spinner(f"Installing {kind}") - else: - # Otherwise, pass-through all logs (with a header). - capture_ctx, spinner = nullcontext(StringIO()), nullcontext() - logger.info("Installing %s ...", kind) - - try: - self._level += 1 - with spinner, capture_ctx as stream: - self._install_impl(requirements, prefix) - - except DiagnosticPipError as exc: - # Format similar to a nested subprocess error, where the - # causing error is shown first, followed by the build error. - logger.info(textwrap.dedent(stream.getvalue())) - logger.error("%s", exc, extra={"rich": True}) - logger.info("") - raise BuildDependencyInstallError( - for_req, requirements, cause=exc, log_lines=None - ) - - except Exception as exc: - logs: list[str] | None = textwrap.dedent(stream.getvalue()).splitlines() - if not capture_logs: - # If logs aren't being captured, then display the error inline - # with the rest of the logs. - logs = None - if isinstance(exc, PipError): - logger.error("%s", exc) - else: - logger.exception("pip crashed unexpectedly") - raise BuildDependencyInstallError( - for_req, requirements, cause=exc, log_lines=logs - ) - - finally: - self._level -= 1 - - def _install_impl(self, requirements: Iterable[str], prefix: Prefix) -> None: - """Core build dependency install logic.""" - from pip._internal.commands.install import installed_packages_summary - from pip._internal.req import install_given_reqs - from pip._internal.req.constructors import install_req_from_line - from pip._internal.wheel_builder import build - - ireqs = [install_req_from_line(req, user_supplied=True) for req in requirements] - ireqs.extend(self._build_constraints) - - resolver = self._make_resolver() - resolved_set = resolver.resolve(ireqs, check_supported_wheels=True) - self._preparer.prepare_linked_requirements_more( - resolved_set.requirements.values() - ) - - reqs_to_build = [ - r for r in resolved_set.requirements_to_install if not r.is_wheel - ] - _, build_failures = build( - reqs_to_build, self._wheel_cache, verify=True, allow_editables=True - ) - if build_failures: - raise InstallWheelBuildError(build_failures) - - installed = install_given_reqs( - resolver.get_installation_order(resolved_set), - prefix=prefix.path, - # Hard-coded options (that should NOT be inherited). - root=None, - home=None, - warn_script_location=False, - use_user_site=False, - # As the build environment is ephemeral, it's wasteful to - # pre-compile everything since not all modules will be used. - pycompile=False, - progress_bar="off", - # Link console scripts to the build env's interpreter, not pip's. - script_executable=prefix.venv_executable, - ) - - env = get_environment(list(prefix.lib_dirs)) - if summary := installed_packages_summary(installed, env): - logger.info(summary) - - def _make_resolver(self) -> BaseResolver: - """Create a new resolver for one time use.""" - # Legacy installer never used the legacy resolver so create a - # resolvelib resolver directly. Yuck. - from pip._internal.req.constructors import install_req_from_req_string - from pip._internal.resolution.resolvelib.resolver import Resolver - - return Resolver( - make_install_req=install_req_from_req_string, - # Inherited state. - preparer=self._preparer, - finder=self._finder, - wheel_cache=self._wheel_cache, - # Hard-coded options (that should NOT be inherited). - ignore_requires_python=False, - use_user_site=False, - ignore_dependencies=False, - only_dependencies=False, - ignore_installed=True, - force_reinstall=False, - upgrade_strategy="to-satisfy-only", - py_version_info=None, - ) diff --git a/venv/lib/python3.11/site-packages/pip/_internal/build_env/noop.py b/venv/lib/python3.11/site-packages/pip/_internal/build_env/noop.py deleted file mode 100755 index c9ee81c..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/build_env/noop.py +++ /dev/null @@ -1,42 +0,0 @@ -from __future__ import annotations - -import sys -from collections.abc import Iterable -from types import TracebackType -from typing import TYPE_CHECKING - -from pip._internal.build_env.base import BuildEnvironment - -if TYPE_CHECKING: - from pip._internal.req.req_install import InstallRequirement - - -class NoOpBuildEnvironment(BuildEnvironment): - """A no-op drop-in replacement for BuildEnvironment""" - - def __init__(self) -> None: - self.python_executable = sys.executable - - def __enter__(self) -> None: - pass - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - pass - - def cleanup(self) -> None: - pass - - def install_requirements( - self, - requirements: Iterable[str], - prefix_as_string: str, - *, - kind: str, - for_req: InstallRequirement | None = None, - ) -> None: - raise NotImplementedError() diff --git a/venv/lib/python3.11/site-packages/pip/_internal/build_env/venv.py b/venv/lib/python3.11/site-packages/pip/_internal/build_env/venv.py deleted file mode 100755 index d6d7c50..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/build_env/venv.py +++ /dev/null @@ -1,145 +0,0 @@ -from __future__ import annotations - -import os -import sys -import sysconfig -from collections.abc import Iterable -from types import TracebackType -from typing import TYPE_CHECKING - -from pip._internal.build_env.base import ( - BuildEnvironment, - BuildEnvironmentInstaller, - Prefix, -) -from pip._internal.exceptions import VenvCreationError, VenvImportError -from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds - -if TYPE_CHECKING: - from pip._internal.req.req_install import InstallRequirement - - -def _get_venv_path_from_sysconfig(name: str, env_dir: str) -> str: - vars = { - "base": env_dir, - "platbase": env_dir, - } - return sysconfig.get_path(name, scheme="venv", vars=vars) - - -class VenvBuildEnvironment(BuildEnvironment): - """A venv-based build environment.""" - - def __init__(self, installer: BuildEnvironmentInstaller) -> None: - # We defer this import because certain distributions of Python do not include - # a functional venv out of the box. - try: - import venv - except ImportError: - raise VenvImportError - - self._env_path = TempDirectory( - kind=tempdir_kinds.BUILD_ENV, globally_managed=True - ).path - # Use symlinks to support relocatable Python installations on POSIX, including - # python-build-standalone. This matches upstream venv CLI's behaviour. - env = venv.EnvBuilder(symlinks=(os.name != "nt")) - try: - context = env.ensure_directories(self._env_path) - env.create(self._env_path) - except OSError as e: - raise VenvCreationError(str(e)) - - if sys.version_info >= (3, 12): - # The context object was only documented in Python 3.12 - self.lib_dirs = [context.lib_path] - self._bin_path = context.bin_path - elif sys.version_info[:2] == (3, 11): - # On Python 3.11, we can use sysconfig. - self.lib_dirs = [_get_venv_path_from_sysconfig("purelib", self._env_path)] - self._bin_path = _get_venv_path_from_sysconfig("scripts", self._env_path) - else: - # Otherwise, we need to manually construct all the paths... sigh. - if sys.platform == "win32": - libpath = os.path.join(self._env_path, "Lib", "site-packages") - else: - python = "pypy" if sys.implementation.name == "pypy" else "python" - libpath = os.path.join( - self._env_path, - "lib", - f"{python}{sys.version_info.major}.{sys.version_info.minor}", - "site-packages", - ) - self.lib_dirs = [libpath] - # Same reasoning for try-except as for python_executable below. - try: - self._bin_path = context.bin_path - except AttributeError: - scripts_dir = "Scripts" if os.name == "nt" else "bin" - self._bin_path = os.path.join(self._env_path, scripts_dir) - - # There are enough ways trying to construct the Python executable path can go - # wrong that we're better off assuming that the context object has the right - # attributes, and only when they don't exist do we try to guess. - # - # These attributes seem to exist in every CPython version after 3.10.1 and - # are documented to exist on 3.12 and higher. - try: - self.python_executable = context.env_exec_cmd - except AttributeError: - try: - self.python_executable = context.env_exe - except AttributeError: - executable_name = "python.exe" if os.name == "nt" else "python" - self.python_executable = os.path.join(self._bin_path, executable_name) - - self._save_env: dict[str, str | None] = {} - self._installer = installer - - if not os.path.exists(self.python_executable): - # This error is only likely on Windows due to interference from AV software. - raise VenvCreationError( - f"Python executable failed to copy to {self.python_executable}" - ) - - def __enter__(self) -> None: - # We want backend calls to be able to use binaries installed as if this - # virtual environment was "activated". - self._save_env = { - name: os.environ.get(name, None) for name in ("PATH", "PYTHONPATH") - } - - new_path = [self._bin_path] - if old_path := self._save_env["PATH"]: - new_path.extend(old_path.split(os.pathsep)) - # However, we don't want a pre-existing PYTHONPATH to influence the - # backend calls. - os.environ.update({"PATH": os.pathsep.join(new_path), "PYTHONPATH": ""}) - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - for varname, old_value in self._save_env.items(): - if old_value is None: - os.environ.pop(varname, None) - else: - os.environ[varname] = old_value - - def install_requirements( - self, - requirements: Iterable[str], - prefix_as_string: str, - *, - kind: str, - for_req: InstallRequirement | None = None, - ) -> None: - if not requirements: - return - - # TODO: when better support for installing to arbitrary Python environments - # is added, replace this prefix hack with that. - prefix = Prefix(self._env_path, venv_executable=self.python_executable) - self._installer.install(requirements, prefix, kind=kind, for_req=for_req) diff --git a/venv/lib/python3.11/site-packages/pip/_internal/build_env/virtual.py b/venv/lib/python3.11/site-packages/pip/_internal/build_env/virtual.py deleted file mode 100755 index 2f06c6c..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/build_env/virtual.py +++ /dev/null @@ -1,139 +0,0 @@ -from __future__ import annotations - -import os -import site -import sys -import textwrap -from collections import OrderedDict -from collections.abc import Iterable -from types import TracebackType -from typing import TYPE_CHECKING - -from pip._internal.build_env.base import ( - BuildEnvironment, - BuildEnvironmentInstaller, - Prefix, -) -from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds - -if TYPE_CHECKING: - from pip._internal.req.req_install import InstallRequirement - - -def get_system_sitepackages() -> set[str]: - """Get system site packages, as a normalized set of strings.""" - system_sites = site.getsitepackages() - return {os.path.normcase(path) for path in system_sites} - - -class VirtualBuildEnvironment(BuildEnvironment): - """Legacy build environment implementation. - - Patches sys.path and uses sitecustomize.py to isolate Python processes. It has - known bugs and weird edge cases, but it exists as a fallback for platforms where - the venv module is unavailable or dysfunctional. - """ - - def __init__(self, installer: BuildEnvironmentInstaller) -> None: - self.python_executable = sys.executable - self.installer = installer - temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True) - - self._prefixes = OrderedDict( - (name, Prefix(os.path.join(temp_dir.path, name))) - for name in ("normal", "overlay") - ) - - self._bin_dirs: list[str] = [] - self.lib_dirs: list[str] = [] - for prefix in reversed(list(self._prefixes.values())): - self._bin_dirs.append(prefix.bin_dir) - self.lib_dirs.extend(prefix.lib_dirs) - - # Customize site to: - # - ensure .pth files are honored - # - prevent access to system site packages - system_sites = get_system_sitepackages() - - self._site_dir = os.path.join(temp_dir.path, "site") - if not os.path.exists(self._site_dir): - os.mkdir(self._site_dir) - with open( - os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8" - ) as fp: - fp.write(textwrap.dedent(""" - import os, site, sys - - # First, discover all system-sites related paths. - original_sys_path = sys.path[:] - # Clear sys.path so addsitedir() will add system site paths and paths - # added by contained .pth files to sys.path reliably. This is necessary - # since Python 3.15, which notably no longer re-executes .pth files for - # known paths. - sys.path = [] - known_paths = set() - for path in {system_sites!r}: - site.addsitedir(path, known_paths=known_paths) - system_paths = set(os.path.normcase(path) for path in sys.path) - - # Drop discovered system-sites related paths. - original_sys_path = [ - path for path in original_sys_path - if os.path.normcase(path) not in system_paths - ] - sys.path = original_sys_path - - # Second, add lib directories. - # ensuring .pth file are processed. - for path in {lib_dirs!r}: - assert not path in sys.path - site.addsitedir(path) - """).format(system_sites=system_sites, lib_dirs=self.lib_dirs)) - - def __enter__(self) -> None: - self._save_env = { - name: os.environ.get(name, None) - for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH") - } - - path = self._bin_dirs[:] - old_path = self._save_env["PATH"] - if old_path: - path.extend(old_path.split(os.pathsep)) - - pythonpath = [self._site_dir] - - os.environ.update( - { - "PATH": os.pathsep.join(path), - "PYTHONNOUSERSITE": "1", - "PYTHONPATH": os.pathsep.join(pythonpath), - } - ) - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - for varname, old_value in self._save_env.items(): - if old_value is None: - os.environ.pop(varname, None) - else: - os.environ[varname] = old_value - - def install_requirements( - self, - requirements: Iterable[str], - prefix_as_string: str, - *, - kind: str, - for_req: InstallRequirement | None = None, - ) -> None: - prefix = self._prefixes[prefix_as_string] - assert not prefix.setup - prefix.setup = True - if not requirements: - return - self.installer.install(requirements, prefix, kind=kind, for_req=for_req) diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cache.py b/venv/lib/python3.11/site-packages/pip/_internal/cache.py deleted file mode 100755 index 462231a..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/cache.py +++ /dev/null @@ -1,294 +0,0 @@ -"""Cache Management""" - -from __future__ import annotations - -import hashlib -import json -import logging -import os -from pathlib import Path -from typing import Any - -from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version -from pip._vendor.packaging.utils import canonicalize_name - -from pip._internal.exceptions import InvalidWheelFilename -from pip._internal.models.direct_url import DirectUrl -from pip._internal.models.link import Link -from pip._internal.models.wheel import Wheel -from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds -from pip._internal.utils.urls import path_to_url - -logger = logging.getLogger(__name__) - -ORIGIN_JSON_NAME = "origin.json" - - -def _hash_dict(d: dict[str, str]) -> str: - """Return a stable sha224 of a dictionary.""" - s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True) - return hashlib.sha224(s.encode("ascii")).hexdigest() - - -class Cache: - """An abstract class - provides cache directories for data from links - - :param cache_dir: The root of the cache. - """ - - def __init__(self, cache_dir: str) -> None: - super().__init__() - assert not cache_dir or os.path.isabs(cache_dir) - self.cache_dir = cache_dir or None - - def _get_cache_path_parts(self, link: Link) -> list[str]: - """Get parts of part that must be os.path.joined with cache_dir""" - - # We want to generate an url to use as our cache key, we don't want to - # just reuse the URL because it might have other items in the fragment - # and we don't care about those. - key_parts = {"url": link.url_without_fragment} - if link.hash_name is not None and link.hash is not None: - key_parts[link.hash_name] = link.hash - if link.subdirectory_fragment: - key_parts["subdirectory"] = link.subdirectory_fragment - - # Include interpreter name, major and minor version in cache key - # to cope with ill-behaved sdists that build a different wheel - # depending on the python version their setup.py is being run on, - # and don't encode the difference in compatibility tags. - # https://github.com/pypa/pip/issues/7296 - key_parts["interpreter_name"] = interpreter_name() - key_parts["interpreter_version"] = interpreter_version() - - # Encode our key url with sha224, we'll use this because it has similar - # security properties to sha256, but with a shorter total output (and - # thus less secure). However the differences don't make a lot of - # difference for our use case here. - hashed = _hash_dict(key_parts) - - # We want to nest the directories some to prevent having a ton of top - # level directories where we might run out of sub directories on some - # FS. - parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]] - - return parts - - def _get_candidates(self, link: Link, canonical_package_name: str) -> list[Any]: - can_not_cache = not self.cache_dir or not canonical_package_name or not link - if can_not_cache: - return [] - - path = self.get_path_for_link(link) - if os.path.isdir(path): - return [(candidate, path) for candidate in os.listdir(path)] - return [] - - def get_path_for_link(self, link: Link) -> str: - """Return a directory to store cached items in for link.""" - raise NotImplementedError() - - def get( - self, - link: Link, - package_name: str | None, - supported_tags: list[Tag], - ) -> Link: - """Returns a link to a cached item if it exists, otherwise returns the - passed link. - """ - raise NotImplementedError() - - -class SimpleWheelCache(Cache): - """A cache of wheels for future installs.""" - - def __init__(self, cache_dir: str) -> None: - super().__init__(cache_dir) - - def get_path_for_link(self, link: Link) -> str: - """Return a directory to store cached wheels for link - - Because there are M wheels for any one sdist, we provide a directory - to cache them in, and then consult that directory when looking up - cache hits. - - We only insert things into the cache if they have plausible version - numbers, so that we don't contaminate the cache with things that were - not unique. E.g. ./package might have dozens of installs done for it - and build a version of 0.0...and if we built and cached a wheel, we'd - end up using the same wheel even if the source has been edited. - - :param link: The link of the sdist for which this will cache wheels. - """ - parts = self._get_cache_path_parts(link) - assert self.cache_dir - # Store wheels within the root cache_dir - return os.path.join(self.cache_dir, "wheels", *parts) - - def get( - self, - link: Link, - package_name: str | None, - supported_tags: list[Tag], - ) -> Link: - candidates = [] - - if link.is_existing_dir(): - return link - if not package_name: - return link - - canonical_package_name = canonicalize_name(package_name) - supported_tags_set = set(supported_tags) - for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name): - try: - wheel = Wheel(wheel_name) - except InvalidWheelFilename: - continue - if wheel.name != canonical_package_name: - logger.debug( - "Ignoring cached wheel %s for %s as it " - "does not match the expected distribution name %s.", - wheel_name, - link, - package_name, - ) - continue - if not wheel.supported(supported_tags_set): - # Built for a different python/arch/etc - continue - candidates.append( - ( - wheel.support_index_min(supported_tags), - wheel_name, - wheel_dir, - ) - ) - - if not candidates: - return link - - _, wheel_name, wheel_dir = min(candidates) - return Link(path_to_url(os.path.join(wheel_dir, wheel_name))) - - -class EphemWheelCache(SimpleWheelCache): - """A SimpleWheelCache that creates it's own temporary cache directory""" - - def __init__(self) -> None: - self._temp_dir = TempDirectory( - kind=tempdir_kinds.EPHEM_WHEEL_CACHE, - globally_managed=True, - ) - - super().__init__(self._temp_dir.path) - - -class CacheEntry: - def __init__( - self, - link: Link, - persistent: bool, - ): - self.link = link - self.persistent = persistent - self.origin: DirectUrl | None = None - origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME - if origin_direct_url_path.exists(): - try: - self.origin = DirectUrl.from_json( - origin_direct_url_path.read_text(encoding="utf-8") - ) - except Exception as e: - logger.warning( - "Ignoring invalid cache entry origin file %s for %s (%s)", - origin_direct_url_path, - link.filename, - e, - ) - - -class WheelCache(Cache): - """Wraps EphemWheelCache and SimpleWheelCache into a single Cache - - This Cache allows for gracefully degradation, using the ephem wheel cache - when a certain link is not found in the simple wheel cache first. - """ - - def __init__(self, cache_dir: str) -> None: - super().__init__(cache_dir) - self._wheel_cache = SimpleWheelCache(cache_dir) - self._ephem_cache = EphemWheelCache() - - def get_path_for_link(self, link: Link) -> str: - return self._wheel_cache.get_path_for_link(link) - - def get_ephem_path_for_link(self, link: Link) -> str: - return self._ephem_cache.get_path_for_link(link) - - def get( - self, - link: Link, - package_name: str | None, - supported_tags: list[Tag], - ) -> Link: - cache_entry = self.get_cache_entry(link, package_name, supported_tags) - if cache_entry is None: - return link - return cache_entry.link - - def get_cache_entry( - self, - link: Link, - package_name: str | None, - supported_tags: list[Tag], - ) -> CacheEntry | None: - """Returns a CacheEntry with a link to a cached item if it exists or - None. The cache entry indicates if the item was found in the persistent - or ephemeral cache. - """ - retval = self._wheel_cache.get( - link=link, - package_name=package_name, - supported_tags=supported_tags, - ) - if retval is not link: - return CacheEntry(retval, persistent=True) - - retval = self._ephem_cache.get( - link=link, - package_name=package_name, - supported_tags=supported_tags, - ) - if retval is not link: - return CacheEntry(retval, persistent=False) - - return None - - @staticmethod - def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None: - origin_path = Path(cache_dir) / ORIGIN_JSON_NAME - if origin_path.exists(): - try: - origin = DirectUrl.from_json(origin_path.read_text(encoding="utf-8")) - except Exception as e: - logger.warning( - "Could not read origin file %s in cache entry (%s). " - "Will attempt to overwrite it.", - origin_path, - e, - ) - else: - # TODO: use DirectUrl.equivalent when - # https://github.com/pypa/pip/pull/10564 is merged. - if origin.url != download_info.url: - logger.warning( - "Origin URL %s in cache entry %s does not match download URL " - "%s. This is likely a pip bug or a cache corruption issue. " - "Will overwrite it with the new value.", - origin.url, - cache_dir, - download_info.url, - ) - origin_path.write_text(download_info.to_json(), encoding="utf-8") diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/__init__.py b/venv/lib/python3.11/site-packages/pip/_internal/cli/__init__.py deleted file mode 100755 index 5fcddf5..0000000 --- a/venv/lib/python3.11/site-packages/pip/_internal/cli/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -"""Subpackage containing all of pip's command line interface related code""" - -# This file intentionally does not import submodules diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index da082c780a57686a53f27ca51d3c93789f0fa78b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278 zcmXv}JxYT?5ZzT#5mI=A?IeX6LRzu35U~k1Hp^sp@?~}Z*l!bvtyd5PFCgB=O2pO+ z1k$B)K1m+K%)B=PZ|1$%I}wbpm$!#!uD>1GL2jFMxAH2ixEEHAMSt(_Pj zGAUMc(Zxog_bN?QcKNJjJp_zac^65!SgB0WkSgS{lI5|b+rIoc(%L4Y^@mt@cAGnx zr9cp{m;~3UNh83VVL@>L-c2Ac>nz35U^s-jm~B$X9T89~@!sL<}IDfklAik3q74;jgRi z;cF;)Hwkc~QB6-jYO1QMtE#K{TdUPX!Sz3@zq;|KW{Ua?ekornxj=vSFHm?uvD6sF z(yS^*!G%l-S>M=EWYQ{9=sU6e8Qxnt8=*RS=k2YqQF^(BYSr;?Sn8(bdtdCh{ ztYcPEHpFZ*_A&d6W6S~XO|1E@X3WX%V%_j`vAbCxJl(8%l=3&<8G0!(6%8}|bcknW z6SpFWV?uL$BAl3+jYarqBF;qP93P6sA}lkpz>JU2MrWC7>-c!@H<&L!Etx~{c!Ce% zG2BIXH(cN&C^Qj^Kv^4}4n^ZoP!Giy;Nc3RNQjRFXP`DX8$w(J`Bjn?@XmzdEEi;> zVP3M8I+bcA9g6UCC@yI(CgPE>EKM2e;Gw1{`nz`w6m`#gui;+fJ>R`15Hiiz^t(Zq zU*>6~VpXHm&aJu9RF!+nPgeaAjQ^y91GW9A(HiAw?r(gbRX0^WoddqMUmro$CzWbe z%c}laRUNb3z#A)#PvMc(RQoF_OHoE@sUb(nipw^qNcq%%eH_G%mNsFv#}P)$)OHLFT#mKx4b*G(yHQkzuGQ%IB4 zrZhAar&r8LO-A+0e@JRr{Y^4k$ius<_-<6FWVK4%G_~Z-nX5gkCDx$qX`vEoz;B$V zQo5uLy~UbXGhSpVScobrsjuVB0C;UxY}Jyo-*RKRA>BBsVl8(KNkgti9@P=7^;4UY zmNS$ROUjruqWwuDNXMBn@q4OclP2Xznp$!FKS)LklCjH@PnnZube!*~(y-)Z9UsB0 zd{S9QgiecsPRmcHliyqYR_sOTHW4at(j5T%xEOjpg!9 zvffZ@Ql0iq(ya5Y0mk^stx&Ekh&xbOKQDJc_fzVXkAS03Dpn+AOWIJga<-B-N{#uwzDd>p;iKHV`DbEkJf~Y6yfjRg8h_&NNs{YoR zA@i+TIS@azO@BQ*=xU3?XDF;pz24UGsH&XjZaQ&GGS0ON(n|Spvxc>p>jnU`mUo?#@AoFNZ{_x^AAWct-**=7%uwd7%yGF4a63npIXe%S zDjc;|Im$u(_N(5$e738?b6bh$k7@4BQa_gy-SB z3*Yat*-*~8?)+o(ADSOd35U;#hd~;{CDut7c-_u=WilH8VM$$eSY26)Or9PT5O%82 zC{LfPc?dhfpP+k_cvv$4n5~9B`OaOcIsgU53d4)L4|@a# z3h&Y*6b*!fPcX>lVxD@9dO$;fV`M2X74$`!@RFU-V8e|t2?`_e#5gz=iAQeFqEmO; zYRqe`{VaD#;K5x09)C@JjX5FG&9RxI+2fg0@>?z3E_BR+8*_l^C<)z&sjr$kSo@}u z4uP#R%bqxhO*r@?V)5wcPndvtOgkP9WZMVjJGUo8uUadwgxn`IqmX%Jg`9%1l@-$T zbi1~sQrfl88k02ew5x0ju>O{8H?aliD5mTu*zJG9)N^p|C6n98!2u2XLB$66@tz^0oXCt@IB9uT#k83qp_6U+Y z(1BavBu(UYlqZW@Y5))2Tk+7nGZ8+-h9EM)OG?tla7s&R2A7VYPbrZF=_SAxotPs5 zmZY6U_@i#Dc|q*OA@LP~tQ0@ZA)H5%baIADvezg=5K>~ugx2O$hYy!_(Bp%=zq{u-prg8ag4L{f+13zB&nBEc9CJQJFg ztfg;Gp~T!QC+Q$+iNskn2wz56FC^LG>>E8tzHyj0_mvI+!HL3)e z%LqBiUage_Dh(bXd4bTm7)!LhDl%D|YM3v{Sdk;zjj{W77=TIPh@FBktrF5o_L6if z{A!7mC7n!@WQ1oh7Mh5}BuiNcB-YbF11H%gV%sc5hg_1#6FJ z?O6-0O{`6b*29bEwk-B{Rja1#py=2ySp1^Jzj(H&Qfs{hmoMwhIp1p%T^(tCTK{;< z?8SI%K*8m~EopsG4fQ}Z&}U-=>mJd%2Qa%D-c1Rvy`pRH;z+^fSR4kHI=U7w6&wvk zO09(`3qV>^FxxW&d2=h=h1T};rGmwoK3mjMmNtkw4UK}n{gHWBc5=hqnKyR=xhv;0 zSC&RrM$#jXI=eSJk8gAyU+09*0kLx+&kO+4J*Lm?@VH8w01nZnyrBg!S@skur?DAm zunyCC%emV7k;|WV`2|+$F(#RP-KAn;yAaM0cm?K3b$SMwk)+ zAOX8;<@T>nh`SGO*bnFJhYOCzYDioy6;2HN+4iOTzuJToKO@2Mw>WP89s?*jT^ar3 zqKWdJr6HnRn_R#0(EGXbPfhFB#op6UBY4h;o-=7jw_*$qS*k8Z(+MZexA zc!osJQ2K0vgdJES{{3(Tld2I+GJUu*WQ_l@ZbkL=z|Xk`J5a!>ZP z+|c{4=g=CRL+@W-V>eokVs-hh{P(f_+%D593+fUtkVwGRHTV;{tO+WKIC}*8K!zECqMlru)E#`@q^W zg1b+2_hAj%kM-xE;OT-rS>Dt2_%SHB<5}?Ixp}c`0G@(EPN`q3MX&bR=ynm|dIZmJM@DHY}LiMRR+RG8kW>3yq+%D(e|q zh8cCi-LQJ%*SE#CV;k;cdH1n`r!Cj_!KwAr|9(m6I4yWiXGR_uwRpr|O;p=6>+=ui zK938nuZpd&!m_rvVsXAgZ?(4ncgOMdTc6v7j>}@lWuf(o*m@;n{>orYhu@xFo~}4+ zDC7nJ2#x1OfVK;w?Sf!#>2lJbSUKfKf5 ztwFv4VosW+vDF5f-I^qC%HxV0X{!fpU1S8uFmMirlRwwjQtG6-dPKzI;JkF*sL)YL zT+%DP+9Q@^U9KaCJ@dAUtxHwIH)m3s9ckZreBDt7tE=u-lbRA`r-28YwILTeT$?;& z^^kC^Y5k#8egwEaDPg4QcFf3Ji!lu6nD~E`T8XcGOimaLp_gE~h9f*2F-901IrXlhIgYeEcAsFtSl37jUofaR#zwSQ-2#6L#tS5Nm~I7&*z)&v3A#U_u3cH*`(1p z#Q|G^4(KLn@Ek~LkiWcbL->S5vCrv;iaXs;3twx}UFGds7GpRGK;Er^9Xo(?I|p2a zW5+W?`KCj8&mnMJrOIk^wIuHs3?$em0XMn?=+I>VuovKwylv3qxF2R5U4?qTR*njZ zoxvuCgoYBG;PAS_GA!k6MsXVk_u!wSK~W*<^H5+0-}=Xe#f7XcJC}Rwy#>+d-}D{b z@Eu(r6?`W}-^s;=g590w0f3#>LIemPtuB~tD<|H)EjIRSn0xZ(o`S`*<@97m@B3DL z4_e=8&8Y=vr|5*JL2HCD0MbJRaC4Dt=zdhRGn@8(8}@xUPOx{2_U^SI(cZhhXT#o? zxAzqqcdh;${FJln!*EqJh5l#%+`ZX9ve7^C2QR4cGntgQ0* z3w#1B3q{Wgwp_)w)_#Af?&x^gkT$>(mFliRK?jx1r2zI|43<{LIw7P z+peTKsa0~4(miGTj$AyY@6O*+)qhKwaY*UGKdWz&*+QL9!Cdnrg(@>ioe~q$CiSJ9 z($Z7#n5v_zrEPfHpE7!9{`BCjL8Gfj*d-eN6YGXw8^RNNVG?{x-If;oRg{Bj*_~nE z1wWY~e(WHFBOnIy1`LW!&Ba29!JRnb9Prr>*xg8&PoQXoW60S?G(N@P;|=^3Ib}IM zKENcvk)m5s4%`eR_GP3sLkYU44)0YuQ5mc3zVPlJd#s5_*)vC2g|n>uB#7iHcJ^Zm zH&*rEC8zFJI>I3ay9pEmo^ep1kP1Ex3qXB6XBQQ24zKJ!Y<(7?P?L>30Y5dVssivn{K3G)b4V;v~*?q7(2*NH#wY580s_;t4bp4#BURNFG|wg38%<1D<=F z+u-mTsT`LO2fJ^FOwIf*X*YTS!%8~Fw8|9$RZ{>gJ%SDw`lH$y_421r*!Pj zm0O$kwhen*&LG(RqTRoEzNjfnzbZqFwm%ya+})zPn@Ae(%5~t7ow~&f;Eiptt2b(U z2}sjhHpj};+p*ZJ^mJ}`IzN2ngKNKi^WWZF_dmQM?0rt$ z`<&o;Ui3VlHsb8c?rdbk+>tkT{9g5`{xjR}Y><=LKOpXh%uYwawL5)D{=@mGYj0m) zzMkz9tZkyT4frzlZn-?GT@Mbvb1=KG)-JeuL|0GVQo0`(-DMhyK0po}TU=xY;5W#j zRt#5=cL9QN6N<32lUkH%VmQd{t@-hx zoMo;{C4;7sUn7#dGsy&#G$9EXWhL8-DPl0dVfGWl;7o#@i$zYMe}z{ZGjM+a0J%Au zE>OdHYWNY=o>$(FDElJ$D^SKo@>ifti{!6Bb>@|Kf!du{-UX^5ue={ogL&m$pq|g~ dbQg6zO*@LzHW*iXalH~8YNkO?p8|*w{trs}^Xvcs diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc deleted file mode 100755 index 458f66782e7954b985fcbd1709f56ac68fe484c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13042 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≫GT10t>X!dGfushxY~wdbxLS@7*B`gRn2JE&%5 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 B@lgN( diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-311.pyc deleted file mode 100755 index 5aff4211ec5a64a273f1e547323223492c587841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9962 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 diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc deleted file mode 100755 index bb3b932c7b182a7e6f5830c9aff7d49baaccf914..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21696 zcmb_^d2k!onP)d{5FkMkBzTjcc!;1#(7LQ!wnSOCsKi$i${GY>Llh(spu0gG2$?7u zXACNwG3}98Oh&GuQ*uHl@eXIov#YI|nsp|rY-*}@3t)9ZRPU;awOgqj*Z#3o$*J;a zw|4jUy>0;AAY?mR(`qYn0TjymzQ#409S zqb^p5HRhhE9Ia$wTdZorGwPYB9<65Y_E^nC?Px6vJ7V66y3slocE;)_e4{=Vu81{E zG>$e-G>tZ~cUP==qGhy&h262%iMG+UiT2TUo-=U~^W~2G$3^@t<;+NUKE+J^3;vxq4YHFLKpIdP~wa z3+5NNKz*w5a9E1?6O+kkBJQ6Ii&8}NOOfQ%vZw66)}D2;G7YPp8l$G~!ty^a?F_x`fR_8=h{Vi9*IpJO^6fWWHKVAb{z6!5R=JhL>!7?F#T5} z;)MjJ_FXr=6h-Qk-Qc$sui;+lNv5ega$5YM=iJ0KO5Sxl9wi}UHEO9MhN!1oI zOP3O2GAxcushUDuED;}PQJzB7xR{ullv34&h>1utd^Id$bn_J`j(oX*Ddl}d>KpvV z)|qp!Tsyx7VDNl@K#SaFh*T`pl4!#uD7Gut=tZ&NlYuCTWh4=gj1^XgHfbJ?;~&l8 zW10>miz*&}2f266$_TT~Ml{aUl{6y$ zCoN5O-87x#zC+_t=*?uKK7G-VYJSI`Vr=@UlUk@ObJO`E?+ZN`znj5s&Wh)}V} zxQk-lYN&J^v4&l#1L_v#5BtXw6BFS=L+<(Ko-xlg`P5>8#z^1MjgK*}`WA4%2ui|JaW=l7>92T@c(?-W;v z)fz%0Ad*W)K=VcmtaK}ZG4k%F>WpQ1XQSZN>& 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 F{{ck+A*=uZ diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc deleted file mode 100755 index 39a1def58fc5862418f30a6c8cefa47c6bc2f2d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7050 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 KwzeR)ru-9MYlqeV diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc deleted file mode 100755 index 6c4769a64365363cff70f33f4aa8daee3c214e75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19114 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 diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc deleted file mode 100755 index fd0f58a1e383c7f8f74675b95ee7960d96db3d1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12854 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 diff --git a/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc b/venv/lib/python3.11/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc deleted file mode 100755 index 08e21d7a892ddca18d9ad3cdd7066a657cb80a60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402 zcmXw#&uYRz5XLvg7;6bcv?#Qv-aOPryq1ERlv?ek-hwx@J?0|eNBa5hIW zc82gaPqKEF2)00Sc8-V!sO2{-uwk)HhJk0uGE^9zDNs#Zi-y(dsD`l?R9)BfwPc|l z((VxcljT8IH?3A*MFWg96JKf;Qr6X5T^)2a%fM}`+gGsC)%SiGY51mPcCJ)o@0HrR z)>9ESOhvQIPq3wj!R{W8!m$U(&eRRzbvO*0(1{{A_a<`~_zy5zB%^TBtT!4k_7m?c za@;3p=*2MdBZ&P;;!P(`0NuccapEMi7`q|y;(D~$< None: - """Entry Point for completion of main and subcommand options.""" - # Don't complete if user hasn't sourced bash_completion file. - if "PIP_AUTO_COMPLETE" not in os.environ: - return - # Don't complete if autocompletion environment variables - # are not present - if not os.environ.get("COMP_WORDS") or not os.environ.get("COMP_CWORD"): - return - cwords = os.environ["COMP_WORDS"].split()[1:] - cword = int(os.environ["COMP_CWORD"]) - try: - current = cwords[cword - 1] - except IndexError: - current = "" - - parser = create_main_parser() - subcommands = list(commands_dict) - options = [] - - # subcommand - subcommand_name: str | None = None - for word in cwords: - if word in subcommands: - subcommand_name = word - break - # subcommand options - if subcommand_name is not None: - # special case: 'help' subcommand has no options - if subcommand_name == "help": - sys.exit(1) - # special case: list locally installed dists for show and uninstall - should_list_installed = not current.startswith("-") and subcommand_name in [ - "show", - "uninstall", - ] - if should_list_installed: - # NOTE: this import is deferred until absolutely necessary as it's slow, - # and it's important that autocompletion is fast. - from pip._internal.metadata import get_default_environment - - env = get_default_environment() - lc = current.lower() - installed = [ - dist.canonical_name - for dist in env.iter_installed_distributions(local_only=True) - if dist.canonical_name.startswith(lc) - and dist.canonical_name not in cwords[1:] - ] - # if there are no dists installed, fall back to option completion - if installed: - for dist in installed: - print(dist) - sys.exit(1) - - should_list_installables = ( - not current.startswith("-") and subcommand_name == "install" - ) - if should_list_installables: - for path in auto_complete_paths(current, "path"): - print(path) - sys.exit(1) - - subcommand = create_command(subcommand_name) - - for opt in subcommand.parser.option_list_all: - if opt.help != optparse.SUPPRESS_HELP: - options += [ - (opt_str, opt.nargs) for opt_str in opt._long_opts + opt._short_opts - ] - - # filter out previously specified options from available options - prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]] - options = [(x, v) for (x, v) in options if x not in prev_opts] - # filter options by current input - options = [(k, v) for k, v in options if k.startswith(current)] - # get completion type given cwords and available subcommand options - completion_type = get_path_completion_type( - cwords, - cword, - subcommand.parser.option_list_all, - ) - # get completion files and directories if ``completion_type`` is - # ````, ``

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 G`2Pm|8eb6r diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/functools.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/functools.cpython-311.pyc deleted file mode 100755 index ec54142cc1eefe91de7f73e2def830ec491a42a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17673 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 diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/itertools.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/itertools.cpython-311.pyc deleted file mode 100755 index 893b72ad45e5a783c9ab23eeb6abcad500d789ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27298 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 NTDqvlX97lq|1SaJ=FtEE diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/lowlevel.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/lowlevel.cpython-311.pyc deleted file mode 100755 index 853671a8d7ca4e5f60038c1584f6ec3c77dde262..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9916 zcmc&)S!^6vc74@d-RzBvxQm-glw^yNOpZ*C7up(0mSkHt&9Nm~9=D>jid{vsrS2~J zRW&IxREC*R0wNGFGN6H&%oq@|I5wP*`N(G`fPeGVG#YTD009C90cQSMkq2;y0Li)U z^-{&f%hyyt-g@=+diUOQ@4Ll+X>N`&T;;oee{HRovER`{?F!3`^7!8r#_q9qn86Gs z%W_ImQJ4`(2Jjrr29rVD)vTHeB||7@MkpK3H6@!wKAer@qRD73mW<`%$#^c2OyruA z&AFCjORhE9D%vz<+j4u7dytP9(QJFJBiW%aGs?qwj%7P@UCAzm1(?}v#6QMLKEt29 zlHH;-v8A-f(2UkwYO)viHr)5(z6bX{vjy!#M!V7Rubm$UFcSXc6=1J2qw5wky8Y!J zqx!R2Bj$ff_8a?+9*jGHQTJ@A8#H>&A!F}L=qtwV!`S_1@Y=rGU>^rDGXCV1)I_TR zv>G(yX7}D&1>4eYzi2mvcKg1u-LMh7$VP_$K;w)kZd}jjEk}1UR^A?Ia$C+Vn0aT? zvgW6)>t@~!Unt}+>D-OuzMyki*q7GxX)~L$=Q3v2FpX4t&P-pQw=#Lhjd}7tjeIII zo07eu;D# zXESMfRh=*WfrN!>-Z!0;ZZGB2DVovDQ}e`WDtK8wyUMhyoOQ$8bP7E0s#8|pOxM|f z3<=B68B-o#Lgo#oKqZ{ID6%cWaoX}HeN zR%^2s*Q(noSf}ZEL({WaYf*FNOwGo|8-=XNHOJEI#f+1lqnr*-&rzXnUmuN$;m&wd_p({i?V?G^}}3o6~J=#x(OaAu^4sJWS7JY|XGtTZ6282Z_>*%%fa?%p#4kVs=G9ec1Eb=MG}O=62ebR^MW}tQCD4$`qq*C z`>1OZF>?!VMH!Ljw(!=gYtMfXdwwG}QHo6z)m@X|?er@n0XIC$tz}p#m7DY2r+q<8 zf=hXP81x=9SyC}rG5}9SfmaeRRU=3i*iexRiCh>U+r(8AF6)wsdCi*FKPZ@*HFM2O zL%`>BN1L;G6!dJhrYV&&tTc*SQz?&y zPo=i9g^^()BO&w{LaewDBqic}bp1PeV;R1YC-sE5jGZ&9R;T1ILyjppM66@VAY z<5^_B$t>PvE9|?N#+!;0!cf&~g{>%lzYJVdmj6#|@&#e9!7Jfq__zq$3H;LvwrLRm z(oh~PZ5gJP$qU%5`X?T)Y7n)Y7`ARj=eViYaC3s|85^iMWz`+1bDUdzf`B*=BV3rD zx447pgsU;ft-MvRz2gISc_E)C-It3Hlaa907UPHscQcw*=@Pw0g3@e~2QQclJ9-Ft zH_G)zDM&UsEt)2ASF|H?5r6g%KwtyAS=SRAolllJpIm*j+&1`S+tDxDj&8I)Rcd=` z_56eQ-u0(G*}D-RFU7};>bPM4^6_n6)@3Qg$6zPY&SmLLUWWU2<(NkFiW^Pgty6F< zZJ*p!{cq**F)XH`zwoDn*GQ(s<#(ErA?YZ&@zj)cNzWF{i>5O*66OQ}e1ymm5LY$x zg`BJE1;=s|Q$J2!Iz9Q$xzxpT(_2;JICUXHvTOH)G*qM9F>vRZyDxnB;@uZlC+R2U zpIYzy9;2vfyoW@gq-t~;O*kinj4mUFd)VkU+Hr3(Iv~eAJd94u|07s>x+=v2gtmw; zH*JTUHeH(#&@pjUZuC`>?Tlk<^W0p>ki5awE0|S)lIj78oLSN)a;7s^>o#he&ec&e z6LlSdy8!RPf}3#z4x*liKP7xi+Qb~-i4>exyEPj!#opt`DP!gxSkMgmi> zK-A5UMQHjQ~88&p4^nawlE@FCvarqqS0pI!JLV zclNBQx1;3~FXI+3?;XOeWeqeW{p=8928iPjSmijTu8^M}n%#0gD6bRZ%dFXjnXHA-1pF9M0yOoRBaTIkDiE6@;psw4D=)QkcX z(C;wo?gJ{v%Dww=YhJ_81J3PUzh@d=&lZ4IF^IsiRb;-&KfYE+wVO(mIn=LuttgF{ z;6-+TId!#Q>>%Tao@Uq$ox*SP?U&n}s>Sw5$c2FuJLfIEhyFG(V3qw>&%qCWdiSTLp7FIrC7?zJ z9&`+>|5>TyNHKBb>j$kp6&8pNG)VdQcrh`)_S!F(?hkDAjFvn4*M3aDN(jxq{`zY> zfl+^%7-s*_dm{Mn%84MSz1a+rS8z66x7;YB?GzhNyLGQ&45V!gNSP4gK)q_XA4ITl zIaZYh*y)syF`U$a*LFN2+fEfz|EpUzd|? z9y*J6`c_5qy)$8xc<28_<{pds%;pN)B1WFwf*2iF;2C*E=o&_nS3%+GiXue`hPW=8 zyS9#cTgiU!vAkLnLnmGv89o*~t_IHk3Lh6f3i=KC&ysa3jZFqVAuy`AEl!I*<1p^~Qk_317Pl%8_38WT4>c%~b z;sRfn8xmC2u(AtEi0MhPo^ia8@r_^!izESEpT1*_30H8(>Ap%h)<<{;K(Jwta|=vUs;b$9TeXG>4KP~1bQ+|z&eX0h#{OqC#OpFnA)3Bv#-{+M8`edWaK z>(jqZ789?_^e7l;jeW&H2yS9_Csy^dL@WD6-|1NJGa{cy6;SD-okFcow@5#QZY?9@ zcSr%fbzK4I0(S3vbPLU^*NP9i8+zmqaQL5Y260}&8AZT3eb`Z!|D!G}7wac6oSSx( zei3H$D#|uj!=o5NCZt5?%|$69^|>Z$0$&TaeA7XdX7ry)8$vk}k`hL^%t>AvVpem_ z=|trwycWd`i5SloFFgo>tph3YzePX$1PG+9jr9(cdPdd~58C?I&)z@w*fQ$yTo<7|K>8L;Lz@TiOP8Xj_*mCsLb*v1_E2;ws=^ATYk}5Uj8hEWZyf zLQAcUa1nwE1O9f@@E5D7kL*QXDP;yE&T|G9j8~j^q&^k>>FE z5HSYCx)DZ&Odynyo}&m@H6{R_Ar#P%F$vIu)lv>+WKW8oFOoq$8~v)mxl0s3XkaGI zC<~?aqwZ^&|2tr>l%J`J6893FmgJ?+t$5tAP6a zEfQb+DUZn$gL6kt1ak8FRe+obh;49cx%nme@*15qPHZYa8d0R>I)kE8A7W|G{c7ae#WOUv6^>VRww3;HL0xal=FOC-!UKM8y-x2>3O3{LxP2sM}@41X1u+oPgX2 z9F}>LJ4+IrJE%f{^DN~^j`(#VTjB|XMFPM78W|h^1cF^^{QMDxgRAEsK6|?K?9}RH zQJs=$L!E*wyrI0SRDxl1DuHka$AlVr6hzsrpUBcSnD9Z6bJE>r*S{W{@`-}ec zP>rv?x_0KTCT~ryDrN6OC7e)>R+yg*MV03(%ujj~%8S&_ONLmWsjS3S_ue_U{!URj zu%R3%DF-Tnh_biBwv$Ix_7xGxdEg+L(!J?c7d8?-x|@|}D$GwbXu;b`@#I?@Cohyv zURaG5*#((4*o8`1Q6TTz$(@6DM;=l6SB=U@uY%a$c5>&*_5F8`JffPf8r9FH6a^Zy VGhKW4&fB+>k3{WPyR;FS_5ZV>Wgh?l diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/pytest_plugin.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/pytest_plugin.cpython-311.pyc deleted file mode 100755 index c1d98b2d4928e0f87e23fdc286dbdd673f1d2eb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20313 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 V4UhGO3Vc@LdZF3;Srd=&{{cLo#S;Jk diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/to_interpreter.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/to_interpreter.cpython-311.pyc deleted file mode 100755 index c3ead82fa7da383625887a0414666e5c3651545e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11433 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 Y+qdC7%=K=NX93E2IT-je0NYjn4gHdJI{*Lx diff --git a/venv/lib/python3.11/site-packages/anyio/__pycache__/to_process.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/__pycache__/to_process.cpython-311.pyc deleted file mode 100755 index d946daa23c9c4d2ac2edcd6c9b9824ac6556d76a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13942 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 JL=iJk3;7 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%0DjAlxnql9I3#!i4UsGk_XOUTIl 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 diff --git a/venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/_trio.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_backends/__pycache__/_trio.cpython-311.pyc deleted file mode 100755 index 612f26d51b04e1fc41a9a71c6b9991abcf92311a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85270 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 GOzh~-1~<#W%^C0Jf|$MLnD=CZJ#w%oh1RUE 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 diff --git a/venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py b/venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py deleted file mode 100755 index 7eba257..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_backends/_asyncio.py +++ /dev/null @@ -1,3201 +0,0 @@ -from __future__ import annotations - -import array -import asyncio -import concurrent.futures -import math -import os -import socket -import sys -import threading -import weakref -from asyncio import ( - AbstractEventLoop, - CancelledError, - all_tasks, - create_task, - current_task, - get_running_loop, - sleep, -) -from asyncio.base_events import _run_until_complete_cb # type: ignore[attr-defined] -from collections import OrderedDict, deque -from collections.abc import ( - AsyncGenerator, - AsyncIterator, - Awaitable, - Callable, - Collection, - Coroutine, - Iterable, - Sequence, -) -from concurrent.futures import Future -from contextlib import AbstractContextManager, suppress -from contextvars import Context, copy_context -from dataclasses import dataclass, field -from functools import partial, wraps -from inspect import ( - CORO_RUNNING, - CORO_SUSPENDED, - getcoroutinestate, -) -from io import IOBase -from os import PathLike -from queue import Queue -from signal import Signals -from socket import AddressFamily, SocketKind -from threading import Thread -from types import CodeType, TracebackType -from typing import ( - IO, - TYPE_CHECKING, - Any, - Literal, - ParamSpec, - TypeVar, - cast, -) -from weakref import WeakKeyDictionary - -from .. import ( - CapacityLimiterStatistics, - EventStatistics, - LockStatistics, - TaskInfo, - abc, -) -from .._core._eventloop import ( - claim_worker_thread, - set_current_async_library, - threadlocals, -) -from .._core._exceptions import ( - BrokenResourceError, - BusyResourceError, - ClosedResourceError, - EndOfStream, - RunFinishedError, - WouldBlock, -) -from .._core._sockets import convert_ipv6_sockaddr -from .._core._streams import create_memory_object_stream -from .._core._synchronization import ( - CapacityLimiter as BaseCapacityLimiter, -) -from .._core._synchronization import Event as BaseEvent -from .._core._synchronization import Lock as BaseLock -from .._core._synchronization import ( - ResourceGuard, - SemaphoreStatistics, -) -from .._core._synchronization import Semaphore as BaseSemaphore -from .._core._tasks import CancelScope as BaseCancelScope -from .._core._tasks import TaskHandle -from ..abc import ( - AsyncBackend, - IPSockAddrType, - SocketListener, - UDPPacketType, - UNIXDatagramPacketType, -) -from ..abc._tasks import call_for_coroutine, get_callable_name, get_coro_name -from ..lowlevel import RunVar, _run_vars - -if TYPE_CHECKING: - from _typeshed import FileDescriptorLike - - from ..abc._eventloop import StrOrBytesPath - from ..streams.memory import MemoryObjectReceiveStream, MemoryObjectSendStream -else: - FileDescriptorLike = object - -if sys.version_info >= (3, 11): - from asyncio import Runner - from typing import Self, TypeVarTuple, Unpack -else: - import contextvars - import enum - import signal - from asyncio import coroutines, events, exceptions, tasks - - from exceptiongroup import BaseExceptionGroup - from typing_extensions import Self, TypeVarTuple, Unpack - - class _State(enum.Enum): - CREATED = "created" - INITIALIZED = "initialized" - CLOSED = "closed" - - class Runner: - # Copied from CPython 3.11 - def __init__( - self, - *, - debug: bool | None = None, - loop_factory: Callable[[], AbstractEventLoop] | None = None, - ): - self._state = _State.CREATED - self._debug = debug - self._loop_factory = loop_factory - self._loop: AbstractEventLoop | None = None - self._context = None - self._interrupt_count = 0 - self._set_event_loop = False - - def __enter__(self) -> Self: - self._lazy_init() - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self.close() - - def close(self) -> None: - """Shutdown and close event loop.""" - loop = self._loop - if self._state is not _State.INITIALIZED or loop is None: - return - try: - _cancel_all_tasks(loop) - loop.run_until_complete(loop.shutdown_asyncgens()) - if hasattr(loop, "shutdown_default_executor"): - loop.run_until_complete(loop.shutdown_default_executor()) - else: - loop.run_until_complete(_shutdown_default_executor(loop)) - finally: - if self._set_event_loop: - events.set_event_loop(None) - loop.close() - self._loop = None - self._state = _State.CLOSED - - def get_loop(self) -> AbstractEventLoop: - """Return embedded event loop.""" - self._lazy_init() - return self._loop - - def run(self, coro: Coroutine[T_Retval], *, context=None) -> T_Retval: - """Run a coroutine inside the embedded event loop.""" - if not coroutines.iscoroutine(coro): - raise ValueError(f"a coroutine was expected, got {coro!r}") - - if events._get_running_loop() is not None: - # fail fast with short traceback - raise RuntimeError( - "Runner.run() cannot be called from a running event loop" - ) - - self._lazy_init() - - if context is None: - context = self._context - task = context.run(self._loop.create_task, coro) - - if ( - threading.current_thread() is threading.main_thread() - and signal.getsignal(signal.SIGINT) is signal.default_int_handler - ): - sigint_handler = partial(self._on_sigint, main_task=task) - try: - signal.signal(signal.SIGINT, sigint_handler) - except ValueError: - # `signal.signal` may throw if `threading.main_thread` does - # not support signals (e.g. embedded interpreter with signals - # not registered - see gh-91880) - sigint_handler = None - else: - sigint_handler = None - - self._interrupt_count = 0 - try: - return self._loop.run_until_complete(task) - except exceptions.CancelledError: - if self._interrupt_count > 0: - uncancel = getattr(task, "uncancel", None) - if uncancel is not None and uncancel() == 0: - raise KeyboardInterrupt # noqa: B904 - raise # CancelledError - finally: - if ( - sigint_handler is not None - and signal.getsignal(signal.SIGINT) is sigint_handler - ): - signal.signal(signal.SIGINT, signal.default_int_handler) - - def _lazy_init(self) -> None: - if self._state is _State.CLOSED: - raise RuntimeError("Runner is closed") - if self._state is _State.INITIALIZED: - return - if self._loop_factory is None: - self._loop = events.new_event_loop() - if not self._set_event_loop: - # Call set_event_loop only once to avoid calling - # attach_loop multiple times on child watchers - events.set_event_loop(self._loop) - self._set_event_loop = True - else: - self._loop = self._loop_factory() - if self._debug is not None: - self._loop.set_debug(self._debug) - self._context = contextvars.copy_context() - self._state = _State.INITIALIZED - - def _on_sigint(self, signum, frame, main_task: asyncio.Task) -> None: - self._interrupt_count += 1 - if self._interrupt_count == 1 and not main_task.done(): - main_task.cancel() - # wakeup loop if it is blocked by select() with long timeout - self._loop.call_soon_threadsafe(lambda: None) - return - raise KeyboardInterrupt() - - def _cancel_all_tasks(loop: AbstractEventLoop) -> None: - to_cancel = tasks.all_tasks(loop) - if not to_cancel: - return - - for task in to_cancel: - task.cancel() - - loop.run_until_complete(tasks.gather(*to_cancel, return_exceptions=True)) - - for task in to_cancel: - if task.cancelled(): - continue - if task.exception() is not None: - loop.call_exception_handler( - { - "message": "unhandled exception during asyncio.run() shutdown", - "exception": task.exception(), - "task": task, - } - ) - - async def _shutdown_default_executor(loop: AbstractEventLoop) -> None: - """Schedule the shutdown of the default executor.""" - - def _do_shutdown(future: asyncio.futures.Future) -> None: - try: - loop._default_executor.shutdown(wait=True) # type: ignore[attr-defined] - loop.call_soon_threadsafe(future.set_result, None) - except Exception as ex: - loop.call_soon_threadsafe(future.set_exception, ex) - - loop._executor_shutdown_called = True - if loop._default_executor is None: - return - future = loop.create_future() - thread = threading.Thread(target=_do_shutdown, args=(future,)) - thread.start() - try: - await future - finally: - thread.join() - - -T_Retval = TypeVar("T_Retval") -T_co = TypeVar("T_co", covariant=True) -T_contra = TypeVar("T_contra", contravariant=True) -PosArgsT = TypeVarTuple("PosArgsT") -P = ParamSpec("P") - -_root_task: RunVar[asyncio.Task[Any] | None] = RunVar("_root_task") - - -def find_root_task() -> asyncio.Task: - root_task = _root_task.get(None) - if root_task is not None and not root_task.done(): - return root_task - - # Look for a task that has been started via run_until_complete() - for task in all_tasks(): - if task._callbacks and not task.done(): - for cb, context in task._callbacks: - if ( - cb is _run_until_complete_cb - or getattr(cb, "__module__", None) == "uvloop.loop" - ): - _root_task.set(task) - - def _unset(t: asyncio.Task[Any]) -> None: - if vars := _run_vars.get(t.get_loop()): - vars.pop(_root_task, None) - - # Register a callback to break the task -> loop -> _run_var[loop][_root_task] -> task cycle - # Also run it in its own context to not create another reference. - # We can't use RunVar.reset() here since these are called synchronously - # and thus lowlevel.current_token() (which RunVar.reset() depends on) fails. - task.add_done_callback(_unset, context=context) - return task - - # Look up the topmost task in the AnyIO task tree, if possible - task = cast(asyncio.Task, current_task()) - state = _task_states.get(task) - if state: - cancel_scope = state.cancel_scope - while cancel_scope and cancel_scope._parent_scope is not None: - cancel_scope = cancel_scope._parent_scope - - if cancel_scope is not None: - return cast(asyncio.Task, cancel_scope._host_task) - - return task - - -def _task_started(task: asyncio.Task) -> bool: - """Return ``True`` if the task has been started and has not finished.""" - # The task coro should never be None here, as we never add finished tasks to the - # task list - coro = task.get_coro() - assert coro is not None - return getcoroutinestate(coro) in (CORO_RUNNING, CORO_SUSPENDED) - - -# -# Timeouts and cancellation -# - - -def is_anyio_cancellation(exc: CancelledError) -> bool: - # Sometimes third party frameworks catch a CancelledError and raise a new one, so as - # a workaround we have to look at the previous ones in __context__ too for a - # matching cancel message - while True: - if ( - exc.args - and isinstance(exc.args[0], str) - and exc.args[0].startswith("Cancelled via cancel scope ") - ): - return True - - if isinstance(exc.__context__, CancelledError): - exc = exc.__context__ - continue - - return False - - -class CancelScope(BaseCancelScope): - __slots__ = ( - "_active", - "_cancel_called", - "_cancel_handle", - "_cancel_reason", - "_cancelled_caught", - "_child_scopes", - "_deadline", - "_host_task", - "_parent_scope", - "_pending_uncancellations", - "_shield", - "_tasks", - "_timeout_handle", - ) - - def __new__(cls, *, deadline: float = math.inf, shield: bool = False) -> Self: - return object.__new__(cls) - - def __init__(self, deadline: float = math.inf, shield: bool = False): - self._deadline = deadline - self._shield = shield - self._parent_scope: CancelScope | None = None - self._child_scopes: set[CancelScope] = set() - self._cancel_called = False - self._cancel_reason: str | None = None - self._cancelled_caught = False - self._active = False - self._timeout_handle: asyncio.TimerHandle | None = None - self._cancel_handle: asyncio.Handle | None = None - self._tasks: set[asyncio.Task] = set() - self._host_task: asyncio.Task | None = None - if sys.version_info >= (3, 11): - self._pending_uncancellations: int | None = 0 - else: - self._pending_uncancellations = None - - def __enter__(self) -> Self: - if self._active: - raise RuntimeError( - "Each CancelScope may only be used for a single 'with' block" - ) - - self._host_task = host_task = cast(asyncio.Task, current_task()) - self._tasks.add(host_task) - try: - task_state = _task_states[host_task] - except KeyError: - task_state = TaskState(None, self) - _task_states[host_task] = task_state - else: - self._parent_scope = task_state.cancel_scope - task_state.cancel_scope = self - if self._parent_scope is not None: - # If using an eager task factory, the parent scope may not even contain - # the host task - self._parent_scope._child_scopes.add(self) - self._parent_scope._tasks.discard(host_task) - - self._timeout() - self._active = True - - # Start cancelling the host task if the scope was cancelled before entering - if self._cancel_called: - self._deliver_cancellation(self) - - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool: - del exc_tb - - if not self._active: - raise RuntimeError("This cancel scope is not active") - if current_task() is not self._host_task: - raise RuntimeError( - "Attempted to exit cancel scope in a different task than it was " - "entered in" - ) - - assert self._host_task is not None - host_task_state = _task_states.get(self._host_task) - if host_task_state is None or host_task_state.cancel_scope is not self: - raise RuntimeError( - "Attempted to exit a cancel scope that isn't the current tasks's " - "current cancel scope" - ) - - try: - self._active = False - if self._timeout_handle: - self._timeout_handle.cancel() - self._timeout_handle = None - - self._tasks.remove(self._host_task) - if self._parent_scope is not None: - self._parent_scope._child_scopes.remove(self) - self._parent_scope._tasks.add(self._host_task) - - host_task_state.cancel_scope = self._parent_scope - - # Restart the cancellation effort in the closest visible, cancelled parent - # scope if necessary - self._restart_cancellation_in_parent() - - # We only swallow the exception iff it was an AnyIO CancelledError, either - # directly as exc_val or inside an exception group and there are no cancelled - # parent cancel scopes visible to us here - if self._cancel_called and not self._parent_cancellation_is_visible_to_us: - # For each level-cancel() call made on the host task, call uncancel() - while self._pending_uncancellations: - self._host_task.uncancel() - self._pending_uncancellations -= 1 - - # Update cancelled_caught and check for exceptions we must not swallow - if isinstance(exc_val, BaseExceptionGroup): - cancelleds_caught, remaining = exc_val.split( - lambda exc: ( - isinstance(exc, CancelledError) - and is_anyio_cancellation(exc) - ) - ) - - if cancelleds_caught is None: - return False - - self._cancelled_caught = True - - if remaining is None: - return True - - context = remaining.__context__ - try: - # Preserve __cause__ and __suppress_context__ by avoiding `raise - # ... from ...` - raise remaining - finally: - # Preserve __context__ - remaining.__context__ = context - del context - else: - if isinstance(exc_val, CancelledError) and is_anyio_cancellation( - exc_val - ): - self._cancelled_caught = True - return True - else: - return False - else: - if self._pending_uncancellations: - assert self._parent_scope is not None - assert self._parent_scope._pending_uncancellations is not None - self._parent_scope._pending_uncancellations += ( - self._pending_uncancellations - ) - self._pending_uncancellations = 0 - - return False - finally: - self._host_task = None - del exc_val - - @property - def _effectively_cancelled(self) -> bool: - cancel_scope: CancelScope | None = self - while cancel_scope is not None: - if cancel_scope._cancel_called: - return True - - if cancel_scope.shield: - return False - - cancel_scope = cancel_scope._parent_scope - - return False - - @property - def _parent_cancellation_is_visible_to_us(self) -> bool: - return ( - self._parent_scope is not None - and not self.shield - and self._parent_scope._effectively_cancelled - ) - - def _timeout(self) -> None: - if self._deadline != math.inf: - loop = get_running_loop() - if loop.time() >= self._deadline: - self.cancel("deadline exceeded") - else: - self._timeout_handle = loop.call_at(self._deadline, self._timeout) - - def _deliver_cancellation(self, origin: CancelScope) -> bool: - """ - Deliver cancellation to directly contained tasks and nested cancel scopes. - - Schedule another run at the end if we still have tasks eligible for - cancellation. - - :param origin: the cancel scope that originated the cancellation - :return: ``True`` if the delivery needs to be retried on the next cycle - - """ - should_retry = False - current = current_task() - for task in self._tasks: - # Always skip tasks that are already done (see issue #1111) - if task.done(): - continue - - should_retry = True - if task._must_cancel: # type: ignore[attr-defined] - continue - - # The task is eligible for cancellation if it has started - if task is not current and (task is self._host_task or _task_started(task)): - waiter = task._fut_waiter # type: ignore[attr-defined] - if not isinstance(waiter, asyncio.Future) or not waiter.done(): - task.cancel(origin._cancel_reason) - if ( - task is origin._host_task - and origin._pending_uncancellations is not None - ): - origin._pending_uncancellations += 1 - - # Deliver cancellation to child scopes that aren't shielded or running their own - # cancellation callbacks - for scope in self._child_scopes: - if not scope._shield and not scope.cancel_called: - should_retry = scope._deliver_cancellation(origin) or should_retry - - # Schedule another callback if there are still tasks left - if origin is self: - if should_retry: - self._cancel_handle = get_running_loop().call_soon( - self._deliver_cancellation, origin - ) - else: - self._cancel_handle = None - - return should_retry - - def _restart_cancellation_in_parent(self) -> None: - """ - Restart the cancellation effort in the closest directly cancelled parent scope. - - """ - scope = self._parent_scope - while scope is not None: - if scope._cancel_called: - if scope._cancel_handle is None: - scope._deliver_cancellation(scope) - - break - - # No point in looking beyond any shielded scope - if scope._shield: - break - - scope = scope._parent_scope - - def _reparent(self, new_parent: CancelScope) -> None: - """ - Move this active scope from its current parent to ``new_parent``. - - Used by :meth:`TaskGroup.start` to move a task that has just called - ``task_status.started()`` into the target task group's cancel scope. - """ - if self._parent_scope is new_parent: - return - - if self._parent_scope is not None: - self._parent_scope._child_scopes.discard(self) - - self._parent_scope = new_parent - new_parent._child_scopes.add(self) - - # If the new parent (or an ancestor) is already cancelled, (re)start the - # delivery loop to ensure we're cancelled at next checkpoint like Trio. - self._restart_cancellation_in_parent() - - def cancel(self, reason: str | None = None) -> None: - if not self._cancel_called: - if self._timeout_handle: - self._timeout_handle.cancel() - self._timeout_handle = None - - self._cancel_called = True - self._cancel_reason = f"Cancelled via cancel scope {id(self):x}" - if task := current_task(): - self._cancel_reason += f" by {task}" - - if reason: - self._cancel_reason += f"; reason: {reason}" - - if self._host_task is not None: - self._deliver_cancellation(self) - - @property - def deadline(self) -> float: - return self._deadline - - @deadline.setter - def deadline(self, value: float) -> None: - self._deadline = float(value) - if self._timeout_handle is not None: - self._timeout_handle.cancel() - self._timeout_handle = None - - if self._active and not self._cancel_called: - self._timeout() - - @property - def cancel_called(self) -> bool: - return self._cancel_called - - @property - def cancelled_caught(self) -> bool: - return self._cancelled_caught - - @property - def shield(self) -> bool: - return self._shield - - @shield.setter - def shield(self, value: bool) -> None: - if self._shield != value: - self._shield = value - if not value: - self._restart_cancellation_in_parent() - - -# -# Task states -# - - -class TaskState: - """ - Encapsulates auxiliary task information that cannot be added to the Task instance - itself because there are no guarantees about its implementation. - """ - - __slots__ = "__weakref__", "cancel_scope", "parent_id" - - def __init__(self, parent_id: int | None, cancel_scope: CancelScope | None): - self.parent_id = parent_id - self.cancel_scope = cancel_scope - - -_task_states: WeakKeyDictionary[asyncio.Task, TaskState] = WeakKeyDictionary() - - -# -# Task groups -# - - -class _AsyncioTaskStatus(abc.TaskStatus[T_contra]): - def __init__( - self, - future: asyncio.Future, - parent_id: int, - target_scope: CancelScope, - spawn_scope: CancelScope, - ): - self._future = future - self._parent_id = parent_id - # The eventual parent scope for this spawn_scope - # (after task_status.started() has been called) - self._target_scope = target_scope - # The task's own cancel scope, also held by its TaskHandle - self._spawn_scope = spawn_scope - - def started(self, value: T_contra | None = None) -> None: - task = cast(asyncio.Task, current_task()) - _task_states[task].parent_id = self._parent_id - if self._future.done(): - if not self._future.cancelled(): - raise RuntimeError("called 'started' twice on the same task status") - else: - # Caller of start() was cancelled, nothing to reparent - return - - self._future.set_result(value) - self._spawn_scope._reparent(self._target_scope) - - -if sys.version_info >= (3, 12): - _eager_task_factory_code: CodeType | None = asyncio.eager_task_factory.__code__ -else: - _eager_task_factory_code = None - - -class TaskGroup(abc.TaskGroup): - def __init__(self) -> None: - self.cancel_scope: CancelScope = CancelScope() - self._entered = False - self._exceptions: list[BaseException] = [] - self._tasks: set[asyncio.Task] = set() - self._on_completed_fut: asyncio.Future[None] | None = None - - async def __aenter__(self) -> Self: - if self._entered: - raise RuntimeError("TaskGroup cannot be entered more than once") - - self._entered = True - - self.cancel_scope.__enter__() - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool: - try: - if exc_val is not None: - self.cancel_scope.cancel() - if not isinstance(exc_val, CancelledError): - self._exceptions.append(exc_val) - - loop = get_running_loop() - try: - if self._tasks: - with CancelScope() as wait_scope: - while self._tasks: - self._on_completed_fut = loop.create_future() - - try: - await self._on_completed_fut - except CancelledError as exc: - # Shield the scope against further cancellation attempts, - # as they're not productive (#695) - wait_scope.shield = True - self.cancel_scope.cancel() - - # Set exc_val from the cancellation exception if it was - # previously unset. However, we should not replace a native - # cancellation exception with one raise by a cancel scope. - if exc_val is None or ( - isinstance(exc_val, CancelledError) - and not is_anyio_cancellation(exc) - ): - exc_val = exc - - self._on_completed_fut = None - else: - # If there are no child tasks to wait on, run at least one checkpoint - # anyway - await AsyncIOBackend.cancel_shielded_checkpoint() - - if self._exceptions: - # The exception that got us here should already have been - # added to self._exceptions so it's ok to break exception - # chaining and avoid adding a "During handling of above..." - # for each nesting level. - raise BaseExceptionGroup( - "unhandled errors in a TaskGroup", self._exceptions - ) from None - elif exc_val: - raise exc_val - except BaseException as exc: - if self.cancel_scope.__exit__(type(exc), exc, exc.__traceback__): - return True - - raise - - return self.cancel_scope.__exit__(exc_type, exc_val, exc_tb) - finally: - del exc_val, exc_tb, self._exceptions - - def _spawn( - self, - coro: Coroutine[Any, Any, T_co], - name: object, - task_status: _AsyncioTaskStatus | None = None, - ) -> TaskHandle[T_co]: - task_status_future = task_status._future if task_status is not None else None - - def task_done(_task: asyncio.Task) -> None: - if sys.version_info >= (3, 14) and self.cancel_scope._host_task is not None: - asyncio.future_discard_from_awaited_by( - _task, self.cancel_scope._host_task - ) - - task_state = _task_states[_task] - assert task_state.cancel_scope is not None - assert _task in task_state.cancel_scope._tasks - task_state.cancel_scope._tasks.remove(_task) - self._tasks.remove(task) - del _task_states[_task] - - if self._on_completed_fut is not None and not self._tasks: - try: - self._on_completed_fut.set_result(None) - except asyncio.InvalidStateError: - pass - - try: - exc = _task.exception() - except CancelledError as e: - while isinstance(e.__context__, CancelledError): - e = e.__context__ - - exc = e - - if exc is not None: - # The future can only be in the cancelled state if the host task was - # cancelled, so return immediately instead of adding one more - # CancelledError to the exceptions list - if task_status_future is not None and task_status_future.cancelled(): - return - - if task_status_future is None or task_status_future.done(): - if not isinstance(exc, CancelledError): - self._exceptions.append(exc) - - if not self.cancel_scope._effectively_cancelled: - self.cancel_scope.cancel() - else: - task_status_future.set_exception(exc) - elif task_status_future is not None and not task_status_future.done(): - task_status_future.set_exception( - RuntimeError("Child exited without calling task_status.started()") - ) - - if task_status_future is not None: - parent_id = id(current_task()) - caller_state = _task_states.get(cast(asyncio.Task, current_task())) - if caller_state is not None and caller_state.cancel_scope is not None: - initial_scope = caller_state.cancel_scope - else: - # The caller is an unmanaged task (no task state) - initial_scope = self.cancel_scope - else: - parent_id = id(self.cancel_scope._host_task) - initial_scope = self.cancel_scope - - spawn_scope = task_status._spawn_scope if task_status is not None else None - handle = TaskHandle(coro, name, cancel_scope=spawn_scope) - loop = asyncio.get_running_loop() - wrapper_coro = handle._run_coro() - try: - if ( - (factory := loop.get_task_factory()) - and getattr(factory, "__code__", None) is _eager_task_factory_code - and (closure := getattr(factory, "__closure__", None)) - ): - custom_task_constructor = closure[0].cell_contents - task = custom_task_constructor( - wrapper_coro, loop=loop, name=handle.name - ) - else: - task = loop.create_task(wrapper_coro, name=handle.name) - except BaseException: - with suppress(BaseException): - wrapper_coro.close() - - with suppress(BaseException): - coro.close() - - raise - - # Make the spawned task inherit the initial cancel scope - _task_states[task] = TaskState(parent_id=parent_id, cancel_scope=initial_scope) - initial_scope._tasks.add(task) - self._tasks.add(task) - if sys.version_info >= (3, 14) and self.cancel_scope._host_task is not None: - asyncio.future_add_to_awaited_by(task, self.cancel_scope._host_task) - - task.add_done_callback(task_done) - return handle - - def create_task( - self, - coro: Coroutine[Any, Any, T_co], - *, - name: object = None, - context: Context | None = None, - ) -> TaskHandle[T_co]: - if not isinstance(coro, Coroutine): - raise TypeError(f"expected a coroutine, got {coro.__class__.__qualname__}") - - if not self._entered or not self.cancel_scope._active: - coro.close() - raise RuntimeError( - "This task group is not active; no new tasks can be started." - ) - - final_name = get_coro_name(coro, name) - - if context is not None: - return context.run(self._spawn, coro, name=final_name) - else: - return self._spawn(coro, name=final_name) - - async def start( - self, - func: Callable[[Unpack[PosArgsT]], Coroutine[Any, Any, T_co]], - *args: Unpack[PosArgsT], - name: object = None, - return_handle: Literal[False, True] = False, - ) -> Any: - if not self._entered or not self.cancel_scope._active: - raise RuntimeError( - "This task group is not active; no new tasks can be started." - ) - - # Until task_status.started() is called, a task spawned via start() belongs to - # the *caller's* cancel scope, not the target group's, so cancelling the group - # does not cancel a task that hasn't reported startup yet. The - # task_status.started() call moves the task's cancel scope to this task group's - # cancel scope. - # - # The caller may be an unmanaged task (no _task_states entry), in which case - # fall back to the group's own scope. - future: asyncio.Future = asyncio.Future() - final_name = get_callable_name(func, name) - task_status: _AsyncioTaskStatus[Any] = _AsyncioTaskStatus( - future, id(self.cancel_scope._host_task), self.cancel_scope, CancelScope() - ) - coro = call_for_coroutine(func, args, task_status=task_status) - handle = self._spawn(coro, final_name, task_status) - - # If the task raises an exception after sending a start value without a switch - # point between, the task group is cancelled and this method never proceeds to - # process the completed future. That's why we have to have a shielded cancel - # scope here. - try: - await future - except BaseException: - if handle.status is TaskHandle.Status.PENDING: - # Cancel the task and wait for it to exit before returning - handle.cancel() - with CancelScope(shield=True): - await handle.wait() - - raise - - if return_handle: - handle._start_value = future.result() - return handle - else: - return future.result() - - -# -# Threads -# - -_Retval_Queue_Type = tuple[T_Retval | None, BaseException | None] - - -class WorkerThread(Thread): - MAX_IDLE_TIME = 10 # seconds - - def __init__( - self, - root_task: asyncio.Task, - workers: set[WorkerThread], - idle_workers: deque[WorkerThread], - ): - kwargs: dict[str, Any] = {} - if sys.version_info >= (3, 14): - kwargs["context"] = Context() - - super().__init__(name="AnyIO worker thread", **kwargs) - self.root_task = root_task - self.workers = workers - self.idle_workers = idle_workers - self.loop = root_task._loop - self.queue: Queue[ - tuple[Context, Callable, tuple, asyncio.Future, CancelScope] | None - ] = Queue(2) - self.idle_since = AsyncIOBackend.current_time() - self.stopping = False - - def _report_result( - self, future: asyncio.Future, result: Any, exc: BaseException | None - ) -> None: - self.idle_since = AsyncIOBackend.current_time() - if not self.stopping: - self.idle_workers.append(self) - - if not future.cancelled(): - if exc is not None: - if isinstance(exc, StopIteration): - new_exc = RuntimeError("coroutine raised StopIteration") - new_exc.__cause__ = exc - exc = new_exc - - future.set_exception(exc) - else: - future.set_result(result) - - def run(self) -> None: - with claim_worker_thread(AsyncIOBackend, self.loop): - while True: - item = self.queue.get() - if item is None: - # Shutdown command received - return - - context, func, args, future, cancel_scope = item - if not future.cancelled(): - result = None - exception: BaseException | None = None - threadlocals.current_cancel_scope = cancel_scope - try: - result = context.run(func, *args) - except BaseException as exc: - exception = exc - finally: - del threadlocals.current_cancel_scope - - try: - self.loop.call_soon_threadsafe( - self._report_result, future, result, exception - ) - except RuntimeError: - if not self.loop.is_closed(): - raise - - del result, exception - - self.queue.task_done() - del item, context, func, args, future, cancel_scope - - def stop(self, f: asyncio.Task | None = None) -> None: - self.stopping = True - self.queue.put_nowait(None) - self.workers.discard(self) - try: - self.idle_workers.remove(self) - except ValueError: - pass - - -_threadpool_idle_workers: RunVar[deque[WorkerThread]] = RunVar( - "_threadpool_idle_workers" -) -_threadpool_workers: RunVar[set[WorkerThread]] = RunVar("_threadpool_workers") - - -# -# Subprocesses -# - - -@dataclass(eq=False) -class StreamReaderWrapper(abc.ByteReceiveStream): - _stream: asyncio.StreamReader - - async def receive(self, max_bytes: int = 65536) -> bytes: - if max_bytes < 1: - raise ValueError("max_bytes must be a positive integer") - - data = await self._stream.read(max_bytes) - if data: - return data - else: - raise EndOfStream - - async def aclose(self) -> None: - self._stream.set_exception(ClosedResourceError()) - await AsyncIOBackend.checkpoint() - - -@dataclass(eq=False) -class StreamWriterWrapper(abc.ByteSendStream): - _stream: asyncio.StreamWriter - _closed: bool = field(init=False, default=False) - - async def send(self, item: bytes) -> None: - await AsyncIOBackend.checkpoint_if_cancelled() - stream_paused = self._stream._protocol._paused # type: ignore[attr-defined] - try: - self._stream.write(item) - await self._stream.drain() - except (ConnectionResetError, BrokenPipeError, RuntimeError) as exc: - # If closed by us and/or the peer: - # * on stdlib, drain() raises ConnectionResetError or BrokenPipeError - # * on uvloop and Winloop, write() eventually starts raising RuntimeError - if self._closed: - raise ClosedResourceError from exc - elif self._stream.is_closing(): - raise BrokenResourceError from exc - - raise - - if not stream_paused: - await AsyncIOBackend.cancel_shielded_checkpoint() - - async def aclose(self) -> None: - self._closed = True - self._stream.close() - await AsyncIOBackend.checkpoint() - - -@dataclass(eq=False) -class Process(abc.Process): - _process: asyncio.subprocess.Process - _stdin: StreamWriterWrapper | None - _stdout: StreamReaderWrapper | None - _stderr: StreamReaderWrapper | None - _exited: asyncio.Event - _transport: asyncio.SubprocessTransport - - async def aclose(self) -> None: - with CancelScope(shield=True) as scope: - # We need to close the underlying pipe_transports as well to allow a - # process blocking on full buffers to receive SIGPIPE and exit. - if self._stdin: - await self._stdin.aclose() - if pipe := self._transport.get_pipe_transport(0): - pipe.close() - if self._stdout: - await self._stdout.aclose() - if pipe := self._transport.get_pipe_transport(1): - pipe.close() - if self._stderr: - await self._stderr.aclose() - if pipe := self._transport.get_pipe_transport(2): - pipe.close() - - scope.shield = False - try: - await self.wait() - except BaseException: - scope.shield = True - # Closing the transport on asyncio also handles sending kill - self._transport.close() - await self.wait() - raise - - async def wait(self) -> int: - await self._exited.wait() - assert self._process.returncode is not None - return self._process.returncode - - def terminate(self) -> None: - self._process.terminate() - - def kill(self) -> None: - self._process.kill() - - def send_signal(self, signal: int) -> None: - self._process.send_signal(signal) - - @property - def pid(self) -> int: - return self._process.pid - - @property - def returncode(self) -> int | None: - return self._process.returncode - - @property - def stdin(self) -> abc.ByteSendStream | None: - return self._stdin - - @property - def stdout(self) -> abc.ByteReceiveStream | None: - return self._stdout - - @property - def stderr(self) -> abc.ByteReceiveStream | None: - return self._stderr - - -def _forcibly_shutdown_process_pool_on_exit( - workers: set[Process], _task: object -) -> None: - """ - Forcibly shuts down worker processes belonging to this event loop.""" - child_watcher: asyncio.AbstractChildWatcher | None = None # type: ignore[name-defined] - if sys.version_info < (3, 12): - try: - child_watcher = asyncio.get_event_loop_policy().get_child_watcher() - except NotImplementedError: - pass - - # Close as much as possible (w/o async/await) to avoid warnings - for process in workers.copy(): - if process.returncode is not None: - continue - - process._stdin._stream._transport.close() # type: ignore[union-attr] - process._stdout._stream._transport.close() # type: ignore[union-attr] - process._stderr._stream._transport.close() # type: ignore[union-attr] - process.kill() - if child_watcher: - child_watcher.remove_child_handler(process.pid) - - -async def _shutdown_process_pool_on_exit(workers: set[abc.Process]) -> None: - """ - Shuts down worker processes belonging to this event loop. - - NOTE: this only works when the event loop was started using asyncio.run() or - anyio.run(). - - """ - process: abc.Process - try: - await sleep(math.inf) - except asyncio.CancelledError: - workers = workers.copy() - for process in workers: - if process.returncode is None: - process.kill() - - for process in workers: - await process.aclose() - - -# -# Sockets and networking -# - - -class StreamProtocol(asyncio.Protocol): - read_queue: deque[bytes] - read_event: asyncio.Event - write_event: asyncio.Event - exception: Exception | None = None - is_at_eof: bool = False - - def connection_made(self, transport: asyncio.BaseTransport) -> None: - self.read_queue = deque() - self.read_event = asyncio.Event() - self.write_event = asyncio.Event() - self.write_event.set() - cast(asyncio.Transport, transport).set_write_buffer_limits(0) - - def connection_lost(self, exc: Exception | None) -> None: - if exc: - self.exception = exc - - self.read_event.set() - self.write_event.set() - - def data_received(self, data: bytes) -> None: - # ProactorEventloop sometimes sends bytearray instead of bytes - self.read_queue.append(bytes(data)) - self.read_event.set() - - def eof_received(self) -> bool | None: - self.is_at_eof = True - self.read_event.set() - return True - - def pause_writing(self) -> None: - self.write_event = asyncio.Event() - - def resume_writing(self) -> None: - self.write_event.set() - - -class DatagramProtocol(asyncio.DatagramProtocol): - read_queue: deque[tuple[bytes, IPSockAddrType]] - read_event: asyncio.Event - write_event: asyncio.Event - closed_event: asyncio.Event - exception: Exception | None = None - - def connection_made(self, transport: asyncio.BaseTransport) -> None: - self.read_queue = deque(maxlen=100) # arbitrary value - self.read_event = asyncio.Event() - self.write_event = asyncio.Event() - self.closed_event = asyncio.Event() - self.write_event.set() - - def connection_lost(self, exc: Exception | None) -> None: - self.read_event.set() - self.write_event.set() - self.closed_event.set() - - def datagram_received(self, data: bytes, addr: IPSockAddrType) -> None: - addr = convert_ipv6_sockaddr(addr) - self.read_queue.append((data, addr)) - self.read_event.set() - - def error_received(self, exc: Exception) -> None: - self.exception = exc - - def pause_writing(self) -> None: - self.write_event.clear() - - def resume_writing(self) -> None: - self.write_event.set() - - -class SocketStream(abc.SocketStream): - def __init__(self, transport: asyncio.Transport, protocol: StreamProtocol): - self._transport = transport - self._protocol = protocol - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - self._closed = False - - @property - def _raw_socket(self) -> socket.socket: - return self._transport.get_extra_info("socket") - - async def receive(self, max_bytes: int = 65536) -> bytes: - if max_bytes < 1: - raise ValueError("max_bytes must be a positive integer") - - with self._receive_guard: - if ( - not self._protocol.read_event.is_set() - and not self._transport.is_closing() - and not self._protocol.is_at_eof - ): - self._transport.resume_reading() - await self._protocol.read_event.wait() - self._transport.pause_reading() - else: - await AsyncIOBackend.checkpoint() - - try: - chunk = self._protocol.read_queue.popleft() - except IndexError: - if self._closed: - raise ClosedResourceError from None - elif self._protocol.exception: - raise BrokenResourceError from self._protocol.exception - else: - raise EndOfStream from None - - if len(chunk) > max_bytes: - # Split the oversized chunk - chunk, leftover = chunk[:max_bytes], chunk[max_bytes:] - self._protocol.read_queue.appendleft(leftover) - - # If the read queue is empty, clear the flag so that the next call will - # block until data is available - if not self._protocol.read_queue: - self._protocol.read_event.clear() - - return chunk - - async def send(self, item: bytes) -> None: - with self._send_guard: - await AsyncIOBackend.checkpoint() - - if self._closed: - raise ClosedResourceError - elif self._protocol.exception is not None: - raise BrokenResourceError from self._protocol.exception - - try: - self._transport.write(item) - except RuntimeError as exc: - if self._transport.is_closing(): - raise BrokenResourceError from exc - else: - raise - - await self._protocol.write_event.wait() - - async def send_eof(self) -> None: - try: - self._transport.write_eof() - except OSError: - pass - - async def aclose(self) -> None: - self._closed = True - if not self._transport.is_closing(): - try: - self._transport.write_eof() - except OSError: - pass - - self._transport.close() - await sleep(0) - self._transport.abort() - - -class _RawSocketMixin: - _receive_future: asyncio.Future | None = None - _send_future: asyncio.Future | None = None - _closing = False - - def __init__(self, raw_socket: socket.socket): - self.__raw_socket = raw_socket - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - - @property - def _raw_socket(self) -> socket.socket: - return self.__raw_socket - - def _wait_until_readable(self, loop: asyncio.AbstractEventLoop) -> asyncio.Future: - def callback(f: object) -> None: - del self._receive_future - loop.remove_reader(self.__raw_socket) - - f = self._receive_future = asyncio.Future() - loop.add_reader(self.__raw_socket, f.set_result, None) - f.add_done_callback(callback) - return f - - def _wait_until_writable(self, loop: asyncio.AbstractEventLoop) -> asyncio.Future: - def callback(f: object) -> None: - del self._send_future - loop.remove_writer(self.__raw_socket) - - f = self._send_future = asyncio.Future() - loop.add_writer(self.__raw_socket, f.set_result, None) - f.add_done_callback(callback) - return f - - async def aclose(self) -> None: - if not self._closing: - self._closing = True - if self.__raw_socket.fileno() != -1: - self.__raw_socket.close() - - if self._receive_future and not self._receive_future.done(): - self._receive_future.set_result(None) - if self._send_future and not self._send_future.done(): - self._send_future.set_result(None) - - -class UNIXSocketStream(_RawSocketMixin, abc.UNIXSocketStream): - async def send_eof(self) -> None: - with self._send_guard: - self._raw_socket.shutdown(socket.SHUT_WR) - - async def receive(self, max_bytes: int = 65536) -> bytes: - if max_bytes < 1: - raise ValueError("max_bytes must be a positive integer") - - loop = get_running_loop() - await AsyncIOBackend.checkpoint() - with self._receive_guard: - while True: - try: - data = self._raw_socket.recv(max_bytes) - except BlockingIOError: - await self._wait_until_readable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - else: - if not data: - raise EndOfStream - - return data - - async def send(self, item: bytes) -> None: - loop = get_running_loop() - await AsyncIOBackend.checkpoint() - with self._send_guard: - view = memoryview(item) - while view: - try: - bytes_sent = self._raw_socket.send(view) - except BlockingIOError: - await self._wait_until_writable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - else: - view = view[bytes_sent:] - - async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: - if not isinstance(msglen, int) or msglen < 0: - raise ValueError("msglen must be a non-negative integer") - if not isinstance(maxfds, int) or maxfds < 1: - raise ValueError("maxfds must be a positive integer") - - loop = get_running_loop() - fds = array.array("i") - await AsyncIOBackend.checkpoint() - with self._receive_guard: - while True: - try: - message, ancdata, _flags, _addr = self._raw_socket.recvmsg( - msglen, socket.CMSG_LEN(maxfds * fds.itemsize) - ) - except BlockingIOError: - await self._wait_until_readable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - else: - if not message and not ancdata: - raise EndOfStream - - break - - for cmsg_level, cmsg_type, cmsg_data in ancdata: - if cmsg_level != socket.SOL_SOCKET or cmsg_type != socket.SCM_RIGHTS: - raise RuntimeError( - f"Received unexpected ancillary data; message = {message!r}, " - f"cmsg_level = {cmsg_level}, cmsg_type = {cmsg_type}" - ) - - fds.frombytes(cmsg_data[: len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) - - return message, list(fds) - - async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: - if not message: - raise ValueError("message must not be empty") - if not fds: - raise ValueError("fds must not be empty") - - loop = get_running_loop() - filenos: list[int] = [] - for fd in fds: - if isinstance(fd, int): - filenos.append(fd) - elif isinstance(fd, IOBase): - filenos.append(fd.fileno()) - - fdarray = array.array("i", filenos) - await AsyncIOBackend.checkpoint() - with self._send_guard: - while True: - try: - # The ignore can be removed after mypy picks up - # https://github.com/python/typeshed/pull/5545 - self._raw_socket.sendmsg( - [message], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fdarray)] - ) - break - except BlockingIOError: - await self._wait_until_writable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - - -class TCPSocketListener(abc.SocketListener): - _accept_scope: CancelScope | None = None - _closed = False - - def __init__(self, raw_socket: socket.socket): - self.__raw_socket = raw_socket - self._loop = cast(asyncio.BaseEventLoop, get_running_loop()) - self._accept_guard = ResourceGuard("accepting connections from") - - @property - def _raw_socket(self) -> socket.socket: - return self.__raw_socket - - async def accept(self) -> abc.SocketStream: - if self._closed: - raise ClosedResourceError - - with self._accept_guard: - await AsyncIOBackend.checkpoint() - with CancelScope() as self._accept_scope: - try: - client_sock, _addr = await self._loop.sock_accept(self._raw_socket) - except asyncio.CancelledError: - # Workaround for https://bugs.python.org/issue41317 - try: - self._loop.remove_reader(self._raw_socket) - except (ValueError, NotImplementedError): - pass - - if self._closed: - raise ClosedResourceError from None - - raise - finally: - self._accept_scope = None - - client_sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - transport, protocol = await self._loop.connect_accepted_socket( - StreamProtocol, client_sock - ) - return SocketStream(transport, protocol) - - async def aclose(self) -> None: - if self._closed: - return - - self._closed = True - if self._accept_scope: - # Workaround for https://bugs.python.org/issue41317 - try: - self._loop.remove_reader(self._raw_socket) - except (ValueError, NotImplementedError): - pass - - self._accept_scope.cancel() - await sleep(0) - - self._raw_socket.close() - - -class UNIXSocketListener(abc.SocketListener): - def __init__(self, raw_socket: socket.socket): - self.__raw_socket = raw_socket - self._loop = get_running_loop() - self._accept_guard = ResourceGuard("accepting connections from") - self._closed = False - - async def accept(self) -> abc.SocketStream: - await AsyncIOBackend.checkpoint() - with self._accept_guard: - while True: - try: - client_sock, _ = self.__raw_socket.accept() - client_sock.setblocking(False) - return UNIXSocketStream(client_sock) - except BlockingIOError: - f: asyncio.Future = asyncio.Future() - self._loop.add_reader(self.__raw_socket, f.set_result, None) - f.add_done_callback( - lambda _: self._loop.remove_reader(self.__raw_socket) - ) - await f - except OSError as exc: - if self._closed: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - - async def aclose(self) -> None: - self._closed = True - self.__raw_socket.close() - - @property - def _raw_socket(self) -> socket.socket: - return self.__raw_socket - - -class UDPSocket(abc.UDPSocket): - def __init__( - self, transport: asyncio.DatagramTransport, protocol: DatagramProtocol - ): - self._transport = transport - self._protocol = protocol - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - self._closed = False - - @property - def _raw_socket(self) -> socket.socket: - return self._transport.get_extra_info("socket") - - async def aclose(self) -> None: - self._closed = True - if not self._transport.is_closing(): - self._transport.close() - - await self._protocol.closed_event.wait() - - async def receive(self) -> tuple[bytes, IPSockAddrType]: - with self._receive_guard: - await AsyncIOBackend.checkpoint() - - # If the buffer is empty, ask for more data - if not self._protocol.read_queue and not self._transport.is_closing(): - self._protocol.read_event.clear() - await self._protocol.read_event.wait() - - try: - return self._protocol.read_queue.popleft() - except IndexError: - if self._closed: - raise ClosedResourceError from None - else: - raise BrokenResourceError from None - - async def send(self, item: UDPPacketType) -> None: - with self._send_guard: - await AsyncIOBackend.checkpoint() - await self._protocol.write_event.wait() - if self._closed: - raise ClosedResourceError - elif self._transport.is_closing(): - raise BrokenResourceError - else: - self._transport.sendto(*item) - - -class ConnectedUDPSocket(abc.ConnectedUDPSocket): - def __init__( - self, transport: asyncio.DatagramTransport, protocol: DatagramProtocol - ): - self._transport = transport - self._protocol = protocol - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - self._closed = False - - @property - def _raw_socket(self) -> socket.socket: - return self._transport.get_extra_info("socket") - - async def aclose(self) -> None: - self._closed = True - if not self._transport.is_closing(): - self._transport.close() - - await self._protocol.closed_event.wait() - - async def receive(self) -> bytes: - with self._receive_guard: - await AsyncIOBackend.checkpoint() - - # If the buffer is empty, ask for more data - if not self._protocol.read_queue and not self._transport.is_closing(): - self._protocol.read_event.clear() - await self._protocol.read_event.wait() - - try: - packet = self._protocol.read_queue.popleft() - except IndexError: - if self._closed: - raise ClosedResourceError from None - else: - raise BrokenResourceError from None - - return packet[0] - - async def send(self, item: bytes) -> None: - with self._send_guard: - await AsyncIOBackend.checkpoint() - await self._protocol.write_event.wait() - if self._closed: - raise ClosedResourceError - elif self._transport.is_closing(): - raise BrokenResourceError - else: - self._transport.sendto(item) - - -class UNIXDatagramSocket(_RawSocketMixin, abc.UNIXDatagramSocket): - async def receive(self) -> UNIXDatagramPacketType: - loop = get_running_loop() - await AsyncIOBackend.checkpoint() - with self._receive_guard: - while True: - try: - data = self._raw_socket.recvfrom(65536) - except BlockingIOError: - await self._wait_until_readable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - else: - return data - - async def send(self, item: UNIXDatagramPacketType) -> None: - loop = get_running_loop() - await AsyncIOBackend.checkpoint() - with self._send_guard: - while True: - try: - self._raw_socket.sendto(*item) - except BlockingIOError: - await self._wait_until_writable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - else: - return - - -class ConnectedUNIXDatagramSocket(_RawSocketMixin, abc.ConnectedUNIXDatagramSocket): - async def receive(self) -> bytes: - loop = get_running_loop() - await AsyncIOBackend.checkpoint() - with self._receive_guard: - while True: - try: - data = self._raw_socket.recv(65536) - except BlockingIOError: - await self._wait_until_readable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - else: - return data - - async def send(self, item: bytes) -> None: - loop = get_running_loop() - await AsyncIOBackend.checkpoint() - with self._send_guard: - while True: - try: - self._raw_socket.send(item) - except BlockingIOError: - await self._wait_until_writable(loop) - except OSError as exc: - if self._closing: - raise ClosedResourceError from None - else: - raise BrokenResourceError from exc - else: - return - - -_read_events: RunVar[dict[int, asyncio.Future[bool]]] = RunVar("read_events") -_write_events: RunVar[dict[int, asyncio.Future[bool]]] = RunVar("write_events") - - -# -# Synchronization -# - - -class Event(BaseEvent): - __slots__ = ("_event",) - - def __new__(cls) -> Self: - return object.__new__(cls) - - def __init__(self) -> None: - self._event = asyncio.Event() - - def set(self) -> None: - self._event.set() - - def is_set(self) -> bool: - return self._event.is_set() - - async def wait(self) -> None: - if self.is_set(): - await AsyncIOBackend.checkpoint() - else: - await self._event.wait() - - def statistics(self) -> EventStatistics: - return EventStatistics(len(self._event._waiters)) - - -class Lock(BaseLock): - __slots__ = "_fast_acquire", "_owner_task", "_waiters" - - def __new__(cls, *, fast_acquire: bool = False) -> Self: - return object.__new__(cls) - - def __init__(self, *, fast_acquire: bool = False) -> None: - self._fast_acquire = fast_acquire - self._owner_task: asyncio.Task | None = None - self._waiters: deque[tuple[asyncio.Task, asyncio.Future]] = deque() - - async def acquire(self) -> None: - task = cast(asyncio.Task, current_task()) - if self._owner_task is None and not self._waiters: - await AsyncIOBackend.checkpoint_if_cancelled() - self._owner_task = task - - # Unless on the "fast path", yield control of the event loop so that other - # tasks can run too - if not self._fast_acquire: - try: - await AsyncIOBackend.cancel_shielded_checkpoint() - except CancelledError: - self.release() - raise - - return - - if self._owner_task == task: - raise RuntimeError("Attempted to acquire an already held Lock") - - fut: asyncio.Future[None] = asyncio.Future() - item = task, fut - self._waiters.append(item) - try: - await fut - except CancelledError: - if fut.cancelled(): - try: - self._waiters.remove(item) - except ValueError: - pass - else: - self.release() - - raise - - def acquire_nowait(self) -> None: - task = cast(asyncio.Task, current_task()) - if self._owner_task is None and not self._waiters: - self._owner_task = task - return - - if self._owner_task is task: - raise RuntimeError("Attempted to acquire an already held Lock") - - raise WouldBlock - - def locked(self) -> bool: - return self._owner_task is not None - - def release(self) -> None: - if self._owner_task != current_task(): - raise RuntimeError("The current task is not holding this lock") - - # A cancelled waiter that already received ownership removes itself from - # _waiters before calling release(); any cancelled waiter still queued here - # was cancelled before being woken, so drop it. - while self._waiters: - task, fut = self._waiters.popleft() - if fut.cancelled(): - continue - - self._owner_task = task - fut.set_result(None) - return - - self._owner_task = None - - def statistics(self) -> LockStatistics: - task_info = AsyncIOTaskInfo(self._owner_task) if self._owner_task else None - return LockStatistics(self.locked(), task_info, len(self._waiters)) - - -class Semaphore(BaseSemaphore): - __slots__ = "_fast_acquire", "_max_value", "_value", "_waiters" - - def __new__( - cls, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> Self: - return object.__new__(cls) - - def __init__( - self, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ): - super().__init__(initial_value, max_value=max_value) - self._value = initial_value - self._max_value = max_value - self._fast_acquire = fast_acquire - self._waiters: deque[asyncio.Future[None]] = deque() - - async def acquire(self) -> None: - if self._value > 0 and not self._waiters: - await AsyncIOBackend.checkpoint_if_cancelled() - self._value -= 1 - - # Unless on the "fast path", yield control of the event loop so that other - # tasks can run too - if not self._fast_acquire: - try: - await AsyncIOBackend.cancel_shielded_checkpoint() - except CancelledError: - self.release() - raise - - return - - fut: asyncio.Future[None] = asyncio.Future() - self._waiters.append(fut) - try: - await fut - except CancelledError: - if fut.cancelled(): - try: - self._waiters.remove(fut) - except ValueError: - pass - else: - self.release() - - raise - - def acquire_nowait(self) -> None: - if self._value == 0: - raise WouldBlock - - self._value -= 1 - - def release(self) -> None: - if self._max_value is not None and self._value == self._max_value: - raise ValueError("semaphore released too many times") - - while self._waiters: - fut = self._waiters.popleft() - if fut.cancelled(): - continue - - fut.set_result(None) - return - - self._value += 1 - - @property - def value(self) -> int: - return self._value - - @property - def max_value(self) -> int | None: - return self._max_value - - def statistics(self) -> SemaphoreStatistics: - return SemaphoreStatistics(len(self._waiters)) - - -class CapacityLimiter(BaseCapacityLimiter): - __slots__ = "_borrowers", "_total_tokens", "_wait_queue" - - def __new__(cls, total_tokens: float) -> Self: - return object.__new__(cls) - - def __init__(self, total_tokens: float): - self._total_tokens: float = 0 - self._borrowers: set[Any] = set() - self._wait_queue: OrderedDict[Any, asyncio.Event] = OrderedDict() - self.total_tokens = total_tokens - - async def __aenter__(self) -> None: - await self.acquire() - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self.release() - - @property - def total_tokens(self) -> float: - return self._total_tokens - - @total_tokens.setter - def total_tokens(self, value: float) -> None: - if not isinstance(value, int) and not math.isinf(value): - raise TypeError("total_tokens must be an int or math.inf") - - if value < 0: - raise ValueError("total_tokens must be >= 0") - - self._total_tokens = value - - # Notify waiting tasks that they have acquired the limiter while - # there is spare capacity. - while self._wait_queue and len(self._borrowers) < self._total_tokens: - borrower, event = self._wait_queue.popitem(last=False) - self._borrowers.add(borrower) - event.set() - - @property - def borrowed_tokens(self) -> int: - return len(self._borrowers) - - @property - def available_tokens(self) -> float: - return self._total_tokens - len(self._borrowers) - - def _notify_next_waiter(self) -> None: - """Hand a free token to the next task in line, if any.""" - if self._wait_queue and len(self._borrowers) < self._total_tokens: - borrower, event = self._wait_queue.popitem(last=False) - self._borrowers.add(borrower) - event.set() - - def acquire_nowait(self) -> None: - self.acquire_on_behalf_of_nowait(current_task()) - - def acquire_on_behalf_of_nowait(self, borrower: object) -> None: - if borrower in self._borrowers: - raise RuntimeError( - "this borrower is already holding one of this CapacityLimiter's tokens" - ) - - if self._wait_queue or len(self._borrowers) >= self._total_tokens: - raise WouldBlock - - self._borrowers.add(borrower) - - async def acquire(self) -> None: - return await self.acquire_on_behalf_of(current_task()) - - async def acquire_on_behalf_of(self, borrower: object) -> None: - await AsyncIOBackend.checkpoint_if_cancelled() - try: - self.acquire_on_behalf_of_nowait(borrower) - except WouldBlock: - event = asyncio.Event() - self._wait_queue[borrower] = event - try: - await event.wait() - except BaseException: - self._wait_queue.pop(borrower, None) - if event.is_set(): - self._borrowers.discard(borrower) - self._notify_next_waiter() - - raise - else: - try: - await AsyncIOBackend.cancel_shielded_checkpoint() - except BaseException: - self.release() - raise - - def release(self) -> None: - self.release_on_behalf_of(current_task()) - - def release_on_behalf_of(self, borrower: object) -> None: - try: - self._borrowers.remove(borrower) - except KeyError: - raise RuntimeError( - "this borrower isn't holding any of this CapacityLimiter's tokens" - ) from None - - self._notify_next_waiter() - - def statistics(self) -> CapacityLimiterStatistics: - return CapacityLimiterStatistics( - self.borrowed_tokens, - self.total_tokens, - tuple(self._borrowers), - len(self._wait_queue), - ) - - -_default_thread_limiter: RunVar[CapacityLimiter] = RunVar("_default_thread_limiter") - - -# -# Operating system signals -# - - -class _SignalReceiver: - def __init__(self, signals: tuple[Signals, ...]): - self._signals = signals - self._loop = get_running_loop() - self._signal_queue: deque[Signals] = deque() - self._future: asyncio.Future = asyncio.Future() - self._handled_signals: set[Signals] = set() - - def _deliver(self, signum: Signals) -> None: - self._signal_queue.append(signum) - if not self._future.done(): - self._future.set_result(None) - - def __enter__(self) -> Self: - for sig in set(self._signals): - self._loop.add_signal_handler(sig, self._deliver, sig) - self._handled_signals.add(sig) - - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - for sig in self._handled_signals: - self._loop.remove_signal_handler(sig) - - def __aiter__(self) -> _SignalReceiver: - return self - - async def __anext__(self) -> Signals: - await AsyncIOBackend.checkpoint() - if not self._signal_queue: - self._future = asyncio.Future() - await self._future - - return self._signal_queue.popleft() - - -# -# Testing and debugging -# - - -class AsyncIOTaskInfo(TaskInfo): - def __init__(self, task: asyncio.Task): - task_state = _task_states.get(task) - if task_state is None: - parent_id = None - else: - parent_id = task_state.parent_id - - coro = task.get_coro() - assert coro is not None, "created TaskInfo from a completed Task" - super().__init__(id(task), parent_id, task.get_name(), coro) - self._task = weakref.ref(task) - - def has_pending_cancellation(self) -> bool: - if not (task := self._task()): - # If the task isn't around anymore, it won't have a pending cancellation - return False - - if task._must_cancel or ( # type: ignore[attr-defined] - isinstance(task._fut_waiter, asyncio.Future) # type: ignore[attr-defined] - and task._fut_waiter.cancelled() # type: ignore[attr-defined] - ): - return True - - if task_state := _task_states.get(task): - if cancel_scope := task_state.cancel_scope: - return cancel_scope._effectively_cancelled - - return False - - -class TestRunner(abc.TestRunner): - _send_stream: MemoryObjectSendStream[tuple[Awaitable[Any], asyncio.Future[Any]]] - - def __init__( - self, - *, - debug: bool | None = None, - use_uvloop: bool = False, - loop_factory: Callable[[], AbstractEventLoop] | None = None, - ) -> None: - if use_uvloop and loop_factory is None: - if sys.platform != "win32": - import uvloop - - loop_factory = uvloop.new_event_loop - else: - import winloop - - loop_factory = winloop.new_event_loop - - self._runner = Runner(debug=debug, loop_factory=loop_factory) - self._exceptions: list[BaseException] = [] - self._runner_task: asyncio.Task | None = None - - def __enter__(self) -> Self: - self._runner.__enter__() - self.get_loop().set_exception_handler(self._exception_handler) - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - self._runner.__exit__(exc_type, exc_val, exc_tb) - - def get_loop(self) -> AbstractEventLoop: - return self._runner.get_loop() - - def is_running(self) -> bool: - try: - asyncio.get_running_loop() - return True - except RuntimeError: - return False - - def _exception_handler( - self, loop: asyncio.AbstractEventLoop, context: dict[str, Any] - ) -> None: - if isinstance(context.get("exception"), Exception): - self._exceptions.append(context["exception"]) - else: - loop.default_exception_handler(context) - - def _raise_async_exceptions(self) -> None: - # Re-raise any exceptions raised in asynchronous callbacks - if self._exceptions: - exceptions, self._exceptions = self._exceptions, [] - if len(exceptions) == 1: - raise exceptions[0] - elif exceptions: - raise BaseExceptionGroup( - "Multiple exceptions occurred in asynchronous callbacks", exceptions - ) - - async def _run_tests_and_fixtures( - self, - receive_stream: MemoryObjectReceiveStream[ - tuple[Awaitable[T_Retval], asyncio.Future[T_Retval]] - ], - ) -> None: - from _pytest.outcomes import OutcomeException - - with receive_stream, self._send_stream: - async for coro, future in receive_stream: - try: - retval = await coro - except CancelledError as exc: - if not future.cancelled(): - future.cancel(*exc.args) - - raise - except BaseException as exc: - if not future.cancelled(): - future.set_exception(exc) - - if not isinstance(exc, (Exception, OutcomeException)): - raise - else: - if not future.cancelled(): - future.set_result(retval) - - async def _call_in_runner_task( - self, - func: Callable[P, Awaitable[T_Retval]], - /, - *args: P.args, - **kwargs: P.kwargs, - ) -> T_Retval: - if not self._runner_task: - self._send_stream, receive_stream = create_memory_object_stream[ - tuple[Awaitable[Any], asyncio.Future] - ](1) - self._runner_task = self.get_loop().create_task( - self._run_tests_and_fixtures(receive_stream) - ) - - coro = func(*args, **kwargs) - future: asyncio.Future[T_Retval] = self.get_loop().create_future() - self._send_stream.send_nowait((coro, future)) - return await future - - def run_asyncgen_fixture( - self, - fixture_func: Callable[..., AsyncGenerator[T_Retval, Any]], - kwargs: dict[str, Any], - ) -> Iterable[T_Retval]: - asyncgen = fixture_func(**kwargs) - fixturevalue: T_Retval = self.get_loop().run_until_complete( - self._call_in_runner_task(asyncgen.asend, None) - ) - self._raise_async_exceptions() - - yield fixturevalue - - try: - self.get_loop().run_until_complete( - self._call_in_runner_task(asyncgen.asend, None) - ) - except StopAsyncIteration: - self._raise_async_exceptions() - else: - self.get_loop().run_until_complete(asyncgen.aclose()) - raise RuntimeError("Async generator fixture did not stop") - - def run_fixture( - self, - fixture_func: Callable[..., Coroutine[Any, Any, T_Retval]], - kwargs: dict[str, Any], - ) -> T_Retval: - retval = self.get_loop().run_until_complete( - self._call_in_runner_task(fixture_func, **kwargs) - ) - self._raise_async_exceptions() - return retval - - def run_test( - self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] - ) -> None: - from _pytest.outcomes import OutcomeException - - try: - self.get_loop().run_until_complete( - self._call_in_runner_task(test_func, **kwargs) - ) - except Exception as exc: - self._exceptions.append(exc) - except OutcomeException: - raise - except BaseException: - # A BaseException (e.g. KeyboardInterrupt, SystemExit) interrupted the event loop before - # the test completed. Cancel _runner_task so it does not resume when the event - # loop is re-entered during async generator fixture teardown. - if self._runner_task is not None and not self._runner_task.done(): - self._runner_task.cancel() - self._send_stream.close() - try: - self.get_loop().run_until_complete(self._runner_task) - except CancelledError: - pass - finally: - self._runner_task = None - raise - self._raise_async_exceptions() - - -class _ProcessStreamProtocol(asyncio.subprocess.SubprocessStreamProtocol): - """ - A subprocess protocol that allows us to be notified of ``process_exited`` - - asyncio's own ``Process.wait()`` only resolves once every pipe transport has - disconnected so to get same semantics as on trio and uvloop we need this. - """ - - def __init__(self) -> None: - # Match the standard factory for asyncio.create_process - super().__init__(limit=2**16, loop=asyncio.get_running_loop()) - self.exited = asyncio.Event() - - def process_exited(self) -> None: - super().process_exited() - self.exited.set() - - -class AsyncIOBackend(AsyncBackend): - @classmethod - def run( - cls, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - args: tuple[Unpack[PosArgsT]], - kwargs: dict[str, Any], - options: dict[str, Any], - ) -> T_Retval: - @wraps(func) - async def wrapper() -> T_Retval: - task = cast(asyncio.Task, current_task()) - task.set_name(get_callable_name(func)) - _task_states[task] = TaskState(None, None) - - try: - return await func(*args) - finally: - del _task_states[task] - - debug = options.get("debug", None) - loop_factory = options.get("loop_factory", None) - if loop_factory is None and options.get("use_uvloop", False): - if sys.platform != "win32": - import uvloop - - loop_factory = uvloop.new_event_loop - else: - import winloop - - loop_factory = winloop.new_event_loop - - with Runner(debug=debug, loop_factory=loop_factory) as runner: - return runner.run(wrapper()) - - @classmethod - def current_token(cls) -> object: - return get_running_loop() - - @classmethod - def current_time(cls) -> float: - return get_running_loop().time() - - @classmethod - def cancelled_exception_class(cls) -> type[BaseException]: - return CancelledError - - @classmethod - async def checkpoint(cls) -> None: - await sleep(0) - - @classmethod - async def checkpoint_if_cancelled(cls) -> None: - task = current_task() - if task is None: - return - - try: - cancel_scope = _task_states[task].cancel_scope - except KeyError: - return - - while cancel_scope: - if cancel_scope.cancel_called: - await sleep(0) - elif cancel_scope.shield: - break - else: - cancel_scope = cancel_scope._parent_scope - - @classmethod - async def cancel_shielded_checkpoint(cls) -> None: - with CancelScope(shield=True): - await sleep(0) - - @classmethod - async def sleep(cls, delay: float) -> None: - await sleep(delay) - - @classmethod - def create_cancel_scope( - cls, *, deadline: float = math.inf, shield: bool = False - ) -> CancelScope: - return CancelScope(deadline=deadline, shield=shield) - - @classmethod - def current_effective_deadline(cls) -> float: - if (task := current_task()) is None: - return math.inf - - try: - cancel_scope = _task_states[task].cancel_scope - except KeyError: - return math.inf - - deadline = math.inf - while cancel_scope: - deadline = min(deadline, cancel_scope.deadline) - if cancel_scope._cancel_called: - deadline = -math.inf - break - elif cancel_scope.shield: - break - else: - cancel_scope = cancel_scope._parent_scope - - return deadline - - @classmethod - def create_task_group(cls) -> abc.TaskGroup: - return TaskGroup() - - @classmethod - def create_event(cls) -> BaseEvent: - return Event() - - @classmethod - def create_lock(cls, *, fast_acquire: bool) -> BaseLock: - return Lock(fast_acquire=fast_acquire) - - @classmethod - def create_semaphore( - cls, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> BaseSemaphore: - return Semaphore(initial_value, max_value=max_value, fast_acquire=fast_acquire) - - @classmethod - def create_capacity_limiter(cls, total_tokens: float) -> BaseCapacityLimiter: - return CapacityLimiter(total_tokens) - - @classmethod - async def run_sync_in_worker_thread( # type: ignore[return] - cls, - func: Callable[[Unpack[PosArgsT]], T_Retval], - args: tuple[Unpack[PosArgsT]], - abandon_on_cancel: bool = False, - limiter: BaseCapacityLimiter | None = None, - ) -> T_Retval: - await cls.checkpoint() - - # If this is the first run in this event loop thread, set up the necessary - # variables - try: - idle_workers = _threadpool_idle_workers.get() - workers = _threadpool_workers.get() - except LookupError: - idle_workers = deque() - workers = set() - _threadpool_idle_workers.set(idle_workers) - _threadpool_workers.set(workers) - - async with limiter or cls.current_default_thread_limiter(): - with CancelScope(shield=not abandon_on_cancel) as scope: - future = asyncio.Future[T_Retval]() - root_task = find_root_task() - if not idle_workers: - worker = WorkerThread(root_task, workers, idle_workers) - worker.start() - workers.add(worker) - root_task.add_done_callback(worker.stop, context=Context()) - else: - worker = idle_workers.pop() - - # Prune any other workers that have been idle for MAX_IDLE_TIME - # seconds or longer - now = cls.current_time() - while idle_workers: - if ( - now - idle_workers[0].idle_since - < WorkerThread.MAX_IDLE_TIME - ): - break - - expired_worker = idle_workers.popleft() - expired_worker.root_task.remove_done_callback( - expired_worker.stop - ) - expired_worker.stop() - - context = copy_context() - context.run(set_current_async_library, None) - if abandon_on_cancel or scope._parent_scope is None: - worker_scope = scope - else: - worker_scope = scope._parent_scope - - worker.queue.put_nowait((context, func, args, future, worker_scope)) - return await future - - @classmethod - def check_cancelled(cls) -> None: - scope: CancelScope | None = threadlocals.current_cancel_scope - while scope is not None: - if scope.cancel_called: - raise CancelledError(f"Cancelled via cancel scope {id(scope):x}") - - if scope.shield: - return - - scope = scope._parent_scope - - @classmethod - def run_async_from_thread( - cls, - func: Callable[[Unpack[PosArgsT]], Coroutine[Any, Any, T_co]], - args: tuple[Unpack[PosArgsT]], - token: object, - ) -> T_co: - async def task_wrapper() -> T_co: - __tracebackhide__ = True - if scope is not None: - task = cast(asyncio.Task, current_task()) - _task_states[task] = TaskState(None, scope) - scope._tasks.add(task) - try: - return await func(*args) - except CancelledError as exc: - raise concurrent.futures.CancelledError(str(exc)) from None - finally: - if scope is not None: - scope._tasks.discard(task) - - loop = cast( - "AbstractEventLoop", token or threadlocals.current_token.native_token - ) - if loop.is_closed(): - raise RunFinishedError - - context = copy_context() - context.run(set_current_async_library, "asyncio") - scope = getattr(threadlocals, "current_cancel_scope", None) - f: concurrent.futures.Future[T_co] = context.run( - asyncio.run_coroutine_threadsafe, task_wrapper(), loop=loop - ) - return f.result() - - @classmethod - def run_sync_from_thread( - cls, - func: Callable[[Unpack[PosArgsT]], T_Retval], - args: tuple[Unpack[PosArgsT]], - token: object, - ) -> T_Retval: - @wraps(func) - def wrapper() -> None: - try: - set_current_async_library("asyncio") - f.set_result(func(*args)) - except BaseException as exc: - f.set_exception(exc) - if not isinstance(exc, Exception): - raise - - loop = cast( - "AbstractEventLoop", token or threadlocals.current_token.native_token - ) - if loop.is_closed(): - raise RunFinishedError - - f: concurrent.futures.Future[T_Retval] = Future() - loop.call_soon_threadsafe(wrapper) - return f.result() - - @classmethod - async def open_process( - cls, - command: StrOrBytesPath | Sequence[StrOrBytesPath], - *, - stdin: int | IO[Any] | None, - stdout: int | IO[Any] | None, - stderr: int | IO[Any] | None, - **kwargs: Any, - ) -> Process: - await cls.checkpoint() - if isinstance(command, PathLike): - command = os.fspath(command) - - # Use loop.subprocess_shell()/subprocess_exec() rather than their - # asyncio.create_subprocess_*() counterparts to get access to - # transport/protocol. - loop = asyncio.get_running_loop() - if isinstance(command, (str, bytes)): - transport, protocol = await loop.subprocess_shell( - _ProcessStreamProtocol, - command, - stdin=stdin, - stdout=stdout, - stderr=stderr, - **kwargs, - ) - else: - transport, protocol = await loop.subprocess_exec( - _ProcessStreamProtocol, - *command, - stdin=stdin, - stdout=stdout, - stderr=stderr, - **kwargs, - ) - - process = asyncio.subprocess.Process(transport, protocol, loop) - stdin_stream = StreamWriterWrapper(process.stdin) if process.stdin else None - stdout_stream = StreamReaderWrapper(process.stdout) if process.stdout else None - stderr_stream = StreamReaderWrapper(process.stderr) if process.stderr else None - return Process( - process, - stdin_stream, - stdout_stream, - stderr_stream, - protocol.exited, - transport, - ) - - @classmethod - def setup_process_pool_exit_at_shutdown(cls, workers: set[abc.Process]) -> None: - create_task( - _shutdown_process_pool_on_exit(workers), - name="AnyIO process pool shutdown task", - ) - find_root_task().add_done_callback( - partial(_forcibly_shutdown_process_pool_on_exit, workers) # type:ignore[arg-type] - ) - - @classmethod - async def connect_tcp( - cls, host: str, port: int, local_address: IPSockAddrType | None = None - ) -> abc.SocketStream: - transport, protocol = cast( - tuple[asyncio.Transport, StreamProtocol], - await get_running_loop().create_connection( - StreamProtocol, host, port, local_addr=local_address - ), - ) - transport.pause_reading() - return SocketStream(transport, protocol) - - @classmethod - async def connect_unix(cls, path: str | bytes) -> abc.UNIXSocketStream: - await cls.checkpoint() - loop = get_running_loop() - raw_socket = socket.socket(socket.AF_UNIX) - raw_socket.setblocking(False) - while True: - try: - raw_socket.connect(path) - except BlockingIOError: - f: asyncio.Future = asyncio.Future() - loop.add_writer(raw_socket, f.set_result, None) - f.add_done_callback(lambda _: loop.remove_writer(raw_socket)) - await f - except BaseException: - raw_socket.close() - raise - else: - return UNIXSocketStream(raw_socket) - - @classmethod - def create_tcp_listener(cls, sock: socket.socket) -> SocketListener: - return TCPSocketListener(sock) - - @classmethod - def create_unix_listener(cls, sock: socket.socket) -> SocketListener: - return UNIXSocketListener(sock) - - @classmethod - async def create_udp_socket( - cls, - family: AddressFamily, - local_address: IPSockAddrType | None, - remote_address: IPSockAddrType | None, - reuse_port: bool, - ) -> UDPSocket | ConnectedUDPSocket: - transport, protocol = await get_running_loop().create_datagram_endpoint( - DatagramProtocol, - local_addr=local_address, - remote_addr=remote_address, - family=family, - reuse_port=reuse_port, - ) - if protocol.exception: - transport.close() - raise protocol.exception - - if not remote_address: - return UDPSocket(transport, protocol) - else: - return ConnectedUDPSocket(transport, protocol) - - @classmethod - async def create_unix_datagram_socket( # type: ignore[override] - cls, raw_socket: socket.socket, remote_path: str | bytes | None - ) -> abc.UNIXDatagramSocket | abc.ConnectedUNIXDatagramSocket: - await cls.checkpoint() - loop = get_running_loop() - - if remote_path: - while True: - try: - raw_socket.connect(remote_path) - except BlockingIOError: - f: asyncio.Future = asyncio.Future() - loop.add_writer(raw_socket, f.set_result, None) - f.add_done_callback(lambda _: loop.remove_writer(raw_socket)) - await f - except BaseException: - raw_socket.close() - raise - else: - return ConnectedUNIXDatagramSocket(raw_socket) - else: - return UNIXDatagramSocket(raw_socket) - - @classmethod - async def getaddrinfo( - cls, - host: bytes | str | None, - port: str | int | None, - *, - family: int | AddressFamily = 0, - type: int | SocketKind = 0, - proto: int = 0, - flags: int = 0, - ) -> Sequence[ - tuple[ - AddressFamily, - SocketKind, - int, - str, - tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], - ] - ]: - return await get_running_loop().getaddrinfo( - host, port, family=family, type=type, proto=proto, flags=flags - ) - - @classmethod - async def getnameinfo( - cls, sockaddr: IPSockAddrType, flags: int = 0 - ) -> tuple[str, str]: - return await get_running_loop().getnameinfo(sockaddr, flags) - - @classmethod - async def wait_readable(cls, obj: FileDescriptorLike) -> None: - try: - read_events = _read_events.get() - except LookupError: - read_events = {} - _read_events.set(read_events) - - fd = obj if isinstance(obj, int) else obj.fileno() - if read_events.get(fd): - raise BusyResourceError("reading from") - - loop = get_running_loop() - fut: asyncio.Future[bool] = loop.create_future() - - def cb() -> None: - try: - del read_events[fd] - except KeyError: - pass - else: - remove_reader(fd) - - try: - fut.set_result(True) - except asyncio.InvalidStateError: - pass - - try: - loop.add_reader(fd, cb) - except NotImplementedError: - from anyio._core._asyncio_selector_thread import get_selector - - selector = get_selector() - selector.add_reader(fd, cb) - remove_reader = selector.remove_reader - else: - remove_reader = loop.remove_reader - - read_events[fd] = fut - try: - success = await fut - finally: - try: - del read_events[fd] - except KeyError: - pass - else: - remove_reader(fd) - - if not success: - raise ClosedResourceError - - @classmethod - async def wait_writable(cls, obj: FileDescriptorLike) -> None: - try: - write_events = _write_events.get() - except LookupError: - write_events = {} - _write_events.set(write_events) - - fd = obj if isinstance(obj, int) else obj.fileno() - if write_events.get(fd): - raise BusyResourceError("writing to") - - loop = get_running_loop() - fut: asyncio.Future[bool] = loop.create_future() - - def cb() -> None: - try: - del write_events[fd] - except KeyError: - pass - else: - remove_writer(fd) - - try: - fut.set_result(True) - except asyncio.InvalidStateError: - pass - - try: - loop.add_writer(fd, cb) - except NotImplementedError: - from anyio._core._asyncio_selector_thread import get_selector - - selector = get_selector() - selector.add_writer(fd, cb) - remove_writer = selector.remove_writer - else: - remove_writer = loop.remove_writer - - write_events[fd] = fut - try: - success = await fut - finally: - try: - del write_events[fd] - except KeyError: - pass - else: - remove_writer(fd) - - if not success: - raise ClosedResourceError - - @classmethod - def notify_closing(cls, obj: FileDescriptorLike) -> None: - fd = obj if isinstance(obj, int) else obj.fileno() - loop = get_running_loop() - - try: - write_events = _write_events.get() - except LookupError: - pass - else: - try: - fut = write_events.pop(fd) - except KeyError: - pass - else: - try: - fut.set_result(False) - except asyncio.InvalidStateError: - pass - - try: - loop.remove_writer(fd) - except NotImplementedError: - from anyio._core._asyncio_selector_thread import get_selector - - get_selector().remove_writer(fd) - - try: - read_events = _read_events.get() - except LookupError: - pass - else: - try: - fut = read_events.pop(fd) - except KeyError: - pass - else: - try: - fut.set_result(False) - except asyncio.InvalidStateError: - pass - - try: - loop.remove_reader(fd) - except NotImplementedError: - from anyio._core._asyncio_selector_thread import get_selector - - get_selector().remove_reader(fd) - - @classmethod - async def wrap_listener_socket(cls, sock: socket.socket) -> SocketListener: - if hasattr(socket, "AF_UNIX") and sock.family == socket.AF_UNIX: - return UNIXSocketListener(sock) - - return TCPSocketListener(sock) - - @classmethod - async def wrap_stream_socket(cls, sock: socket.socket) -> SocketStream: - transport, protocol = await get_running_loop().create_connection( - StreamProtocol, sock=sock - ) - return SocketStream(transport, protocol) - - @classmethod - async def wrap_unix_stream_socket(cls, sock: socket.socket) -> UNIXSocketStream: - return UNIXSocketStream(sock) - - @classmethod - async def wrap_udp_socket(cls, sock: socket.socket) -> UDPSocket: - transport, protocol = await get_running_loop().create_datagram_endpoint( - DatagramProtocol, sock=sock - ) - return UDPSocket(transport, protocol) - - @classmethod - async def wrap_connected_udp_socket(cls, sock: socket.socket) -> ConnectedUDPSocket: - transport, protocol = await get_running_loop().create_datagram_endpoint( - DatagramProtocol, sock=sock - ) - return ConnectedUDPSocket(transport, protocol) - - @classmethod - async def wrap_unix_datagram_socket(cls, sock: socket.socket) -> UNIXDatagramSocket: - return UNIXDatagramSocket(sock) - - @classmethod - async def wrap_connected_unix_datagram_socket( - cls, sock: socket.socket - ) -> ConnectedUNIXDatagramSocket: - return ConnectedUNIXDatagramSocket(sock) - - @classmethod - def current_default_thread_limiter(cls) -> CapacityLimiter: - try: - return _default_thread_limiter.get() - except LookupError: - limiter = CapacityLimiter(40) - _default_thread_limiter.set(limiter) - return limiter - - @classmethod - def open_signal_receiver( - cls, *signals: Signals - ) -> AbstractContextManager[AsyncIterator[Signals]]: - return _SignalReceiver(signals) - - @classmethod - def get_current_task(cls) -> TaskInfo: - return AsyncIOTaskInfo(current_task()) # type: ignore[arg-type] - - @classmethod - def get_running_tasks(cls) -> Sequence[TaskInfo]: - return [AsyncIOTaskInfo(task) for task in all_tasks() if not task.done()] - - @classmethod - async def wait_all_tasks_blocked(cls) -> None: - await cls.checkpoint() - this_task = current_task() - while True: - for task in all_tasks(): - if task is this_task: - continue - - waiter = task._fut_waiter # type: ignore[attr-defined] - if waiter is None or waiter.done(): - await sleep(0.1) - break - else: - return - - @classmethod - def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: - return TestRunner(**options) - - -backend_class = AsyncIOBackend diff --git a/venv/lib/python3.11/site-packages/anyio/_backends/_trio.py b/venv/lib/python3.11/site-packages/anyio/_backends/_trio.py deleted file mode 100755 index 2e67786..0000000 --- a/venv/lib/python3.11/site-packages/anyio/_backends/_trio.py +++ /dev/null @@ -1,1473 +0,0 @@ -from __future__ import annotations - -import array -import math -import os -import socket -import sys -import types -import weakref -from collections.abc import ( - AsyncGenerator, - AsyncIterator, - Awaitable, - Callable, - Collection, - Coroutine, - Iterable, - Sequence, -) -from contextlib import AbstractContextManager -from contextvars import Context -from dataclasses import dataclass -from functools import partial, wraps -from io import IOBase -from os import PathLike -from signal import Signals -from socket import AddressFamily, SocketKind -from types import TracebackType -from typing import ( - IO, - TYPE_CHECKING, - Any, - Generic, - Literal, - NoReturn, - ParamSpec, - TypeVar, - cast, - overload, -) - -import trio.from_thread -import trio.lowlevel -from outcome import Error, Outcome, Value -from trio.lowlevel import ( - current_root_task, - current_task, - notify_closing, - wait_readable, - wait_writable, -) -from trio.socket import SocketType as TrioSocketType -from trio.to_thread import run_sync - -from .. import ( - CapacityLimiterStatistics, - EventStatistics, - LockStatistics, - RunFinishedError, - TaskInfo, - WouldBlock, - abc, -) -from .._core._eventloop import claim_worker_thread -from .._core._exceptions import ( - BrokenResourceError, - BusyResourceError, - ClosedResourceError, - EndOfStream, -) -from .._core._sockets import convert_ipv6_sockaddr -from .._core._streams import create_memory_object_stream -from .._core._synchronization import ( - CapacityLimiter as BaseCapacityLimiter, -) -from .._core._synchronization import Event as BaseEvent -from .._core._synchronization import Lock as BaseLock -from .._core._synchronization import ( - ResourceGuard, - SemaphoreStatistics, -) -from .._core._synchronization import Semaphore as BaseSemaphore -from .._core._tasks import CancelScope as BaseCancelScope -from .._core._tasks import TaskHandle -from ..abc import IPSockAddrType, UDPPacketType, UNIXDatagramPacketType -from ..abc._eventloop import AsyncBackend, StrOrBytesPath -from ..abc._tasks import T_contra, call_for_coroutine, get_callable_name, get_coro_name - -if TYPE_CHECKING: - from _typeshed import FileDescriptorLike - - from ..streams.memory import MemoryObjectSendStream - -if sys.version_info < (3, 15): - from typing_extensions import sentinel - -if sys.version_info >= (3, 11): - from typing import Self, TypeVarTuple, Unpack -else: - from exceptiongroup import BaseExceptionGroup - from typing_extensions import Self, TypeVarTuple, Unpack - -T = TypeVar("T") -T_Retval = TypeVar("T_Retval") -T_co = TypeVar("T_co", covariant=True) -T_SockAddr = TypeVar("T_SockAddr", str, IPSockAddrType) -PosArgsT = TypeVarTuple("PosArgsT") -P = ParamSpec("P") - - -def ensure_returns_coro( - func: Callable[P, Awaitable[T_Retval]], -) -> Callable[P, Coroutine[Any, Any, T_Retval]]: - @wraps(func) - def wrapper(*args: P.args, **kwargs: P.kwargs) -> Coroutine[Any, Any, T_Retval]: - awaitable = func(*args, **kwargs) - # Check the common case first. - if isinstance(awaitable, Coroutine): - return awaitable - elif not isinstance(awaitable, Awaitable): - # The user violated the type annotations. Still, we should pass this on to - # Trio so it can raise with an appropriate message. - return awaitable - else: - - @wraps(func) - async def inner_wrapper() -> T_Retval: - return await awaitable - - return inner_wrapper() - - return wrapper - - -# -# Event loop -# - -RunVar = trio.lowlevel.RunVar - - -# -# Timeouts and cancellation -# - - -class CancelScope(BaseCancelScope): - __slots__ = ("__original",) - - def __new__( - cls, original: trio.CancelScope | None = None, **kwargs: object - ) -> Self: - return object.__new__(cls) - - def __init__(self, original: trio.CancelScope | None = None, **kwargs: Any) -> None: - self.__original = original or trio.CancelScope(**kwargs) - - def __enter__(self) -> Self: - self.__original.__enter__() - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool: - return self.__original.__exit__(exc_type, exc_val, exc_tb) - - def cancel(self, reason: str | None = None) -> None: - self.__original.cancel(reason) - - @property - def deadline(self) -> float: - return self.__original.deadline - - @deadline.setter - def deadline(self, value: float) -> None: - self.__original.deadline = value - - @property - def cancel_called(self) -> bool: - return self.__original.cancel_called - - @property - def cancelled_caught(self) -> bool: - return self.__original.cancelled_caught - - @property - def shield(self) -> bool: - return self.__original.shield - - @shield.setter - def shield(self, value: bool) -> None: - self.__original.shield = value - - -# -# Task groups -# - -empty_start_value = sentinel("empty_start_value") - - -class _TrioTaskStatus(abc.TaskStatus[T_contra], Generic[T_contra]): - early_start_value: T_contra | object = empty_start_value - real_task_status: trio.TaskStatus[T_contra | None] | None = None - - def started(self, value: T_contra | None = None) -> None: - if self.real_task_status is None: - if self.early_start_value is not empty_start_value: - raise RuntimeError("called 'started' twice on the same task status") - - self.early_start_value = value - else: - self.real_task_status.started(value) - - -class TaskGroup(abc.TaskGroup): - def __init__(self) -> None: - self._entered = False - self._active = False - self._nursery_manager = trio.open_nursery(strict_exception_groups=True) - self.cancel_scope = None # type: ignore[assignment] - - async def __aenter__(self) -> Self: - if self._entered: - raise RuntimeError("TaskGroup cannot be entered more than once") - - self._entered = True - self._active = True - self._nursery = await self._nursery_manager.__aenter__() - self.cancel_scope = CancelScope(self._nursery.cancel_scope) - return self - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool: - try: - # trio.Nursery.__exit__ returns bool; .open_nursery has wrong type - return await self._nursery_manager.__aexit__(exc_type, exc_val, exc_tb) # type: ignore[return-value] - except BaseExceptionGroup as exc: - if not exc.split(trio.Cancelled)[1]: - raise trio.Cancelled._create() from exc - - raise - finally: - del exc_val, exc_tb - self._active = False - - def _check_active(self, coro: Coroutine | None = None) -> None: - if not self._active: - if coro is not None: - coro.close() - - raise RuntimeError( - "This task group is not active; no new tasks can be started." - ) - - def create_task( - self, - coro: Coroutine[Any, Any, T_co], - *, - name: object = None, - context: Context | None = None, - ) -> TaskHandle[T_co]: - if not isinstance(coro, Coroutine): - raise TypeError(f"expected a coroutine, got {coro.__class__.__qualname__}") - - self._check_active(coro) - final_name = get_coro_name(coro, name) - handle = TaskHandle(coro, final_name) - if context is not None: - context.run( - partial(self._nursery.start_soon, handle._run_coro, name=handle.name) - ) - else: - self._nursery.start_soon(handle._run_coro, name=handle.name) - - return handle - - async def start( - self, - func: Callable[[Unpack[PosArgsT]], Coroutine[Any, Any, T_co]], - *args: Unpack[PosArgsT], - name: object = None, - return_handle: Literal[False, True] = False, - ) -> Any: - handle: TaskHandle[T_co] - - async def run_coro_with_task_status( - *, task_status: trio.TaskStatus[Any] - ) -> None: - nonlocal handle - wrapper_task_status = _TrioTaskStatus() - coro = call_for_coroutine(func, args, task_status=wrapper_task_status) - if wrapper_task_status.early_start_value is not empty_start_value: - task_status.started(wrapper_task_status.early_start_value) - else: - wrapper_task_status.real_task_status = task_status - - handle = TaskHandle(coro, final_name) - await handle._run_coro() - - self._check_active() - final_name = get_callable_name(func, name) - start_value = await self._nursery.start( - run_coro_with_task_status, name=final_name - ) - if return_handle: - handle._start_value = start_value - return handle - else: - return start_value - - -# -# Subprocesses -# - - -@dataclass(eq=False) -class ReceiveStreamWrapper(abc.ByteReceiveStream): - _stream: trio.abc.ReceiveStream - - async def receive(self, max_bytes: int | None = None) -> bytes: - if max_bytes is not None and max_bytes < 1: - raise ValueError("max_bytes must be a positive integer") - - try: - data = await self._stream.receive_some(max_bytes) - except trio.ClosedResourceError as exc: - raise ClosedResourceError from exc.__cause__ - except trio.BrokenResourceError as exc: - raise BrokenResourceError from exc.__cause__ - - if data: - return bytes(data) - else: - raise EndOfStream - - async def aclose(self) -> None: - await self._stream.aclose() - - -@dataclass(eq=False) -class SendStreamWrapper(abc.ByteSendStream): - _stream: trio.abc.SendStream - - async def send(self, item: bytes) -> None: - try: - await self._stream.send_all(item) - except trio.ClosedResourceError as exc: - raise ClosedResourceError from exc.__cause__ - except trio.BrokenResourceError as exc: - raise BrokenResourceError from exc.__cause__ - - async def aclose(self) -> None: - await self._stream.aclose() - - -@dataclass(eq=False) -class Process(abc.Process): - _process: trio.Process - _stdin: abc.ByteSendStream | None - _stdout: abc.ByteReceiveStream | None - _stderr: abc.ByteReceiveStream | None - - async def aclose(self) -> None: - with CancelScope(shield=True): - if self._stdin: - await self._stdin.aclose() - if self._stdout: - await self._stdout.aclose() - if self._stderr: - await self._stderr.aclose() - - try: - await self.wait() - except BaseException: - self.kill() - with CancelScope(shield=True): - await self.wait() - raise - - async def wait(self) -> int: - return await self._process.wait() - - def terminate(self) -> None: - self._process.terminate() - - def kill(self) -> None: - self._process.kill() - - def send_signal(self, signal: Signals) -> None: - self._process.send_signal(signal) - - @property - def pid(self) -> int: - return self._process.pid - - @property - def returncode(self) -> int | None: - return self._process.returncode - - @property - def stdin(self) -> abc.ByteSendStream | None: - return self._stdin - - @property - def stdout(self) -> abc.ByteReceiveStream | None: - return self._stdout - - @property - def stderr(self) -> abc.ByteReceiveStream | None: - return self._stderr - - -class _ProcessPoolShutdownInstrument(trio.abc.Instrument): - def after_run(self) -> None: - super().after_run() - - -current_default_worker_process_limiter: trio.lowlevel.RunVar = RunVar( - "current_default_worker_process_limiter" -) - - -async def _shutdown_process_pool(workers: set[abc.Process]) -> None: - try: - await trio.sleep(math.inf) - except trio.Cancelled: - for process in workers: - if process.returncode is None: - process.kill() - - with CancelScope(shield=True): - for process in workers: - await process.aclose() - - -# -# Sockets and networking -# - - -class _TrioSocketMixin(Generic[T_SockAddr]): - def __init__(self, trio_socket: TrioSocketType) -> None: - self._trio_socket = trio_socket - self._closed = False - - def _check_closed(self) -> None: - if self._closed: - raise ClosedResourceError - if self._trio_socket.fileno() < 0: - raise BrokenResourceError - - @property - def _raw_socket(self) -> socket.socket: - return self._trio_socket._sock # type: ignore[attr-defined] - - async def aclose(self) -> None: - if self._trio_socket.fileno() >= 0: - self._closed = True - self._trio_socket.close() - - def _convert_socket_error(self, exc: BaseException) -> NoReturn: - if isinstance(exc, trio.ClosedResourceError): - raise ClosedResourceError from exc - elif self._trio_socket.fileno() < 0 and self._closed: - raise ClosedResourceError from None - elif isinstance(exc, OSError): - raise BrokenResourceError from exc - else: - raise exc - - -class SocketStream(_TrioSocketMixin, abc.SocketStream): - def __init__(self, trio_socket: TrioSocketType) -> None: - super().__init__(trio_socket) - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - - async def receive(self, max_bytes: int = 65536) -> bytes: - if max_bytes < 1: - raise ValueError("max_bytes must be a positive integer") - - with self._receive_guard: - try: - data = await self._trio_socket.recv(max_bytes) - except BaseException as exc: - self._convert_socket_error(exc) - - if data: - return data - else: - raise EndOfStream - - async def send(self, item: bytes) -> None: - with self._send_guard: - view = memoryview(item) - while view: - try: - bytes_sent = await self._trio_socket.send(view) - except BaseException as exc: - self._convert_socket_error(exc) - - view = view[bytes_sent:] - - async def send_eof(self) -> None: - self._trio_socket.shutdown(socket.SHUT_WR) - - -class UNIXSocketStream(SocketStream, abc.UNIXSocketStream): - async def receive_fds(self, msglen: int, maxfds: int) -> tuple[bytes, list[int]]: - if not isinstance(msglen, int) or msglen < 0: - raise ValueError("msglen must be a non-negative integer") - if not isinstance(maxfds, int) or maxfds < 1: - raise ValueError("maxfds must be a positive integer") - - fds = array.array("i") - await trio.lowlevel.checkpoint() - with self._receive_guard: - while True: - try: - message, ancdata, _flags, _addr = await self._trio_socket.recvmsg( - msglen, socket.CMSG_LEN(maxfds * fds.itemsize) - ) - except BaseException as exc: - self._convert_socket_error(exc) - else: - if not message and not ancdata: - raise EndOfStream - - break - - for cmsg_level, cmsg_type, cmsg_data in ancdata: - if cmsg_level != socket.SOL_SOCKET or cmsg_type != socket.SCM_RIGHTS: - raise RuntimeError( - f"Received unexpected ancillary data; message = {message!r}, " - f"cmsg_level = {cmsg_level}, cmsg_type = {cmsg_type}" - ) - - fds.frombytes(cmsg_data[: len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) - - return message, list(fds) - - async def send_fds(self, message: bytes, fds: Collection[int | IOBase]) -> None: - if not message: - raise ValueError("message must not be empty") - if not fds: - raise ValueError("fds must not be empty") - - filenos: list[int] = [] - for fd in fds: - if isinstance(fd, int): - filenos.append(fd) - elif isinstance(fd, IOBase): - filenos.append(fd.fileno()) - - fdarray = array.array("i", filenos) - await trio.lowlevel.checkpoint() - with self._send_guard: - while True: - try: - await self._trio_socket.sendmsg( - [message], - [ - ( - socket.SOL_SOCKET, - socket.SCM_RIGHTS, - fdarray, - ) - ], - ) - break - except BaseException as exc: - self._convert_socket_error(exc) - - -class TCPSocketListener(_TrioSocketMixin, abc.SocketListener): - def __init__(self, raw_socket: socket.socket): - super().__init__(trio.socket.from_stdlib_socket(raw_socket)) - self._accept_guard = ResourceGuard("accepting connections from") - - async def accept(self) -> SocketStream: - with self._accept_guard: - try: - trio_socket, _addr = await self._trio_socket.accept() - except BaseException as exc: - self._convert_socket_error(exc) - - trio_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - return SocketStream(trio_socket) - - -class UNIXSocketListener(_TrioSocketMixin, abc.SocketListener): - def __init__(self, raw_socket: socket.socket): - super().__init__(trio.socket.from_stdlib_socket(raw_socket)) - self._accept_guard = ResourceGuard("accepting connections from") - - async def accept(self) -> UNIXSocketStream: - with self._accept_guard: - try: - trio_socket, _addr = await self._trio_socket.accept() - except BaseException as exc: - self._convert_socket_error(exc) - - return UNIXSocketStream(trio_socket) - - -class UDPSocket(_TrioSocketMixin[IPSockAddrType], abc.UDPSocket): - def __init__(self, trio_socket: TrioSocketType) -> None: - super().__init__(trio_socket) - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - - async def receive(self) -> tuple[bytes, IPSockAddrType]: - with self._receive_guard: - try: - data, addr = await self._trio_socket.recvfrom(65536) - return data, convert_ipv6_sockaddr(addr) - except BaseException as exc: - self._convert_socket_error(exc) - - async def send(self, item: UDPPacketType) -> None: - with self._send_guard: - try: - await self._trio_socket.sendto(*item) - except BaseException as exc: - self._convert_socket_error(exc) - - -class ConnectedUDPSocket(_TrioSocketMixin[IPSockAddrType], abc.ConnectedUDPSocket): - def __init__(self, trio_socket: TrioSocketType) -> None: - super().__init__(trio_socket) - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - - async def receive(self) -> bytes: - with self._receive_guard: - try: - return await self._trio_socket.recv(65536) - except BaseException as exc: - self._convert_socket_error(exc) - - async def send(self, item: bytes) -> None: - with self._send_guard: - try: - await self._trio_socket.send(item) - except BaseException as exc: - self._convert_socket_error(exc) - - -class UNIXDatagramSocket(_TrioSocketMixin[str], abc.UNIXDatagramSocket): - def __init__(self, trio_socket: TrioSocketType) -> None: - super().__init__(trio_socket) - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - - async def receive(self) -> UNIXDatagramPacketType: - with self._receive_guard: - try: - data, addr = await self._trio_socket.recvfrom(65536) - return data, addr - except BaseException as exc: - self._convert_socket_error(exc) - - async def send(self, item: UNIXDatagramPacketType) -> None: - with self._send_guard: - try: - await self._trio_socket.sendto(*item) - except BaseException as exc: - self._convert_socket_error(exc) - - -class ConnectedUNIXDatagramSocket( - _TrioSocketMixin[str], abc.ConnectedUNIXDatagramSocket -): - def __init__(self, trio_socket: TrioSocketType) -> None: - super().__init__(trio_socket) - self._receive_guard = ResourceGuard("reading from") - self._send_guard = ResourceGuard("writing to") - - async def receive(self) -> bytes: - with self._receive_guard: - try: - return await self._trio_socket.recv(65536) - except BaseException as exc: - self._convert_socket_error(exc) - - async def send(self, item: bytes) -> None: - with self._send_guard: - try: - await self._trio_socket.send(item) - except BaseException as exc: - self._convert_socket_error(exc) - - -# -# Synchronization -# - - -class Event(BaseEvent): - __slots__ = ("__original",) - - def __new__(cls) -> Self: - return object.__new__(cls) - - def __init__(self) -> None: - self.__original = trio.Event() - - def is_set(self) -> bool: - return self.__original.is_set() - - async def wait(self) -> None: - return await self.__original.wait() - - def statistics(self) -> EventStatistics: - orig_statistics = self.__original.statistics() - return EventStatistics(tasks_waiting=orig_statistics.tasks_waiting) - - def set(self) -> None: - self.__original.set() - - -class Lock(BaseLock): - __slots__ = "__original", "_fast_acquire" - - def __new__(cls, *, fast_acquire: bool = False) -> Self: - return object.__new__(cls) - - def __init__(self, *, fast_acquire: bool = False) -> None: - self._fast_acquire = fast_acquire - self.__original = trio.Lock() - - @staticmethod - def _convert_runtime_error_msg(exc: RuntimeError) -> None: - if exc.args == ("attempt to re-acquire an already held Lock",): - exc.args = ("Attempted to acquire an already held Lock",) - - async def acquire(self) -> None: - if not self._fast_acquire: - try: - await self.__original.acquire() - except RuntimeError as exc: - self._convert_runtime_error_msg(exc) - raise - - return - - # This is the "fast path" where we don't let other tasks run - await trio.lowlevel.checkpoint_if_cancelled() - try: - self.__original.acquire_nowait() - except trio.WouldBlock: - await self.__original._lot.park() - except RuntimeError as exc: - self._convert_runtime_error_msg(exc) - raise - - def acquire_nowait(self) -> None: - try: - self.__original.acquire_nowait() - except trio.WouldBlock: - raise WouldBlock from None - except RuntimeError as exc: - self._convert_runtime_error_msg(exc) - raise - - def locked(self) -> bool: - return self.__original.locked() - - def release(self) -> None: - self.__original.release() - - def statistics(self) -> LockStatistics: - orig_statistics = self.__original.statistics() - owner = TrioTaskInfo(orig_statistics.owner) if orig_statistics.owner else None - return LockStatistics( - orig_statistics.locked, owner, orig_statistics.tasks_waiting - ) - - -class Semaphore(BaseSemaphore): - __slots__ = ("__original",) - - def __new__( - cls, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> Self: - return object.__new__(cls) - - def __init__( - self, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> None: - super().__init__(initial_value, max_value=max_value, fast_acquire=fast_acquire) - self.__original = trio.Semaphore(initial_value, max_value=max_value) - - async def acquire(self) -> None: - if not self._fast_acquire: - await self.__original.acquire() - return - - # This is the "fast path" where we don't let other tasks run - await trio.lowlevel.checkpoint_if_cancelled() - try: - self.__original.acquire_nowait() - except trio.WouldBlock: - await self.__original._lot.park() - - def acquire_nowait(self) -> None: - try: - self.__original.acquire_nowait() - except trio.WouldBlock: - raise WouldBlock from None - - @property - def max_value(self) -> int | None: - return self.__original.max_value - - @property - def value(self) -> int: - return self.__original.value - - def release(self) -> None: - self.__original.release() - - def statistics(self) -> SemaphoreStatistics: - orig_statistics = self.__original.statistics() - return SemaphoreStatistics(orig_statistics.tasks_waiting) - - -class CapacityLimiter(BaseCapacityLimiter): - __slots__ = ("__original",) - - def __new__( - cls, - total_tokens: float | None = None, - *, - original: trio.CapacityLimiter | None = None, - ) -> Self: - return object.__new__(cls) - - def __init__( - self, - total_tokens: float | None = None, - *, - original: trio.CapacityLimiter | None = None, - ) -> None: - if original is not None: - self.__original = original - else: - assert total_tokens is not None - self.__original = trio.CapacityLimiter(total_tokens) - - async def __aenter__(self) -> None: - return await self.__original.__aenter__() - - async def __aexit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> None: - await self.__original.__aexit__(exc_type, exc_val, exc_tb) - - @property - def total_tokens(self) -> float: - return self.__original.total_tokens - - @total_tokens.setter - def total_tokens(self, value: float) -> None: - self.__original.total_tokens = value - - @property - def borrowed_tokens(self) -> int: - return self.__original.borrowed_tokens - - @property - def available_tokens(self) -> float: - return self.__original.available_tokens - - def acquire_nowait(self) -> None: - try: - self.__original.acquire_nowait() - except trio.WouldBlock: - raise WouldBlock from None - - def acquire_on_behalf_of_nowait(self, borrower: object) -> None: - try: - self.__original.acquire_on_behalf_of_nowait(borrower) - except trio.WouldBlock: - raise WouldBlock from None - - async def acquire(self) -> None: - await self.__original.acquire() - - async def acquire_on_behalf_of(self, borrower: object) -> None: - await self.__original.acquire_on_behalf_of(borrower) - - def release(self) -> None: - return self.__original.release() - - def release_on_behalf_of(self, borrower: object) -> None: - return self.__original.release_on_behalf_of(borrower) - - def statistics(self) -> CapacityLimiterStatistics: - orig = self.__original.statistics() - return CapacityLimiterStatistics( - borrowed_tokens=orig.borrowed_tokens, - total_tokens=orig.total_tokens, - borrowers=tuple(orig.borrowers), - tasks_waiting=orig.tasks_waiting, - ) - - -_capacity_limiter_wrapper: trio.lowlevel.RunVar = RunVar("_capacity_limiter_wrapper") - - -# -# Signal handling -# - - -class _SignalReceiver: - _iterator: AsyncIterator[int] - - def __init__(self, signals: tuple[Signals, ...]): - self._signals = signals - - def __enter__(self) -> Self: - self._cm = trio.open_signal_receiver(*self._signals) - self._iterator = self._cm.__enter__() - return self - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: TracebackType | None, - ) -> bool | None: - return self._cm.__exit__(exc_type, exc_val, exc_tb) - - def __aiter__(self) -> _SignalReceiver: - return self - - async def __anext__(self) -> Signals: - signum = await self._iterator.__anext__() - return Signals(signum) - - -# -# Testing and debugging -# - - -class TestRunner(abc.TestRunner): - def __init__(self, **options: Any) -> None: - from queue import Queue - - self._call_queue: Queue[Callable[[], object]] = Queue() - self._send_stream: ( - MemoryObjectSendStream[tuple[Awaitable[Any], list[Outcome]]] | None - ) = None - self._options = options - - def __exit__( - self, - exc_type: type[BaseException] | None, - exc_val: BaseException | None, - exc_tb: types.TracebackType | None, - ) -> None: - if self._send_stream: - self._send_stream.close() - while self._send_stream is not None: - self._call_queue.get()() - - def is_running(self) -> bool: - return trio.lowlevel.in_trio_task() - - async def _run_tests_and_fixtures(self) -> None: - self._send_stream, receive_stream = create_memory_object_stream[ - tuple[Awaitable[Any], list[Outcome]] - ](1) - with receive_stream: - async for awaitable, outcome_holder in receive_stream: - try: - retval = await awaitable - except BaseException as exc: - outcome_holder.append(Error(exc)) - else: - outcome_holder.append(Value(retval)) - - def _main_task_finished(self, outcome: object) -> None: - self._send_stream = None - - def _call_in_runner_task( - self, - func: Callable[P, Awaitable[T_Retval]], - /, - *args: P.args, - **kwargs: P.kwargs, - ) -> T_Retval: - if self._send_stream is None: - trio.lowlevel.start_guest_run( - self._run_tests_and_fixtures, - run_sync_soon_threadsafe=self._call_queue.put, - done_callback=self._main_task_finished, - **self._options, - ) - while self._send_stream is None: - self._call_queue.get()() - - outcome_holder: list[Outcome] = [] - self._send_stream.send_nowait((func(*args, **kwargs), outcome_holder)) - while not outcome_holder: - self._call_queue.get()() - - return outcome_holder[0].unwrap() - - def run_asyncgen_fixture( - self, - fixture_func: Callable[..., AsyncGenerator[T_Retval, Any]], - kwargs: dict[str, Any], - ) -> Iterable[T_Retval]: - asyncgen = fixture_func(**kwargs) - fixturevalue: T_Retval = self._call_in_runner_task(asyncgen.asend, None) - - yield fixturevalue - - try: - self._call_in_runner_task(asyncgen.asend, None) - except StopAsyncIteration: - pass - else: - self._call_in_runner_task(asyncgen.aclose) - raise RuntimeError("Async generator fixture did not stop") - - def run_fixture( - self, - fixture_func: Callable[..., Coroutine[Any, Any, T_Retval]], - kwargs: dict[str, Any], - ) -> T_Retval: - return self._call_in_runner_task(fixture_func, **kwargs) - - def run_test( - self, test_func: Callable[..., Coroutine[Any, Any, Any]], kwargs: dict[str, Any] - ) -> None: - self._call_in_runner_task(test_func, **kwargs) - - -class TrioTaskInfo(TaskInfo): - def __init__(self, task: trio.lowlevel.Task): - parent_id = None - if task.parent_nursery and task.parent_nursery.parent_task: - parent_id = id(task.parent_nursery.parent_task) - - super().__init__(id(task), parent_id, task.name, task.coro) - self._task = weakref.proxy(task) - - def has_pending_cancellation(self) -> bool: - try: - return self._task._cancel_status.effectively_cancelled - except ReferenceError: - # If the task is no longer around, it surely doesn't have a cancellation - # pending - return False - - -class TrioBackend(AsyncBackend): - @classmethod - def run( - cls, - func: Callable[[Unpack[PosArgsT]], Awaitable[T_Retval]], - args: tuple[Unpack[PosArgsT]], - kwargs: dict[str, Any], - options: dict[str, Any], - ) -> T_Retval: - assert not kwargs, "unreachable, and not supported by Trio" - return trio.run(ensure_returns_coro(func), *args, **options) - - @classmethod - def current_token(cls) -> object: - return trio.lowlevel.current_trio_token() - - @classmethod - def current_time(cls) -> float: - return trio.current_time() - - @classmethod - def cancelled_exception_class(cls) -> type[BaseException]: - return trio.Cancelled - - @classmethod - async def checkpoint(cls) -> None: - await trio.lowlevel.checkpoint() - - @classmethod - async def checkpoint_if_cancelled(cls) -> None: - await trio.lowlevel.checkpoint_if_cancelled() - - @classmethod - async def cancel_shielded_checkpoint(cls) -> None: - await trio.lowlevel.cancel_shielded_checkpoint() - - @classmethod - async def sleep(cls, delay: float) -> None: - await trio.sleep(delay) - - @classmethod - def create_cancel_scope( - cls, *, deadline: float = math.inf, shield: bool = False - ) -> BaseCancelScope: - return CancelScope(deadline=deadline, shield=shield) - - @classmethod - def current_effective_deadline(cls) -> float: - return trio.current_effective_deadline() - - @classmethod - def create_task_group(cls) -> abc.TaskGroup: - return TaskGroup() - - @classmethod - def create_event(cls) -> BaseEvent: - return Event() - - @classmethod - def create_lock(cls, *, fast_acquire: bool) -> Lock: - return Lock(fast_acquire=fast_acquire) - - @classmethod - def create_semaphore( - cls, - initial_value: int, - *, - max_value: int | None = None, - fast_acquire: bool = False, - ) -> BaseSemaphore: - return Semaphore(initial_value, max_value=max_value, fast_acquire=fast_acquire) - - @classmethod - def create_capacity_limiter(cls, total_tokens: float) -> CapacityLimiter: - return CapacityLimiter(total_tokens) - - @classmethod - async def run_sync_in_worker_thread( - cls, - func: Callable[[Unpack[PosArgsT]], T_Retval], - args: tuple[Unpack[PosArgsT]], - abandon_on_cancel: bool = False, - limiter: BaseCapacityLimiter | None = None, - ) -> T_Retval: - def wrapper() -> T_Retval: - with claim_worker_thread(TrioBackend, token): - return func(*args) - - token = TrioBackend.current_token() - return await run_sync( - wrapper, - abandon_on_cancel=abandon_on_cancel, - limiter=cast(trio.CapacityLimiter, limiter), - ) - - @classmethod - def check_cancelled(cls) -> None: - trio.from_thread.check_cancelled() - - @classmethod - def run_async_from_thread( - cls, - func: Callable[[Unpack[PosArgsT]], Coroutine[Any, Any, T_co]], - args: tuple[Unpack[PosArgsT]], - token: object, - ) -> T_co: - trio_token = cast("trio.lowlevel.TrioToken | None", token) - try: - return trio.from_thread.run(func, *args, trio_token=trio_token) - except trio.RunFinishedError: - raise RunFinishedError from None - - @classmethod - def run_sync_from_thread( - cls, - func: Callable[[Unpack[PosArgsT]], T_Retval], - args: tuple[Unpack[PosArgsT]], - token: object, - ) -> T_Retval: - trio_token = cast("trio.lowlevel.TrioToken | None", token) - try: - return trio.from_thread.run_sync(func, *args, trio_token=trio_token) - except trio.RunFinishedError: - raise RunFinishedError from None - - @classmethod - async def open_process( - cls, - command: StrOrBytesPath | Sequence[StrOrBytesPath], - *, - stdin: int | IO[Any] | None, - stdout: int | IO[Any] | None, - stderr: int | IO[Any] | None, - **kwargs: Any, - ) -> Process: - def convert_item(item: StrOrBytesPath) -> str: - str_or_bytes = os.fspath(item) - if isinstance(str_or_bytes, str): - return str_or_bytes - else: - return os.fsdecode(str_or_bytes) - - if isinstance(command, (str, bytes, PathLike)): - process = await trio.lowlevel.open_process( - convert_item(command), - stdin=stdin, - stdout=stdout, - stderr=stderr, - shell=True, - **kwargs, - ) - else: - process = await trio.lowlevel.open_process( - [convert_item(item) for item in command], - stdin=stdin, - stdout=stdout, - stderr=stderr, - shell=False, - **kwargs, - ) - - stdin_stream = SendStreamWrapper(process.stdin) if process.stdin else None - stdout_stream = ReceiveStreamWrapper(process.stdout) if process.stdout else None - stderr_stream = ReceiveStreamWrapper(process.stderr) if process.stderr else None - return Process(process, stdin_stream, stdout_stream, stderr_stream) - - @classmethod - def setup_process_pool_exit_at_shutdown(cls, workers: set[abc.Process]) -> None: - trio.lowlevel.spawn_system_task(_shutdown_process_pool, workers) - - @classmethod - async def connect_tcp( - cls, host: str, port: int, local_address: IPSockAddrType | None = None - ) -> SocketStream: - family = socket.AF_INET6 if ":" in host else socket.AF_INET - trio_socket = trio.socket.socket(family) - trio_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) - if local_address: - await trio_socket.bind(local_address) - - try: - await trio_socket.connect((host, port)) - except BaseException: - trio_socket.close() - raise - - return SocketStream(trio_socket) - - @classmethod - async def connect_unix(cls, path: str | bytes) -> abc.UNIXSocketStream: - trio_socket = trio.socket.socket(socket.AF_UNIX) - try: - await trio_socket.connect(path) - except BaseException: - trio_socket.close() - raise - - return UNIXSocketStream(trio_socket) - - @classmethod - def create_tcp_listener(cls, sock: socket.socket) -> abc.SocketListener: - return TCPSocketListener(sock) - - @classmethod - def create_unix_listener(cls, sock: socket.socket) -> abc.SocketListener: - return UNIXSocketListener(sock) - - @classmethod - async def create_udp_socket( - cls, - family: socket.AddressFamily, - local_address: IPSockAddrType | None, - remote_address: IPSockAddrType | None, - reuse_port: bool, - ) -> UDPSocket | ConnectedUDPSocket: - trio_socket = trio.socket.socket(family=family, type=socket.SOCK_DGRAM) - - if reuse_port: - trio_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) - - if local_address: - await trio_socket.bind(local_address) - - if remote_address: - await trio_socket.connect(remote_address) - return ConnectedUDPSocket(trio_socket) - else: - return UDPSocket(trio_socket) - - @classmethod - @overload - async def create_unix_datagram_socket( - cls, raw_socket: socket.socket, remote_path: None - ) -> abc.UNIXDatagramSocket: ... - - @classmethod - @overload - async def create_unix_datagram_socket( - cls, raw_socket: socket.socket, remote_path: str | bytes - ) -> abc.ConnectedUNIXDatagramSocket: ... - - @classmethod - async def create_unix_datagram_socket( - cls, raw_socket: socket.socket, remote_path: str | bytes | None - ) -> abc.UNIXDatagramSocket | abc.ConnectedUNIXDatagramSocket: - trio_socket = trio.socket.from_stdlib_socket(raw_socket) - - if remote_path: - await trio_socket.connect(remote_path) - return ConnectedUNIXDatagramSocket(trio_socket) - else: - return UNIXDatagramSocket(trio_socket) - - @classmethod - async def getaddrinfo( - cls, - host: bytes | str | None, - port: str | int | None, - *, - family: int | AddressFamily = 0, - type: int | SocketKind = 0, - proto: int = 0, - flags: int = 0, - ) -> Sequence[ - tuple[ - AddressFamily, - SocketKind, - int, - str, - tuple[str, int] | tuple[str, int, int, int] | tuple[int, bytes], - ] - ]: - return await trio.socket.getaddrinfo(host, port, family, type, proto, flags) - - @classmethod - async def getnameinfo( - cls, sockaddr: IPSockAddrType, flags: int = 0 - ) -> tuple[str, str]: - return await trio.socket.getnameinfo(sockaddr, flags) - - @classmethod - async def wait_readable(cls, obj: FileDescriptorLike) -> None: - try: - await wait_readable(obj) - except trio.ClosedResourceError as exc: - raise ClosedResourceError().with_traceback(exc.__traceback__) from None - except trio.BusyResourceError: - raise BusyResourceError("reading from") from None - - @classmethod - async def wait_writable(cls, obj: FileDescriptorLike) -> None: - try: - await wait_writable(obj) - except trio.ClosedResourceError as exc: - raise ClosedResourceError().with_traceback(exc.__traceback__) from None - except trio.BusyResourceError: - raise BusyResourceError("writing to") from None - - @classmethod - def notify_closing(cls, obj: FileDescriptorLike) -> None: - notify_closing(obj) - - @classmethod - async def wrap_listener_socket(cls, sock: socket.socket) -> abc.SocketListener: - if hasattr(socket, "AF_UNIX") and sock.family == socket.AF_UNIX: - return UNIXSocketListener(sock) - - return TCPSocketListener(sock) - - @classmethod - async def wrap_stream_socket(cls, sock: socket.socket) -> SocketStream: - trio_sock = trio.socket.from_stdlib_socket(sock) - return SocketStream(trio_sock) - - @classmethod - async def wrap_unix_stream_socket(cls, sock: socket.socket) -> UNIXSocketStream: - trio_sock = trio.socket.from_stdlib_socket(sock) - return UNIXSocketStream(trio_sock) - - @classmethod - async def wrap_udp_socket(cls, sock: socket.socket) -> UDPSocket: - trio_sock = trio.socket.from_stdlib_socket(sock) - return UDPSocket(trio_sock) - - @classmethod - async def wrap_connected_udp_socket(cls, sock: socket.socket) -> ConnectedUDPSocket: - trio_sock = trio.socket.from_stdlib_socket(sock) - return ConnectedUDPSocket(trio_sock) - - @classmethod - async def wrap_unix_datagram_socket(cls, sock: socket.socket) -> UNIXDatagramSocket: - trio_sock = trio.socket.from_stdlib_socket(sock) - return UNIXDatagramSocket(trio_sock) - - @classmethod - async def wrap_connected_unix_datagram_socket( - cls, sock: socket.socket - ) -> ConnectedUNIXDatagramSocket: - trio_sock = trio.socket.from_stdlib_socket(sock) - return ConnectedUNIXDatagramSocket(trio_sock) - - @classmethod - def current_default_thread_limiter(cls) -> CapacityLimiter: - try: - return _capacity_limiter_wrapper.get() - except LookupError: - limiter = CapacityLimiter( - original=trio.to_thread.current_default_thread_limiter() - ) - _capacity_limiter_wrapper.set(limiter) - return limiter - - @classmethod - def open_signal_receiver( - cls, *signals: Signals - ) -> AbstractContextManager[AsyncIterator[Signals]]: - return _SignalReceiver(signals) - - @classmethod - def get_current_task(cls) -> TaskInfo: - task = current_task() - return TrioTaskInfo(task) - - @classmethod - def get_running_tasks(cls) -> Sequence[TaskInfo]: - root_task = current_root_task() - assert root_task - task_infos = [TrioTaskInfo(root_task)] - nurseries = root_task.child_nurseries - while nurseries: - new_nurseries: list[trio.Nursery] = [] - for nursery in nurseries: - for task in nursery.child_tasks: - task_infos.append(TrioTaskInfo(task)) - new_nurseries.extend(task.child_nurseries) - - nurseries = new_nurseries - - return task_infos - - @classmethod - async def wait_all_tasks_blocked(cls) -> None: - from trio.testing import wait_all_tasks_blocked - - await wait_all_tasks_blocked() - - @classmethod - def create_test_runner(cls, options: dict[str, Any]) -> TestRunner: - return TestRunner(**options) - - -backend_class = TrioBackend diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__init__.py b/venv/lib/python3.11/site-packages/anyio/_core/__init__.py deleted file mode 100755 index e69de29..0000000 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/__init__.cpython-311.pyc deleted file mode 100755 index 43baf1df7fdd6aacb8135dbef5363bf1d9a1de36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmZ3^%ge<81UIJ4$^y}kK?DpiLK&agfQ;!3DGb33nv8xc8H$*I{LdiCU;g?T`MIh3 zxrs%|`TAb@>G{U`i3J7vWvO{(`Z<|N`URCG8Tom}dWMGj#hE3kx&?{J*@@|?#rlbP zm6`ea@yYo`srvEpnR%Hd@$q^EmA^P_a`RJ4b5iY!Sb^q)Tu{spBt9@RGBSQ(fDuK^ GKrsMmRxdLE diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_asyncio_selector_thread.cpython-311.pyc deleted file mode 100755 index 0e847fd582b5098d4245c3c3627dd9fa6ec700e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9086 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 GGW}om%qtcE diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_concurrency_utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_concurrency_utils.cpython-311.pyc deleted file mode 100755 index 93856dd24519c279678a380a98ce16a9b9e9bd51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9565 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 CtloM6 diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_contextmanagers.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_contextmanagers.cpython-311.pyc deleted file mode 100755 index 13b6c259138c41e329acf6615b6a4ed8c8de60da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9672 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 CS-dj< diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_eventloop.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_eventloop.cpython-311.pyc deleted file mode 100755 index 84d6777240dcb678786ff6fc3adb46d3340ac173..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9338 zcmc&)eQX;?cAw=g$>o>$A=#E?TUlF*B}x`)$%#J{I~Uqf;v}{%wVj}*YtU=%%A!qj zh1sQL>7*X-;wyAT0;Fhy7?%bR`jI9LiZhB9IG_a%&Y%6GAYC3zETF<@k)rvh;2{lQ z=&!yvyGwB;%SC|#T@ByP&dkofee>qM-+QaSj6{M2j^;dJPpy1y7L#j>$dJR2`1vI%Gtl|Zq()RXPuh|1sG;V`BIZ+Wp!1MsvE z+_f{iv$QL_iz8)`we)VZC}DNC5;+N@0~XJH*}igQfT(*03H8D=JlVd>q%6#nJN#ub zu$Q@WIBac^l~b|3V|vi%;SCY1Q+Ace2sXC2w+pmnE`*wiXPt8jC_GwO4weC1q_ z?12Kw4k+EgQ4eyY>`*+)&Oh-eFDcSpUv^MAsSMr~vd=50l;`1mPhIe!}Z)v^M&`enQ>Xr^FLpyH+61=YAM7ftbPP0!F9 z`lZEvN+EAt(G7Y?GJvluoikj$YDSBitf)%vx;3XxcUnyO?FKVyS901Mlc6chRLc4F zaYuGnu2>9Tah`bf>LIBu<0}qF@F+nBhSp=7htoayraW*+_d;!b#|Fb7&8yOqG_93E zE>txtw48U86(u6V&rb;V-7lc^6Jj`h(Ck*5JKVBByA71OeJI?L@F{GR&v>`8|C9?5 zgKb1>;1cKVU-p)#28iKv<{<>O-0@}K5@#Sc_HmogT?Ve8eJK1A_o+t_fD*;~nb$q% zlJBP;*JzmSQ}UT->nO#)?E8J+Jm+j|xb`mz)u<71oQ4lMA}4qq-P{ zlFH2Hq*R!BhHgj&eap&&G8wZ4y)8sbSzJ#5t9+|s*=6*d|NIsf0L5lDC-6;K*5kute{+lIhes} zl*+muuO(z594qNwgOcip)!gVUs1vA_!EHi#XHS7WQiS#ex@$gvxo%F0$Qqv`w=C$;j+70bUTArIrgDtq7hRM=% z3&yNgK9U+APs6@c$Ixqnzt+=CeCZr$mYUA7jn7QS+yWg#?vNaWpMD(NMU{M?BD+)d z-gKikUGt}_%Pqorr@6JRzS^F1UzC7YrQUVE(RIEio^J^O?`dwWH~Ga-y?3I~JFya3 zi9A^g?Q9W0bac{YDDm-ZEz}QXEwQiV;o=$Y-Z6LpoGscsdaA{5Tw0C4<@xTe{~|zI zKGL(R<>w>2z7LXUU#;)h7dL=FsdpW3bRGXyz9wd#z|o50v$2vOk$82g>F=re_kQmq z@eyD%HqnSptaw|3;2mxDC2M`@FD|S^o6)_GqSC{twA!<3d~xCabM z00TXX1-9GYmMgl-j8NNe$oehV)08#pb85aYQ-DpcQ~(Bok+(gK?Eu(&SVqhla0oZN zt^!t6bjvDCCp~l+xH7$ZQB~)X9DM<>IofhO3oTpaXdqUykDKlK_Hu&&fn&0J?^&`# z%ZvtWNSE?*IjBW%tb%nw_g(wCv*I{fq$5L>zl5{i8+ zd?fxn{eHS8?B1@hNlj4!>s zYo+;;dbYxg3*up z56|Ay|7dzOQ;!{N#17VjLyh22P1v?DC2(ynd^l_{?z_`ac~+3|bOYs94OmKU@n4uA zAyR{Q#$}US$Y?{Fu)~}sumtWbZ6~<0R>GQL*tSa!2D7l#<}j4OoiYN9ISgvS_-zYN z^){AfC`WB;Lfe`$&||H-Z3bxuqC3gvM&Z7`t&jYG7b&g|Mkq>Z)sX(7LkKi9rQc2dHx}S-)tDS(ex=j;bOO(eVO7 z*!4=GXpF&|*+5B8f$biFX*O|h#u%n579H@SQ#80M@Y6A@s*-O)-PIp%RUwQg8Iykl zl~2eGviyu#^;L59_%cSJaEEhjj_DvN6ocqXaQayk%5&s0dH*>l>RKYJ9W!i<+&b6$ zCyYQx|0a*h#P}s!@k=TMS&q-N(QKhuFcwgfTcv2J14Ic-(KoHY=HU!;(# z;NHBd>ob*NaREaSrlQ-~l^0Uu6Snqw*`hE{Oq1|hrVn5vq)Px~q8>rkB+&-q?S(YM z_S!Ry>M}Sx*`hnpy?qCrhPgk0pS}#FN&tC14_0O8TJLbZccjrf(jq?ZVMbQMEe{{q zu@>HUuUHR{Ho~JdR-UXy`vCF0|y^P2R(lt9QWSm#=Yy^EY)*b*43#yd6gw@+}q~=-l+Zk zc1DdE70C`#Ho$@v>jL<<*aO2R>w4R;{l8c&b9Woaa%6ejJijGdeY^G1UepAgG>wWD+Y18+b+GAh`{R?qv^0Jdo>woX;i{(rHg}ZQFqWrCB&uMFMQy$a-mORx2Ag3kU|8_Whi&Q|YKoB+FaCWK?yZFnTII8xeWdKc&G8lgb9`JwnkTGTj3-gNtkWtek(RYp{IGF!cT! zemW{$l~|$oTJM;ZQ&@>WoZTWqpldC008;?xx#rmTFE9Vq<=-58y?*SC#<4f*V{bOb z-o!k>d6pJ9&vj$~2p{Qc#k}6ZwP^pnc0jz)B#CfWtk3f@6*GI|2oe&7vf668T*;oMJok4KE+0NXzXKa52LwkjG30btha`u6Y+aVXN-?`u-pC_JN^(zm8|)@sy}`#?p*1@Kgh!b;>~dPqwwIv z@L)ZBu)(ZMvwQD{Cjb)cK{OEGAkA=Wr|Jy{yPagQAnce(@UJmGbm|5wkSuwP{ObISP zWs?%X7t@O_?0vJncu!Y}&1sv92Gv#y6n^1Qd@#;}1jQ_s8m?R~n&LYQifPP;YYzH?`mK99*EK z{>lE%h~j_yR-o!27yQv1Froc^bQbESmnBl+RVLu7^Hnf$L6Q6?c3`#=jY_!Y?_Cq4 zkd=ER9)2huzQ3a`9&3olYEEhKMBEL7*h?jYRwlL|=fWf`m5|_ICnce5v zmuQz!GI@Lp{Ko<-h{eUF=-y2)16dS-5k-GzCB%| zOxCt9P4axrU7BQH&0U&gpyn=3lB#WA9+PCvT^{qk2H*YR{6oIK#`iac(b_iUv2e8Z zwDOpQtMK;|3;~z?_+X?{%^ab2NQ#ep_7YGl- z`>NvOP-5lShm%$Ur7AW;pv73Z%Kw7TJy{oS&P3ZyPSs6X4(l+@v?e4Y!D!>Md3G9q#>wTPQY#1m_I0^ATzYLVaa&~_I9JT~;kIeK) zA*Yud$x`LOK+~=YqV`?ha#p~VUW0t8qruz8a!1vT>2 z?_6>?LvbWqZrXBYjxO)H_wt^5{txx5&d#iaYxUaCU;X1=N%~*9sb6h=Ltej;kfiI9 zF6pu0si!W9CQo5z z+RRou#yeywA)S@<%7jWG%+%AFJ z1zb-I*CTMdf$L?vH|?cYe_S7UJvqKdj2Xn3eX;p_1#UlZ2V%HBfg1wuU<}tUaEE|X z*}$gf4hr01;Eu%R?Gw18z#U`zH_baBaQ6Xse+)Mya1Q|YU~J8U0+$EwA$D-nnui4L zOTZnE%~J*LVc-fe++l$m2JR7dc+;9k1nvZIUyjW?DsYbi_gD;fOix^p@?ZIsL?thK z9hzm?uI3uH<&5FJ{VcN>*Ib+9CZ#i-SuR@2Noy{j_>@HK(++>;?orKQr!SXSl_sC% zcCA{XMeCRBH{|u*Xk3?=G%o8BgkK(4#1<5i(PgZ zw=`2MT+* zDy&%avc+P>)@vrUbH(BhYnmBg(#4`~mx{#?q;)!k&(9A}+Z8rk(Rj%oe%_w4A05`J z)!`Xt%?z8yvm1ZtY&Z#36=1z}Hye2kW zaP4B%A6VcutLV&Gr3uw2gJDda73-)0UIl9^hNZdSi8je=Ro9$TZ7x=~F`Umr4%CX_ zOtNWhhB*NrI1$Zz2ne!zsnu5p;%-lfr2Yua3OaDf>yH5b(`MPsEJ|frPrjZTPwMTW zokqKDQMxRTr=U7nuiuwj|3uDNAfd_`;QaiZPQ_>pj-HHWL2TLOs*pBFY@k)D;fN)< zuMP&30Y~W6CYu)$BfK;w8CKcmDG*hH?+Gs=7e9I3L*rlM>(YY!YKXj&SV%Zeq9;&S zoZ~^(SLz^Vlm1H}q|i^gj0TVYr|70{m}W}D)W?zGsQbG(ra^S zRmMq)4a;zgMLvk$e9}ug%q)u=K1Ac%i^Y@1=j)AsVZL>N^Kk1`Er5&*1yf z1Hbu_-&#_Zlu!DGu9+)+=o$I-?7#hJN%_A_=g-n_r2i)~@Q2L6jozD?p_RwF zf8ave@W-fn?V(G}D_o^v`w1Kda7gj-bD?@u{t z@4mNAzj^lB*<0P2JzX0Tz?zil?7IC~TG}thN?w2$BqKT7SiP-Wgl9o+rp^ z@Ld%>w}fAK5mRx=>&F0N-UxoD?u~>8YJ;Imc|D^wXD%8yO$jND#7(od>T1pI?C5Hl+Z8xkb(SOGpeRW=76dk7cqP_D1XQYVgjVp&zVG!?T8RQa!HbBWA(;j- z^7?r+$gH?cMklJ;?=@jCIJn58kdb&-iK;$jMj#vNIdBreDxv~G7o4N2nMBQ;I^P8X za9@uNKS&7e5>ipuqlfXB7J4Ks`o7qKhPM0^ra3ehLh^C5?Oh&x{-ZMh{`Y3)g_X<; z%k{5dHpEsu^eAS3klI>o^R%;v=s8VNN~+5Ve2oy_0@y-I<+c}PsM|e2Un1!lCH%rG zV9s`t`zaH#vL2Pdk%;hx;E zkW#~Sd_5aMY&J6S(gl&>OsEJ?)JcT+vl`bi!LC%1e@z;u;RZU^`Zyi~ftoh|=qfq;0~iets-W`o0&z9#_X~i}~=CNC-jh9#So@zb5u0BZzL+ z_65leBS=JeXnz>q^TP->!n^0BSNaiVGzAt5a#Z_IL;HWEd|SGn_$lfoZw!zvSdefp z2X;XoLjadG9K&*4%_=cY!6m$HJ&1O^-LP@UX<1VW1=W0o&2kO1p4y2e zE81nFQmd#|tuhHaZI{(a%yyd7ba;28DTE(UU1xAz&?zrlF%BPwSgL!rL^91~0+j#8{La^@ zlfWzZIb?bxekU|BIi(HH+5zzG5v?4N@jH8)j?1`R_H$@}~MwBeK!zMV)Ak z$agosQ6_fz!31hR+tn4G!;U!tN|9oAH$iqc0(?4YLWIukb-8t%*LBV!_h6#Ba2|1v zhQhGaO#c_D%j_}&J9BQLUViy27>6cLDm*2{5YT$~LxiAU2WLO5F$Z}&X%uYB7Usie zRzr>>o{5ebKY9ImH0~`5jryO!%b>b2N;bf^k}4U1K$;>1z_{6{Fo=RGTzkzV0)>w! zChEc>AUIXAIo}uv-_u-N=#TO|Gz6D1#i3X&ZV0})z4qgIchLDWv>gIfdPq#?+epR< zbnQUhg>CS4fmV*_!ku+~@FEH~`bif#@np?qFWUB{TGg)*Uu)KYSnV-75B16!17+a? ziojf(2nxzz;}o13s%i8Pit7BQh=n1UO_m+yVatZ$FKac^RcAC4HRZ76EEd_$bWo(m z2~e2C8zo8V+Tnp@zeB<_YTBhs^G^nmHi(~?_-@g%XEno}Kww$3L~iC#u@#sH^XQ!Q zg^(t05oiAcZH~ZC@QcOSqsz(Q>ob!E?r`tB#_ZELZWmnid8nP(WXM2?!)Bm2W)l&@ zc9TsoU>{H+#Q@j@6N^y73bjIU*`kmkD8mGqs^FqKEu4YxAP|c)$`--N`jp06K^QNB zcZ|_Y2c!IYD+w2!>BvNZ^5vqxC{=DJupfOZq+js%g{drrsic{vh;1nA1|@i#a_*&i zDcoQ6xL6T8oS1Owtq5@rHl~UqBtkKLP;s$e{h!!8+!<^3R1xDC|J zO`~Mcs{{YIARahDp{Ml%K{?pw-^+KLBHz&vI<*xYflbq;do&@Xxe*%wdFYp0fAmFlgn7bl%xvWG|xB6=dlfPGzqkk*6M*60KCiORXRTp_+MM=q6qU&9EMYHkmj0rHEij$b`X-IAhaFn-zAC( z{Ckvi>e?acxid9LB@3kcYMkybO1k~$+?!;N6PW~l6Q!5Bc1UlxzmJA&&%{aoB3K8&d!8hCu;vMFy8ddly5{KTB87INttiTbjQmkH&0qUvrw&BzS(MI6EsL?Rc)P*t% z6%F}U2#A!53N!ip=wCs~LPhaLSwR=xxz0IWcgcoj_9OCwHd*3HLSPK^a!3B`VCm&s)Vt9@9oXW~-|L96N0v{Cb7=*a2I*W* ziE|0@nKbP;4we?^*s}D diff --git a/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_fileio.cpython-311.pyc b/venv/lib/python3.11/site-packages/anyio/_core/__pycache__/_fileio.cpython-311.pyc deleted file mode 100755 index 9c010b23d5c6247c39ebc0c80ed761cf1e336577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52799 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