diff --git a/CHANGES.rst b/CHANGES.rst index 965cb9427..b524f3472 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -7,6 +7,7 @@ v9.9.9 (unreleased) - fix: XMPP support on python 3.10 (#1771) - chore: bump actions/checkout version (#1772) - chore: bump actions/setup-python version (#1773) +- refactor: switch to pyproject.toml (#1753) v6.2.1 (2026-06-06) diff --git a/docs/contributing.rst b/docs/contributing.rst index 43a8d2c22..74462ea49 100644 --- a/docs/contributing.rst +++ b/docs/contributing.rst @@ -27,6 +27,28 @@ Clone you github fork repo locally and install errbot in development mode from t From there, anytime you execute `errbot` it will run from the checked out version of Errbot with all your local changes taken into account. +Updating the dependency lockfile +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Errbot ships a pinned dependency lockfile (``pylock.toml``) in `PEP 751`_ format, +generated by uv_ from the top-level dependencies declared in ``pyproject.toml``. +The lockfile is the source of truth for reproducible installs in CI and for +downstream consumers that want exact versions. + +Regenerate the lockfile any time you change a dependency in ``pyproject.toml`` (or +to refresh the pinned versions). From the root of the repository:: + + # Install uv if you don't have it (https://docs.astral.sh/uv/) + pip install uv + + # Recompile the lockfile from pyproject.toml, pinned to the project's + # minimum supported Python version so the resolution covers 3.10+. + uv pip compile pyproject.toml -o pylock.toml \ + --format pylock.toml --python-version 3.10 + +Commit the resulting ``pylock.toml`` alongside your ``pyproject.toml`` change in +the same pull request so the two stay in sync. + Preparing your pull request ^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -42,6 +64,56 @@ these guidelines as you open a pull request. * If you can, please add tests for your code. We know large parts of our codebase are missing tests, so we won't reject your code if it lacks tests, though. +Releasing Errbot +---------------- + +This section is for maintainers cutting a release. The flow assumes a CHANGES.rst +maintained by hand under a ``v9.9.9 (unreleased)`` heading on master. + +Cutting a release +~~~~~~~~~~~~~~~~~ + +1. **Open a release PR** that does two edits: + + - Bump ``errbot/version.py``:: + + VERSION = "X.Y.Z" + + - Rename the unreleased heading in ``CHANGES.rst`` from ``v9.9.9 (unreleased)`` + to ``vX.Y.Z (YYYY-MM-DD)`` and double-check the entries beneath it. + +2. **Let CI gate the change.** The test ``tests/release_metadata_test.py`` skips on the + ``9.9.9`` sentinel but, once ``version.py`` is bumped, asserts that ``CHANGES.rst`` + contains a section heading for the new version. A release PR that forgets the heading + rename will fail this test before it can merge. + +3. **Merge the release PR**, then run the release tooling from a clean checkout:: + + ./tools/releases.sh + + The script reruns the same pre-release gate, builds the sdist/wheel with + ``python -m build``, and calls ``twine`` to publish to PyPI. + +4. **Tag the commit** and push the tag:: + + git tag vX.Y.Z + git push origin vX.Y.Z + +5. **Return master to dev mode** in a follow-up PR: + + - Reset ``errbot/version.py`` to ``VERSION = "9.9.9"``. + - Add a fresh ``v9.9.9 (unreleased)`` heading at the top of ``CHANGES.rst``. + +After this, the gate test goes back to skipping on master and the next release +cycle starts. + +Refreshing the lockfile for a release +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If dependency pins have changed since the previous release, regenerate +``pylock.toml`` (see `Updating the dependency lockfile`_) and include the result +in the release PR. + Contributing documentation & making changes to the website ---------------------------------------------------------- @@ -94,3 +166,5 @@ to ask your question on Stack Overflow, `tagged errbot .. _repos.py: https://github.com/errbotio/errbot/blob/master/errbot/repos.py .. _`issue tracker`: https://github.com/errbotio/errbot/issues/ .. _Gitter: https://gitter.im/errbotio/errbot +.. _uv: https://docs.astral.sh/uv/ +.. _`PEP 751`: https://peps.python.org/pep-0751/ diff --git a/pylock.toml b/pylock.toml new file mode 100644 index 000000000..c55a8beef --- /dev/null +++ b/pylock.toml @@ -0,0 +1,551 @@ +# This file was autogenerated by uv via the following command: +# uv export --format pylock.toml --output-file pylock.toml +lock-version = "1.0" +created-by = "uv" +requires-python = ">=3.10" + +[[packages]] +name = "ansi" +version = "0.3.7" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/ed/58/9444d8e465858ae9cb2096aa48236ab5760ea9dbaac58e609f3b461776de/ansi-0.3.7.tar.gz", upload-time = 2024-01-22T00:52:48Z, size = 7926, hashes = { sha256 = "7e59108922259e03c54e4d93fc611bba0e756513086849708b86b6c80f8d4cd4" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/0e/44/8244b092c39aa39cb61afcb5d64f4a2a22bf9ab291d5f689a9406d158d04/ansi-0.3.7-py3-none-any.whl", upload-time = 2024-01-22T00:52:46Z, size = 9000, hashes = { sha256 = "bdd9e3c2dc3e4c8df8c2b745ca6f07f715aa4edee5ed4a5bcb29065da06a3f71" } }] + +[[packages]] +name = "blinker" +version = "1.9.0" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", upload-time = 2024-11-08T17:25:47Z, size = 22460, hashes = { sha256 = "b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", upload-time = 2024-11-08T17:25:46Z, size = 8458, hashes = { sha256 = "ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" } }] + +[[packages]] +name = "certifi" +version = "2026.6.17" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", upload-time = 2026-06-17T10:31:07Z, size = 134594, hashes = { sha256 = "024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", upload-time = 2026-06-17T10:31:06Z, size = 133289, hashes = { sha256 = "2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db" } }] + +[[packages]] +name = "cffi" +version = "2.1.0" +marker = "platform_python_implementation != 'PyPy'" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", upload-time = 2026-07-06T21:34:30Z, size = 531036, hashes = { sha256 = "efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9" } } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/e9/6d7724983b3d5a0908dbf74f64038ade77c18646ff6636ec7894fd392ce1/cffi-2.1.0-cp310-cp310-macosx_10_15_x86_64.whl", upload-time = 2026-07-06T21:32:09Z, size = 183837, hashes = { sha256 = "b65f590ef2a44640f9a05dbb548a429b4ade77913ce683ac8b1480777658a6c0" } }, + { url = "https://files.pythonhosted.org/packages/69/aa/24580a278de21fd7322635556334d9b535f1cbc00b0a3919447cdf464c65/cffi-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", upload-time = 2026-07-06T21:32:11Z, size = 184226, hashes = { sha256 = "164bff1657b2a74f0b6d54e11c9b375bc97b931f2ca9c43fcf875838da1570dd" } }, + { url = "https://files.pythonhosted.org/packages/88/a9/02cae418ec4beb282ace11958d9d4737793439d561fadc7e6d56f2e2b354/cffi-2.1.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", upload-time = 2026-07-06T21:32:12Z, size = 211107, hashes = { sha256 = "c941bb58d5a6e1c3892d86e42927ed6c180302f07e6d395d08c416e594b98b46" } }, + { url = "https://files.pythonhosted.org/packages/3b/30/c806937ed5e4c2c7ac30d9d6b76b5dc57ff8b75d83800d9bb11a8253cf2a/cffi-2.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", upload-time = 2026-07-06T21:32:13Z, size = 218733, hashes = { sha256 = "a016194dbe13d14ee9556e734b772d8d67b947092b268d757fd4290e3ba2dfc2" } }, + { url = "https://files.pythonhosted.org/packages/f9/cf/398272b8bbfd58aa314fda5a7f1cdbb26d1d78ae324a11211521315dd1f0/cffi-2.1.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", upload-time = 2026-07-06T21:32:15Z, size = 205543, hashes = { sha256 = "03e9810d18c646077e501f661b682fbf5dee4676048527ca3cffe66faa9960dd" } }, + { url = "https://files.pythonhosted.org/packages/45/ca/f91641185cdd90c36d317a9dc7f85e88ef8682d8b300977baff5e23c35d8/cffi-2.1.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", upload-time = 2026-07-06T21:32:16Z, size = 205460, hashes = { sha256 = "19c54ac121cad98450b4896fa9a43ee0180d57bc4bc911a33db6cab1efab6cd3" } }, + { url = "https://files.pythonhosted.org/packages/38/66/04781a77b411f0bb5b234d62c1814754ab75ebe455ccff1b08e8d7aae98f/cffi-2.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", upload-time = 2026-07-06T21:32:17Z, size = 218760, hashes = { sha256 = "4d433a51f1870e43a13b6732f92aaf540ff77c2015097c78556f75a2d6c030e0" } }, + { url = "https://files.pythonhosted.org/packages/d0/9a/bb1d5ed9c3fcae158e9f6391bf309c95d98c2ac37ed56573228471d0af5e/cffi-2.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", upload-time = 2026-07-06T21:32:19Z, size = 221230, hashes = { sha256 = "3d7f118b5adbfdfead90c25822690b02bc8074fba949bb7858bec4ebd55adb43" } }, + { url = "https://files.pythonhosted.org/packages/41/aa/3c1409cdd26094efacd1c36c66e0a6eb9d4296e4fd4f9901b8b2042f4323/cffi-2.1.0-cp310-cp310-musllinux_1_2_i686.whl", upload-time = 2026-07-06T21:32:20Z, size = 213524, hashes = { sha256 = "c5f5df567f6eb216de69be06ce55c8b714090fae02b18a3b40da8163b8c5fa9c" } }, + { url = "https://files.pythonhosted.org/packages/fa/75/74dfb7c3fc6ebbd408038476bd4c1d7e925c62614e7b9c534ecc34218288/cffi-2.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", upload-time = 2026-07-06T21:32:21Z, size = 220341, hashes = { sha256 = "11b3fb55f4f8ad92274ed26705f65d8f91457de71f5380061eb6d125a768fecd" } }, + { url = "https://files.pythonhosted.org/packages/70/b6/9003c33a3e7d2c1306f5962e646457dcfe5a8cd8fce6bbe02d7af25db783/cffi-2.1.0-cp310-cp310-win32.whl", upload-time = 2026-07-06T21:32:23Z, size = 174578, hashes = { sha256 = "9d72af0cf10a76a600a9690078fe31c63b9588c8e86bf9fd353f713c84b5db0f" } }, + { url = "https://files.pythonhosted.org/packages/8a/26/710688310447531c7a22f857c7f79d9855ec18b03e04494ced723fb37e2f/cffi-2.1.0-cp310-cp310-win_amd64.whl", upload-time = 2026-07-06T21:32:24Z, size = 185071, hashes = { sha256 = "fb62edb5bb52cca65fab91a63afa7561607120d26090a7e8fda6fb9f064726da" } }, + { url = "https://files.pythonhosted.org/packages/d3/67/85c89a59ba36a671e79638f44d466749f08179266a57e4f2ffdf92174072/cffi-2.1.0-cp311-cp311-macosx_10_15_x86_64.whl", upload-time = 2026-07-06T21:32:26Z, size = 183845, hashes = { sha256 = "02cb7ff33ded4f1532476731f89ede53e2e488a8e6205515a82144246ffa7dcc" } }, + { url = "https://files.pythonhosted.org/packages/ea/dd/e3b0baa2d3d6a857ac72b7efbf18e32e487c9cdafcc13049ad765495b15e/cffi-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", upload-time = 2026-07-06T21:32:28Z, size = 184186, hashes = { sha256 = "f5bce581e6b8c235e566a14768a943b172ada3ed73537bb0c0be1edee312d4e7" } }, + { url = "https://files.pythonhosted.org/packages/65/68/9f3ef890cf3c6ab97bd531c5677f67613d302165d16f8142b2811782a614/cffi-2.1.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", upload-time = 2026-07-06T21:32:29Z, size = 211892, hashes = { sha256 = "30b65779d598c370374fefabf138d456fd6f3216bfa7bedfab1ba82025b0cd93" } }, + { url = "https://files.pythonhosted.org/packages/22/d7/1a74539db16d8bfd839ff1515948948efbb162e574650fd3d846896eea95/cffi-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", upload-time = 2026-07-06T21:32:30Z, size = 218793, hashes = { sha256 = "88023dfe18799507b73f1dbb0d14326a17465de1bc9c9c7655c22845e9ddc3a2" } }, + { url = "https://files.pythonhosted.org/packages/ec/d1/9a5b7169499e8e8d8e636de70b97ac7c9447104d2ff1a2cd94790cea5162/cffi-2.1.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", upload-time = 2026-07-06T21:32:32Z, size = 205737, hashes = { sha256 = "0a96b74cda968eebbad56d973efe5098974f0a9fb323865bf99ea1fd24e3e64c" } }, + { url = "https://files.pythonhosted.org/packages/ba/b0/e131a9c41f10607926278453d9596163594fe1c4ebc46efe3b5e5b34eb84/cffi-2.1.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", upload-time = 2026-07-06T21:32:33Z, size = 204909, hashes = { sha256 = "a5781494d4d400a3f47f8f1da94b324f6e6b440a53387774002890a2a2f4b50f" } }, + { url = "https://files.pythonhosted.org/packages/fb/d2/4398416cd699b35167947c6e22aca52c47e69ad5695073c9f1f2c52e04aa/cffi-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", upload-time = 2026-07-06T21:32:35Z, size = 217883, hashes = { sha256 = "aa7a1b53a2a4452ada2d1b5dade9960b2522f1e61293a811a077439e39029565" } }, + { url = "https://files.pythonhosted.org/packages/a2/a5/d4fe77b589e5e82d43ebc809bf2e6474afe8e48e32ea050b9357645b6471/cffi-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", upload-time = 2026-07-06T21:32:36Z, size = 221251, hashes = { sha256 = "9d8272c0e483b024e1b9ad029821470ed8ec65631dbd90217469da0e7cd89f1c" } }, + { url = "https://files.pythonhosted.org/packages/22/f0/a2fc43084c0433caf7f461bccc013e28f848d04ee1c5ed7fce71423cf4d9/cffi-2.1.0-cp311-cp311-musllinux_1_2_i686.whl", upload-time = 2026-07-06T21:32:37Z, size = 214250, hashes = { sha256 = "7762faa47e8ff7eb80bd261d9a7d8eea2d8baa69de5e95b70c1f338bbe712f02" } }, + { url = "https://files.pythonhosted.org/packages/04/8c/b925975448cf20634a9fbd5efceb807219db452653648d2897c0989cab2d/cffi-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", upload-time = 2026-07-06T21:32:39Z, size = 219441, hashes = { sha256 = "89095c1968b4ba8285840e131bf2891b09ae137fe2146905acae0354fbce1b5e" } }, + { url = "https://files.pythonhosted.org/packages/eb/da/5c4918a2d61d86fa927d716cb3d8e4626ef8dc8f605a599d32f33897f59a/cffi-2.1.0-cp311-cp311-win32.whl", upload-time = 2026-07-06T21:32:40Z, size = 174496, hashes = { sha256 = "64c753a0f87a256020004f37a1c8c02c480e725f910f0b2a0f3f07debd1b2479" } }, + { url = "https://files.pythonhosted.org/packages/f9/c8/6c2de1d55cf35ef8b92885d5ef280790f0fb9634d87ea1cc315176aecd61/cffi-2.1.0-cp311-cp311-win_amd64.whl", upload-time = 2026-07-06T21:32:41Z, size = 185113, hashes = { sha256 = "4f26194e3d95e06501b942642855aed4f953d55e95d7d01b7c4483db3ecff458" } }, + { url = "https://files.pythonhosted.org/packages/9e/4e/e8d7cb5783f1841a3c8fb3a7735838d7484d08ec08c9f984b14cac1ac0e9/cffi-2.1.0-cp311-cp311-win_arm64.whl", upload-time = 2026-07-06T21:32:42Z, size = 179927, hashes = { sha256 = "35aaea0c7ee0e58a5cd8c2fd1a48fdf7ece0d2699b7ecdda08194e9ce5dd9b3d" } }, + { url = "https://files.pythonhosted.org/packages/1e/85/990925db5df586ec90beb97529c853497e7f85ba0234830447faf41c3057/cffi-2.1.0-cp312-cp312-macosx_10_15_x86_64.whl", upload-time = 2026-07-06T21:32:44Z, size = 184829, hashes = { sha256 = "df2b82571a1b30f58a87bf4e5a9e78d2b1eff6c6ce8fd3aa3757221f93f0863f" } }, + { url = "https://files.pythonhosted.org/packages/4b/92/e7bb136ad6b5352603732cf907ef862ca103f20f2031c1735a46300c20c9/cffi-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", upload-time = 2026-07-06T21:32:45Z, size = 184728, hashes = { sha256 = "78474632761faa0fb96f30b1c928c84ebcf68713cbb80d15bab09dfe61640fde" } }, + { url = "https://files.pythonhosted.org/packages/c3/c0/d1ec30ffb370f748f2fb54425972bfef9871e0132e82fb589c46b6676049/cffi-2.1.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", upload-time = 2026-07-06T21:32:48Z, size = 214815, hashes = { sha256 = "5972433ad71a9e46516584ef60a0fda12d9dc459938d1539c3ddecf9bdc1368d" } }, + { url = "https://files.pythonhosted.org/packages/1b/dc/5620cf930688be01f2d673804291de757a934c90b946dbdc3d84130c2ea4/cffi-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", upload-time = 2026-07-06T21:32:49Z, size = 222429, hashes = { sha256 = "b6422532152adf4e59b110cb2808cee7a033800952f5c036b4af047ee43199e7" } }, + { url = "https://files.pythonhosted.org/packages/4b/a4/77b53abbf7a1e0beb9637edbef2a94d15f9c822f591e85d439ffd91519a6/cffi-2.1.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", upload-time = 2026-07-06T21:32:51Z, size = 210315, hashes = { sha256 = "46b1c8db8f6122420f32d02fffb924c2fe9bc772d228c7c711748fff56aabb2b" } }, + { url = "https://files.pythonhosted.org/packages/58/0c/f528df19cc94b675087324d4760d9e6d5bfae97d6217aa4fac43de4f5fcc/cffi-2.1.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", upload-time = 2026-07-06T21:32:52Z, size = 208859, hashes = { sha256 = "d9fafc5aa2e2a39aaf7f8cc0c1f044a9b07fca12e558dca53a3cc5c654ad67a7" } }, + { url = "https://files.pythonhosted.org/packages/62/f2/c9522a81c32132799a1972c39f5c5f8b4c8b9f00488a23feaa6c06f07741/cffi-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", upload-time = 2026-07-06T21:32:53Z, size = 221844, hashes = { sha256 = "1e9f50d192a3e525b15a75ab5114e442d83d657b7ec29182a991bc9a88fd3a66" } }, + { url = "https://files.pythonhosted.org/packages/6e/28/bd53988b9833e8f8ad539d26f4c07a6b3f6bcb1e9e02e7ca038250b3428d/cffi-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", upload-time = 2026-07-06T21:32:54Z, size = 225287, hashes = { sha256 = "98fff996e983a36d3aa2eca83af40c5821202e7e6f32d13ae94e3d2286f10cfe" } }, + { url = "https://files.pythonhosted.org/packages/79/99/0d0fd37f055224085f42bbb2c022d002e17dde4a97972822327b07d84101/cffi-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", upload-time = 2026-07-06T21:32:56Z, size = 223681, hashes = { sha256 = "379de10ce1ba048b1448599d1b37b24caee16309d1ac98d3982fc997f768700b" } }, + { url = "https://files.pythonhosted.org/packages/b0/80/c138990aa2a70b1a269f6e06348729836d733d6f970867943f61d367f8cc/cffi-2.1.0-cp312-cp312-win32.whl", upload-time = 2026-07-06T21:32:57Z, size = 175269, hashes = { sha256 = "9b8f0f26ca4e7513c534d351eca551947d053fac438f2a04ac96d882909b0d3a" } }, + { url = "https://files.pythonhosted.org/packages/a8/eb/f636456ff21a83fc13c032b58cc5dde061691546ac79efa284b2989b7982/cffi-2.1.0-cp312-cp312-win_amd64.whl", upload-time = 2026-07-06T21:32:59Z, size = 185881, hashes = { sha256 = "c97f080ea627e2863524c5af3836e2270b5f5dfff1f104392b959f8df0c5d384" } }, + { url = "https://files.pythonhosted.org/packages/dd/2c/400ea43e721727dca8a65c4521390e9196757caba4a45643acb2b63271b8/cffi-2.1.0-cp312-cp312-win_arm64.whl", upload-time = 2026-07-06T21:33:02Z, size = 180088, hashes = { sha256 = "6d194185eabd279f1c05ebe3504265ddfc5ad2b58d0714f7db9f01da592e9eb6" } }, + { url = "https://files.pythonhosted.org/packages/96/88/a996879e2eeccb815f6e3a5967b12a308257412acec882039d386bd2aa7b/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", upload-time = 2026-07-06T21:33:03Z, size = 194331, hashes = { sha256 = "10537b1df4967ca26d21e5072d7d54188354483b91dc75058968d3f0cf13fbda" } }, + { url = "https://files.pythonhosted.org/packages/58/85/7ae00d5c8dd6266f4e944c3db630f3c5c9a98b61d469c714d848b1d8138a/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", upload-time = 2026-07-06T21:33:05Z, size = 196966, hashes = { sha256 = "a95b05f9baf29b91171b3a8bd2020b028835243e7b0ff6bb23e2a3c228518b1b" } }, + { url = "https://files.pythonhosted.org/packages/8c/e9/45c3a76ad8d43ad9261f4c95436da61128d3ca545d72b9612c0ab5be0b1c/cffi-2.1.0-cp313-cp313-macosx_10_15_x86_64.whl", upload-time = 2026-07-06T21:33:06Z, size = 184795, hashes = { sha256 = "15faec4adfff450819f3aee0e2e02c812de6edb88203aa58807955db2003472a" } }, + { url = "https://files.pythonhosted.org/packages/84/4c/82f132cb4418ee6d953d982b19191e87e2a6372c8a4ce36e50b69d6ade4a/cffi-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", upload-time = 2026-07-06T21:33:08Z, size = 184746, hashes = { sha256 = "716ff8ec22f20b4d988b12884086bcef0fc99737043e503f7a3935a6be99b1ea" } }, + { url = "https://files.pythonhosted.org/packages/a0/1c/4ed5a0e5bdca6cbc275556de3328dd1b76fd0c11cc13c88fe66d1d8715f2/cffi-2.1.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", upload-time = 2026-07-06T21:33:09Z, size = 214747, hashes = { sha256 = "63960549e4f8dc41e31accb97b975abaecfc44c03e396c093a6436763c2ea7db" } }, + { url = "https://files.pythonhosted.org/packages/3a/a6/e879bb68cc23a2bc9ba8f4b7d8019f0c2694bad2ab6c4a3701d429439f58/cffi-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", upload-time = 2026-07-06T21:33:10Z, size = 222392, hashes = { sha256 = "ff067a8d8d880e7809e4ac88eb009bb848870115317b306666502ccad30b147f" } }, + { url = "https://files.pythonhosted.org/packages/88/f6/01890cfd63c08f8eb96a8319b0443690197d240a8bd6346048cf7bde9190/cffi-2.1.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", upload-time = 2026-07-06T21:33:12Z, size = 210285, hashes = { sha256 = "3b926723c13eba9f81d2ef3820d63aeceec3b2d4639906047bf675cb8a7a500d" } }, + { url = "https://files.pythonhosted.org/packages/a6/cf/2b684132056f438567b61e19d690dd31cd0921ace051e0a458be6074369e/cffi-2.1.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", upload-time = 2026-07-06T21:33:13Z, size = 208801, hashes = { sha256 = "47ff3a8bfd8cb9da1af7524b965127095055654c177fcfc7578debcb015eecd0" } }, + { url = "https://files.pythonhosted.org/packages/6f/08/f2e7d62c460faae0926f2d6e423694aa409ced3bc1fe2927a0a6e5f05416/cffi-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", upload-time = 2026-07-06T21:33:15Z, size = 221808, hashes = { sha256 = "799416bae98336e400981ff6e532d67d5c709cfb30afb79865a1315f94b0e224" } }, + { url = "https://files.pythonhosted.org/packages/38/37/04f54b8e63a02f3d908332c9effbf8c366167c6f733ed8a3d4f79b7e2a1e/cffi-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", upload-time = 2026-07-06T21:33:16Z, size = 225241, hashes = { sha256 = "961be50688f7fba2fa65f63712d3b9b341a22311f5253460ce933f52f0de1c8c" } }, + { url = "https://files.pythonhosted.org/packages/a9/d6/c72eecca433cd3e681c65ed313ab4835d9d4a379704d0f628a6a05f51c2e/cffi-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", upload-time = 2026-07-06T21:33:18Z, size = 223588, hashes = { sha256 = "bf5c6cf48238b0eb4c086978c492ad1cbc22373fc5b2d7353b3a598ce6db887a" } }, + { url = "https://files.pythonhosted.org/packages/c6/4b/e706f67279140f92939da3475ad610df18bfd52d50f14953a8e5fede71d5/cffi-2.1.0-cp313-cp313-win32.whl", upload-time = 2026-07-06T21:33:19Z, size = 175248, hashes = { sha256 = "db3eb7d46527159a878ec3460e9d40615bc25ba337d477db681aea6e4f05c5d2" } }, + { url = "https://files.pythonhosted.org/packages/5a/47/59eb7975cb0e4ef0afa764ea945b29a5bb4537a9f771cb7d6c8a5dd74c95/cffi-2.1.0-cp313-cp313-win_amd64.whl", upload-time = 2026-07-06T21:33:21Z, size = 185717, hashes = { sha256 = "8e74a6135550c4748af665b1b1118b6aab33b1fc6a16f9aff630af107c3b4512" } }, + { url = "https://files.pythonhosted.org/packages/5a/af/34fee85c48f8d94efc8597bc09470c9dd274c145f1c12e0fbc6ab6d38d74/cffi-2.1.0-cp313-cp313-win_arm64.whl", upload-time = 2026-07-06T21:33:22Z, size = 180114, hashes = { sha256 = "2282cd5e38aa8accd03e99d1256af8411c84cdbee6a89d841b563fdbd1f3e50f" } }, + { url = "https://files.pythonhosted.org/packages/d8/f0/81478e482afa03f6d18dc8f2afb5edc45b3080853b634b5ed91961be0998/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", upload-time = 2026-07-06T21:33:23Z, size = 194142, hashes = { sha256 = "d2117334c3af3bdcb9a88522b844a2bdb5efdc4f71c6c822df55486ae1c3347a" } }, + { url = "https://files.pythonhosted.org/packages/7d/95/8de304305cd9204974b0ca051b86d307cafca13aa575a0ef1b44d92c0d8c/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", upload-time = 2026-07-06T21:33:25Z, size = 196819, hashes = { sha256 = "702c436735fbe99d59ada02a1f65cfc0d31c0ee8b7290912f8fbc5cd1e4b16c3" } }, + { url = "https://files.pythonhosted.org/packages/20/71/7c8372d30e42415602ed9f268f7cfd66f1b855fed881ecd168bcb45dbc0b/cffi-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", upload-time = 2026-07-06T21:33:26Z, size = 184965, hashes = { sha256 = "1ff3456eab0d889592d1936d6125bbfbc7ae4d3354a700f8bd80450a66445d4d" } }, + { url = "https://files.pythonhosted.org/packages/d6/5c/584e626835f0375c928176c04137c96927165cb8733cdb3150ec04e5ee5e/cffi-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", upload-time = 2026-07-06T21:33:27Z, size = 184952, hashes = { sha256 = "c4165821e131d6d4ca444347c2b694e2311bcfa3fe5a861cc72968f28867beac" } }, + { url = "https://files.pythonhosted.org/packages/2e/d2/065fcae1c73979fac8e054462478d0ff8a29c40cdc2ed7ea5676a061df53/cffi-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", upload-time = 2026-07-06T21:33:29Z, size = 222353, hashes = { sha256 = "276f20fffd7b396e12516ba8edf9509210ac248cbbc5acbc39cd512f9f59ebe6" } }, + { url = "https://files.pythonhosted.org/packages/ed/a5/e8bbb1ce5b3ac2f53ad6a10bde44318a5a8d99d4f4a000d44a6e39aeb3e4/cffi-2.1.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", upload-time = 2026-07-06T21:33:30Z, size = 210051, hashes = { sha256 = "7d5980a3433d4b71a5e120f9dd551403d7824e31e2e67124fe2769c404c06913" } }, + { url = "https://files.pythonhosted.org/packages/28/ed/c127d3ac36e899c965e3361357c3befacd6578c03f40125183e41c3b219e/cffi-2.1.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", upload-time = 2026-07-06T21:33:31Z, size = 208630, hashes = { sha256 = "6ca4919c6e4f89aa99c42510b42cf54596892c00b3f9077f6bdd1505e24b9c8d" } }, + { url = "https://files.pythonhosted.org/packages/cc/d7/97d3136f81db489ec8d1d67748c110d6c994268fd7528014aa9f2b085e4e/cffi-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", upload-time = 2026-07-06T21:33:33Z, size = 221593, hashes = { sha256 = "d53d10f7da99ae46f7373b9150393e9c5eab9b224909982b43832668de4779f5" } }, + { url = "https://files.pythonhosted.org/packages/d3/27/93195977168ee63aed233a1a0993a2178798654d1f4bddcdd321d6fd3b21/cffi-2.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", upload-time = 2026-07-06T21:33:34Z, size = 225146, hashes = { sha256 = "c351efb95e832a853a29361675f33a7ce53de1a109cd73fd47af0712213aa4ce" } }, + { url = "https://files.pythonhosted.org/packages/b3/c1/6dbd291ee2ae5a50a034aa057207081f545923bbf15dad4511e985aafff5/cffi-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", upload-time = 2026-07-06T21:33:35Z, size = 223240, hashes = { sha256 = "dbf7c7a88e2bac086f06d14577332760bdeecc42bdec8ac4077f6260557d9326" } }, + { url = "https://files.pythonhosted.org/packages/0f/6f/ade5ce9863a57992a6ea3d0d10d7e29b8749fc127204b3d493d667b2815f/cffi-2.1.0-cp314-cp314-win32.whl", upload-time = 2026-07-06T21:33:51Z, size = 177723, hashes = { sha256 = "1854b724d00f6654c742097d5387569021be12d3a0f770eae1df8f8acfcc6acd" } }, + { url = "https://files.pythonhosted.org/packages/41/de/92b9eeed4ae4a21d6fd9b2a2c8505cbed573299902ea73981cc13f7ff62c/cffi-2.1.0-cp314-cp314-win_amd64.whl", upload-time = 2026-07-06T21:33:53Z, size = 187937, hashes = { sha256 = "1b96bfe2c4bd825681b7d311ad6d9b7280a091f43e8f63da5729638083cd3bfb" } }, + { url = "https://files.pythonhosted.org/packages/2e/1a/cc6ae6c2913a03aab8898eee57963cf1035b8df5872ed8b9115fcc7e2be8/cffi-2.1.0-cp314-cp314-win_arm64.whl", upload-time = 2026-07-06T21:33:54Z, size = 183001, hashes = { sha256 = "7d28dff1db6764108bc30788d85d61c876beff416d9a49cb9dd7c5a9f34f5804" } }, + { url = "https://files.pythonhosted.org/packages/14/f0/134c00ce0779ec86dea2aa1aac69339c2741a8045072676763512363a2ea/cffi-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", upload-time = 2026-07-06T21:33:36Z, size = 188538, hashes = { sha256 = "7ea6b3e2c4250ff1de21c630fe72d0f63eb95c2c32ffbf64a358cf4a8836d714" } }, + { url = "https://files.pythonhosted.org/packages/50/d8/3b86aba791cb610d24e8a3e1b2cd529e71fa15096b04e4d4e360049d4a4c/cffi-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", upload-time = 2026-07-06T21:33:38Z, size = 188230, hashes = { sha256 = "6af371f3767faeffc6ac1ef57cdfd25844403e9d3f476c5537caee499de96376" } }, + { url = "https://files.pythonhosted.org/packages/14/d0/117dcd9209255ad8571fbc8c92ef32593a1d294dcec91ddc4e4db50606f2/cffi-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", upload-time = 2026-07-06T21:33:39Z, size = 223899, hashes = { sha256 = "eb4e8997a49aa2c08a3e43c9045d224448b8941d88e7ac163c7d383e560cbf98" } }, + { url = "https://files.pythonhosted.org/packages/b6/3d/f20f8b886b254e3ad10e15cd4186d3aed49f3e6a35ab37aab9f8f25f7c03/cffi-2.1.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", upload-time = 2026-07-06T21:33:40Z, size = 211652, hashes = { sha256 = "bf01d8c84cbea96b944c73b22182e6c7c432b3475632b8111dbfdc95ddad6e13" } }, + { url = "https://files.pythonhosted.org/packages/28/3b/fad54de07260b93ddeef4b96d0131d57ea900675df1d410ae1deee52d7a6/cffi-2.1.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", upload-time = 2026-07-06T21:33:42Z, size = 210755, hashes = { sha256 = "33eb1ad83ebe8f313e0df035c406227d55a79456704a863fad9842136af5ad7d" } }, + { url = "https://files.pythonhosted.org/packages/cc/82/3d5c705acb7abbba9bbd7d79b8e62e0f25b6120eb7ae6ac49f1b721722fe/cffi-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", upload-time = 2026-07-06T21:33:43Z, size = 223933, hashes = { sha256 = "ac0f1a2d0cfa7eea3f2aaf006ab6e70e8feeb16b75d65b7e5939982ca2f11056" } }, + { url = "https://files.pythonhosted.org/packages/6c/d0/47e338384ab6b1004241002fa616301020cea4fc95f283506565d252f276/cffi-2.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", upload-time = 2026-07-06T21:33:45Z, size = 226749, hashes = { sha256 = "c16914df9fb7f500e440e6875fa23ff5e0b31db01fa9c06af98d59a91f0dc2e4" } }, + { url = "https://files.pythonhosted.org/packages/70/25/65bd5b58ea4bfdfc15cde02cb5365f89ef8ab8b2adfb8fe5c4bd4233382f/cffi-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", upload-time = 2026-07-06T21:33:46Z, size = 225703, hashes = { sha256 = "5ecbd0499275d57506d397eebe1981cee87b47fcd9ef5c22cab7ed7644a39a94" } }, + { url = "https://files.pythonhosted.org/packages/dc/78/aa01ac599a8a4322533d45a1f9bc93b338276d2d59dabbe7c6d92a775c81/cffi-2.1.0-cp314-cp314t-win32.whl", upload-time = 2026-07-06T21:33:47Z, size = 182857, hashes = { sha256 = "7d034dcffa09e9a46c93fa3a3be402096cb5354ac6e41ab8e5cc9cd8b642ad76" } }, + { url = "https://files.pythonhosted.org/packages/b9/26/d00496b22de4d4228f32dde94ad996f350c8aad676d63bcca0743c8dea4d/cffi-2.1.0-cp314-cp314t-win_amd64.whl", upload-time = 2026-07-06T21:33:48Z, size = 194065, hashes = { sha256 = "0582a58f3051372229ca8e7f5f589f9e5632678208d8636fea3676711fdf7fe5" } }, + { url = "https://files.pythonhosted.org/packages/d5/dd/0c7dbf815a579ff005008a2d815a55d6bb047c349eef536d9dc53d3f0a8d/cffi-2.1.0-cp314-cp314t-win_arm64.whl", upload-time = 2026-07-06T21:33:50Z, size = 186404, hashes = { sha256 = "510aeeeac94811b138077451da1fb18b308a5feab47dd2b603af55804155e1c8" } }, + { url = "https://files.pythonhosted.org/packages/55/c7/8c8c50cb11c6750051daf12164098a9a6f027ac4356967fd4d800a07f242/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", upload-time = 2026-07-06T21:33:56Z, size = 194121, hashes = { sha256 = "2e9dabb9abcb7ad15938c7196ad5c1718a4e6d33cc79b4c0209bdb64c4a54a5c" } }, + { url = "https://files.pythonhosted.org/packages/99/e2/67680bf19a6b60d2bb7ff83baefa2a4c3d2d7dc0f3277034b802e1fc504c/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", upload-time = 2026-07-06T21:33:57Z, size = 196820, hashes = { sha256 = "37f525a7e7e50c017fdebe58b787be310ad59357ae43a053943a6e1a6c526001" } }, + { url = "https://files.pythonhosted.org/packages/ed/da/4bbe583a3b3a5c8c60892124fe17f3fa3656523faf0d3484eae90f091853/cffi-2.1.0-cp315-cp315-macosx_10_15_x86_64.whl", upload-time = 2026-07-06T21:33:58Z, size = 184936, hashes = { sha256 = "95f2954c2c9473d892eca6e0409f3568b37ab62a8eedb122461f73cc273476e3" } }, + { url = "https://files.pythonhosted.org/packages/e5/4b/1f4c36ab273980d7aa75bb126ea4f8971f24a96108acad3a0a084028c57b/cffi-2.1.0-cp315-cp315-macosx_11_0_arm64.whl", upload-time = 2026-07-06T21:34:00Z, size = 185045, hashes = { sha256 = "cdf2448aab5f661c9315308ec8b93f4e8a1a67a3c733f8631067a2b67d5913dc" } }, + { url = "https://files.pythonhosted.org/packages/ef/c3/ad299dc38f3583f8d916b299f028af418a9ec98bc695fcbebeae7420691c/cffi-2.1.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", upload-time = 2026-07-06T21:34:01Z, size = 222342, hashes = { sha256 = "90bec57cf82089383bd06a605b3eb8daebf7e5a668520beaf6e327a83a947699" } }, + { url = "https://files.pythonhosted.org/packages/eb/d8/df4543cc087245044ed02ef3ad8e0a26619d0075ac7a77a12dc81177851b/cffi-2.1.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", upload-time = 2026-07-06T21:34:03Z, size = 210073, hashes = { sha256 = "6274dcb2d15cef48daa73ed1be5a40d501d74dccd0cd6db364776d12cb6ba022" } }, + { url = "https://files.pythonhosted.org/packages/2c/0e/fac738d73728c6cea2a88a2883dca54892496cbba88a1dc1f2909cb8a6f5/cffi-2.1.0-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", upload-time = 2026-07-06T21:34:04Z, size = 208551, hashes = { sha256 = "2b71d409cccee78310ab5dec549aed052aaea483346e282c7b02362596e01bb0" } }, + { url = "https://files.pythonhosted.org/packages/e6/3f/0b04a700dd64f465c93020253a793a82c9b4dff9961f48facd0df945d9b8/cffi-2.1.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", upload-time = 2026-07-06T21:34:06Z, size = 221649, hashes = { sha256 = "7d3538f9c0e50670f4deb93dbb696576e60590369cae2faf7de681e597a8a1f1" } }, + { url = "https://files.pythonhosted.org/packages/5d/7c/b7379a5704c79eda57ce075869ba70a0368d1c850f803b3c0d078d39dcaf/cffi-2.1.0-cp315-cp315-musllinux_1_2_aarch64.whl", upload-time = 2026-07-06T21:34:07Z, size = 225203, hashes = { sha256 = "8f9ec95b8a043d3dfbc74d9abc6f7baf524dd27a8dc160b0a32ff9cdab650c28" } }, + { url = "https://files.pythonhosted.org/packages/5a/02/d5e6c43ea85c41bda2a184a3418f195fe7cf602967a8d2b94e085b83deef/cffi-2.1.0-cp315-cp315-musllinux_1_2_x86_64.whl", upload-time = 2026-07-06T21:34:08Z, size = 223263, hashes = { sha256 = "af5e2915d41fe6c961694d7bfdc8562942638200f3ce2765dfb8b745cf997629" } }, + { url = "https://files.pythonhosted.org/packages/2c/d8/772b8259bf75749adffb1c546828978381fb516f60cf701f6c83daf60c85/cffi-2.1.0-cp315-cp315-win32.whl", upload-time = 2026-07-06T21:34:26Z, size = 177696, hashes = { sha256 = "0a42c688d19fca6e095a53c6a6e2295a5b050a8b289f109adab02a9e61a25de6" } }, + { url = "https://files.pythonhosted.org/packages/2f/dd/afa2191fc6d57fedd26e5844a2fe2fcc0bbfa00961bbaa5a41e4921e7cca/cffi-2.1.0-cp315-cp315-win_amd64.whl", upload-time = 2026-07-06T21:34:27Z, size = 187914, hashes = { sha256 = "bccbbb5ee76a61f9d99b5bf3846a51d7fca4b6a732fe46f89295610edaf41853" } }, + { url = "https://files.pythonhosted.org/packages/05/ef/6cd4f8c671517162379dc79cfae5aea9106bc38abb89628d5c16adf6a838/cffi-2.1.0-cp315-cp315-win_arm64.whl", upload-time = 2026-07-06T21:34:28Z, size = 183004, hashes = { sha256 = "8d35c139744adb3e727cd51b1a18324bbe44b8bd41bf8322bca4d41289f48eda" } }, + { url = "https://files.pythonhosted.org/packages/11/b6/12fc55092817a5faa26fb8c40c7f9d662e11a46ee248c137aafc42517d92/cffi-2.1.0-cp315-cp315t-macosx_10_15_x86_64.whl", upload-time = 2026-07-06T21:34:09Z, size = 188378, hashes = { sha256 = "f9912624a0c0b834b7520d7769b3644453aabc0a7e1c839da7359f050750e9bc" } }, + { url = "https://files.pythonhosted.org/packages/8d/2e/cdac88979f295fde5daa69622c7d2111e56e7ceb94f211357fbe452339e4/cffi-2.1.0-cp315-cp315t-macosx_11_0_arm64.whl", upload-time = 2026-07-06T21:34:11Z, size = 188319, hashes = { sha256 = "df92f2aba50eb4d96718b68ef76f2e57a57b54f2fa62333496d16c6d585a85ca" } }, + { url = "https://files.pythonhosted.org/packages/e0/27/1d0b408497e41a74795af122d7b603c418c5fed0171450f899afd04e594f/cffi-2.1.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", upload-time = 2026-07-06T21:34:12Z, size = 223904, hashes = { sha256 = "0520e1f4c35f44e209cbbb421b67eec42e6a157f59444dfb6058874ff3610e5d" } }, + { url = "https://files.pythonhosted.org/packages/8b/31/e115c985105dd7ffb32444505f18ceb874bb42d992af05d5dced7ecf1980/cffi-2.1.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", upload-time = 2026-07-06T21:34:13Z, size = 211554, hashes = { sha256 = "3681e031db29958a7502f5c0c9d6bbc4c36cb20f7b104086fa642d1799631ff8" } }, + { url = "https://files.pythonhosted.org/packages/5a/67/9e6e09409336d9e515c58367e7cfcf4f89df06ad25252675595a58eb59d5/cffi-2.1.0-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", upload-time = 2026-07-06T21:34:15Z, size = 210795, hashes = { sha256 = "762f99479dcb369f60ab9017ad4ab97a36a1dd7c1ee5a3b15db0f4b8659120cd" } }, + { url = "https://files.pythonhosted.org/packages/19/e5/d3cc82a4a0be7902af279c04181ad038449c096734464a5ae1de3e1401bd/cffi-2.1.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", upload-time = 2026-07-06T21:34:17Z, size = 223843, hashes = { sha256 = "0611e7ebf90573a535ebdc33ae9da222d037853983e13359f580fab781ca017f" } }, + { url = "https://files.pythonhosted.org/packages/b9/65/b434abc97ce7cecc2c640fde160507c0ecc7e21544b483ba3325d2e2ea17/cffi-2.1.0-cp315-cp315t-musllinux_1_2_aarch64.whl", upload-time = 2026-07-06T21:34:19Z, size = 226773, hashes = { sha256 = "86cf8755a791f72c85dc287128cc62d4f24d392e3f1e15837245623f4a33cccc" } }, + { url = "https://files.pythonhosted.org/packages/b5/9f/d4dc66ca651eb1145a133314cda721abf13cfac3d28c4a0402263ae6ad75/cffi-2.1.0-cp315-cp315t-musllinux_1_2_x86_64.whl", upload-time = 2026-07-06T21:34:20Z, size = 225719, hashes = { sha256 = "ba00f661f8ba35d075c937174e27c2c421cec3942fd2e0ea3e66996757c0fdd9" } }, + { url = "https://files.pythonhosted.org/packages/68/5a/e536c528bc8057496c360c0978559a2dc45653f89dd6151078aa7d8fca1a/cffi-2.1.0-cp315-cp315t-win32.whl", upload-time = 2026-07-06T21:34:22Z, size = 182760, hashes = { sha256 = "cb96698e3c7413d906ce83f8ffd245ec1bd94707541f299d0ce4d6b0193e982b" } }, + { url = "https://files.pythonhosted.org/packages/d3/0b/0ffe8b82d3875bced5fa1e7986a7a46b748262a40ab7f60b475eb9fb1bb3/cffi-2.1.0-cp315-cp315t-win_amd64.whl", upload-time = 2026-07-06T21:34:23Z, size = 193769, hashes = { sha256 = "f146d154428a2523f9cc7936c02353c2459b8f6cf07d3cd1ee1c0a611109c5d5" } }, + { url = "https://files.pythonhosted.org/packages/a0/17/1073b53b68c9b5ca6914adf5f8bf55aacc2d3be102418c90700160ea8605/cffi-2.1.0-cp315-cp315t-win_arm64.whl", upload-time = 2026-07-06T21:34:24Z, size = 186405, hashes = { sha256 = "cbb7640ce37159548d2147b5b8c241f962143d4c71231431820783f4dc78f210" } }, +] + +[[packages]] +name = "charset-normalizer" +version = "3.4.9" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", upload-time = 2026-07-07T14:34:58Z, size = 152439, hashes = { sha256 = "673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b" } } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/81/8e983840c6e5b93b33c2ba81aa3d52c2e42f0e9a690ce7607a2e61da4a5c/charset_normalizer-3.4.9-cp310-cp310-macosx_10_9_universal2.whl", upload-time = 2026-07-07T14:32:36Z, size = 322240, hashes = { sha256 = "cd6280cf040f233bd7d3407b743b4b4c74f70e8e1c4199cb112a62c941c0772a" } }, + { url = "https://files.pythonhosted.org/packages/de/d1/b4319dc3229d8272fba305e206fc0a148e2de8d4087917ce62ae6382f359/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", upload-time = 2026-07-07T14:32:38Z, size = 216475, hashes = { sha256 = "aa99adc8f081b475a12843953db36831eaf83ec33eb46a90629ca6a5de45a616" } }, + { url = "https://files.pythonhosted.org/packages/80/33/6c99c1b3e6b8bf730e1bc809b9a2608f224145069114c479a2e9e1494346/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", upload-time = 2026-07-07T14:32:39Z, size = 238670, hashes = { sha256 = "c1225416b463483160e4af85d5fc3a9690ccb53fd4b1865a6437825f5ede3209" } }, + { url = "https://files.pythonhosted.org/packages/7f/f4/ffbb83546e1f198ecc70ecd372b65cf2b50f9068b380abd67640f17a8e18/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", upload-time = 2026-07-07T14:32:41Z, size = 233476, hashes = { sha256 = "16d10d789dd9bcca1173c95af82c58433122564b7bc39385124be735a35cbe99" } }, + { url = "https://files.pythonhosted.org/packages/e8/5f/b98b8da398637b551e427e7be922bdec19177dc54d6811dcdaa503f23aac/charset_normalizer-3.4.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", upload-time = 2026-07-07T14:32:42Z, size = 223817, hashes = { sha256 = "9bb41182d93ea91f60b4bc8fbf4c820c69ef8a12ab2d917f3f1834f1acad07e8" } }, + { url = "https://files.pythonhosted.org/packages/36/31/a276bb2e66243072a3fd06fdcab9cbb61a305b02143d70d2bda21d888fa8/charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_armv7l.whl", upload-time = 2026-07-07T14:32:44Z, size = 207974, hashes = { sha256 = "bcf74c1df76758a395bf0af608c04c82257523f55c9868b334f06270d0f2112b" } }, + { url = "https://files.pythonhosted.org/packages/5e/be/7ee4453d7e88dfbc4104ccd34900b9f2c7c17dac22881865fe0e82424a25/charset_normalizer-3.4.9-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", upload-time = 2026-07-07T14:32:45Z, size = 221655, hashes = { sha256 = "b5314963fce9b0b12743891de876e724997864ee22aa496f903f426c7e2fa5b2" } }, + { url = "https://files.pythonhosted.org/packages/1d/85/181c652953eb5276d198f375b1dd641047392050098100a3a02d6534f657/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", upload-time = 2026-07-07T14:32:47Z, size = 219229, hashes = { sha256 = "e9701d0049d92c16703a42771b98d560b95248949f23f8cf7b4eddd201814fb9" } }, + { url = "https://files.pythonhosted.org/packages/0c/e7/aaf6da33fc9f4691cda8f7efbc9f69179d3d39ec8a4799baf273ee1d8db0/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_armv7l.whl", upload-time = 2026-07-07T14:32:48Z, size = 209704, hashes = { sha256 = "65a7ff3f705e57d392f7261b6d0550fe137c3019477431f1c355e0db0a7d3e15" } }, + { url = "https://files.pythonhosted.org/packages/63/01/f2fb3bd3a73be48b173ee0c6aa8d2497af97d5663a8c4c4b491de4c62f7a/charset_normalizer-3.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", upload-time = 2026-07-07T14:32:50Z, size = 226243, hashes = { sha256 = "79580094b00d1789d1f93ea55bc43cb2f611910c72235b7657f3482ddcc1b22d" } }, + { url = "https://files.pythonhosted.org/packages/c4/02/c57a22739fe05246b0b5783b3bfb6afaac4eebb46f3ececdfb2f048f780e/charset_normalizer-3.4.9-cp310-cp310-win32.whl", upload-time = 2026-07-07T14:32:51Z, size = 150935, hashes = { sha256 = "432786d3561e69aeeae6c7e8648964ce0ad05736120135601f87ac26b9c83381" } }, + { url = "https://files.pythonhosted.org/packages/37/8d/ca39a7559a4797505530d084fd3a49a2c959efbbbff146302fb7be4e3b35/charset_normalizer-3.4.9-cp310-cp310-win_amd64.whl", upload-time = 2026-07-07T14:32:53Z, size = 162314, hashes = { sha256 = "8c041122946b7ba21bb32c45b1aa57b1be35527690aeb3c5c234521085632eee" } }, + { url = "https://files.pythonhosted.org/packages/01/da/a44bd7a13d426e69e4894557106cd58669097bfad4a8681123b618fbfc5d/charset_normalizer-3.4.9-cp310-cp310-win_arm64.whl", upload-time = 2026-07-07T14:32:54Z, size = 153075, hashes = { sha256 = "375b83ed0aecfce76c16d198fbc21f3b11b337d68662bea0a995046682a11419" } }, + { url = "https://files.pythonhosted.org/packages/0b/e3/85ec501f206fb049259288c1f3506e53876937fb00edb47009348e66756b/charset_normalizer-3.4.9-cp311-cp311-macosx_10_9_universal2.whl", upload-time = 2026-07-07T14:32:56Z, size = 317075, hashes = { sha256 = "0e94703ec9684807f20cfb5eed95c70f67f2a8f21ad620146d7b5a13677b93e5" } }, + { url = "https://files.pythonhosted.org/packages/c3/69/2a5385192e67175f7d8bd5ce4f57c24bc956439adeae5c13a99aa28a53d1/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", upload-time = 2026-07-07T14:32:57Z, size = 213837, hashes = { sha256 = "2a441ea71902098ffe78c5abe6c494f44160b4af614ed16c3d9a3b1d17fd8ee2" } }, + { url = "https://files.pythonhosted.org/packages/b3/46/03ddc7da576d814fe0a36dd1f0fd3258e95404b4b2e3c026b7923d7e133f/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", upload-time = 2026-07-07T14:32:59Z, size = 235503, hashes = { sha256 = "304b13570067b2547562e308af560b3963857b1fa90bd6afd978130130fe2d6a" } }, + { url = "https://files.pythonhosted.org/packages/4e/6e/de0229a7ef40f6f9d28a837eebf4ec47bdca5dab4e900c84f22919af636a/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", upload-time = 2026-07-07T14:33:00Z, size = 229944, hashes = { sha256 = "4773092f8019072343a7447203308b176e10199920eb02d6195e81bbb3274c29" } }, + { url = "https://files.pythonhosted.org/packages/a5/34/49b9060e8418b14fb5cba9cf6bfb383111e2538a03a1fb18e66a95aeb3d5/charset_normalizer-3.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", upload-time = 2026-07-07T14:33:02Z, size = 221276, hashes = { sha256 = "04ce310cb89c15df659582aee80a0603788732a5e017d5bd5c81158106ce249c" } }, + { url = "https://files.pythonhosted.org/packages/44/95/80282cce0fae9c3061203d723ee87da996aed79679e65d8935050ee7ca1f/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_armv7l.whl", upload-time = 2026-07-07T14:33:03Z, size = 205260, hashes = { sha256 = "c0323c9daef75ef2e5083624b4585018a0c9d5e3b40f607eed81a311270b934b" } }, + { url = "https://files.pythonhosted.org/packages/0c/74/2f62c8821b969ea3bd67cc2e6976834f48ca5d12664d2559ebcd9bcfbed7/charset_normalizer-3.4.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", upload-time = 2026-07-07T14:33:05Z, size = 217786, hashes = { sha256 = "871ff67ea1aad4dfd91736464934d56b32dac49f9fbe16cddba36198a7b3a0db" } }, + { url = "https://files.pythonhosted.org/packages/d9/8d/feabb82cb49fcad14515b1d7d1ca4787b0da7fc723a212bf89bc9e0fac52/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", upload-time = 2026-07-07T14:33:06Z, size = 216798, hashes = { sha256 = "67830fc78e67501f47bb950471b2dcb9b35b140084429318e862895a8e89c993" } }, + { url = "https://files.pythonhosted.org/packages/a5/ff/c946d63bc3786d5b84d960b0f7ab7e25b828486a946b5aa997625bcaf6a6/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_armv7l.whl", upload-time = 2026-07-07T14:33:08Z, size = 206429, hashes = { sha256 = "3d92613ec25e43b05f042302531ec0f00b8445190e43325880cbd6ab7c2581da" } }, + { url = "https://files.pythonhosted.org/packages/af/ba/5e5007c370702f85d2ef75791fac7943ed41e080364a673b20142e430e3e/charset_normalizer-3.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", upload-time = 2026-07-07T14:33:09Z, size = 223066, hashes = { sha256 = "280081916dc341820640489a66e4696049401ef1cf6dd672f672e70ad915aca3" } }, + { url = "https://files.pythonhosted.org/packages/83/d5/9096aa3cf532dfad237861544eb47a0f20d5adbf1039760fed8eaae935d9/charset_normalizer-3.4.9-cp311-cp311-win32.whl", upload-time = 2026-07-07T14:33:11Z, size = 150456, hashes = { sha256 = "ac351b3b8014eead140e77e9717e2992c6bbe30b63bc3422422eb84865412e3d" } }, + { url = "https://files.pythonhosted.org/packages/ed/a1/e29995109e455dc8eff8d0fac6ae509be39561318a7cfeac5d33ad029213/charset_normalizer-3.4.9-cp311-cp311-win_amd64.whl", upload-time = 2026-07-07T14:33:12Z, size = 161410, hashes = { sha256 = "6366a16e1a25018694d6a5d784d09b046edc9eac40ea2b54065c3052672516a1" } }, + { url = "https://files.pythonhosted.org/packages/4f/8d/1569f4d0032d6ba2a4fe4591c35bf87868c600c41a71eb5c2e1ffa8464c2/charset_normalizer-3.4.9-cp311-cp311-win_arm64.whl", upload-time = 2026-07-07T14:33:14Z, size = 152649, hashes = { sha256 = "1d22856ffbe153a602df38e4a5464f0b748a54002e0d69ac6d2ad0a197cc99ec" } }, + { url = "https://files.pythonhosted.org/packages/70/4a/ecbd131485c07fcdfad54e28946d513e3da22ef3b4bd854dcafae54ec739/charset_normalizer-3.4.9-cp312-cp312-macosx_10_13_universal2.whl", upload-time = 2026-07-07T14:33:15Z, size = 319300, hashes = { sha256 = "45b0cc4e3556cd875e09102988d1ab8356c998b596c9fced84547c8138b487a0" } }, + { url = "https://files.pythonhosted.org/packages/ec/96/5d9364e3342d69f3a045e1777bc47c85c383e6e9466d561b33fdb419d1f9/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", upload-time = 2026-07-07T14:33:17Z, size = 215802, hashes = { sha256 = "9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9" } }, + { url = "https://files.pythonhosted.org/packages/4b/4c/5361f9aa7f2cb58d94f2ab831b3d493f69efb1d239654b4744e3c09527cb/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", upload-time = 2026-07-07T14:33:18Z, size = 237171, hashes = { sha256 = "9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44" } }, + { url = "https://files.pythonhosted.org/packages/50/78/ce342ca4ff30b2eb49fe6d9578df85974f90c67d294113e94efdd9664cbd/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", upload-time = 2026-07-07T14:33:20Z, size = 233075, hashes = { sha256 = "7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9" } }, + { url = "https://files.pythonhosted.org/packages/01/c4/4fa4c8b3097a11f3c5f09a35b72ed6855fb1d332469504962ab7bafcc702/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", upload-time = 2026-07-07T14:33:21Z, size = 224256, hashes = { sha256 = "5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd" } }, + { url = "https://files.pythonhosted.org/packages/87/3a/ad914516df7e358a81aae018caa5e0470ba827fa6d763b1d2e87d920a5f6/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_armv7l.whl", upload-time = 2026-07-07T14:33:23Z, size = 208784, hashes = { sha256 = "90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84" } }, + { url = "https://files.pythonhosted.org/packages/d7/74/3c12f9755717dfe5c5c87da63f35d765fa0c00382ec26bf23f7fae34f2ba/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", upload-time = 2026-07-07T14:33:24Z, size = 219928, hashes = { sha256 = "9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b" } }, + { url = "https://files.pythonhosted.org/packages/33/9a/895095b83e7907abd6d3d99aad3a38ad0d9686cc186cb0c94c24320fe63e/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", upload-time = 2026-07-07T14:33:26Z, size = 218489, hashes = { sha256 = "60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde" } }, + { url = "https://files.pythonhosted.org/packages/a1/34/ef5c05f412f42520d7709b7d3784d19640839eb7366ded1755511585429f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_armv7l.whl", upload-time = 2026-07-07T14:33:27Z, size = 210267, hashes = { sha256 = "a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39" } }, + { url = "https://files.pythonhosted.org/packages/83/dc/9b29fa4412b318bf3bfea985c35d67eb55e04b59a7c3f2237168b0e0be6f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", upload-time = 2026-07-07T14:33:29Z, size = 226030, hashes = { sha256 = "03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62" } }, + { url = "https://files.pythonhosted.org/packages/0e/42/6dbc00b8cd16011691203e33570fa42ed5746599a2e878112d16eab403a3/charset_normalizer-3.4.9-cp312-cp312-win32.whl", upload-time = 2026-07-07T14:33:30Z, size = 151185, hashes = { sha256 = "78841cccf1af7b40f6f716338d50c0902dbe88d9f800b3c973b7a9a0a693a642" } }, + { url = "https://files.pythonhosted.org/packages/80/cc/f920afd1a23c58ccd53c1d36085a71893a4737ff5e66e0371efab6809850/charset_normalizer-3.4.9-cp312-cp312-win_amd64.whl", upload-time = 2026-07-07T14:33:32Z, size = 162557, hashes = { sha256 = "4b3dac63058cc36820b0dd072f89898604e2d39686fe05321729d00d8ac185a0" } }, + { url = "https://files.pythonhosted.org/packages/f0/e6/0386d43a261ff4e4b30c5857af7df877254b46bec7b9d1b74b6bf969a90b/charset_normalizer-3.4.9-cp312-cp312-win_arm64.whl", upload-time = 2026-07-07T14:33:33Z, size = 152665, hashes = { sha256 = "78fa18e436a1a0e58dbd7e02fc4473f3f32cceb12df9dfca542d075961c307d2" } }, + { url = "https://files.pythonhosted.org/packages/b2/06/97ec2aeae780b31d742b6352218b43841a6871e2564578ca522dce4a45c3/charset_normalizer-3.4.9-cp313-cp313-macosx_10_13_universal2.whl", upload-time = 2026-07-07T14:33:35Z, size = 317688, hashes = { sha256 = "440eede837960000d74978f0eba527be106b5b9aee0daf779d395276ed0b0614" } }, + { url = "https://files.pythonhosted.org/packages/d0/39/8ff066c672434225f8d25f8b739f992af250944392173dcc88362681c9bf/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", upload-time = 2026-07-07T14:33:36Z, size = 214982, hashes = { sha256 = "21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698" } }, + { url = "https://files.pythonhosted.org/packages/92/8f/3a47a3667c83c2df9483d91644c6c107de3bf8874aa1793da9d3012eb986/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", upload-time = 2026-07-07T14:33:38Z, size = 236460, hashes = { sha256 = "e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b" } }, + { url = "https://files.pythonhosted.org/packages/f1/60/b22cdbee7e4013dab8b0d7647fc6181120fbbbc8f7025c226d15bd5a47fc/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", upload-time = 2026-07-07T14:33:40Z, size = 232003, hashes = { sha256 = "bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9" } }, + { url = "https://files.pythonhosted.org/packages/ea/f8/72eb13dcabe7257035cea8aefd922caad2f110d252bf9f67c4c2ca763aee/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", upload-time = 2026-07-07T14:33:41Z, size = 223149, hashes = { sha256 = "84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33" } }, + { url = "https://files.pythonhosted.org/packages/b0/3e/faee8f9de92b14ee1198e9163252bb15efee7301b31256a3b6d9ebfdd0dd/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_armv7l.whl", upload-time = 2026-07-07T14:33:43Z, size = 207901, hashes = { sha256 = "5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63" } }, + { url = "https://files.pythonhosted.org/packages/3a/25/45f30093ae27dd7b92a793b61882a38685f993700113ca36e0c9c14965e1/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", upload-time = 2026-07-07T14:33:44Z, size = 219176, hashes = { sha256 = "a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0" } }, + { url = "https://files.pythonhosted.org/packages/48/18/c8f397329c35e32f6a837e488986f4ae03bd2abebc453b48714991630c2f/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", upload-time = 2026-07-07T14:33:46Z, size = 217356, hashes = { sha256 = "416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe" } }, + { url = "https://files.pythonhosted.org/packages/86/7e/5ce0bba863470fd1902d5e5843968951bddf38abe4742fc97116ef4598b3/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_armv7l.whl", upload-time = 2026-07-07T14:33:47Z, size = 209614, hashes = { sha256 = "75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35" } }, + { url = "https://files.pythonhosted.org/packages/6c/ef/2473d3c4d869155be4af1191111d59c4d5c4e0173026f7e85b176e23bf65/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", upload-time = 2026-07-07T14:33:49Z, size = 224991, hashes = { sha256 = "69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8" } }, + { url = "https://files.pythonhosted.org/packages/d0/a3/53ddae3db108a088156aa8ddfafd411ebbc1340f48c5573f697b27f69a39/charset_normalizer-3.4.9-cp313-cp313-win32.whl", upload-time = 2026-07-07T14:33:50Z, size = 150622, hashes = { sha256 = "51307f5c71007673a2bf8232ad973483d281e74cb99c8c5a990af1eefa6277d9" } }, + { url = "https://files.pythonhosted.org/packages/e8/ef/6953a77c7cf2c2ff9998e6f575ab3e380119f100223381565a4f94c1f836/charset_normalizer-3.4.9-cp313-cp313-win_amd64.whl", upload-time = 2026-07-07T14:33:52Z, size = 161947, hashes = { sha256 = "fe2c7201c642b7c308f1675355ad7ff7b66acfe3541625efe5a3ad38f29d6115" } }, + { url = "https://files.pythonhosted.org/packages/6e/fb/d560d1d1555debbfe7849d9cac6145c1b537709d79576bf22557ed803b82/charset_normalizer-3.4.9-cp313-cp313-win_arm64.whl", upload-time = 2026-07-07T14:33:53Z, size = 152594, hashes = { sha256 = "611057cc5d5c0afc743ba8be6bd828c17e0aaa8643f9d0a9b9bb7dea80eb8012" } }, + { url = "https://files.pythonhosted.org/packages/7e/8d/496817fa0944239ecae662dd57ea765cfeaec6a735f9f025d4b7b72e7143/charset_normalizer-3.4.9-cp314-cp314-macosx_10_15_universal2.whl", upload-time = 2026-07-07T14:33:54Z, size = 317253, hashes = { sha256 = "0327fcd59a935777d83410750c50600ee9571af2846f71ce40f25b13da1ef380" } }, + { url = "https://files.pythonhosted.org/packages/2b/f9/ef4a69ea338ad3c0deceea0f5f7d2380ae8b52132b06d652cb0d2cd86706/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", upload-time = 2026-07-07T14:33:56Z, size = 215898, hashes = { sha256 = "8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9" } }, + { url = "https://files.pythonhosted.org/packages/8c/e7/5ddfd76fc061eb52de219658a4aa431cbacadf0a0219c8854f00da50d289/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", upload-time = 2026-07-07T14:33:57Z, size = 236718, hashes = { sha256 = "33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4" } }, + { url = "https://files.pythonhosted.org/packages/49/ba/768fa3f36048d81c477a0ce61f813bc1454d80917ccfe550abd9f44f5e24/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", upload-time = 2026-07-07T14:33:59Z, size = 232519, hashes = { sha256 = "f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a" } }, + { url = "https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", upload-time = 2026-07-07T14:34:01Z, size = 223143, hashes = { sha256 = "c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046" } }, + { url = "https://files.pythonhosted.org/packages/19/79/55c32d06d76ae4feafe053f061f3e3ab70bcf19f4007797ce8c3efda7830/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_armv7l.whl", upload-time = 2026-07-07T14:34:03Z, size = 206742, hashes = { sha256 = "f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81" } }, + { url = "https://files.pythonhosted.org/packages/10/e0/47c079dd82d217c807479cd59ffd30af56307ea31c108b75758970459ad3/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", upload-time = 2026-07-07T14:34:04Z, size = 219191, hashes = { sha256 = "4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917" } }, + { url = "https://files.pythonhosted.org/packages/42/ab/b9bc2e77d6b44a7e46ef62ec5cac1c9a6ba7b9135a5d560f002696ec9995/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", upload-time = 2026-07-07T14:34:06Z, size = 218328, hashes = { sha256 = "a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41" } }, + { url = "https://files.pythonhosted.org/packages/f1/78/c9c71d599f5aa2d42bcdd35cbbd46d7f535351a57e40ff7d8e5a7e219401/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_armv7l.whl", upload-time = 2026-07-07T14:34:07Z, size = 207406, hashes = { sha256 = "d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1" } }, + { url = "https://files.pythonhosted.org/packages/f6/39/c914445c321a845097ce4f6ac7de9a18228a77b766272125a1ce00d851eb/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", upload-time = 2026-07-07T14:34:09Z, size = 225157, hashes = { sha256 = "898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf" } }, + { url = "https://files.pythonhosted.org/packages/9b/f2/c0d4b8508565a36bc5c624e88ed297f5b0b1095011034d7f5b83a69908b5/charset_normalizer-3.4.9-cp314-cp314-win32.whl", upload-time = 2026-07-07T14:34:10Z, size = 151095, hashes = { sha256 = "c1c948747b03be832dceed96ca815cef7360de9aa19d37c730f8e3f6101aca48" } }, + { url = "https://files.pythonhosted.org/packages/49/fd/a1d26144398c67486422a72bf5812cda22cb4ccfcd95a290fb41ceb4b8e2/charset_normalizer-3.4.9-cp314-cp314-win_amd64.whl", upload-time = 2026-07-07T14:34:12Z, size = 162796, hashes = { sha256 = "16b65ea0f2465b6fb52aa22de5eca612aa964ddfec00a912e26f4656cbef890b" } }, + { url = "https://files.pythonhosted.org/packages/20/95/d75e82f8ce9fd323ebf059c16c9aadefb22a1ecde13b7840b35835e4886c/charset_normalizer-3.4.9-cp314-cp314-win_arm64.whl", upload-time = 2026-07-07T14:34:14Z, size = 153334, hashes = { sha256 = "40a126142a56b2dfc0aacbad1de8310cbf60da7656db0e6b16eebd48e3e93519" } }, + { url = "https://files.pythonhosted.org/packages/00/5e/17398df3a139985ba9d11ed072531986f408c8fca952835ef1ab1820c02b/charset_normalizer-3.4.9-cp314-cp314t-macosx_10_15_universal2.whl", upload-time = 2026-07-07T14:34:15Z, size = 338848, hashes = { sha256 = "609b3ba8fcc0fb5ab7af00719d0fb6ad0cb518e48e7712d12fd68f1327951198" } }, + { url = "https://files.pythonhosted.org/packages/cd/91/7253a32e86b7e1d1239b1b36ba6dd0f021a21107ab33054b53119cc083b9/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", upload-time = 2026-07-07T14:34:17Z, size = 223022, hashes = { sha256 = "51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32" } }, + { url = "https://files.pythonhosted.org/packages/cb/32/2e64bd2be10e89c61e57ebe6a93fd98ae88eb7ebe414b5121f22c96c69eb/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", upload-time = 2026-07-07T14:34:18Z, size = 241590, hashes = { sha256 = "cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632" } }, + { url = "https://files.pythonhosted.org/packages/3d/ef/d96ec496cfea0c21db43b0ad03891308b02388d054cc902cf0e5a1ad6a88/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", upload-time = 2026-07-07T14:34:20Z, size = 239584, hashes = { sha256 = "fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf" } }, + { url = "https://files.pythonhosted.org/packages/d4/ce/9af95f7876194bd7a14e3dfe4a4de2e0bff02666a3910d72beafd06cc297/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", upload-time = 2026-07-07T14:34:22Z, size = 230224, hashes = { sha256 = "df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990" } }, + { url = "https://files.pythonhosted.org/packages/52/94/af74dde74a3996bd959c350709bfe50e297823d70a8c1cbd54b838880863/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_armv7l.whl", upload-time = 2026-07-07T14:34:23Z, size = 212667, hashes = { sha256 = "f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d" } }, + { url = "https://files.pythonhosted.org/packages/ee/f0/f1c4fe746c395922961b5916ed1d7d6e7d4c84851d19ed43cc89980ec953/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", upload-time = 2026-07-07T14:34:25Z, size = 227179, hashes = { sha256 = "32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e" } }, + { url = "https://files.pythonhosted.org/packages/e4/56/6c745619ac397e8871e2bcd3cea1eec86b877488f33888b3aef5c3ed506e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", upload-time = 2026-07-07T14:34:27Z, size = 225372, hashes = { sha256 = "83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c" } }, + { url = "https://files.pythonhosted.org/packages/78/ad/98aae8630ac71f16711968e38a5acfecce41b778bf2f0312851020f565a8/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_armv7l.whl", upload-time = 2026-07-07T14:34:28Z, size = 215222, hashes = { sha256 = "cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2" } }, + { url = "https://files.pythonhosted.org/packages/f7/40/9593d54209765207a7f11073c06494c1721e4ca4a0a426c597679bf7f91e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", upload-time = 2026-07-07T14:34:30Z, size = 231958, hashes = { sha256 = "ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534" } }, + { url = "https://files.pythonhosted.org/packages/b1/27/693ee5e8a18191eb38647360c51cd505013e2bd3b366aa43fd5344c21e3c/charset_normalizer-3.4.9-cp314-cp314t-win32.whl", upload-time = 2026-07-07T14:34:31Z, size = 155580, hashes = { sha256 = "0d861473f743244d349b50f850d10eb87aeb22bbdcc8e64f79273c94af5a8226" } }, + { url = "https://files.pythonhosted.org/packages/80/3f/bd97d3d9c613013d07cb7733d299385b41df37f0471310f5a73dc359f0b8/charset_normalizer-3.4.9-cp314-cp314t-win_amd64.whl", upload-time = 2026-07-07T14:34:33Z, size = 167620, hashes = { sha256 = "9b8e0f3107e2200b76f6054de99016eac3ee6762713587b36baaa7e4bd2ae177" } }, + { url = "https://files.pythonhosted.org/packages/3d/c6/eee9dca4439b1061f76373f06ea855678cc4a64c1c3c90b50e479edbb8eb/charset_normalizer-3.4.9-cp314-cp314t-win_arm64.whl", upload-time = 2026-07-07T14:34:35Z, size = 158037, hashes = { sha256 = "19ac87f93086ce37b86e098888555c4b4bc48102279bae3350098c0ed664b501" } }, + { url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", upload-time = 2026-07-07T14:34:56Z, size = 64538, hashes = { sha256 = "68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5" } }, +] + +[[packages]] +name = "click" +version = "8.4.2" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", upload-time = 2026-06-24T17:45:15Z, size = 338000, hashes = { sha256 = "9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", upload-time = 2026-06-24T17:45:13Z, size = 119243, hashes = { sha256 = "e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76" } }] + +[[packages]] +name = "colorama" +version = "0.4.6" +marker = "sys_platform == 'win32'" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", upload-time = 2022-10-25T02:36:22Z, size = 27697, hashes = { sha256 = "08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", upload-time = 2022-10-25T02:36:20Z, size = 25335, hashes = { sha256 = "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" } }] + +[[packages]] +name = "colorlog" +version = "6.10.1" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/a2/61/f083b5ac52e505dfc1c624eafbf8c7589a0d7f32daa398d2e7590efa5fda/colorlog-6.10.1.tar.gz", upload-time = 2025-10-16T16:14:11Z, size = 17162, hashes = { sha256 = "eb4ae5cb65fe7fec7773c2306061a8e63e02efc2c72eba9d27b0fa23c94f1321" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/6d/c1/e419ef3723a074172b68aaa89c9f3de486ed4c2399e2dbd8113a4fdcaf9e/colorlog-6.10.1-py3-none-any.whl", upload-time = 2025-10-16T16:14:10Z, size = 11743, hashes = { sha256 = "2d7e8348291948af66122cff006c9f8da6255d224e7cf8e37d8de2df3bad8c9c" } }] + +[[packages]] +name = "cryptography" +version = "47.0.0" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/ef/b2/7ffa7fe8207a8c42147ffe70c3e360b228160c1d85dc3faff16aaa3244c0/cryptography-47.0.0.tar.gz", upload-time = 2026-04-24T19:54:57Z, size = 830863, hashes = { sha256 = "9f8e55fe4e63613a5e1cc5819030f27b97742d720203a087802ce4ce9ceb52bb" } } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/98/40dfe932134bdcae4f6ab5927c87488754bf9eb79297d7e0070b78dd58e9/cryptography-47.0.0-cp311-abi3-macosx_10_9_universal2.whl", upload-time = 2026-04-24T19:53:03Z, size = 7912214, hashes = { sha256 = "160ad728f128972d362e714054f6ba0067cab7fb350c5202a9ae8ae4ce3ef1a0" } }, + { url = "https://files.pythonhosted.org/packages/34/c6/2733531243fba725f58611b918056b277692f1033373dcc8bd01af1c05d4/cryptography-47.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", upload-time = 2026-04-24T19:53:06Z, size = 4644617, hashes = { sha256 = "b9a8943e359b7615db1a3ba587994618e094ff3d6fa5a390c73d079ce18b3973" } }, + { url = "https://files.pythonhosted.org/packages/00/e3/b27be1a670a9b87f855d211cf0e1174a5d721216b7616bd52d8581d912ed/cryptography-47.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", upload-time = 2026-04-24T19:53:09Z, size = 4668186, hashes = { sha256 = "f5c15764f261394b22aef6b00252f5195f46f2ca300bec57149474e2538b31f8" } }, + { url = "https://files.pythonhosted.org/packages/81/b9/8443cfe5d17d482d348cee7048acf502bb89a51b6382f06240fd290d4ca3/cryptography-47.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", upload-time = 2026-04-24T19:53:11Z, size = 4651244, hashes = { sha256 = "9c59ab0e0fa3a180a5a9c59f3a5abe3ef90d474bc56d7fadfbe80359491b615b" } }, + { url = "https://files.pythonhosted.org/packages/5d/5e/13ed0cdd0eb88ba159d6dd5ebfece8cb901dbcf1ae5ac4072e28b55d3153/cryptography-47.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", upload-time = 2026-04-24T19:53:13Z, size = 5252906, hashes = { sha256 = "34b4358b925a5ea3e14384ca781a2c0ef7ac219b57bb9eacc4457078e2b19f92" } }, + { url = "https://files.pythonhosted.org/packages/64/16/ed058e1df0f33d440217cd120d41d5dda9dd215a80b8187f68483185af82/cryptography-47.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", upload-time = 2026-04-24T19:53:15Z, size = 4701842, hashes = { sha256 = "0024b87d47ae2399165a6bfb20d24888881eeab83ae2566d62467c5ff0030ce7" } }, + { url = "https://files.pythonhosted.org/packages/02/e0/3d30986b30fdbd9e969abbdf8ba00ed0618615144341faeb57f395a084fe/cryptography-47.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", upload-time = 2026-04-24T19:53:17Z, size = 4289313, hashes = { sha256 = "1e47422b5557bb82d3fff997e8d92cff4e28b9789576984f08c248d2b3535d93" } }, + { url = "https://files.pythonhosted.org/packages/df/fd/32db38e3ad0cb331f0691cb4c7a8a6f176f679124dee746b3af6633db4d9/cryptography-47.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", upload-time = 2026-04-24T19:53:20Z, size = 4650964, hashes = { sha256 = "6f29f36582e6151d9686235e586dd35bb67491f024767d10b842e520dc6a07ac" } }, + { url = "https://files.pythonhosted.org/packages/86/53/5395d944dfd48cb1f67917f533c609c34347185ef15eb4308024c876f274/cryptography-47.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", upload-time = 2026-04-24T19:53:22Z, size = 5207817, hashes = { sha256 = "a9b761f012a943b7de0e828843c5688d0de94a0578d44d6c85a1bae32f87791f" } }, + { url = "https://files.pythonhosted.org/packages/34/4f/e5711b28e1901f7d480a2b1b688b645aa4c77c73f10731ed17e7f7db3f0d/cryptography-47.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", upload-time = 2026-04-24T19:53:24Z, size = 4701544, hashes = { sha256 = "4e1de79e047e25d6e9f8cea71c86b4a53aced64134f0f003bbcbf3655fd172c8" } }, + { url = "https://files.pythonhosted.org/packages/22/22/c8ddc25de3010fc8da447648f5a092c40e7a8fadf01dd6d255d9c0b9373d/cryptography-47.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", upload-time = 2026-04-24T19:53:26Z, size = 4783536, hashes = { sha256 = "ef6b3634087f18d2155b1e8ce264e5345a753da2c5fa9815e7d41315c90f8318" } }, + { url = "https://files.pythonhosted.org/packages/66/b6/d4a68f4ea999c6d89e8498579cba1c5fcba4276284de7773b17e4fa69293/cryptography-47.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", upload-time = 2026-04-24T19:53:28Z, size = 4926106, hashes = { sha256 = "11dbb9f50a0f1bb9757b3d8c27c1101780efb8f0bdecfb12439c22a74d64c001" } }, + { url = "https://files.pythonhosted.org/packages/54/ed/5f524db1fade9c013aa618e1c99c6ed05e8ffc9ceee6cda22fed22dda3f4/cryptography-47.0.0-cp311-abi3-win32.whl", upload-time = 2026-04-24T19:53:31Z, size = 3258581, hashes = { sha256 = "7fda2f02c9015db3f42bb8a22324a454516ed10a8c29ca6ece6cdbb5efe2a203" } }, + { url = "https://files.pythonhosted.org/packages/b2/dc/1b901990b174786569029f67542b3edf72ac068b6c3c8683c17e6a2f5363/cryptography-47.0.0-cp311-abi3-win_amd64.whl", upload-time = 2026-04-24T19:53:33Z, size = 3775309, hashes = { sha256 = "f5c3296dab66202f1b18a91fa266be93d6aa0c2806ea3d67762c69f60adc71aa" } }, + { url = "https://files.pythonhosted.org/packages/14/88/7aa18ad9c11bc87689affa5ce4368d884b517502d75739d475fc6f4a03c7/cryptography-47.0.0-cp314-cp314t-macosx_10_9_universal2.whl", upload-time = 2026-04-24T19:53:35Z, size = 7904299, hashes = { sha256 = "be12cb6a204f77ed968bcefe68086eb061695b540a3dd05edac507a3111b25f0" } }, + { url = "https://files.pythonhosted.org/packages/07/55/c18f75724544872f234678fdedc871391722cb34a2aee19faa9f63100bb2/cryptography-47.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", upload-time = 2026-04-24T19:53:37Z, size = 4631180, hashes = { sha256 = "2ebd84adf0728c039a3be2700289378e1c164afc6748df1a5ed456767bef9ba7" } }, + { url = "https://files.pythonhosted.org/packages/ee/65/31a5cc0eaca99cec5bafffe155d407115d96136bb161e8b49e0ef73f09a7/cryptography-47.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", upload-time = 2026-04-24T19:53:39Z, size = 4653529, hashes = { sha256 = "7f68d6fbc7fbbcfb0939fea72c3b96a9f9a6edfc0e1b1d29778a2066030418b1" } }, + { url = "https://files.pythonhosted.org/packages/e5/bc/641c0519a495f3bfd0421b48d7cd325c4336578523ccd76ea322b6c29c7a/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", upload-time = 2026-04-24T19:53:42Z, size = 4638570, hashes = { sha256 = "6651d32eff255423503aa276739da98c30f26c40cbeffcc6048e0d54ef704c0c" } }, + { url = "https://files.pythonhosted.org/packages/2b/f2/300327b0a47f6dc94dd8b71b57052aefe178bb51745073d73d80604f11ab/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", upload-time = 2026-04-24T19:53:44Z, size = 5238019, hashes = { sha256 = "3fb8fa48075fad7193f2e5496135c6a76ac4b2aa5a38433df0a539296b377829" } }, + { url = "https://files.pythonhosted.org/packages/e9/5a/5b5cf994391d4bf9d9c7efd4c66aabe4d95227256627f8fea6cff7dfadbd/cryptography-47.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", upload-time = 2026-04-24T19:53:47Z, size = 4686832, hashes = { sha256 = "11438c7518132d95f354fa01a4aa2f806d172a061a7bed18cf18cbdacdb204d7" } }, + { url = "https://files.pythonhosted.org/packages/dc/2c/ae950e28fd6475c852fc21a44db3e6b5bcc1261d1e370f2b6e42fa800fef/cryptography-47.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", upload-time = 2026-04-24T19:53:48Z, size = 4269301, hashes = { sha256 = "8c1a736bbb3288005796c3f7ccb9453360d7fed483b13b9f468aea5171432923" } }, + { url = "https://files.pythonhosted.org/packages/67/fb/6a39782e150ffe5cc1b0018cb6ddc48bf7ca62b498d7539ffc8a758e977d/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", upload-time = 2026-04-24T19:53:51Z, size = 4638110, hashes = { sha256 = "f1557695e5c2b86e204f6ce9470497848634100787935ab7adc5397c54abd7ab" } }, + { url = "https://files.pythonhosted.org/packages/8e/d7/0b3c71090a76e5c203164a47688b697635ece006dcd2499ab3a4dbd3f0bd/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", upload-time = 2026-04-24T19:53:52Z, size = 5194988, hashes = { sha256 = "f9a034b642b960767fb343766ae5ba6ad653f2e890ddd82955aef288ffea8736" } }, + { url = "https://files.pythonhosted.org/packages/63/33/63a961498a9df51721ab578c5a2622661411fc520e00bd83b0cc64eb20c4/cryptography-47.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", upload-time = 2026-04-24T19:53:55Z, size = 4686563, hashes = { sha256 = "b1c76fca783aa7698eb21eb14f9c4aa09452248ee54a627d125025a43f83e7a7" } }, + { url = "https://files.pythonhosted.org/packages/b7/bf/5ee5b145248f92250de86145d1c1d6edebbd57a7fe7caa4dedb5d4cf06a1/cryptography-47.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", upload-time = 2026-04-24T19:53:57Z, size = 4770094, hashes = { sha256 = "4f7722c97826770bab8ae92959a2e7b20a5e9e9bf4deae68fd86c3ca457bab52" } }, + { url = "https://files.pythonhosted.org/packages/92/43/21d220b2da5d517773894dacdcdb5c682c28d3fffce65548cb06e87d5501/cryptography-47.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", upload-time = 2026-04-24T19:54:00Z, size = 4913811, hashes = { sha256 = "09f6d7bf6724f8db8b32f11eccf23efc8e759924bc5603800335cf8859a3ddbd" } }, + { url = "https://files.pythonhosted.org/packages/31/98/dc4ad376ac5f1a1a7d4a83f7b0c6f2bcad36b5d2d8f30aeb482d3a7d9582/cryptography-47.0.0-cp314-cp314t-win32.whl", upload-time = 2026-04-24T19:54:02Z, size = 3237158, hashes = { sha256 = "6eebcaf0df1d21ce1f90605c9b432dd2c4f4ab665ac29a40d5e3fc68f51b5e63" } }, + { url = "https://files.pythonhosted.org/packages/bc/da/97f62d18306b5133468bc3f8cc73a3111e8cdc8cf8d3e69474d6e5fd2d1b/cryptography-47.0.0-cp314-cp314t-win_amd64.whl", upload-time = 2026-04-24T19:54:04Z, size = 3758706, hashes = { sha256 = "51c9313e90bd1690ec5a75ed047c27c0b8e6c570029712943d6116ef9a90620b" } }, + { url = "https://files.pythonhosted.org/packages/e0/34/a4fae8ae7c3bc227460c9ae43f56abf1b911da0ec29e0ebac53bb0a4b6b7/cryptography-47.0.0-cp38-abi3-macosx_10_9_universal2.whl", upload-time = 2026-04-24T19:54:06Z, size = 7904072, hashes = { sha256 = "14432c8a9bcb37009784f9594a62fae211a2ae9543e96c92b2a8e4c3cd5cd0c4" } }, + { url = "https://files.pythonhosted.org/packages/01/64/d7b1e54fdb69f22d24a64bb3e88dc718b31c7fb10ef0b9691a3cf7eeea6e/cryptography-47.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", upload-time = 2026-04-24T19:54:08Z, size = 4635767, hashes = { sha256 = "07efe86201817e7d3c18781ca9770bc0db04e1e48c994be384e4602bc38f8f27" } }, + { url = "https://files.pythonhosted.org/packages/8b/7b/cca826391fb2a94efdcdfe4631eb69306ee1cff0b22f664a412c90713877/cryptography-47.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", upload-time = 2026-04-24T19:54:10Z, size = 4654350, hashes = { sha256 = "2b45761c6ec22b7c726d6a829558777e32d0f1c8be7c3f3480f9c912d5ee8a10" } }, + { url = "https://files.pythonhosted.org/packages/4c/65/4b57bcc823f42a991627c51c2f68c9fd6eb1393c1756aac876cba2accae2/cryptography-47.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", upload-time = 2026-04-24T19:54:13Z, size = 4643394, hashes = { sha256 = "edd4da498015da5b9f26d38d3bfc2e90257bfa9cbed1f6767c282a0025ae649b" } }, + { url = "https://files.pythonhosted.org/packages/f4/c4/2c5fbeea70adbbca2bbae865e1d605d6a4a7f8dbd9d33eaf69645087f06c/cryptography-47.0.0-cp38-abi3-manylinux_2_28_ppc64le.whl", upload-time = 2026-04-24T19:54:15Z, size = 5225777, hashes = { sha256 = "9af828c0d5a65c70ec729cd7495a4bf1a67ecb66417b8f02ff125ab8a6326a74" } }, + { url = "https://files.pythonhosted.org/packages/7e/b8/ac57107ef32749d2b244e36069bb688792a363aaaa3acc9e3cf84c130315/cryptography-47.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", upload-time = 2026-04-24T19:54:17Z, size = 4688771, hashes = { sha256 = "256d07c78a04d6b276f5df935a9923275f53bd1522f214447fdf365494e2d515" } }, + { url = "https://files.pythonhosted.org/packages/56/fc/9f1de22ff8be99d991f240a46863c52d475404c408886c5a38d2b5c3bb26/cryptography-47.0.0-cp38-abi3-manylinux_2_31_armv7l.whl", upload-time = 2026-04-24T19:54:19Z, size = 4270753, hashes = { sha256 = "5d0e362ff51041b0c0d219cc7d6924d7b8996f57ce5712bdcef71eb3c65a59cc" } }, + { url = "https://files.pythonhosted.org/packages/00/68/d70c852797aa68e8e48d12e5a87170c43f67bb4a59403627259dd57d15de/cryptography-47.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", upload-time = 2026-04-24T19:54:21Z, size = 4642911, hashes = { sha256 = "1581aef4219f7ca2849d0250edaa3866212fb74bf5667284f46aa92f9e65c1ca" } }, + { url = "https://files.pythonhosted.org/packages/a5/51/661cbee74f594c5d97ff82d34f10d5551c085ca4668645f4606ebd22bd5d/cryptography-47.0.0-cp38-abi3-manylinux_2_34_ppc64le.whl", upload-time = 2026-04-24T19:54:24Z, size = 5181411, hashes = { sha256 = "a49a3eb5341b9503fa3000a9a0db033161db90d47285291f53c2a9d2cd1b7f76" } }, + { url = "https://files.pythonhosted.org/packages/94/87/f2b6c374a82cf076cfa1416992ac8e8ec94d79facc37aec87c1a5cb72352/cryptography-47.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", upload-time = 2026-04-24T19:54:26Z, size = 4688262, hashes = { sha256 = "2207a498b03275d0051589e326b79d4cf59985c99031b05bb292ac52631c37fe" } }, + { url = "https://files.pythonhosted.org/packages/14/e2/8b7462f4acf21ec509616f0245018bb197194ab0b65c2ea21a0bdd53c0eb/cryptography-47.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", upload-time = 2026-04-24T19:54:28Z, size = 4775506, hashes = { sha256 = "7a02675e2fabd0c0fc04c868b8781863cbf1967691543c22f5470500ff840b31" } }, + { url = "https://files.pythonhosted.org/packages/70/75/158e494e4c08dc05e039da5bb48553826bd26c23930cf8d3cd5f21fa8921/cryptography-47.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", upload-time = 2026-04-24T19:54:30Z, size = 4912060, hashes = { sha256 = "80887c5cbd1774683cb126f0ab4184567f080071d5acf62205acb354b4b753b7" } }, + { url = "https://files.pythonhosted.org/packages/06/bd/0a9d3edbf5eadbac926d7b9b3cd0c4be584eeeae4a003d24d9eda4affbbd/cryptography-47.0.0-cp38-abi3-win32.whl", upload-time = 2026-04-24T19:54:33Z, size = 3248487, hashes = { sha256 = "ed67ea4e0cfb5faa5bc7ecb6e2b8838f3807a03758eec239d6c21c8769355310" } }, + { url = "https://files.pythonhosted.org/packages/60/80/5681af756d0da3a599b7bdb586fac5a1540f1bcefd2717a20e611ddade45/cryptography-47.0.0-cp38-abi3-win_amd64.whl", upload-time = 2026-04-24T19:54:35Z, size = 3755737, hashes = { sha256 = "835d2d7f47cdc53b3224e90810fb1d36ca94ea29cc1801fb4c1bc43876735769" } }, + { url = "https://files.pythonhosted.org/packages/1b/a0/928c9ce0d120a40a81aa99e3ba383e87337b9ac9ef9f6db02e4d7822424d/cryptography-47.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", upload-time = 2026-04-24T19:54:38Z, size = 3909893, hashes = { sha256 = "7f1207974a904e005f762869996cf620e9bf79ecb4622f148550bb48e0eb35a7" } }, + { url = "https://files.pythonhosted.org/packages/81/75/d691e284750df5d9569f2b1ce4a00a71e1d79566da83b2b3e5549c84917f/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", upload-time = 2026-04-24T19:54:40Z, size = 4587867, hashes = { sha256 = "1a405c08857258c11016777e11c02bacbe7ef596faf259305d282272a3a05cbe" } }, + { url = "https://files.pythonhosted.org/packages/07/d6/1b90f1a4e453009730b4545286f0b39bb348d805c11181fc31544e4f9a65/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", upload-time = 2026-04-24T19:54:42Z, size = 4627192, hashes = { sha256 = "20fdbe3e38fb67c385d233c89371fa27f9909f6ebca1cecc20c13518dae65475" } }, + { url = "https://files.pythonhosted.org/packages/dc/53/cb358a80e9e359529f496870dd08c102aa8a4b5b9f9064f00f0d6ed5b527/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", upload-time = 2026-04-24T19:54:44Z, size = 4587486, hashes = { sha256 = "f7db373287273d8af1414cf95dc4118b13ffdc62be521997b0f2b270771fef50" } }, + { url = "https://files.pythonhosted.org/packages/8b/57/aaa3d53876467a226f9a7a82fd14dd48058ad2de1948493442dfa16e2ffd/cryptography-47.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", upload-time = 2026-04-24T19:54:47Z, size = 4626327, hashes = { sha256 = "9fe6b7c64926c765f9dff301f9c1b867febcda5768868ca084e18589113732ab" } }, + { url = "https://files.pythonhosted.org/packages/ab/9c/51f28c3550276bcf35660703ba0ab829a90b88be8cd98a71ef23c2413913/cryptography-47.0.0-pp311-pypy311_pp73-win_amd64.whl", upload-time = 2026-04-24T19:54:49Z, size = 3698916, hashes = { sha256 = "cffbba3392df0fa8629bb7f43454ee2925059ee158e23c54620b9063912b86c8" } }, +] + +[[packages]] +name = "daemonize" +version = "2.5.0" +marker = "sys_platform != 'win32'" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/8c/20/96f7dbc23812cfe4cf479c87af3e4305d0d115fd1fffec32ddeee7b9c82b/daemonize-2.5.0.tar.gz", upload-time = 2018-12-12T19:47:39Z, size = 8759, hashes = { sha256 = "dd026e4ff8d22cb016ed2130bc738b7d4b1da597ef93c074d2adb9e4dea08bc3" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/45/ad/1b20db02287afd40d3130a218ac5ce2f7d2ab581cfda29bada5e1c4bee17/daemonize-2.5.0-py2.py3-none-any.whl", upload-time = 2018-12-12T19:47:37Z, size = 5231, hashes = { sha256 = "9b6b91311a9d934ff3f5f766666635ca280d3de8e7137e4cd7d3f052543b989f" } }] + +[[packages]] +name = "deepmerge" +version = "2.0" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/a8/3a/b0ba594708f1ad0bc735884b3ad854d3ca3bdc1d741e56e40bbda6263499/deepmerge-2.0.tar.gz", upload-time = 2024-08-30T05:31:50Z, size = 19890, hashes = { sha256 = "5c3d86081fbebd04dd5de03626a0607b809a98fb6ccba5770b62466fe940ff20" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/2d/82/e5d2c1c67d19841e9edc74954c827444ae826978499bde3dfc1d007c8c11/deepmerge-2.0-py3-none-any.whl", upload-time = 2024-08-30T05:31:48Z, size = 13475, hashes = { sha256 = "6de9ce507115cff0bed95ff0ce9ecc31088ef50cbdf09bc90a09349a318b3d00" } }] + +[[packages]] +name = "dulwich" +version = "1.2.10" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/89/d9/e6272430ccf84739509f45006543a1babcecc55a70cbd296424901df8ed5/dulwich-1.2.10.tar.gz", upload-time = 2026-07-07T00:52:05Z, size = 1310282, hashes = { sha256 = "106546960f592216315e56d32a92e72e67f1e86671335722f833f5ecd5b73314" } } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/fb/8928fc911e872ded288ca6258f85dabd3d8aa7de35e8dccfb7bf37ef59be/dulwich-1.2.10-cp310-cp310-macosx_10_12_x86_64.whl", upload-time = 2026-07-07T00:51:00Z, size = 1379546, hashes = { sha256 = "07f81ec4773c89d5989d173a077ed54b400719b4990b2f46a7b5604f16da46d1" } }, + { url = "https://files.pythonhosted.org/packages/29/bd/9c8a1ff7fec58a74eb36ec54d124cf88b5ade65aea1fd612b82e791480bc/dulwich-1.2.10-cp310-cp310-macosx_11_0_arm64.whl", upload-time = 2026-07-07T00:51:02Z, size = 1373414, hashes = { sha256 = "afb850b4f6ff6f1c7178bfbefbf079a0d0d03014bb385929a0934732ac7dd0c0" } }, + { url = "https://files.pythonhosted.org/packages/21/31/0f7869d034766f65579e56705854c160020966238360b7583f8fa972b8a8/dulwich-1.2.10-cp310-cp310-manylinux_2_28_aarch64.whl", upload-time = 2026-07-07T00:51:04Z, size = 1452967, hashes = { sha256 = "86c81a30340ca15aa1d275f42abc1f297e0af2a2d6cc213b5e9e40f52c61ff4f" } }, + { url = "https://files.pythonhosted.org/packages/f6/e1/93dc57b7fbd3efc3fc7f57d8a094fd06f4372df8cbb9d5a23972147c354d/dulwich-1.2.10-cp310-cp310-manylinux_2_28_x86_64.whl", upload-time = 2026-07-07T00:51:05Z, size = 1477046, hashes = { sha256 = "51d97aaa382b6e9ee0adffcd0028c430ff133be4d6bbff53ee1aeedcb3fcff07" } }, + { url = "https://files.pythonhosted.org/packages/f2/1d/8fa893a9249bdf60790a5ebc012c367943684d0f65eabe4c2cb2576e5222/dulwich-1.2.10-cp310-cp310-win32.whl", upload-time = 2026-07-07T00:51:07Z, size = 1043829, hashes = { sha256 = "93299fd523892d39f69e08bf71984267798d76cb914163c48c998181891a24a2" } }, + { url = "https://files.pythonhosted.org/packages/5a/51/bf90a2b83eb67c2b2f125d39941ce20b4cdfeb7d41d89d1cc699f2dac474/dulwich-1.2.10-cp310-cp310-win_amd64.whl", upload-time = 2026-07-07T00:51:08Z, size = 1061358, hashes = { sha256 = "f91eb2908d900288da261f05fb436a384fc94b30980869a2db4db7b52b30047a" } }, + { url = "https://files.pythonhosted.org/packages/55/11/8a2aa5f7220d9290e4c9ad4ac6d482d9b34762079331e8e02d835329f552/dulwich-1.2.10-cp311-cp311-macosx_10_12_x86_64.whl", upload-time = 2026-07-07T00:51:10Z, size = 1378353, hashes = { sha256 = "f6d989605955bfbb678425a2e8710100ef35960340bfb55faaca902006c69163" } }, + { url = "https://files.pythonhosted.org/packages/7a/66/859b121c1f18fa32833a239beadd67cf11df89974ff223b28d9ff53f4f2f/dulwich-1.2.10-cp311-cp311-macosx_11_0_arm64.whl", upload-time = 2026-07-07T00:51:11Z, size = 1371855, hashes = { sha256 = "af4a750597d1a6e77bca74b9246bf84b62a9bfa7e48783af4ed0e9f04f0dbfbd" } }, + { url = "https://files.pythonhosted.org/packages/85/66/1833afc2444fc70e6e79458169275687aef858ea1c6a8198e2b7f97da27d/dulwich-1.2.10-cp311-cp311-manylinux_2_28_aarch64.whl", upload-time = 2026-07-07T00:51:13Z, size = 1493934, hashes = { sha256 = "6c715289e8c5667978ff28a1847736633766ca1c7082144ba0ee95e459be3f97" } }, + { url = "https://files.pythonhosted.org/packages/e9/1f/a200b9071a4d9dce6ce0033654d63ee389be2d4de432d1d7028dccdbf8d5/dulwich-1.2.10-cp311-cp311-manylinux_2_28_x86_64.whl", upload-time = 2026-07-07T00:51:15Z, size = 1523369, hashes = { sha256 = "f21c7f2dc4de8353b59b82bc0245838f3f94ff9332b71f6394642e3bb012c71b" } }, + { url = "https://files.pythonhosted.org/packages/11/1b/e36deccfa78f674e7c4d7482b2a710581a1161b65080dd6b1daac17c5b42/dulwich-1.2.10-cp311-cp311-win32.whl", upload-time = 2026-07-07T00:51:16Z, size = 1043413, hashes = { sha256 = "ca1fbe5f4b2ee48154b24c68eeb689b848394a857f7cb3dea3de0b86c464454b" } }, + { url = "https://files.pythonhosted.org/packages/fc/67/fb78d06d58486ea3bef2c87af17ea0b106d9863e89664cc834cea060af6e/dulwich-1.2.10-cp311-cp311-win_amd64.whl", upload-time = 2026-07-07T00:51:18Z, size = 1103445, hashes = { sha256 = "9874964ac78713c640c42c9dc27a74dd2d4169d99821a57301d37e5673409d27" } }, + { url = "https://files.pythonhosted.org/packages/73/fb/af9504fed5f023194143bd059132729aad00f4608f4ed785dc1f94ff500d/dulwich-1.2.10-cp312-cp312-macosx_10_13_x86_64.whl", upload-time = 2026-07-07T00:51:20Z, size = 1371347, hashes = { sha256 = "4bf4671061aa98e7f4d420fe5238b2ca2cb2a00a280c8f549fa92d34569971a8" } }, + { url = "https://files.pythonhosted.org/packages/4a/3e/aff9e8b9d07f3afac9c618cd2e7529e4695375a64ebd07831462bb78c946/dulwich-1.2.10-cp312-cp312-macosx_11_0_arm64.whl", upload-time = 2026-07-07T00:51:22Z, size = 1356141, hashes = { sha256 = "43315f1e95f7d5c1a6f2695f5534263b80678ccbfd9756101f07759a4e65850e" } }, + { url = "https://files.pythonhosted.org/packages/89/8d/03c2692896241b94d04cbc8f4db662458864e13604e5295baf96a2b647db/dulwich-1.2.10-cp312-cp312-manylinux_2_28_aarch64.whl", upload-time = 2026-07-07T00:51:23Z, size = 1437999, hashes = { sha256 = "699edc94fddd0a2346e41e405fd7c537072d75cb9ddb39bd47f2e8fbd56d1e4e" } }, + { url = "https://files.pythonhosted.org/packages/43/75/b37e1c9548d7b9355971e462acf5da795c9539d8b330f4495ddf0244d99a/dulwich-1.2.10-cp312-cp312-manylinux_2_28_x86_64.whl", upload-time = 2026-07-07T00:51:25Z, size = 1463581, hashes = { sha256 = "b2dc7c46cfeb40022d2fca9d23c3ca1aba602ee99bfb6554278f05f2aa890a0e" } }, + { url = "https://files.pythonhosted.org/packages/32/a0/2de9d8bfd975b79e51c40394d8fb627dbffc97a4c89778eb3314b304ea6e/dulwich-1.2.10-cp312-cp312-win32.whl", upload-time = 2026-07-07T00:51:26Z, size = 1082677, hashes = { sha256 = "9c01a6b29cedb054a16fa04adf834a6531a39450888fc7ce2b3bf0fb6cba70c4" } }, + { url = "https://files.pythonhosted.org/packages/d1/67/49e913c54d7723c5a5bb12a38552a6db5cb691631326882ab2208a5186fa/dulwich-1.2.10-cp312-cp312-win_amd64.whl", upload-time = 2026-07-07T00:51:28Z, size = 1053703, hashes = { sha256 = "96981c6704def4fd0f91fb9be9f613cf99ba327e2a655b8ef987f5f5245420f3" } }, + { url = "https://files.pythonhosted.org/packages/8b/9d/6389b4209788fe46e4943492158f497ac6f7c485b83c70a4f79546d0ccc5/dulwich-1.2.10-cp313-cp313-android_24_arm64_v8a.whl", upload-time = 2026-07-07T00:51:29Z, size = 1510472, hashes = { sha256 = "bd859654ed2e8c61c03066b739fc758b70edfcfce41344fae07f5f7f41b998b4" } }, + { url = "https://files.pythonhosted.org/packages/b7/5c/07c64540fc713057351db05a021deec6518f57e8393e734d058be8def427/dulwich-1.2.10-cp313-cp313-android_24_x86_64.whl", upload-time = 2026-07-07T00:51:31Z, size = 1500010, hashes = { sha256 = "adf9a780add1b6da7e6df1b609afca66733380188a3a257ea340bc080ef4637c" } }, + { url = "https://files.pythonhosted.org/packages/20/af/4007763bde53f768ac9736f81f5af2658808181024d2afe1b99e6bb34826/dulwich-1.2.10-cp313-cp313-macosx_10_13_x86_64.whl", upload-time = 2026-07-07T00:51:32Z, size = 1370987, hashes = { sha256 = "f337fd7dffe5e6cbff5e9a4694339b7575ed948babcc7675321efac075cb0a0e" } }, + { url = "https://files.pythonhosted.org/packages/23/da/336440eb9bf6ca889a99c0c1bab37763714e2f56fe9553fe23f269560c58/dulwich-1.2.10-cp313-cp313-macosx_11_0_arm64.whl", upload-time = 2026-07-07T00:51:34Z, size = 1355513, hashes = { sha256 = "ded6744fcd2fb0e1f66c811492aefcdbee169010057f2a2e034a463eb0118c80" } }, + { url = "https://files.pythonhosted.org/packages/bf/e4/cd27a143488489c4d40b3b9fefa2fa189c49920ac226c6b11475892f6576/dulwich-1.2.10-cp313-cp313-manylinux_2_28_aarch64.whl", upload-time = 2026-07-07T00:51:35Z, size = 1437157, hashes = { sha256 = "a16ea1a6d96db53a0089f7f6c4e6b942eff143e4de26b786aa894bf978ac148d" } }, + { url = "https://files.pythonhosted.org/packages/45/03/44017e9b958238612aa17f8a6ad9af4ff63536cb99c8d8f4e210a8aa6866/dulwich-1.2.10-cp313-cp313-manylinux_2_28_x86_64.whl", upload-time = 2026-07-07T00:51:37Z, size = 1462033, hashes = { sha256 = "dfe2683285a7363a0d4b16f7f6fc9ee8a57a7b1cb1c390695475b76d8ce1b0f5" } }, + { url = "https://files.pythonhosted.org/packages/75/74/6f2ddceed5d8fa3f49235fe33afd55d92a986a3bd5ce3dbcba42907d96d4/dulwich-1.2.10-cp313-cp313-win32.whl", upload-time = 2026-07-07T00:51:38Z, size = 1082412, hashes = { sha256 = "0840968ec6636a677b48bc6e38bf4ce2326e8f0d60cd9c9753cceeff5e23e92c" } }, + { url = "https://files.pythonhosted.org/packages/bf/c9/bf8c3e47edb11798db7303b255d63db916877042e848808a6b5942e6624e/dulwich-1.2.10-cp313-cp313-win_amd64.whl", upload-time = 2026-07-07T00:51:39Z, size = 1053583, hashes = { sha256 = "a2e884a93452e8e1fb4a4886d14b328bae65c7a2fa88466c0b38faa63204f34d" } }, + { url = "https://files.pythonhosted.org/packages/d1/2d/643fcf28fb2f3118ec6b558695e4e18b0991edf64d4447bc6c5105465d4f/dulwich-1.2.10-cp314-cp314-android_24_arm64_v8a.whl", upload-time = 2026-07-07T00:51:41Z, size = 1512387, hashes = { sha256 = "fd86069664383fc456eeb291d67dc541c7f6ab163c59da1f8e18c72283f120c5" } }, + { url = "https://files.pythonhosted.org/packages/b7/61/c57fd318bc943f294420353fa5544d54fb8984abdd95ef24a21d8d0f5b3d/dulwich-1.2.10-cp314-cp314-android_24_x86_64.whl", upload-time = 2026-07-07T00:51:43Z, size = 1502540, hashes = { sha256 = "e445229de65ad6c3a8e2d9934fb807453c09b94f1469d32804e19fdfdcf6fd94" } }, + { url = "https://files.pythonhosted.org/packages/03/8e/4b284074e199193dbc1cd8d26dcc92ab8f84fb73654c05c290619cd3ed24/dulwich-1.2.10-cp314-cp314-macosx_10_15_x86_64.whl", upload-time = 2026-07-07T00:51:45Z, size = 1375734, hashes = { sha256 = "09c36bed6f2695cf34e606c403a00c6511f87f31ed20cac68f0bacf6df21cc4b" } }, + { url = "https://files.pythonhosted.org/packages/e4/6c/b465e1b60ab4675cbeeb8977c871c4b773bf0667d1a33dfa879e446c86c8/dulwich-1.2.10-cp314-cp314-macosx_11_0_arm64.whl", upload-time = 2026-07-07T00:51:47Z, size = 1358916, hashes = { sha256 = "ea42aa414a53d71ae0e294003a10b17ad454ff73d345a82e47da93e977fd2ff1" } }, + { url = "https://files.pythonhosted.org/packages/6b/e8/7efcc79c58153dff1c96dc8992a161d28288a7381eb4591c49712d112f61/dulwich-1.2.10-cp314-cp314-manylinux_2_28_aarch64.whl", upload-time = 2026-07-07T00:51:48Z, size = 1485761, hashes = { sha256 = "5b60380225742d7292703e573ce5a86be6f69fb9088ef2965c43830479df9f90" } }, + { url = "https://files.pythonhosted.org/packages/d0/f7/609f2fcfafc515f25948f14c349467d2c3c72a035e65470a8cc4fa4fa7da/dulwich-1.2.10-cp314-cp314-manylinux_2_28_x86_64.whl", upload-time = 2026-07-07T00:51:49Z, size = 1513339, hashes = { sha256 = "c321650fc9fa0b3e614607f0a229523491153d0ab00502366ac93b022d3c7f6c" } }, + { url = "https://files.pythonhosted.org/packages/90/53/df8b6c6168e7e1bab5b33dbee0c82d99ab94021493e5d1f1445d15eb1c61/dulwich-1.2.10-cp314-cp314-win32.whl", upload-time = 2026-07-07T00:51:51Z, size = 1046718, hashes = { sha256 = "834df23dca29e5adc5310b1b73eb573ad805fd0f39987e86afda2d81bfe24ab1" } }, + { url = "https://files.pythonhosted.org/packages/5a/da/5497cc3be68fa62626da0111b88dfa1a296907fe67c3cd57ff65bd67c7bf/dulwich-1.2.10-cp314-cp314-win_amd64.whl", upload-time = 2026-07-07T00:51:52Z, size = 1106937, hashes = { sha256 = "abd8ffeec9c151cea62aafd25260ac7141a7ea56ce363dfc72cddf63396e8d02" } }, + { url = "https://files.pythonhosted.org/packages/1e/af/b88671fdc6cb3f0732d0bef0bfdc2937370dcef605c14d90d2d63f7b7c34/dulwich-1.2.10-cp314-cp314t-macosx_10_15_x86_64.whl", upload-time = 2026-07-07T00:51:55Z, size = 1421051, hashes = { sha256 = "d5fd557539c982aabe15f7a14cff3d8786cdb62578d6f90f7871379fa3453260" } }, + { url = "https://files.pythonhosted.org/packages/17/0d/0d5d1f92c3589772d6f367be9251c417e35890ca7b5e461ed90f11e1615f/dulwich-1.2.10-cp314-cp314t-macosx_11_0_arm64.whl", upload-time = 2026-07-07T00:51:57Z, size = 1359050, hashes = { sha256 = "66cb00f1298e4e0dd254ff6a68554577020b4b810b4a31083409baea62f8b1df" } }, + { url = "https://files.pythonhosted.org/packages/bf/23/0b1a354cbaa574596e0bde8171b452ec7882765fcef283dcd2f4d8bf93b0/dulwich-1.2.10-cp314-cp314t-manylinux_2_28_aarch64.whl", upload-time = 2026-07-07T00:51:58Z, size = 1440306, hashes = { sha256 = "eca947467a28992088a0461c408791b405153294887accb92f64d60f9cc04758" } }, + { url = "https://files.pythonhosted.org/packages/e6/14/0178b5f8a9ccaa7ae434d0c931d2c792b1243a1ea2d98a08646a936f132e/dulwich-1.2.10-cp314-cp314t-manylinux_2_28_x86_64.whl", upload-time = 2026-07-07T00:51:59Z, size = 1466689, hashes = { sha256 = "7712da64d7cad219c77aa4216d46a1b14876ed078b2a88621462d2834f4f85b3" } }, + { url = "https://files.pythonhosted.org/packages/9e/ac/10ba0dbe9cf3112d3b6fc8305b731798734017762200ac9fb75a0fc297be/dulwich-1.2.10-cp314-cp314t-win32.whl", upload-time = 2026-07-07T00:52:01Z, size = 1046430, hashes = { sha256 = "52cfbd70f178b5ad770b9a1aee8a757aeda0e7282ae72cd546a98e6b9b0816cb" } }, + { url = "https://files.pythonhosted.org/packages/34/d3/2bc63e9ef4a3248595b8f02bfee22bf9df77adb181a53716fd81305d2665/dulwich-1.2.10-cp314-cp314t-win_amd64.whl", upload-time = 2026-07-07T00:52:03Z, size = 1063788, hashes = { sha256 = "38478aa5d1821fd3d41e1ec7c65fb9a55d302d041635079db11118b79109054f" } }, + { url = "https://files.pythonhosted.org/packages/d1/f5/efdcbd50a4480083d8d049ea1c49095097802599f7ecd2dc92942af7f4c4/dulwich-1.2.10-py3-none-any.whl", upload-time = 2026-07-07T00:52:04Z, size = 711548, hashes = { sha256 = "b9f18afbe8e6f6a380b199df3d2da14312b4eac4ee34ee77c6f61c56bd2693ed" } }, +] + +[[packages]] +name = "errbot" +directory = { path = ".", editable = true } + +[[packages]] +name = "flask" +version = "3.1.3" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/26/00/35d85dcce6c57fdc871f3867d465d780f302a175ea360f62533f12b27e2b/flask-3.1.3.tar.gz", upload-time = 2026-02-19T05:00:57Z, size = 759004, hashes = { sha256 = "0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/7f/9c/34f6962f9b9e9c71f6e5ed806e0d0ff03c9d1b0b2340088a0cf4bce09b18/flask-3.1.3-py3-none-any.whl", upload-time = 2026-02-19T05:00:56Z, size = 103424, hashes = { sha256 = "f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c" } }] + +[[packages]] +name = "idna" +version = "3.18" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", upload-time = 2026-06-02T14:34:07Z, size = 196711, hashes = { sha256 = "ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", upload-time = 2026-06-02T14:34:06Z, size = 65455, hashes = { sha256 = "7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2" } }] + +[[packages]] +name = "itsdangerous" +version = "2.2.0" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", upload-time = 2024-04-16T21:28:15Z, size = 54410, hashes = { sha256 = "e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", upload-time = 2024-04-16T21:28:14Z, size = 16234, hashes = { sha256 = "c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef" } }] + +[[packages]] +name = "jinja2" +version = "3.1.6" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", upload-time = 2025-03-05T20:05:02Z, size = 245115, hashes = { sha256 = "0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", upload-time = 2025-03-05T20:05:00Z, size = 134899, hashes = { sha256 = "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" } }] + +[[packages]] +name = "markdown" +version = "3.10.2" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", upload-time = 2026-02-09T14:57:26Z, size = 368805, hashes = { sha256 = "994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", upload-time = 2026-02-09T14:57:25Z, size = 108180, hashes = { sha256 = "e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36" } }] + +[[packages]] +name = "markupsafe" +version = "3.0.3" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", upload-time = 2025-09-27T18:37:40Z, size = 80313, hashes = { sha256 = "722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698" } } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", upload-time = 2025-09-27T18:36:05Z, size = 11631, hashes = { sha256 = "2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559" } }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", upload-time = 2025-09-27T18:36:07Z, size = 12057, hashes = { sha256 = "e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419" } }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", upload-time = 2025-09-27T18:36:08Z, size = 22050, hashes = { sha256 = "1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695" } }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", upload-time = 2025-09-27T18:36:08Z, size = 20681, hashes = { sha256 = "f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591" } }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", upload-time = 2025-09-27T18:36:10Z, size = 20705, hashes = { sha256 = "c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c" } }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", upload-time = 2025-09-27T18:36:11Z, size = 21524, hashes = { sha256 = "0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f" } }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", upload-time = 2025-09-27T18:36:12Z, size = 20282, hashes = { sha256 = "d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6" } }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", upload-time = 2025-09-27T18:36:13Z, size = 20745, hashes = { sha256 = "177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1" } }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", upload-time = 2025-09-27T18:36:14Z, size = 14571, hashes = { sha256 = "2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa" } }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", upload-time = 2025-09-27T18:36:16Z, size = 15056, hashes = { sha256 = "c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8" } }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", upload-time = 2025-09-27T18:36:17Z, size = 13932, hashes = { sha256 = "e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1" } }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", upload-time = 2025-09-27T18:36:18Z, size = 11631, hashes = { sha256 = "1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad" } }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", upload-time = 2025-09-27T18:36:19Z, size = 12058, hashes = { sha256 = "4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a" } }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", upload-time = 2025-09-27T18:36:20Z, size = 24287, hashes = { sha256 = "6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50" } }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", upload-time = 2025-09-27T18:36:22Z, size = 22940, hashes = { sha256 = "0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf" } }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", upload-time = 2025-09-27T18:36:23Z, size = 21887, hashes = { sha256 = "bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f" } }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", upload-time = 2025-09-27T18:36:24Z, size = 23692, hashes = { sha256 = "068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a" } }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", upload-time = 2025-09-27T18:36:25Z, size = 21471, hashes = { sha256 = "7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115" } }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", upload-time = 2025-09-27T18:36:27Z, size = 22923, hashes = { sha256 = "f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a" } }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", upload-time = 2025-09-27T18:36:28Z, size = 14572, hashes = { sha256 = "0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19" } }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", upload-time = 2025-09-27T18:36:29Z, size = 15077, hashes = { sha256 = "de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01" } }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", upload-time = 2025-09-27T18:36:29Z, size = 13876, hashes = { sha256 = "3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c" } }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", upload-time = 2025-09-27T18:36:30Z, size = 11615, hashes = { sha256 = "d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e" } }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", upload-time = 2025-09-27T18:36:31Z, size = 12020, hashes = { sha256 = "1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce" } }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", upload-time = 2025-09-27T18:36:32Z, size = 24332, hashes = { sha256 = "3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d" } }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", upload-time = 2025-09-27T18:36:33Z, size = 22947, hashes = { sha256 = "d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d" } }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", upload-time = 2025-09-27T18:36:35Z, size = 21962, hashes = { sha256 = "94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a" } }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", upload-time = 2025-09-27T18:36:36Z, size = 23760, hashes = { sha256 = "be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b" } }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", upload-time = 2025-09-27T18:36:36Z, size = 21529, hashes = { sha256 = "83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f" } }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", upload-time = 2025-09-27T18:36:37Z, size = 23015, hashes = { sha256 = "77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b" } }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", upload-time = 2025-09-27T18:36:38Z, size = 14540, hashes = { sha256 = "d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d" } }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", upload-time = 2025-09-27T18:36:39Z, size = 15105, hashes = { sha256 = "26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c" } }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", upload-time = 2025-09-27T18:36:40Z, size = 13906, hashes = { sha256 = "35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f" } }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", upload-time = 2025-09-27T18:36:41Z, size = 11622, hashes = { sha256 = "e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795" } }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", upload-time = 2025-09-27T18:36:43Z, size = 12029, hashes = { sha256 = "116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219" } }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", upload-time = 2025-09-27T18:36:44Z, size = 24374, hashes = { sha256 = "133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6" } }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", upload-time = 2025-09-27T18:36:45Z, size = 22980, hashes = { sha256 = "ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676" } }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", upload-time = 2025-09-27T18:36:46Z, size = 21990, hashes = { sha256 = "509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9" } }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", upload-time = 2025-09-27T18:36:47Z, size = 23784, hashes = { sha256 = "a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1" } }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", upload-time = 2025-09-27T18:36:48Z, size = 21588, hashes = { sha256 = "795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc" } }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", upload-time = 2025-09-27T18:36:49Z, size = 23041, hashes = { sha256 = "8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12" } }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", upload-time = 2025-09-27T18:36:51Z, size = 14543, hashes = { sha256 = "bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed" } }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", upload-time = 2025-09-27T18:36:52Z, size = 15113, hashes = { sha256 = "9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5" } }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", upload-time = 2025-09-27T18:36:53Z, size = 13911, hashes = { sha256 = "7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485" } }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", upload-time = 2025-09-27T18:36:54Z, size = 11658, hashes = { sha256 = "218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73" } }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", upload-time = 2025-09-27T18:36:55Z, size = 12066, hashes = { sha256 = "3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37" } }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", upload-time = 2025-09-27T18:36:56Z, size = 25639, hashes = { sha256 = "4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19" } }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", upload-time = 2025-09-27T18:36:57Z, size = 23569, hashes = { sha256 = "8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025" } }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", upload-time = 2025-09-27T18:36:58Z, size = 23284, hashes = { sha256 = "b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6" } }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", upload-time = 2025-09-27T18:36:59Z, size = 24801, hashes = { sha256 = "9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f" } }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", upload-time = 2025-09-27T18:37:00Z, size = 22769, hashes = { sha256 = "12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb" } }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", upload-time = 2025-09-27T18:37:01Z, size = 23642, hashes = { sha256 = "8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009" } }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", upload-time = 2025-09-27T18:37:02Z, size = 14612, hashes = { sha256 = "69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354" } }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", upload-time = 2025-09-27T18:37:03Z, size = 15200, hashes = { sha256 = "1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218" } }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", upload-time = 2025-09-27T18:37:04Z, size = 13973, hashes = { sha256 = "ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287" } }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", upload-time = 2025-09-27T18:37:06Z, size = 11619, hashes = { sha256 = "eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe" } }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", upload-time = 2025-09-27T18:37:07Z, size = 12029, hashes = { sha256 = "c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026" } }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", upload-time = 2025-09-27T18:37:09Z, size = 24408, hashes = { sha256 = "f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737" } }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", upload-time = 2025-09-27T18:37:10Z, size = 23005, hashes = { sha256 = "457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97" } }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", upload-time = 2025-09-27T18:37:11Z, size = 22048, hashes = { sha256 = "e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d" } }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", upload-time = 2025-09-27T18:37:12Z, size = 23821, hashes = { sha256 = "ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda" } }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", upload-time = 2025-09-27T18:37:13Z, size = 21606, hashes = { sha256 = "0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf" } }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", upload-time = 2025-09-27T18:37:14Z, size = 23043, hashes = { sha256 = "2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe" } }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", upload-time = 2025-09-27T18:37:15Z, size = 14747, hashes = { sha256 = "729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9" } }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", upload-time = 2025-09-27T18:37:16Z, size = 15341, hashes = { sha256 = "bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581" } }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", upload-time = 2025-09-27T18:37:17Z, size = 14073, hashes = { sha256 = "5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4" } }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", upload-time = 2025-09-27T18:37:18Z, size = 11661, hashes = { sha256 = "1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab" } }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", upload-time = 2025-09-27T18:37:19Z, size = 12069, hashes = { sha256 = "1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175" } }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", upload-time = 2025-09-27T18:37:20Z, size = 25670, hashes = { sha256 = "1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634" } }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", upload-time = 2025-09-27T18:37:21Z, size = 23598, hashes = { sha256 = "fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50" } }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", upload-time = 2025-09-27T18:37:22Z, size = 23261, hashes = { sha256 = "f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e" } }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", upload-time = 2025-09-27T18:37:23Z, size = 24835, hashes = { sha256 = "e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5" } }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", upload-time = 2025-09-27T18:37:24Z, size = 22733, hashes = { sha256 = "f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523" } }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", upload-time = 2025-09-27T18:37:25Z, size = 23672, hashes = { sha256 = "5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc" } }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", upload-time = 2025-09-27T18:37:26Z, size = 14819, hashes = { sha256 = "915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d" } }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", upload-time = 2025-09-27T18:37:27Z, size = 15426, hashes = { sha256 = "4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9" } }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", upload-time = 2025-09-27T18:37:28Z, size = 14146, hashes = { sha256 = "32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa" } }, +] + +[[packages]] +name = "pycparser" +version = "3.0" +marker = "implementation_name != 'PyPy' and platform_python_implementation != 'PyPy'" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", upload-time = 2026-01-21T14:26:51Z, size = 103492, hashes = { sha256 = "600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", upload-time = 2026-01-21T14:26:50Z, size = 48172, hashes = { sha256 = "b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992" } }] + +[[packages]] +name = "pygments" +version = "2.20.0" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", upload-time = 2026-03-29T13:29:33Z, size = 4955991, hashes = { sha256 = "6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", upload-time = 2026-03-29T13:29:30Z, size = 1231151, hashes = { sha256 = "81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176" } }] + +[[packages]] +name = "pygments-markdown-lexer" +version = "0.1.0.dev39" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/c3/12/674cdee66635d638cedb2c5d9c85ce507b7b2f91bdba29e482f1b1160ff6/pygments-markdown-lexer-0.1.0.dev39.zip", upload-time = 2015-07-06T11:08:10Z, size = 28039, hashes = { sha256 = "4c128c26450b5886521c674d759f95fc3768b8955a7d9c81866ee0213c2febdf" } } + +[[packages]] +name = "pyopenssl" +version = "26.1.0" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/8c/a8/26d36401e3ab8eed9030ad33f381da7856fcfad5691780fccd1b019718fc/pyopenssl-26.1.0.tar.gz", upload-time = 2026-04-24T20:23:48Z, size = 186181, hashes = { sha256 = "737f0a2275c5bc54f3b02137687e1a765931fb3949b9a92a825e4d33b9eec08b" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/a8/41/52f3a3e812b816a91e89aa504199d8bf989a1f873192b10762be66cf2009/pyopenssl-26.1.0-py3-none-any.whl", upload-time = 2026-04-24T20:23:46Z, size = 58109, hashes = { sha256 = "115563879b2c8ccb207975705d3e491434d8c9d7c79667c902ecbf5f3bbd2ece" } }] + +[[packages]] +name = "requests" +version = "2.32.5" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", upload-time = 2025-08-18T20:46:02Z, size = 134517, hashes = { sha256 = "dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", upload-time = 2025-08-18T20:46:00Z, size = 64738, hashes = { sha256 = "2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6" } }] + +[[packages]] +name = "setuptools" +version = "83.0.0" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", upload-time = 2026-07-04T15:31:22Z, size = 1154254, hashes = { sha256 = "025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", upload-time = 2026-07-04T15:31:20Z, size = 1008090, hashes = { sha256 = "29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3" } }] + +[[packages]] +name = "typing-extensions" +version = "4.16.0" +marker = "python_full_version < '3.13'" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", upload-time = 2026-07-02T08:40:05Z, size = 113555, hashes = { sha256 = "dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", upload-time = 2026-07-02T08:40:04Z, size = 45571, hashes = { sha256 = "481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8" } }] + +[[packages]] +name = "urllib3" +version = "2.7.0" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", upload-time = 2026-05-07T16:13:18Z, size = 433602, hashes = { sha256 = "231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", upload-time = 2026-05-07T16:13:17Z, size = 131087, hashes = { sha256 = "9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897" } }] + +[[packages]] +name = "werkzeug" +version = "3.1.8" +index = "https://pypi.org/simple" +sdist = { url = "https://files.pythonhosted.org/packages/dd/b2/381be8cfdee792dd117872481b6e378f85c957dd7c5bca38897b08f765fd/werkzeug-3.1.8.tar.gz", upload-time = 2026-04-02T18:49:14Z, size = 875852, hashes = { sha256 = "9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/93/8c/2e650f2afeb7ee576912636c23ddb621c91ac6a98e66dc8d29c3c69446e1/werkzeug-3.1.8-py3-none-any.whl", upload-time = 2026-04-02T18:49:12Z, size = 226459, hashes = { sha256 = "63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50" } }] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..9e2fdd048 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,86 @@ +[build-system] +requires = ["setuptools>=77"] +build-backend = "setuptools.build_meta" + +[project] +name = "errbot" +dynamic = ["version", "readme"] +description = "Errbot is a chatbot designed to be simple to extend with plugins written in Python." +authors = [{name = "errbot.io", email = "info@errbot.io"}] +license = "GPL-3.0-or-later" +license-files = ["COPYING"] +requires-python = ">=3.10" +keywords = ["xmpp", "irc", "slack", "hipchat", "gitter", "tox", "chatbot", "bot", "plugin", "chatops"] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Topic :: Communications :: Chat", + "Topic :: Communications :: Chat :: Internet Relay Chat", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] +dependencies = [ + "setuptools>=78.1.1", + "flask==3.1.3", + "requests==2.32.5", + "jinja2==3.1.6", + "pyOpenSSL==26.1.0", + "colorlog==6.10.1", + "markdown==3.10.2", + "ansi==0.3.7", + "Pygments==2.20.0", + "pygments-markdown-lexer==0.1.0.dev39", + "dulwich==1.2.10", + "deepmerge==2.0", + 'daemonize==2.5.0; sys_platform != "win32"', +] + +[project.optional-dependencies] +slack = ["errbot-backend-slackv3==0.3.2"] +discord = ["err-backend-discord==3.0.1"] +mattermost = ["err-backend-mattermost==3.0.0"] +IRC = ["irc==20.5.0"] +telegram = ["python-telegram-bot==13.15"] +XMPP = [ + "slixmpp==1.12.0; python_version < '3.11'", + "slixmpp==1.15.0; python_version >= '3.11'", + "pyasn1==0.6.3", + "pyasn1-modules==0.4.2", +] +test = ["pytest", "requests"] + +[project.urls] +Homepage = "http://errbot.io/" + +[project.scripts] +errbot = "errbot.cli:main" + +[tool.setuptools.dynamic] +version = {attr = "errbot.version.VERSION"} +readme = {file = ["README.rst", "CHANGES.rst"], content-type = "text/x-rst"} + +[tool.setuptools.packages.find] +include = ["errbot", "errbot.*"] + +[tool.setuptools.package-data] +errbot = [ + "backends/*.plug", + "backends/*.html", + "backends/styles/*.css", + "backends/images/*.svg", + "core_plugins/*.plug", + "core_plugins/*.md", + "core_plugins/templates/*.md", + "storage/*.plug", + "templates/initdir/example.py", + "templates/initdir/example.plug", + "templates/initdir/config.py.tmpl", + "templates/*.md", + "templates/new_plugin.py.tmpl", +] + +[tool.ruff.lint.per-file-ignores] +"tests/borken_plugin/broken.py" = ["F401"] diff --git a/setup.py b/setup.py deleted file mode 100644 index 15fa4ccb8..000000000 --- a/setup.py +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/env python - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -import os -import sys - -from setuptools import find_packages, setup - -py_version = sys.version_info[:2] - -if py_version < (3, 10): - raise RuntimeError("Errbot requires Python 3.10 or later") - -VERSION_FILE = os.path.join("errbot", "version.py") - -deps = [ - "setuptools>=78.1.1", - "flask==3.1.3", - "requests==2.32.5", - "jinja2==3.1.6", - "pyOpenSSL==26.1.0", - "colorlog==6.10.1", - "markdown==3.10.2", - "ansi==0.3.7", - "Pygments==2.20.0", - "pygments-markdown-lexer==0.1.0.dev39", # syntax coloring to debug md - "dulwich==1.2.1", # python implementation of git - "deepmerge==2.0", -] - -src_root = os.curdir - - -def read_version(): - """ - Read directly the errbot/version.py and gives the version without loading Errbot. - :return: errbot.version.VERSION - """ - - variables = {} - with open(VERSION_FILE) as f: - exec(compile(f.read(), "version.py", "exec"), variables) - return variables["VERSION"] - - -def read(fname, encoding="ascii"): - return open( - os.path.join(os.path.dirname(__file__), fname), "r", encoding=encoding - ).read() - - -if __name__ == "__main__": - VERSION = read_version() - - args = set(sys.argv) - - changes = read("CHANGES.rst", "utf8") - - if changes.find(VERSION) == -1: - raise Exception("You forgot to put a release note in CHANGES.rst ?!") - - if args & {"bdist", "bdist_dumb", "bdist_rpm", "bdist_wininst", "bdist_msi"}: - raise Exception("err doesn't support binary distributions") - - packages = find_packages(src_root, include=["errbot", "errbot.*"]) - - setup( - name="errbot", - version=VERSION, - packages=packages, - entry_points={ - "console_scripts": [ - "errbot = errbot.cli:main", - ] - }, - install_requires=deps, - tests_require=["nose", "requests"], - package_data={ - "errbot": [ - "backends/*.plug", - "backends/*.html", - "backends/styles/*.css", - "backends/images/*.svg", - "core_plugins/*.plug", - "core_plugins/*.md", - "core_plugins/templates/*.md", - "storage/*.plug", - "templates/initdir/example.py", - "templates/initdir/example.plug", - "templates/initdir/config.py.tmpl", - "templates/*.md", - "templates/new_plugin.py.tmpl", - ], - }, - extras_require={ - "slack": [ - "errbot-backend-slackv3==0.3.2", - ], - "discord": [ - # held at 3.0.1: 4.0 is a major bump on external backend; compat unverified - "err-backend-discord==3.0.1", - ], - "mattermost": [ - "err-backend-mattermost==3.0.0", - ], - "IRC": [ - "irc==20.5.0", - ], - "telegram": [ - # held at 13.15: v20+ is fully async; backend would need a rewrite - "python-telegram-bot==13.15", - ], - "XMPP:python_version < '3.11'": [ - "slixmpp==1.12.0", - "pyasn1==0.6.3", - "pyasn1-modules==0.4.2", - ], - "XMPP:python_version >= '3.11'": [ - "slixmpp==1.15.0", - "pyasn1==0.6.3", - "pyasn1-modules==0.4.2", - ], - ':sys_platform!="win32"': ["daemonize==2.5.0"], - }, - author="errbot.io", - author_email="info@errbot.io", - description="Errbot is a chatbot designed to be simple to extend with plugins written in Python.", - long_description_content_type="text/x-rst", - long_description="".join([read("README.rst"), "\n\n", changes]), - license="GPL", - keywords="xmpp irc slack hipchat gitter tox chatbot bot plugin chatops", - url="http://errbot.io/", - classifiers=[ - "Development Status :: 5 - Production/Stable", - "Topic :: Communications :: Chat", - "Topic :: Communications :: Chat :: Internet Relay Chat", - "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - ], - src_root=src_root, - platforms="any", - ) diff --git a/tests/release_metadata_test.py b/tests/release_metadata_test.py new file mode 100644 index 000000000..3e27bf080 --- /dev/null +++ b/tests/release_metadata_test.py @@ -0,0 +1,38 @@ +"""Release-time gate. + +When ``errbot/version.py`` has been bumped past the dev sentinel ``9.9.9``, +``CHANGES.rst`` must contain a section heading for that version. On master +the sentinel keeps this test skipped; it only fires once a release is being +prepared (or a release branch is checked out), at which point it forces the +maintainer to update CHANGES.rst before the tag goes out. + +This replaces the install-time check that lived in setup.py. +""" +import re +from pathlib import Path + +import pytest + +REPO_ROOT = Path(__file__).resolve().parent.parent +DEV_SENTINEL = "9.9.9" + + +def _read_version() -> str: + """Read VERSION from errbot/version.py without importing the package.""" + ns: dict = {} + exec((REPO_ROOT / "errbot" / "version.py").read_text(), ns) + return ns["VERSION"] + + +def test_changes_rst_has_section_for_current_version(): + version = _read_version() + if version == DEV_SENTINEL: + pytest.skip(f"dev sentinel {DEV_SENTINEL} — no CHANGES.rst entry expected") + + changes = (REPO_ROOT / "CHANGES.rst").read_text() + pattern = rf"^v?{re.escape(version)}\b" + assert re.search(pattern, changes, re.MULTILINE), ( + f"CHANGES.rst is missing a section heading for version {version}. " + f"Rename the 'v{DEV_SENTINEL} (unreleased)' heading to the new " + "version, or add a new release section, before tagging." + ) diff --git a/tools/README.md b/tools/README.md index bc201fb15..02a82f810 100644 --- a/tools/README.md +++ b/tools/README.md @@ -18,12 +18,12 @@ These are support tools for the project - creates a temporary directory, clones the repository, builds the python package, and prepares multi-arch docker images. - **Requirements:** - `git` - - `pipenv` + - `uv` - `python 3.12` - `podman` (for docker image builds) - **Execution (macOS):** 1. **Pre-requisite:** Open `tools/releases.sh` and update the `RELEASE`, `BRANCH`, and `PYTHON_VERSION` variables to match the target release. - 2. Ensure you have the requirements installed (e.g., `brew install pipenv podman`). + 2. Ensure you have the requirements installed (e.g., `brew install uv podman`). 3. Make the script executable: `chmod +x tools/releases.sh` 4. Run the script from the project root: `./tools/releases.sh` 5. Follow the manual steps printed at the end of the script to complete the publication. diff --git a/tools/releases.sh b/tools/releases.sh index cbe653964..774e20759 100755 --- a/tools/releases.sh +++ b/tools/releases.sh @@ -36,13 +36,14 @@ pushd errbot git checkout ${BRANCH} header "pypi build" -pipenv --python ${PYTHON_VERSION} -pipenv run pip3 install pytest twine build +uv venv --python ${PYTHON_VERSION} +source .venv/bin/activate +uv pip install pytest twine build #header "pre-release gate (version <-> CHANGES.rst)" -#pipenv run python3 -m pytest tests/release_metadata_test.py -v +#python3 -m pytest tests/release_metadata_test.py -v -pipenv run python3 -m build +python3 -m build header "Building multi-arch docker images..." podman rmi -f errbotio/errbot:test 2>/dev/null || true @@ -50,10 +51,10 @@ podman manifest rm errbotio/errbot:test 2>/dev/null || true podman build --platform linux/amd64,linux/arm64 --manifest errbotio/errbot:test -f Dockerfile . header "Checking and uploading Python package..." -pipenv run twine check dist/* +twine check dist/* header "Manual: publish pypi and docker" -echo pipenv run twine upload dist/* +echo twine upload dist/* echo podman build --platform linux/amd64,linux/arm64 --manifest errbotio/errbot:${RELEASE} -f Dockerfile . echo podman manifest push errbotio/errbot:${RELEASE} docker://docker.io/errbotio/errbot:${RELEASE} echo git tag v${RELEASE} diff --git a/tox.ini b/tox.ini index a4e0e7fe4..d17e4032f 100644 --- a/tox.ini +++ b/tox.ini @@ -17,9 +17,10 @@ commands = [testenv:dist-check] deps = + build twine commands = - python setup.py sdist + python -m build --sdist twine check {toxinidir}/dist/* [testenv:security]