From 6d3649fb6aaabef776602430b1df92afe4a5c101 Mon Sep 17 00:00:00 2001
From: Edward Knight Sourced from cffi's
releases. Full Changelog: https://github.com/python-cffi/cffi/compare/v1.17.1...v2.0.0 Full Changelog: https://github.com/python-cffi/cffi/compare/v1.17.1...v2.0.0b1 Sourced from cryptography's
changelog. 46.0.1 - 2025-09-16 .. _v46-0-0: 46.0.0 - 2025-09-16Release notes
v2.0.0
What's Changed
v2.0.0b1
What's Changed
Commits
6366c01
release 2.0.0 (#196)95c8476
2.0.0 post beta backports (#195)195cbda
Release 2.0.0b1 (#183)b4bbe79
fix version test to support beta7ed073d
Add support for the free-threaded build (#178)67a170d
Change the license from MIT to MIT-no-attribution, which is the same
without ...92645ec
Add Python 3.14 support/testing (#177)2b81170
doc: update test commands in Section Testing/development tips (#158)25172b8
doc: update year (#153)b57a92c
issue 147: force-compute nested structs before parent structs. Occurs
mainly...
Updates `cryptography` from 45.0.6 to 46.0.1
Changelog
* Fixed an issue where users installing via ``pip`` on Python 3.14
development
versions would not properly install a dependency.
* Fixed an issue building the free-threaded macOS 3.14 wheels.
x86_64 macOS (including publishing wheels)
is deprecated
and will be removed in two releases. We will switch to publishing an
arm64 only wheel for macOS.ppc64le manylinux wheels and
publish them to PyPI.win_arm64 (Windows on Arm) wheels and
publish them to PyPI.get_attribute_for_oid method on
:class:~cryptography.x509.CertificateSigningRequest. Users
should use
:meth:~cryptography.x509.Attributes.get_attribute_for_oid
instead.CAST5, SEED,
IDEA, and Blowfish
classes from the cipher module. These are still available in
:doc:/hazmat/decrepit/index... _v45-0-7:
45.0.7 - 2025-09-01
* Added a function to support an upcoming ``pyOpenSSL`` release.
.. _v45-0-6:
e735cfc
release 46.0.1 (#13450)4e457ff
Explicitly specify python in mac uv build invocation (#13447)2726efd
Depend on CFFI 2.0.0 or newer on Python > 3.8 (#13448)6223062
release 46.0.0 (#13446)563c491
Update comment for pyopenssl-release tag (#13445)d2f6f7f
Bump downstream dependencies in CI (#13439)e7ab02b
we'll ship this with 3.5.3 why not (#13442)0b68a4b
Another pair of bump dependencies fix (#13444)e076d08
Attempt to fix commit message for bump downstreams (#13440)6835ce8
Put correct version bounds for pyenchant in pins (#13441)Sourced from jsonschema-specifications's releases.
v2025.9.1
What's Changed
- [pre-commit.ci] pre-commit autoupdate by
@pre-commit-ci[bot] in python-jsonschema/jsonschema-specifications#94- [pre-commit.ci] pre-commit autoupdate by
@pre-commit-ci[bot] in python-jsonschema/jsonschema-specifications#96- [pre-commit.ci] pre-commit autoupdate by
@pre-commit-ci[bot] in python-jsonschema/jsonschema-specifications#98- [pre-commit.ci] pre-commit autoupdate by
@pre-commit-ci[bot] in python-jsonschema/jsonschema-specifications#99- [pre-commit.ci] pre-commit autoupdate by
@pre-commit-ci[bot] in python-jsonschema/jsonschema-specifications#100- [pre-commit.ci] pre-commit autoupdate by
@pre-commit-ci[bot] in python-jsonschema/jsonschema-specifications#101- [pre-commit.ci] pre-commit autoupdate by
@pre-commit-ci[bot] in python-jsonschema/jsonschema-specifications#102- Bump actions/checkout from 4 to 5 by
@dependabot[bot] in python-jsonschema/jsonschema-specifications#104- [pre-commit.ci] pre-commit autoupdate by
@pre-commit-ci[bot] in python-jsonschema/jsonschema-specifications#103- [pre-commit.ci] pre-commit autoupdate by
@pre-commit-ci[bot] in python-jsonschema/jsonschema-specifications#105- [pre-commit.ci] pre-commit autoupdate by
@pre-commit-ci[bot] in python-jsonschema/jsonschema-specifications#106- Move 2019-09 "format" schema to correct directory by
@branenin python-jsonschema/jsonschema-specifications#107New Contributors
@branenmade their first contribution in python-jsonschema/jsonschema-specifications#107Full Changelog: https://github.com/python-jsonschema/jsonschema-specifications/compare/v2025.4.1...v2025.9.1
3b84601
Update docs requirements.5a27ff3
Merge pull request #107
from branen/relocate-misplaced-metaschemac2e2b75
Move 2019-09 "format" schema to correct directorye2b4d6a
Merge pull request #106
from python-jsonschema/pre-commit-ci-update-config1336f01
[pre-commit.ci] pre-commit autoupdate9dd6369
Merge pull request #105
from python-jsonschema/pre-commit-ci-update-configc1563ea
[pre-commit.ci] pre-commit autoupdatecbd01ef
No lockfile yet.125eafa
Merge pull request #103
from python-jsonschema/pre-commit-ci-update-config9dca87c
Use the setup-uv action for uv.Sourced from pycparser's releases.
release_v2.23
What's Changed
- Allow abstract declarator "static" (GH issue #539) by
@gpercivain eliben/pycparser#545- Add support for Python 3.13 by
@hugovkin eliben/pycparser#550- Add dirent and socket typedefs. by
@MegaManSecin eliben/pycparser#558- Support for labels with no statement by
@ignatiraboin eliben/pycparser#562- Accept empty 'case' or 'default' labels by
@ignatiraboin eliben/pycparser#564- fix: preserve parentheses for statement exprs by
@zawan-ilain eliben/pycparser#566- fix: hex float types by
@zawan-ilain eliben/pycparser#567- Explicit error for comments, with README link by
@cellularmitosisin eliben/pycparser#569- showemptyattrs option on Node.show() by
@cellularmitosisin eliben/pycparser#570- Add fake typedefs for GNU Extension 128-bit integers. by
@dj-wednesdayin eliben/pycparser#577- Typedef for __kernel_sa_family_t in linux/socket.h by
@crosserin eliben/pycparser#578New Contributors
@gpercivamade their first contribution in eliben/pycparser#545@MegaManSecmade their first contribution in eliben/pycparser#558@ignatirabomade their first contribution in eliben/pycparser#562@zawan-ilamade their first contribution in eliben/pycparser#566@cellularmitosismade their first contribution in eliben/pycparser#569@dj-wednesdaymade their first contribution in eliben/pycparser#577@crossermade their first contribution in eliben/pycparser#578Full Changelog: https://github.com/eliben/pycparser/compare/release_v2.22...release_v2.23
5b60167
Prepare for release 2.237b24736
Typedef for __kernel_sa_family_t in _fake_typedefs.h (#578)90184f1
Add fake typedefs for GNU Extension 128-bit integers. (#577)f04fdcd
showemptyattrs option on Node.show() (#570)156eae7
Explicit error for comments, with README link (#569)2215299
fix: hex float types (#567)037bd31
fix: preserve parentheses for statement exprs (#566)9cecc09
Accept empty 'case' or 'default' labels (#564)7ae671d
Support for labels with no statement (#562)42b5423
Add dirent and socket typedefs. (#558)Sourced from pygithub's releases.
v2.8.1
What's Changed
Bug Fixes
- Use default type if known type is not supported by
@EnricoMiin PyGithub/PyGithub#3365Full Changelog: https://github.com/PyGithub/PyGithub/compare/v2.8.0...v2.8.1
v2.8.0
What's Changed
New Features
- Add self hosted runner management to Organization by
@billnapierin PyGithub/PyGithub#3203- Add support to generate release notes by
@mball-agathosin PyGithub/PyGithub#3022Improvements
- Fix connection pooling to improve connection performance by
@chriskuehlin PyGithub/PyGithub#3289- Add
Repository.get_automated_security_fixesmethod by@zstyblikin PyGithub/PyGithub#3303- Sync
Issueclass with API spec by@EnricoMiin PyGithub/PyGithub#3338- Return more union classes like
NamedUser | Organization | Enterpriseby@EnricoMiin PyGithub/PyGithub#3224- Sync
Enterpriseclass with API spec by@EnricoMiin PyGithub/PyGithub#3342- Sync
GitReleaseAssetclass with API spec by@EnricoMiin PyGithub/PyGithub#3343- Sync many class with OpenAPI spec by
@EnricoMiin PyGithub/PyGithub#3344- Point deprecation warnings to the caller code rather than inner class by
@xmo-odooin PyGithub/PyGithub#3275- Allow for repo strings in all
Teamrepo methods by@EnricoMiin PyGithub/PyGithub#3356Bug Fixes
- Fix API path of
Repository.get_git_refby@csalerno-asmlin PyGithub/PyGithub#2992- Rework redirection URL allowance check by
@EnricoMiin PyGithub/PyGithub#3329- Fix
GitRelease.name, deprecateGitRelease.titleby@EnricoMiin PyGithub/PyGithub#3346- Remove
"COMMENT"as the default event forcreate_reviewby@eddie-santosin PyGithub/PyGithub#3078- Add support for public release assets by
@aoliemanin PyGithub/PyGithub#3339- Fix GitHub breaking API change of
maintainersinOrganization.create_teamby@interifterin PyGithub/PyGithub#3291Maintenance
- Minor fix to release.yml by
@EnricoMiin PyGithub/PyGithub#3201- Reduce test replay data by
@EnricoMiin PyGithub/PyGithub#3243- Add check to OpenAPI script to check doc-string verbs by
@EnricoMiin PyGithub/PyGithub#3332- Improve apply OpenAPI schemas by
@EnricoMiin PyGithub/PyGithub#3333- Add config to OpenAPI script to ignore schemas by
@EnricoMiin PyGithub/PyGithub#3334- Add suggest and create method feature to OpenAPI script by
@EnricoMiin PyGithub/PyGithub#3318- Fix CI OpenApi apply command by
@EnricoMiin PyGithub/PyGithub#3341- Improve OpenAPI scripts by
@EnricoMiin PyGithub/PyGithub#3340- Improve OpenAPI CI by
@EnricoMiin PyGithub/PyGithub#3347- Rework test framework by
@EnricoMiin PyGithub/PyGithub#3271- Some minor fixes to OpenAPI scripts by
@EnricoMiin PyGithub/PyGithub#3350- Add manual workflow to fix auto-fixable issues by
@EnricoMiin PyGithub/PyGithub#3351- Bump actions/download-artifact from 4 to 5 by
@dependabot[bot] in PyGithub/PyGithub#3330- Use default per-page const in
PaginatedListby@sam93210in PyGithub/PyGithub#3039- Bump actions/setup-python from 4 to 5 by
@dependabot[bot] in PyGithub/PyGithub#3283- Bump actions/checkout from 3 to 5 by
@dependabot[bot] in PyGithub/PyGithub#3348- Various minor OpenAPI scripts fixes by
@EnricoMiin PyGithub/PyGithub#3353- Add union class support to OpenAPI script by
@EnricoMiin PyGithub/PyGithub#3354- Add
github_actionslabel to Maintenance section by@EnricoMiin PyGithub/PyGithub#3357- Upgrade docformatter pre-commit hook by
@EnricoMiin PyGithub/PyGithub#3359
... (truncated)
Sourced from pygithub's changelog.
Version 2.8.1 (September 02, 2025)
Bug Fixes ^^^^^^^^^
- Use default type if known type is not supported (
[#3365](https://github.com/pygithub/pygithub/issues/3365) <https://github.com/PyGithub/PyGithub/pull/3365>) (40506415 <https://github.com/PyGithub/PyGithub/commit/40506415>)Version 2.8.0 (September 02, 2025)
New Features ^^^^^^^^^^^^
- Add self hosted runner management to Organization (
[#3203](https://github.com/pygithub/pygithub/issues/3203) <https://github.com/PyGithub/PyGithub/pull/3203>) (4ea1c4e2 <https://github.com/PyGithub/PyGithub/commit/4ea1c4e2>)- Add support to generate release notes (
[#3022](https://github.com/pygithub/pygithub/issues/3022) <https://github.com/PyGithub/PyGithub/pull/3022>) (e359b83a <https://github.com/PyGithub/PyGithub/commit/e359b83a>)Improvements ^^^^^^^^^^^^
- Fix connection pooling to improve connection performance (
[#3289](https://github.com/pygithub/pygithub/issues/3289) <https://github.com/PyGithub/PyGithub/pull/3289>_)- Add
Repository.get_automated_security_fixesmethod ([#3303](https://github.com/pygithub/pygithub/issues/3303) <https://github.com/PyGithub/PyGithub/pull/3303>) (22048d83 <https://github.com/PyGithub/PyGithub/commit/22048d83>)- Sync
Issueclass with API spec ([#3338](https://github.com/pygithub/pygithub/issues/3338) <https://github.com/PyGithub/PyGithub/pull/3338>) (62da467a <https://github.com/PyGithub/PyGithub/commit/62da467a>)- Return more union classes like
NamedUser | Organization | Enterprise([#3224](https://github.com/pygithub/pygithub/issues/3224) <https://github.com/PyGithub/PyGithub/pull/3224>) (aea64148 <https://github.com/PyGithub/PyGithub/commit/aea64148>)- Sync
Enterpriseclass with API spec ([#3342](https://github.com/pygithub/pygithub/issues/3342) <https://github.com/PyGithub/PyGithub/pull/3342>) (01bb5ab1 <https://github.com/PyGithub/PyGithub/commit/01bb5ab1>)- Sync
GitReleaseAssetclass with API spec ([#3343](https://github.com/pygithub/pygithub/issues/3343) <https://github.com/PyGithub/PyGithub/pull/3343>) (74449fed <https://github.com/PyGithub/PyGithub/commit/74449fed>)- Sync many class with OpenAPI spec (
[#3344](https://github.com/pygithub/pygithub/issues/3344) <https://github.com/PyGithub/PyGithub/pull/3344>_)- Point deprecation warnings to the caller code rather than inner class (
[#3275](https://github.com/pygithub/pygithub/issues/3275) <https://github.com/PyGithub/PyGithub/pull/3275>) (99bb5270 <https://github.com/PyGithub/PyGithub/commit/99bb5270>)- Allow for repo strings in all
Teamrepo methods ([#3356](https://github.com/pygithub/pygithub/issues/3356) <https://github.com/PyGithub/PyGithub/pull/3356>) (3234a21f <https://github.com/PyGithub/PyGithub/commit/3234a21f>)Bug Fixes ^^^^^^^^^
- Fix API path of
Repository.get_git_ref([#2992](https://github.com/pygithub/pygithub/issues/2992) <https://github.com/PyGithub/PyGithub/pull/2992>) (a6965031 <https://github.com/PyGithub/PyGithub/commit/a6965031>)- Rework redirection URL allowance check (
[#3329](https://github.com/pygithub/pygithub/issues/3329) <https://github.com/PyGithub/PyGithub/pull/3329>) (065b1319 <https://github.com/PyGithub/PyGithub/commit/065b1319>)- Fix
GitRelease.name, deprecateGitRelease.title([#3346](https://github.com/pygithub/pygithub/issues/3346) <https://github.com/PyGithub/PyGithub/pull/3346>) (fb51957f <https://github.com/PyGithub/PyGithub/commit/fb51957f>)- Remove
"COMMENT"as the default event forcreate_review([#3078](https://github.com/pygithub/pygithub/issues/3078) <https://github.com/PyGithub/PyGithub/pull/3078>) (8494da5c <https://github.com/PyGithub/PyGithub/commit/8494da5c>)- Add support for public release assets (
[#3339](https://github.com/pygithub/pygithub/issues/3339) <https://github.com/PyGithub/PyGithub/pull/3339>) (abad296e <https://github.com/PyGithub/PyGithub/commit/abad296e>)- Fix GitHub breaking API change of
maintainersinOrganization.create_team([#3291](https://github.com/pygithub/pygithub/issues/3291) <https://github.com/PyGithub/PyGithub/pull/3291>) (17bc4df4 <https://github.com/PyGithub/PyGithub/commit/17bc4df4>)Maintenance ^^^^^^^^^^^
- Minor fix to release.yml (
[#3201](https://github.com/pygithub/pygithub/issues/3201) <https://github.com/PyGithub/PyGithub/pull/3201>) (f1fc6e7c <https://github.com/PyGithub/PyGithub/commit/f1fc6e7c>)- Reduce test replay data (
[#3243](https://github.com/pygithub/pygithub/issues/3243) <https://github.com/PyGithub/PyGithub/pull/3243>) (19426454 <https://github.com/PyGithub/PyGithub/commit/19426454>)- Add check to OpenAPI script to check doc-string verbs (
[#3332](https://github.com/pygithub/pygithub/issues/3332) <https://github.com/PyGithub/PyGithub/pull/3332>) (3efde77d <https://github.com/PyGithub/PyGithub/commit/3efde77d>)- Improve apply OpenAPI schemas (
[#3333](https://github.com/pygithub/pygithub/issues/3333) <https://github.com/PyGithub/PyGithub/pull/3333>) (ec189dd6 <https://github.com/PyGithub/PyGithub/commit/ec189dd6>)- Add config to OpenAPI script to ignore schemas (
[#3334](https://github.com/pygithub/pygithub/issues/3334) <https://github.com/PyGithub/PyGithub/pull/3334>) (0478d33b <https://github.com/PyGithub/PyGithub/commit/0478d33b>)- Add suggest and create method feature to OpenAPI script (
[#3318](https://github.com/pygithub/pygithub/issues/3318) <https://github.com/PyGithub/PyGithub/pull/3318>_)- Fix CI OpenApi apply command (
[#3341](https://github.com/pygithub/pygithub/issues/3341) <https://github.com/PyGithub/PyGithub/pull/3341>) (cdc10a27 <https://github.com/PyGithub/PyGithub/commit/cdc10a27>)- Improve OpenAPI scripts (
[#3340](https://github.com/pygithub/pygithub/issues/3340) <https://github.com/PyGithub/PyGithub/pull/3340>) (ad278c5f <https://github.com/PyGithub/PyGithub/commit/ad278c5f>)- Improve OpenAPI CI (
[#3347](https://github.com/pygithub/pygithub/issues/3347) <https://github.com/PyGithub/PyGithub/pull/3347>) (8165bbc9 <https://github.com/PyGithub/PyGithub/commit/8165bbc9>)- Rework test framework (
[#3271](https://github.com/pygithub/pygithub/issues/3271) <https://github.com/PyGithub/PyGithub/pull/3271>) (1b700187 <https://github.com/PyGithub/PyGithub/commit/1b700187>)- Some minor fixes to OpenAPI scripts (
[#3350](https://github.com/pygithub/pygithub/issues/3350) <https://github.com/PyGithub/PyGithub/pull/3350>) (a813a945 <https://github.com/PyGithub/PyGithub/commit/a813a945>)- Add manual workflow to fix auto-fixable issues (
[#3351](https://github.com/pygithub/pygithub/issues/3351) <https://github.com/PyGithub/PyGithub/pull/3351>) (0e6317d9 <https://github.com/PyGithub/PyGithub/commit/0e6317d9>)
... (truncated)
ecd4764
Update changelog4050641
Use default type if known type is not supported (#3365)18eeb26
Release 2.8.0 (#3360)17bc4df
Fix GitHub breaking API change of maintainers in
Organization.create_team...6f0d6ef
Update docs on development (#3352)12d8d10
Add warning about Checks API in doc-strings (#3229)6ec3ca2
Upgrade docformatter pre-commit hook (#3359)9612e61
Revert get_enterprise breaking change (#3358)0c31f84
Add github_actions label to Maintenance section (#3357)3234a21
Allow for repo strings in all Team repo methods (#3356)Sourced from pynacl's changelog.
1.6.0 (2025-09-11)
- BACKWARDS INCOMPATIBLE: Removed support for Python 3.6 and 3.7.
- Added support for the low level AEAD AES bindings.
- Added support for
crypto_core_ed25519_from_uniform.- Update
libsodiumto 1.0.20-stable (2025-08-27 build).- Added support for free-threaded Python 3.14.
- Added support for Windows on ARM wheels.
3209bf1
release 1.6.0 (#891)15bc45d
upgrade to libsodium 1.0.20-stable 2025-08-27 build (#890)ac958e0
fix doc mistake (#892)593fb5e
update changelog and drop support for python 3.7 (#888)7bc6126
fix var casing in wheel builder (#889)59f9595
Support Python 3.14 and 3.14t (#880)2860f98
Bump actions/setup-python from 5 to 6 (#887)b712d60
Update CI for the new staticnode location (#885)1780489
Bump actions/checkout from 4.2.2 to 4.3.0 (#883)e03ffee
Bump actions/download-artifact from 4.3.0 to 5.0.0 (#882)Sourced from rpds-py's releases.
v0.27.1
What's Changed
- Include attestations in published artifacts by
@EpicWinkin crate-py/rpds#160New Contributors
@EpicWinkmade their first contribution in crate-py/rpds#160Full Changelog: https://github.com/crate-py/rpds/compare/v0.27.0...v0.27.1
7ecc7a5
Merge pull request #165
from EpicWink/pypi-publish-subdirab51ff3
Download packages to subdirectory in PyPI publish CI jobd1fd8ac
Merge pull request #162
from crate-py/dependabot/github_actions/astral-sh/set...cfb1867
Merge pull request #163
from crate-py/dependabot/github_actions/github/codeql...c29352f
Merge pull request #161
from EpicWink/pypi-publish-fix-dir21da625
Bump github/codeql-action from 3.29.10 to 3.29.1179cbefa
Bump astral-sh/setup-uv from 6.5.0 to 6.6.0c32f229
Specify packages directory for PyPI publish action09865d3
Tag a release.16a674d
Merge branch 'pypi-publish-action'Sourced from typing-extensions's releases.
4.15.0
No user-facing changes since 4.15.0rc1.
New features since 4.14.1:
- Add the
@typing_extensions.disjoint_basedecorator, as specified in PEP 800. Patch by Jelle Zijlstra.- Add
typing_extensions.type_repr, a backport ofannotationlib.type_repr, introduced in Python 3.14 (CPython PR #124551, originally by Jelle Zijlstra). Patch by Semyon Moroz.- Fix behavior of type params in
typing_extensions.evaluate_forward_ref. Backport of CPython PR #137227 by Jelle Zijlstra.4.15.0rc1
- Add the
@typing_extensions.disjoint_basedecorator, as specified in PEP 800. Patch by Jelle Zijlstra.- Add
typing_extensions.type_repr, a backport ofannotationlib.type_repr, introduced in Python 3.14 (CPython PR #124551, originally by Jelle Zijlstra). Patch by Semyon Moroz.- Fix behavior of type params in
typing_extensions.evaluate_forward_ref. Backport of CPython PR #137227 by Jelle Zijlstra.
Sourced from typing-extensions's changelog.
Release 4.15.0 (August 25, 2025)
No user-facing changes since 4.15.0rc1.
Release 4.15.0rc1 (August 18, 2025)
- Add the
@typing_extensions.disjoint_basedecorator, as specified in PEP 800. Patch by Jelle Zijlstra.- Add
typing_extensions.type_repr, a backport ofannotationlib.type_repr, introduced in Python 3.14 (CPython PR #124551, originally by Jelle Zijlstra). Patch by Semyon Moroz.- Fix behavior of type params in
typing_extensions.evaluate_forward_ref. Backport of CPython PR #137227 by Jelle Zijlstra.
9d1637e
Prepare release 4.15.0 (#658)4bd67c5
Coverage: exclude some noise (#656)e589a26
Coverage: add detailed report to job summary (#655)67d37fe
Coverage: Implement fail_under (#654)e9ae26f
Don't delete previous coverage comment (#653)ac80bb7
Add Coverage workflow (#623)abaaafd
Prepare release 4.15.0rc1 (#650)9810405
Add @disjoint_base (PEP 800) (#634)7ee9e05
Backport type_params fix from CPython (#646)1e8eb9c
Do not refer to PEP 705 as being experimental (#648)Sourced from zstandard's releases.
0.25.0
- PyO3 Rust created upgraded from 0.24 to 0.25. (#273)
- We now use
Py_REFCNT(obj)instead of accessing(*obj)->ob_refcntdirectly. This fixes a nogil / multi-threaded compile error. (#201, #275)- A zstandard commit to fix qsort detection on BSD operating systems has been backported. (#272)
- The
PYTHON_ZSTANDARD_IMPORT_POLICYenvironment variable now has leading and trailing whitespace stripped. Values likecffiandcffiare now equivalent tocffi.- The CI jobs for building wheels have been overhauled to always use
cibuildwheelanduv(where possible). This change should be backwards compatible. But wheel building for this project has historically been fragile and there may be unwanted changes. We're optimistic that standardizing on uv (except for musllinux ppc64le and s390x where uv isn't available) will lead to more stability over time.- CI now runs tests against the wheels we distribute. Previously, we ran tests against a separate build that was theoretically identical. But the builds may have been subtly different, leading to preventable bugs in our wheels. (Enabling this test coverage did not uncover any failures.)
- The
pyproject.tomlbuild backend has been switched fromsetuptools.build_meta:__legacy__tosetuptools.build_meta.- The setuptools build dependency has been upgraded from <69.0.0 to >=77.0.0. Modern versions of setuptools broke
--config-settings=--build-option=...as part of implementing PEP 660. A workaround is to use--config-settings=--global-option=...instead.--global-optionapparently is deprecated and the setuptools folks have yet to figure out how to thread config settings intosetup.pyinvocations. (--build-optionis sent to thebuild_wheelcommand but not thebuild_editablecommand.)- Python 3.14 wheels are now built with
manylinux_2_28(versusmanylinux2014) for older Python versions. This may raise the minimum glibc version, effectively dropping support for Debian 8 and 9, Ubuntu 13.10 through 18.04, Fedora 19 to 28, and RHEL/Centos 7. However, in practice most platforms don't container newer glibc symbols and are still ABI compatible withmanylinux2014and glibc 2.17.- We now require cffi >= 2.0.0b on Python 3.14. <3.14 still requires 1.17. (#274)
- The cffi backend is now automatically disabled for free-threaded builds on Python <3.14, as cffi didn't implement free-threaded support until the 2.0 release. (#274)
- Added CI coverage for free-threaded CPython 3.13 and 3.14. We do not yet formally support free-threaded builds. (#276)
- The C and Rust backends now declare the GIL as unused.
- The
pythoncapi_compat.hfile has been upgraded to the latest version. (#278)setup.pynow depends onpackagingand usespackaging.version.Versionfor version comparisons. This removes some deprecation warnings from usage of legacy distutilsVersionclasses.- Relax run-time libzstd version checking in C extension from exactly 1.5.7 to >=1.5.6. (#254, #267)
- C extension types now (correctly) declare their fully qualified type names
... (truncated)
Sourced from zstandard's changelog.
0.25.0 (released 2025-09-14)
- PyO3 Rust created upgraded from 0.24 to 0.25. (#273)
- We now use
Py_REFCNT(obj)instead of accessing(*obj)->ob_refcntdirectly. This fixes a nogil / multi-threaded compile error. (#201, #275)- A zstandard commit to fix qsort detection on BSD operating systems has been backported. (#272)
- The
PYTHON_ZSTANDARD_IMPORT_POLICYenvironment variable now has leading and trailing whitespace stripped. Values likecffiandcffiare now equivalent tocffi.- The CI jobs for building wheels have been overhauled to always use
cibuildwheelanduv(where possible). This change should be backwards compatible. But wheel building for this project has historically been fragile and there may be unwanted changes. We're optimistic that standardizing on uv (except for musllinux ppc64le and s390x where uv isn't available) will lead to more stability over time.- CI now runs tests against the wheels we distribute. Previously, we ran tests against a separate build that was theoretically identical. But the builds may have been subtly different, leading to preventable bugs in our wheels. (Enabling this test coverage did not uncover any failures.)
- The
pyproject.tomlbuild backend has been switched fromsetuptools.build_meta:__legacy__tosetuptools.build_meta.- The setuptools build dependency has been upgraded from <69.0.0 to >=77.0.0. Modern versions of setuptools broke
--config-settings=--build-option=...as part of implementing PEP 660. A workaround is to use--config-settings=--global-option=...`` instead.--global-optionapparently is deprecated and the setuptools folks have yet to figure out how to thread config settings intosetup.pyinvocations. (`--build-optionis sent to thebuild_wheelcommand but not thebuild_editablecommand.)- Python 3.14 wheels are now built with
manylinux_2_28(versusmanylinux2014) for older Python versions. This may raise the minimum glibc version, effectively dropping support for Debian 8 and 9, Ubuntu 13.10 through 18.04, Fedora 19 to 28, and RHEL/Centos 7. However, in practice most platforms don't container newer glibc symbols and are still ABI compatible withmanylinux2014and glibc 2.17.- We now require cffi >= 2.0.0b on Python 3.14. <3.14 still requires 1.17. (#274)
- The cffi backend is now automatically disabled for free-threaded builds on Python <3.14, as cffi didn't implement free-threaded support until the 2.0 release. (#274)
- Added CI coverage for free-threaded CPython 3.13 and 3.14. We do not yet formally support free-threaded builds. (#276)
- The C and Rust backends now declare the GIL as unused.
- The
pythoncapi_compat.hfile has been upgraded to the latest version. (#278)setup.pynow depends onpackagingand usespackaging.version.Versionfor version comparisons. This removes some deprecation warnings from usage of legacy distutilsVersionclasses.- Relax run-time libzstd version checking in C extension from exactly 1.5.7
... (truncated)
7a77a75
global: release 0.25.07935539
rust: cargo upgradebc3074c
rust: update dependenciesSourced from actions/setup-python's releases.
v6.0.0
What's Changed
Breaking Changes
- Upgrade to node 24 by
@salmanmkcin actions/setup-python#1164Make sure your runner is on version v2.327.1 or later to ensure compatibility with this release. See Release Notes
Enhancements:
- Add support for
pip-versionby@priyagupta108in actions/setup-python#1129- Enhance reading from .python-version by
@krystof-kin actions/setup-python#787- Add version parsing from Pipfile by
@aradkdjin actions/setup-python#1067Bug fixes:
- Clarify pythonLocation behaviour for PyPy and GraalPy in environment variables by
@aparnajyothi-yin actions/setup-python#1183- Change missing cache directory error to warning by
@aparnajyothi-yin actions/setup-python#1182- Add Architecture-Specific PATH Management for Python with --user Flag on Windows by
@aparnajyothi-yin actions/setup-python#1122- Include python version in PyPy python-version output by
@cdce8pin actions/setup-python#1110- Update docs: clarification on pip authentication with setup-python by
@priya-kinthaliin actions/setup-python#1156Dependency updates:
- Upgrade idna from 2.9 to 3.7 in /tests/data by
@dependabot[bot] in actions/setup-python#843- Upgrade form-data to fix critical vulnerabilities #182 & #183 by
@aparnajyothi-yin actions/setup-python#1163- Upgrade setuptools to 78.1.1 to fix path traversal vulnerability in PackageIndex.download by
@aparnajyothi-yin actions/setup-python#1165- Upgrade actions/checkout from 4 to 5 by
@dependabot[bot] in actions/setup-python#1181- Upgrade
@actions/tool-cachefrom 2.0.1 to 2.0.2 by@dependabot[bot] in actions/setup-python#1095New Contributors
@krystof-kmade their first contribution in actions/setup-python#787@cdce8pmade their first contribution in actions/setup-python#1110@aradkdjmade their first contribution in actions/setup-python#1067Full Changelog: https://github.com/actions/setup-python/compare/v5...v6.0.0
e797f83
Upgrade to node 24 (#1164)3d1e2d2
Revert "Enhance cache-dependency-path handling to support files
outside the w...65b0712
Clarify pythonLocation behavior for PyPy and GraalPy in environment
variables...5b668cf
Bump actions/checkout from 4 to 5 (#1181)f62a0e2
Change missing cache directory error to warning (#1182)9322b3c
Upgrade setuptools to 78.1.1 to fix path traversal vulnerability in
PackageIn...fbeb884
Bump form-data to fix critical vulnerabilities #182
& #183
(#1163)03bb615
Bump idna from 2.9 to 3.7 in /tests/data (#843)36da51d
Add version parsing from Pipfile (#1067)3c6f142
update documentation (#1156)Sourced from actions/attest-build-provenance's releases.
v3.0.0
What's Changed
- Adjust node max-http-header-size setting by
@bdehamerin actions/attest-build-provenance#687- Bump actions/attest from v2.4.0 to v3.0.0 by
@bdehamerin actions/attest-build-provenance#691
- Bump to node24 runtime
- Improved checksum parsing
- Bump attest-build-provenance/predicate to v2.0.0 by
@bdehamerin actions/attest-build-provenance#693
- Bump to node24 runtime by
@bdehamerin actions/attest-build-provenance#692⚠️ Minimum Compatible Runner Version
v2.327.1 Release Notes
Make sure your runner is updated to this version or newer to use this release.
Full Changelog: https://github.com/actions/attest-build-provenance/compare/v2.4.0...v3.0.0
977bb37
bump attest-build-provenance/predicate to v2.0.0 (#693)864457a
Bump to node24 runtime (#692)57aa2b0
bump actions/attest from v2.4.0 to v3.0.0 (#691)8ee7163
refactor eslint config (#690)91ca1c2
Bump actions/checkout from 4.1.1 to 5.0.0 (#684)ff19f40
custom node max-http-header-size (#687)8bd83f1
pin workflow deps (#683)f0878de
Bump the npm-development group with 4 updates (#681)463e6df
Bump the npm-development group with 3 updates (#678)fef91c1
Bump the npm-development group with 6 updates (#673)Sourced from zizmorcore/zizmor-action's releases.
v0.2.0
What's Changed
- feat: add support for
colorinput by@birjjin zizmorcore/zizmor-action#37- Adding option for GitHub annotations by
@abdelqin zizmorcore/zizmor-action#45New Contributors
@birjjmade their first contribution in zizmorcore/zizmor-action#37@abdelqmade their first contribution in zizmorcore/zizmor-action#45Full Changelog: https://github.com/zizmorcore/zizmor-action/compare/v0.1.2...v0.2.0
e673c39
Adding option for GitHub annotations (#45)2d5a33f
chore: add missing license (#44)a016d81
chore(deps): bump github/codeql-action in the github-actions group (#39)a8fb1d7
feat: add support for color input (#37)0968032
chore(deps): bump the github-actions group with 2 updates (#35)7f2abff
README: bump pins (#33)Sourced from anyhow's releases.
1.0.99
- Allow build-script cleanup failure with NFSv3 output directory to be non-fatal (#420)
1.0.98
- Add
self.into_boxed_dyn_error()andself.reallocate_into_boxed_dyn_error_without_backtrace()methods for anyhow::Error (#415)1.0.97
- Documentation improvements
1.0.96
- Documentation improvements
f2b963a
Release 1.0.992c64c15
Merge pull request #420
from dtolnay/enotempty8cf66f7
Allow build-script cleanup failure with NFSv3 output directory to be
non-fatalf5e145c
Revert "Pin nightly toolchain used for miri job"1d7ef1d
Update ui test suite to nightly-2025-06-306929572
Update ui test suite to nightly-2025-06-1837224e3
Ignore mismatched_lifetime_syntaxes lint11f0e81
Pin nightly toolchain used for miri jobd04c999
Raise required compiler for backtrace feature to rust 1.82219d163
Update test suite to nightly-2025-05-011168eb2
workspace: perform releases1cbcefc
workspace: enable http2 reqwest featured5d09f0
apple-codesign: add release notes for Info.plist fix0e88caf
apple-codesign: print S3 error contextb7fab9b
apple-codesign: honor verbose level to set logging levelcfb7529
apple-platform-rs: fix non-macOS Info.plist detection100545d
apple-xar: add id attribute for extended attribute struct5fb3af6
apple-sdk: support reading path set by xcode-select
--switch9ba97e6
app-store-connect: add api to enable capability for a bundle IDe09f979
app-store-connect: add IosDistribution certificate typeSourced from bytes's releases.
Bytes v1.10.1
1.10.1 (March 5th, 2025)
Fixed
- Fix memory leak when using
to_vecwithBytes::from_owner(#773)
Sourced from bytes's changelog.
1.10.1 (March 5th, 2025)
Fixed
- Fix memory leak when using
to_vecwithBytes::from_owner(#773)
19d1427
chore: prepare bytes v1.10.1 (#774)3667543
Fix memory leak in owned_to_vec (#773)Sourced from clap's releases.
v4.5.47
[4.5.47] - 2025-09-02
Features
- Added
impl FromArgMatches for ()- Added
impl Args for ()- Added
impl Subcommand for ()- Added
impl FromArgMatches for Infallible- Added
impl Subcommand for InfallibleFixes
- (derive) Update runtime error text to match
clapv4.5.46
[4.5.46] - 2025-08-26
Features
- Expose
StyledStr::push_strv4.5.45
[4.5.45] - 2025-08-12
Fixes
- (unstable-v5)
ValueEnumvariants now use the full doc comment, not summary, forPossibleValue::helpv4.5.44
[4.5.44] - 2025-08-11
Features
- Add
Command::mut_subcommandsv4.5.43
[4.5.43] - 2025-08-06
Fixes
- (help) In long help, list Possible Values before defaults, rather than after, for a more consistent look
v4.5.42
[4.5.42] - 2025-07-30
Fixes
- Include subcommand visible long aliases in
--help
... (truncated)
Sourced from clap's changelog.
[4.5.47] - 2025-09-02
Features
- Added
impl FromArgMatches for ()- Added
impl Args for ()- Added
impl Subcommand for ()- Added
impl FromArgMatches for Infallible- Added
impl Subcommand for InfallibleFixes
- (derive) Update runtime error text to match
clap[4.5.46] - 2025-08-26
Features
- Expose
StyledStr::push_str[4.5.45] - 2025-08-12
Fixes
- (unstable-v5)
ValueEnumvariants now use the full doc comment, not summary, forPossibleValue::help[4.5.44] - 2025-08-11
Features
- Add
Command::mut_subcommands[4.5.43] - 2025-08-06
Fixes
- (help) In long help, list Possible Values before defaults, rather than after, for a more consistent look
[4.5.42] - 2025-07-30
Fixes
- Include subcommand visible long aliases in
--help[4.5.41] - 2025-07-09
Features
- Add
Styles::contextandStyles::context_valueto customize the styling of[default: value]like notes in the--help
... (truncated)
f046ca6
chore: Release436949d
docs: Update changelog1ddab84
Merge pull request #5954
from epage/tests8a66dbf
test(complete): Add more native cases76465cf
test(complete): Make things more consistent232cedb
test(complete): Remove redundant index02244a6
Merge pull request #5949
from krobelus/option-name-completions-after-positionals2e13847
fix(complete): Missing options in multi-val arg74388d7
test(complete): Multi-valued, unbounded positional5b3d45f
refactor(complete): Extract function for options2757052
version 1.1.0d2c8040
test_env_case_preservingae8814e
use a mixed-case env var name in test_env_remove_case_sensitivity944c126
add tests for EnvNameString61f29ff
avoid allocating in EnvNameString::hashfc909f7
use case-insensitive strings for env var names on Windows306bb5c
clarify a comment in StdinBytesHandle::waitca531e2
improve the Expression docs38fa270
wait_timeout and wait_deadline0c90564
switch back to IntoRawFd/IntoRawHandle boundsSourced from flate2's releases.
1.1.2
What's Changed
- feat: simplify manual bits extraction and an unneeded reref by
@CosminPerRamin rust-lang/flate2-rs#484- chore: update deps by
@CosminPerRamin rust-lang/flate2-rs#485- feat: solve remaining clippy warnings and add it to CI by
@CosminPerRamin rust-lang/flate2-rs#487- ci: add audit check by
@CosminPerRamin rust-lang/flate2-rs#488- feat: revert most recent deps updates by
@CosminPerRamin rust-lang/flate2-rs#489- upgrade zlib-rs to version
0.5.1by@folkertdevin rust-lang/flate2-rs#490Full Changelog: https://github.com/rust-lang/flate2-rs/compare/1.1.1...1.1.2
1.1.1
This release should be smaller and thus faster to download. Additionally, when using the
zlib-rsbackend, duplicate symbol issues shouldn't occur anymore.What's Changed
- docs: Update README to promote zlib-rs by
@Xuanwoin rust-lang/flate2-rs#470- Update miniz_oxide to 0.8.5 by
@oyvindlnin rust-lang/flate2-rs#475- Remove stale CHANGELOG.md by
@jayvdbin rust-lang/flate2-rs#476- More informative README on backends by
@Shnatselin rust-lang/flate2-rs#480- Rewrite outdated backend notes in lib.rs by
@Shnatselin rust-lang/flate2-rs#481- upgrade zlib-rs to version
0.5.0by@folkertdevin rust-lang/flate2-rs#482New Contributors
@Xuanwomade their first contribution in rust-lang/flate2-rs#470@jayvdbmade their first contribution in rust-lang/flate2-rs#476Full Changelog: https://github.com/rust-lang/flate2-rs/compare/1.1.0...1.1.1
1.1.0
What's Changed
- Fix cfgs by
@kornelskiin rust-lang/flate2-rs#441- update CI to use new wasi target by
@oyvindlnin rust-lang/flate2-rs#444- Implement
CloneforCompressErrorandDecompressErrorby@mkrasnitskiin rust-lang/flate2-rs#445- Update LICENSE-MIT by
@maximevtushin rust-lang/flate2-rs#448- feat: replace custom u16 le parser with existent rust method by
@CosminPerRamin rust-lang/flate2-rs#450- Fix CI by
@Byronin rust-lang/flate2-rs#449- Do not use cloudflare-zlib-sys 0.3.4 by
@jongiddyin rust-lang/flate2-rs#451- Increase minimum compiler version to 1.67 by
@jongiddyin rust-lang/flate2-rs#452- deps: bump miniz_oxide to 0.8.4 by
@CosminPerRamin rust-lang/flate2-rs#459- deps(dev): update rand to 0.9 by
@CosminPerRamin rust-lang/flate2-rs#458- docs: fix spelling mistake in flate2::zlib::write::ZlibDecoder by
@CosminPerRamin rust-lang/flate2-rs#455- feat: remove explicit default impls by
@CosminPerRamin rust-lang/flate2-rs#457- Change private bounds from
R: ReadtoR: BufReadby@JonathanBrouwerin rust-lang/flate2-rs#453- feat: replace manual copy loop with rust-provided function by
@CosminPerRamin rust-lang/flate2-rs#456- feat: reduce CrcReader::sum calls in GzEncoder::read_footer by
@CosminPerRamin rust-lang/flate2-rs#454- feat: remove redundant if guard on option value match by
@CosminPerRamin rust-lang/flate2-rs#464- feat: add Error associated type in zio::Ops to handle multiple errors by
@CosminPerRamin rust-lang/flate2-rs#461- feat: remove explicit redundant lifetime by
@CosminPerRamin rust-lang/flate2-rs#465
... (truncated)
ac4d950
Merge pull request #490
from folkertdev/update-zlib-rs-0.5.1e38e16f
upgrade zlib-rs to version 0.5.176cc0cc
Merge pull request #489
from CosminPerRam/feat/revert_updates8f52350
Revert "chore: update deps"df11207
Merge pull request #488
from CosminPerRam/ci/audita8872d7
ci: rename audit job190750c
ci: add audit checkc2c78de
solve remaining clippy warnings and add it to CI (#487)306e909
Merge pull request #485
from CosminPerRam/chore/update_deps29d8194
Merge pull request #484
from CosminPerRam/feat/simplify_manual_conversionSourced from goblin's changelog.
[0.10.1]
Added
pe: Add .NET CLR parser, thanks
@kkent030315: m4b/goblin#432 pe: Add parser forC_SCOPE_TABLE, thanks@kkent030315: m4b/goblin#477 pe: Add resource parser, thanks@kkent030315: m4b/goblin#431 pe: Addparse_tls_dataoption, thanks@ideeockus: m4b/goblin#457 pe: Add load config parser, thanks@kkent030315: m4b/goblin#464 elf: addedtype_to_strsupport for coredump constants, thanks@gunbux: m4b/goblin#475 elf: added PowerPC64 relocations, thanks@Gelbpunkt: m4b/goblin#484Fixed
pe: fix load config parser out of bounds, thanks
@kkent030315and Robel Campbell: m4b/goblin#483 pe: remove unwind info alignment assertion, thanks@kkent030315: m4b/goblin#480 pe: fix base relocation parser panic, thanks@kkent030315: m4b/goblin#465 pe: Fix some offsets computation when using scroll, thanks@DreydenGys: m4b/goblin#471 pe: cannot read cb size, thanks chf0x: m4b/goblin#472 pe: fix tls raw data parser, thanks@jorgeaduranand@kkent030315: m4b/goblin#473 build: fix no-std build errors, thanks@hannahfluch: m4b/goblin#478[0.10.0] - 2025-5-25
Breaking
build: use rust 2024 edition; bump MSRV to 1.85 pe: fix address size incompatibility on 32-bit builds, thanks
@kkent030315: m4b/goblin#441 pe: fix fail on malformed certificate table parsing, thanks@ideeockus: m4b/goblin#417 pe: remove use of generics for is_32bit, thanks@kkent030315: m4b/goblin#435 pe: Support multiple debug directories and VCFeature, Repro, ExDllCharacteristics, POGO parsers, thanks@kkent030315: m4b/goblin#403Added
elf: add Loongarch macros and name mapping, thanks
@000lbh: m4b/goblin#446 pe: Add base relocation parser thanks@kkent030315: m4b/goblin#444Fixed
pe.header: fix parse without rich header, thanks
@ideeockus: m4b/goblin#451 pe.header: fix parse header with no dos stub, thanks@ideeockus: m4b/goblin#456 pe.imports: ignore malformed imports in ParseMode::Permissive, thanks@ideeockus: m4b/goblin#442 pe: Change Section Table Real Name Handling, thanks@prettyroseslover: m4b/goblin#438 pe.tls:tlsdata.parse_with_opts- integer overflow + out of bound, thanks@BinFlip: m4b/goblin#448 pe.debug:POGOInfo.parse_with_opts- integer overflow + out of bound, thanks@BinFlip: m4b/goblin#449 archive: fix subtract with overflow in archive parser, thanks@kkent030315: m4b/goblin#454 te: fix subtract with overflow in TE header parser, thanks@kkent030315: m4b/goblin#452 archive: fix size overflow in name index parser, thanks@kkent030315: m4b/goblin#455 coff: fix subtract with overflow in COFF header parser, thanks@kkent030315: m4b/goblin#453[0.9.3] - 2025-1-5
Fixed
pe: fix import parser for non-well-formed import table, thanks
@kkent030315: m4b/goblin#429 pe: fix empty import table parsing, thanks@kkent030315: m4b/goblin#430Added
pe: Add tests for TLS parser and characteristics constants, thanks
@kkent030315: m4b/goblin#426 elf: added new constants for 32-bit PowerPC, thanks@ivlzmem4b/goblin#439[0.9.2] - 2024-10-26
... (truncated)
Sourced from http's releases.
v1.3.1
What's Changed
- fix: validate path bytes are at least utf8 by
@seanmonstarin hyperium/http#756Full Changelog: https://github.com/hyperium/http/compare/v1.3.0...v1.3.1
v1.3.0
What's Changed
- Allow most UTF-8 characters in URI path and query. (hyperium/http#715)
- This means paring
Uris with previously illegal characters according the original RFC will now be accepted. They used to be rejected in the name of spec purity, but many operators were using a fork ofhttpbecause reality is that most characters are seen in the real world.- Fix
HeaderMap::reserve()to allocate sufficient capacity.New Contributors
@joelwurtzmade their first contribution in hyperium/http#715@ADD-SPmade their first contribution in hyperium/http#738@kawaemonmade their first contribution in hyperium/http#741@DaniPopesmade their first contribution in hyperium/http#748@jpdsmade their first contribution in hyperium/http#695Thanks!
Full Changelog: https://github.com/hyperium/http/compare/v1.2.0...v1.3.0
Sourced from http's changelog.
1.3.1 (March 11, 2025)
- Fix validation that all characters are UTF-8 in URI path and query.
1.3.0 (March 11, 2025)
- Allow most UTF-8 characters in URI path and query.
- Fix
HeaderMap::reserve()to allocate sufficient capacity.
8c1fb20
v1.3.16637a72
fix: validate path bytes are at least utf8 (#756)d0dd91e
v1.3.064bd92b
docs: Fixed encryption/compression typo for 'accept-encoding: identity'.
(#695)b03ed6a
chore: use range.contains in StatusCode methods (#748)a463fb5
chore(ci): use yq to get rust-version in manifest (#746)68845bd
fix: HeaderMap::reserve allocates insufficient capacity (#741)4e02046
refactor(header): remove BytesMut inline optimization when creating (#738)091ee9a
feat(uri): allow utf8 char, not rfc 3986 compliant, in path and query
(#715)Sourced from http-body-util's releases.
http-body-util v0.1.3
Features
- Add
Channel, a body type backed by an async channel.- Make
Empty::new()to beconst fn.Thanks!
ad4a9c9
http-body-util: v0.1.3c86632e
feat(util): introduce Sender::{capacity, max_capacity} (#147)f904761
update copyright year (#148)5d21ad1
feat(util): introduce channel::Sender::try_send() (#146)1090bff
docs: notes on poll_frame return values (#144)261b2df
docs: is_end_stream is a hint (#143)86fdf00
util: add a channel body (#140)7339aec
chore(http-body): update msrv to 1.61 (#141)98d0886
feat(util): allow Empty constructor in const context (#129)fed1452
chore(util): update msrv to 1.61Sourced from hyper's releases.
v1.7.0
Highlights
Features
- client:
- error: add
Error::is_shutdown()(#3863) (b8affd8a, closes #2745)- server: add
allow_multiple_spaces_in_request_line_delimitershttp1 builder method (#3929) (9749184f)Bug Fixes
What's Changed
- chore: remove redundant backticks by
@jimmycathyin hyperium/hyper#3855- Gate tests with features they test by
@WhyNotHugoin hyperium/hyper#3864- docs(service): add
HttpServicedocumentation by@cratelynin hyperium/hyper#3869- docs(examples): alias Builder for clarity by
@Muffeterin hyperium/hyper#3873- docs(MAINTAINERS): add katelyn martin as collaborator by
@seanmonstarin hyperium/hyper#3878- chore(proto/h2): fix module-level documentation by
@cratelynin hyperium/hyper#3881- feat(client): add a
TrySendError::message()method by@cratelynin hyperium/hyper#3884- feat(client): add a
TrySendError::error()method by@cratelynin hyperium/hyper#3885- fix(http2): add decriptive error for non-zero connect request by
@samp5in hyperium/hyper#3886- refactor(lib): drop futures-util except in ffi by
@hanna-kruppein hyperium/hyper#3890- fix(date): improve caching accuracy by
@Patryk27in hyperium/hyper#3887- docs(SECURITY): update policy to use GSA drafts when reporting vulnerabilities by
@seanmonstarin hyperium/hyper#3894- feat: add Error::is_shutdown() by
@joshkain hyperium/hyper#3863- docs: improve ext module overview by
@seanmonstarin hyperium/hyper#3921- docs(rt): improve rt module overview by
@seanmonstarin hyperium/hyper#3920- chore(ci): update to cargo-check-external-types-0.3.0 by
@tottotoin hyperium/hyper#3928- test(common): add missing assertion in full_rewind test by
@1911860538in hyperium/hyper#3926- fix(lib): avoid implicit cargo feature by
@hanna-kruppein hyperium/hyper#3931- feat(http1): add allow_multiple_spaces_in_request_line_delimiters h1 builder config method by
@mccordryanin hyperium/hyper#3929- Prepare v1.7.0 by
@seanmonstarin hyperium/hyper#3933New Contributors
@jimmycathymade their first contribution in hyperium/hyper#3855@Muffetermade their first contribution in hyperium/hyper#3873@samp5made their first contribution in hyperium/hyper#3886@hanna-kruppemade their first contribution in hyperium/hyper#3890@Patryk27made their first contribution in hyperium/hyper#3887@joshkamade their first contribution in hyperium/hyper#3863@1911860538made their first contribution in hyperium/hyper#3926@mccordryanmade their first contribution in hyperium/hyper#3929
... (truncated)
400bdfd
v1.7.09749184
feat(server): add
allow_multiple_spaces_in_request_line_delimiters http1
bu...caa166c
chore(dependencies): avoid implicit cargo feature of futures-util (#3931)8ad2595
test(common): add missing assertion in full_rewind test (#3926)24f0da8
chore(ci): update to cargo-check-external-types-0.3.0 (#3928)974289f
docs(rt): improve rt module overview (#3920)283fd23
docs: improve ext module overview and Protocol
docs (#3921)b8affd8
feat(error): add Error::is_shutdown() (#3863)c88df78
docs(SECURITY): update policy to use GSA drafts when reporting
vulnerabilitie...436cadd
fix(server): improve caching accuracy of Date header (#3887)Sourced from hyper-util's releases.
v0.1.17
Highlights
- Fix
legacy::Clientto allow absolute-form URIs whenConnected::proxy(true)is passed and the scheme ishttps.What's Changed
- chore(test): remove some miri exception config by
@tottotoin hyperium/hyper-util#222- refactor(connect): safely convert
socket2::Socketto TokioTcpSocketby@0x676e67in hyperium/hyper-util#223- refactor: set correct cfg on common::{Exec, Lazy, SyncWrapper} by
@seanmonstarin hyperium/hyper-util#224- fix(client): allow absolute-form if is_proxied is set even on HTTPS by
@seanmonstarin hyperium/hyper-util#225Full Changelog: https://github.com/hyperium/hyper-util/compare/v0.1.16...v0.1.17
v0.1.16
Highlights
- Add
impl Cloneforproxy::Tunnelservice.- Fix
proxy::Matcherto detect SOCKS4 schemes.- Fix
legacy::Clientpool idle checker to trigger less aggresively, saving CPU.What's Changed
- feat(client): implement Clone for Tunnel by
@tottotoin hyperium/hyper-util#212- fix(client): don't spawn pool idle interval if timeout is 0 by
@seanmonstarin hyperium/hyper-util#215- refactor(client): simplify pool idle task with async/await by
@seanmonstarin hyperium/hyper-util#216- feat: allow socket2 0.6 by
@tottotoin hyperium/hyper-util#213- fix(client): cap pool idle interval to a minimum by
@seanmonstarin hyperium/hyper-util#217- tests(client): fix flaky pool test by
@seanmonstarin hyperium/hyper-util#220- fix(proxy): Fix SOCKS4 proxy protocol parsing and matching by
@0x676e67in hyperium/hyper-util#219- Move tokio/net feature to client to make TokioIo can used in wasm by
@tiannianin hyperium/hyper-util#218- Prepare v0.1.16 by
@seanmonstarin hyperium/hyper-util#221New Contributors
@tiannianmade their first contribution in hyperium/hyper-util#218Full Changelog: https://github.com/hyperium/hyper-util/compare/v0.1.15...v0.1.16
v0.1.15
tl;dr
- Add header casing options to
auto::Builder.- Fix
proxy::Socksv5to check for enough bytes before parsing ipv6 responses.- Fix including
client-proxyin thefullfeature set.What's Changed
- ci: pin tracing-core in msrv job by
@seanmonstarin hyperium/hyper-util#203- Cleanup deadcode in
clientby@howardjohnin hyperium/hyper-util#202- refactor(socks): deduplicate and reuse shared logic by
@0x676e67in hyperium/hyper-util#205- refactor: include client-proxy in full feature by
@seanmonstarin hyperium/hyper-util#206
... (truncated)
Sourced from hyper-util's changelog.
0.1.17 (2025-09-15)
- Fix
legacy::Clientto allow absolute-form URIs whenConnected::proxy(true)is passed and the scheme ishttps.0.1.16 (2025-07-22)
- Add
impl Cloneforproxy::Tunnelservice.- Fix
proxy::Matcherto detect SOCKS4 schemes.- Fix
legacy::Clientpool idle checker to trigger less aggresively, saving CPU.0.1.15 (2025-07-07)
- Add header casing options to
auto::Builder.- Fix
proxy::Socksv5to check for enough bytes before parsing ipv6 responses.- Fix including
client-proxyin thefullfeature set.0.1.14 (2025-06-04)
- Fix
HttpConnectorto defer address family order to resolver sort order.- Fix
proxy::Matcherto find HTTPS system proxies on Windows.0.1.13 (2025-05-27)
- Fix
HttpConnectorto always prefer IPv6 addresses first, if happy eyeballs is enabled.- Fix
legacy::Clientto return better errors if available on the connection.0.1.12 (2025-05-19)
- Add
client::legacy::proxy::Tunnelconnector that wraps another connector with HTTP tunneling.- Add
client::legacy::proxy::{SocksV4, SocksV5}connectors that wraps another connector with SOCKS.- Add
client::proxy::matcher::Matchertype that can use environment variables to match proxy rules.- Add
server::graceful::Watchertype that can be sent to watch a connection in another task.- Add
GracefulShutdown::count()method to get number of currently watched connections.- Fix missing
must_useattributes onConnectionfutures.- Fix tracing span in GAI resolver that can cause panics.
0.1.11 (2025-03-31)
- Add
tracingcrate feature with support inTokioExecutor.- Add
HttpConnector::interface()support for macOS and Solarish systems.- Add
rt::WithHyperIoandrt::WithTokioIocombinators.- Add
auto_date_header()for auto server builder.- Add
max_local_error_reset_streams()for auto server builder.- Add
ignore_invalid_headers()for auto server builder.- Add methods to determine if auto server is configured for HTTP/1 or HTTP/2.
- Implement
ConnectionforUnixStreamandNamedPipeClient.- Fix HTTP/2 websocket requests sent through
legacy::Client.
3021828
v0.1.179fb7cd5
fix(client): allow absolute-form if is_proxied is set even on HTTPS (#225)00035ba
refactor: set correct cfg on common::{rewind, Exec, Lazy, SyncWrapper}
(#224)ad8c7c5
refactor(connect): safely convert Socket to Tokio
TcpSocket (#223)00911ec
chore(test): remove some miri exception config ("]
edition = "2024"
[dependencies]
-anyhow = "1.0.80"
-apple-sdk = "0.5.2"
-bytes = "1.5.0"
-clap = "4.5.1"
-duct = "0.13.7"
-flate2 = "1.0.28"
+anyhow = "1.0.99"
+apple-sdk = "0.6.0"
+bytes = "1.10.1"
+clap = "4.5.47"
+duct = "1.1.0"
+flate2 = "1.1.2"
futures = "0.3.30"
-goblin = "0.8.0"
+goblin = "0.10.1"
hex = "0.4.3"
-http = "1.0.0"
-http-body-util = "0.1.0"
-hyper = { version = "1.2.0", features = ["client"] }
-hyper-util = { version = "0.1.3" }
+http = "1.3.1"
+http-body-util = "0.1.3"
+hyper = { version = "1.7.0", features = ["client"] }
+hyper-util = { version = "0.1.17" }
normalize-path = "0.2.1"
-object = "0.37.1"
-octocrab = { version = "0.44.1", features = ["rustls", "stream"] }
-once_cell = "1.19.0"
+object = "0.37.3"
+octocrab = { version = "0.45.0", features = ["rustls", "stream"] }
+once_cell = "1.21.3"
pdb = "0.8.0"
-pep440_rs = "0.6.6"
-rayon = "1.8.1"
-reqwest = { version = "0.12.12", features = ["rustls-tls-webpki-roots", "stream"] }
-reqwest-middleware = "0.4.0"
+pep440_rs = "0.7.3"
+rayon = "1.11.0"
+reqwest = { version = "0.12.23", features = ["rustls-tls-webpki-roots", "stream"] }
+reqwest-middleware = "0.4.2"
reqwest-retry = "0.7.0"
-scroll = "0.12.0"
-semver = "1.0.22"
-serde = { version = "1.0.197", features = ["derive"] }
-serde_json = "1.0.114"
-sha2 = "0.10.8"
-tar = "0.4.40"
-tempfile = "3.10.0"
+scroll = "0.13.0"
+semver = "1.0.27"
+serde = { version = "1.0.225", features = ["derive"] }
+serde_json = "1.0.145"
+sha2 = "0.10.9"
+tar = "0.4.44"
+tempfile = "3.22.0"
text-stub-library = "0.9.0"
-tokio = "1.43.1"
-tokio-util = "0.7.13"
-url = "2.5.0"
-version-compare = "0.1.1"
-zip = "0.6.6"
-zstd = "0.13.0"
+tokio = "1.47.1"
+tokio-util = "0.7.16"
+url = "2.5.7"
+version-compare = "0.2.0"
+zip = "5.1.1"
+zstd = "0.13.3"
From ce3b5ae806cf52ea7018e5d973eb24c9e3d65289 Mon Sep 17 00:00:00 2001
From: Mohammad Miadh Angkad fb14ac4
2025.10.05 (#371)2c7c7ee
Add Python 3.14 classifier in setup.py1a5cb7b
Bump actions/setup-python from 5.6.0 to 6.0.0 (#367)dea5960
Bump pypa/gh-action-pypi-publish from 1.12.4 to 1.13.0 (#366)83566b7
Bump actions/checkout from 4.2.2 to 5.0.0ca2e121
Bump actions/download-artifact from 4.3.0 to 5.0.0Sourced from charset-normalizer's releases.
Version 3.4.4
3.4.4 (2025-10-13)
Changed
- Bound
setuptoolsto a specific constraintsetuptools>=68,<=81.- Raised upper bound of mypyc for the optional pre-built extension to v1.18.2
Removed
setuptools-scmas a build dependency.Misc
- Enforced hashes in
dev-requirements.txtand createdci-requirements.txtfor security purposes.- Additional pre-built wheels for riscv64, s390x, and armv7l architectures.
- Restore
multiple.intoto.jsonlin GitHub releases in addition to individual attestation file per wheel.
Sourced from charset-normalizer's changelog.
3.4.4 (2025-10-13)
Changed
- Bound
setuptoolsto a specific constraintsetuptools>=68,<=81.- Raised upper bound of mypyc for the optional pre-built extension to v1.18.2
Removed
setuptools-scmas a build dependency.Misc
- Enforced hashes in
dev-requirements.txtand createdci-requirements.txtfor security purposes.- Additional pre-built wheels for riscv64, s390x, and armv7l architectures.
- Restore
multiple.intoto.jsonlin GitHub releases in addition to individual attestation file per wheel.
b30ffdc
:wrench: fix checksum step in cd.ymld3fbfcf
:wrench: fix cd.ymldafbb95
Release 3.4.4 (#658)1f18ffa
:arrow_up: raise mypy upper bound to 1.18.2ef4ac69
Merge branch 'release-3.4.4' of github.com:jawah/charset_normalizer into
rele...4b35dda
:pencil: write changelog for 3.4.40ec6452
:wrench: update cd.yml workflow (add riscv64, s390x and armv7l)f341ede
:arrow_up: upgrade dependencies (dev, ci)a308841
:pencil: write changelog for 3.4.49c906da
:wrench: update cd.yml workflow (add riscv64, s390x and armv7l)Sourced from cryptography's changelog.
46.0.3 - 2025-10-15
* Fixed compilation when using LibreSSL 4.2.0... _v46-0-2:
46.0.2 - 2025-09-30
- Updated Windows, macOS, and Linux wheels to be compiled with OpenSSL 3.5.4.
.. _v46-0-1:
c0af4dd
release 46.0.3 (#13681)99efe5a
bump version for 46.0.2 (#13531)Sourced from idna's changelog.
3.11 (2025-10-12)
- Update to Unicode 16.0.0, including significant changes to UTS46 processing. As a result of Unicode ending support for it, transitional processing no longer has an effect and returns the same result.
- Add support for Python 3.14, lowest supported version is Python 3.8.
- Various updates to packaging, including PEP 740 support.
ad949ee
Release v3.11cae4ba7
Second release candidate for 3.118adb305
Add space in RST link74cb2b6
Release candidate for 3.1105dab09
Format idna-data with ruff90eac78
Apply ruff formattinga31ce7e
Remove errant test vectors81f0333
Omit vectors known to be broken in test suitea0f3257
Merge branch 'master' into unicode-16-uts46-changes38d9886
Remove extra UTS46 test vectorSourced from markupsafe's releases.
3.0.3
This is the MarkupSafe 3.0.3 fix release, which fixes bugs but does not otherwise change behavior and should not result in breaking changes compared to the latest feature release.
PyPI: https://pypi.org/project/MarkupSafe/3.0.3/ Changes: https://markupsafe.palletsprojects.com/page/changes/#version-3-0-3 Milestone: https://github.com/pallets/markupsafe/milestone/15?closed=1
Sourced from markupsafe's changelog.
Version 3.0.3
Released 2025-09-27
__version__raisesDeprecationWarninginstead ofUserWarning. :issue:487- Adopt multi-phase initialisation (:pep:
489) for the C extension. :issue:494- Build Windows ARM64 wheels. :issue:
485- Build Python 3.14 wheels. :issue:
503- Build riscv64 wheels. :issue:
505
297fc8e
release version 3.0.37e4e6ce
Free-threading: run with pytest-run-paralell (#507)6100b9c
enable riscv64 wheels (#506)c9d5ecf
enable riscv64 wheels2f9b337
tox for 3.1478d951a
update dev dependenciesbb6744e
add entry65c4134
upgrade cibuildwheel, add cp314 wheels and test on CPython
3.14 (#504)3a9bd88
add cp314 wheelsaafe44d
remove slsa provenance (#501)Sourced from referencing's releases.
v0.37.0
What's Changed
- Declare support for Python 3.14 and 3.14t by
@cclaussin python-jsonschema/referencing#270- Drop support for Python 3.9
New Contributors
@cclaussmade their first contribution in python-jsonschema/referencing#270Full Changelog: https://github.com/python-jsonschema/referencing/compare/v0.36.2...v0.37.0
Sourced from referencing's changelog.
v0.37.0
- Declare support for Python 3.14.
- Drop support for Python 3.9 which is near EOL.
944ed5a
Style.6382532
Prepare the CHANGELOG for v0.37.91b4bf5
Drop support for 3.9, which is near EOL.0c14d46
Update requirements.2928df5
Add the 3.14 classifier.3ce7f9a
Merge pull request #270
from cclauss/patch-1b6fc425
ci: Add Python 3.14 and 3.14t to the testing9d1efc5
Merge pull request #265
from python-jsonschema/pre-commit-ci-update-config1513a51
Merge pull request #268
from python-jsonschema/dependabot/submodules/suite-79...8ebb38f
Merge pull request #269
from python-jsonschema/dependabot/github_actions/astr...Sourced from deprecated's releases.
v1.3.1
What's Changed
- v1.3.1 by
@laurent-laporte-proin laurent-laporte-pro/deprecated#95Full Changelog: https://github.com/laurent-laporte-pro/deprecated/compare/v1.3.0...v1.3.1
v1.3.0
What's Changed
- Allow and test wrapt 2.x by
@musicinmybrainin laurent-laporte-pro/deprecated#88- docs: update the Wrapt compatibility matrix to include Python 3.13 and 3.14 by
@laurent-laporte-proin laurent-laporte-pro/deprecated#91- chore(ci): run coverage only in the dedicated coverage env by
@laurent-laporte-proin laurent-laporte-pro/deprecated#92- feature: parameter deprecation by
@laurent-laporte-proin laurent-laporte-pro/deprecated#93- v1.3.0 by
@laurent-laporte-proin laurent-laporte-pro/deprecated#90New Contributors
@musicinmybrainmade their first contribution in laurent-laporte-pro/deprecated#88Full Changelog: https://github.com/laurent-laporte-pro/deprecated/compare/v1.2.18...v1.3.0
Sourced from deprecated's changelog.
=============== Changelog 1.2.x
All notable changes for the 1.2.x releases.
The format is based on
Keep a Changelog <https://keepachangelog.com/en/1.0.0/>_ and this project adheres toSemantic Versioning <https://semver.org/spec/v2.0.0.html>_... note::
The library **"Python-Deprecated"** was renamed **"Deprecated"**, simply! This project is more consistent because now, the name of the library is the same as the name of the Python package.
- In your
setup.py, you can replace the "Python-Deprecated" dependency with "Deprecated".- In your source code, nothing has changed, you will always use
import deprecated, as before.- I decided to keep the same version number because there is really no change in the source code
(only in comment or documentation).
d135459
v1.3.1 (#95)b29c0db
feat(pyproject): add TestPyPI configuration for package publishingee5014a
docs(changelog): update changelog for v1.3.1 and include previous
versions13db9ba
docs(changelog): add v1.3.1 release notes for packaging fix and missing
sourc...72fecf8
docs(changelog): update v1.3.0 release notes to indicate yanked status
and re...966df9d
Prepare next version 1.3.1 (unreleased)3ad781a
v1.3.0 (#90)e9eed1e
docs(tutorial): add documentation for deprecated parameters
decorator969a6cd
feat: add experimental @deprecated_params decorator (#93)3f30cdb
docs(changelog): add experimental @deprecated_params
decoratorSourced from pynacl's changelog.
1.6.1 (2025-11-10)
- The
MAKEenvironment variable can now be used to specify themakebinary that should be used in the build process.
077559e
bump for 1.6.1 (#906)4f2eada
Bump actions/upload-artifact from 4 to 5 (#904)d8185db
Bump actions/download-artifact from 5.0.0 to 6.0.0 (#903)f986caa
Update Python version from 3.14t-dev to 3.14t (#901)e8d3bc7
use 3.14.0 in CI (#900)f08cb9c
build macOS wheels on macos-15 (arm64) (#898)eb41815
Update macOS runner version in CI workflow (#897)7f418a0
Honor MAKE environment variable (#895)84afafd
Require CFFI 2.0.0 or newer on Python >= 3.9 (#894)Sourced from rpds-py's releases.
v0.29.0
What's Changed
- Bump actions/download-artifact from 5 to 6 by
@dependabot[bot] in crate-py/rpds#195- Bump github/codeql-action from 4.30.9 to 4.31.0 by
@dependabot[bot] in crate-py/rpds#194- Bump actions/upload-artifact from 4 to 5 by
@dependabot[bot] in crate-py/rpds#192- Bump astral-sh/setup-uv from 7.1.1 to 7.1.2 by
@dependabot[bot] in crate-py/rpds#193- Bump github/codeql-action from 4.31.0 to 4.31.2 by
@dependabot[bot] in crate-py/rpds#196- [pre-commit.ci] pre-commit autoupdate by
@pre-commit-ci[bot] in crate-py/rpds#199- Bump softprops/action-gh-release from 2.4.1 to 2.4.2 by
@dependabot[bot] in crate-py/rpds#198- Bump rpds from 1.1.2 to 1.2.0 by
@dependabot[bot] in crate-py/rpds#197Full Changelog: https://github.com/crate-py/rpds/compare/v0.28.0...v0.29.0
v0.28.0
What's Changed
- Bump PyO3 to 0.27
Full Changelog: https://github.com/crate-py/rpds/compare/v0.27.1...v0.28.0
5fb6f35
Prepare for 0.29.0d17dbd1
Add rpds's Stack.74707af
Follow the rpds API more closely for Queue.41455f3
-> native uv for dpeendency groups.e93532d
Use 3.14 by default in nox.020c41f
Remove dead hooks.6e08b75
Accept zizmor's cooldown suggestions for dependabot.a5d40a9
Merge pull request #197
from crate-py/dependabot/cargo/rpds-1.2.0b830be1
Merge pull request #198
from crate-py/dependabot/github_actions/softprops/act...e7ac330
Merge pull request #199
from crate-py/pre-commit-ci-update-configSourced from wrapt's releases.
wrapt-2.0.1
See the project page on the Python Package Index at https://pypi.org/project/wrapt/2.0.1/ for more information.
wrapt-2.0.0
See the project page on the Python Package Index at https://pypi.org/project/wrapt/2.0.0/ for more information.
Sourced from wrapt's changelog.
Version 2.0.1
Bugs Fixed
The
wrapt.lazy_import()function wasn't included in the__all__attribute of thewraptmodule, meaning that it wasn't accessible when usingfrom wrapt import *and type checkers such asmypyorpylancemay not see it as part of the public API.When using
wrapt.lazy_import()to lazily import a function of a module, the resulting proxy object wasn't marked as callable until something triggered the import of the module via the proxy. This meant acallable()check on the proxy would returnFalseuntil the module was actually imported. Further, calling the proxy before the module was imported would raiseTypeError: 'LazyObjectProxy' object is not callablerather than importing the module and calling the function as expected. In order to address this issue, an additional keyword argumentinterfacehas been added towrapt.lazy_import()which can be used to specify the expected interface type of the wrapped object. This will default toCallablewhen an attribute name is supplied, and toModuleTypewhen no attribute name is supplied. If usingwrapt.lazy_import()and supplying anattributeargument, and you expect the wrapped object to be something other than a callable, you should now also supplyinterface=...with the appropriate type fromcollections.abcto ensure the proxy behaves correctly prior to the module being imported. This should only be necessary where the wrapped object has special dunder methods on its type which need to exist on the proxy prior to the module being imported.Version 2.0.0
There have been subtle changes in various corner cases of the behaviour of the
ObjectProxyclass, which although not expected to cause problems, still has the potential for causing issues if code was for some reason dependent on prior behaviour. All existing code related to Python 2.X has also been removed. Finally it has also been a while since the last significant release. For all these reasons a major version bump is being made.New Features
Added
__all__attribute towraptmodule to expose the public API.The
wrapt.PartialCallableObjectProxyclass can now be accessed via the aliaswrapt.partial, which is a convenience for users who are used to usingfunctools.partialand want to use thewraptversion of it.Type hints have been added to the
wraptmodule. The type hints are available when using Python 3.10 or later, and can be used with static type checkers such aspylanceormypy. Note that due to limitations in
... (truncated)
14387af
Merge branch 'release/2.0.1'73db180
Prepare for 2.0.1 release.1ec71e0
Fix lazy import for callable attributes of a module.09cd9e6
Use RestructuredText readme file for PyPi.d8803ad
Change version to a release candidate.26e637f
Missing lazy_import in public API declaration.d07059f
Merge branch 'release/2.0.0'a3a3b30
Merge tag '2.0.0' into developbf2609e
Update Python version in GitHub runner.0363b82
Update version to 2.0.0 for release.Sourced from anyhow's releases.
1.0.100
- Teach clippy to lint formatting arguments in
bail!,ensure!,anyhow!(#426)
18c2598
Release 1.0.100f271988
Merge pull request #426
from dtolnay/clippyfmt52f2115
Mark macros with clippy::format_argsda5fd9d
Raise minimum tested compiler to rust 1.76211e409
Opt in to generate-macro-expansion when building on docs.rsb48fc02
Enforce trybuild >= 1.0.108d5f59fb
Update ui test suite to nightly-2025-09-07238415d
Update ui test suite to nightly-2025-08-243bab070
Update actions/checkout@v4 -> v54249254
Order cap-lints flag in the same order as thiserror build scriptSourced from bytes's releases.
Bytes v1.11.0
1.11.0 (November 14th, 2025)
- Bump MSRV to 1.57 (#788)
Fixed
- fix:
BytesMutonly reuse if src has remaining (#803)- Specialize
BytesMut::put::<Bytes>(#793)- Reserve capacity in
BytesMut::put(#794)- Change
BytesMut::remaining_mutto useisize::MAXinstead ofusize::MAX(#795)Internal changes
Sourced from bytes's changelog.
1.11.0 (November 14th, 2025)
- Bump MSRV to 1.57 (#788)
Fixed
- fix:
BytesMutonly reuse if src has remaining (#803)- Specialize
BytesMut::put::<Bytes>(#793)- Reserve capacity in
BytesMut::put(#794)- Change
BytesMut::remaining_mutto useisize::MAXinstead ofusize::MAX(#795)Internal changes
a7952fb
chore: prepare bytes v1.11.0 (#804)60cbb77
fix: BytesMut only reuse if src has remaining (#803)7ce330f
Move drop_fn of from_owner into vtable (#801)4b53a29
Tweak BytesMut::remaining_mut (#795)016fdbd
Reserve capacity in BytesMut::put (#794)ef7f257
Specialize BytesMut::put::<Bytes> (#793)8b4f54d
Ignore BytesMut::freeze doctest on wasm (#790)16132ad
Fix latest clippy warnings (#787)3e44f88
Bump MSRV to 1.57 (#788)f29e939
Add some tests for Limit, BytesMut and Reader (#785)Sourced from clap's releases.
v4.5.52
[4.5.52] - 2025-11-17
Fixes
- Don't panic when
args_conflicts_with_subcommandsconflicts with anArgGroupv4.5.51
[4.5.51] - 2025-10-29
Fixes
- (help) Correctly calculate padding for short flags that take a value
- (help) Don't panic on short flags using
ArgAction::Countv4.5.50
[4.5.50] - 2025-10-20
Features
- Accept
CowwhereStringand&strare acceptedv4.5.48
[4.5.48] - 2025-09-19
Documentation
- Add a new CLI Concepts document as another way of framing clap
- Expand the
typed_derivecookbook entry
Sourced from clap's changelog.
[4.5.52] - 2025-11-17
Fixes
- Don't panic when
args_conflicts_with_subcommandsconflicts with anArgGroup[4.5.51] - 2025-10-29
Fixes
- (help) Correctly calculate padding for short flags that take a value
- (help) Don't panic on short flags using
ArgAction::Count[4.5.50] - 2025-10-20
Features
- Accept
CowwhereStringand&strare accepted[4.5.49] - 2025-10-13
Fixes
- (help) Correctly wrap when ANSI escape codes are present
[4.5.48] - 2025-09-19
Documentation
- Add a new CLI Concepts document as another way of framing clap
- Expand the
typed_derivecookbook entry
783b291
chore: Releasea88013a
docs: Update changeloga3c6230
Merge pull request #6000
from mernen/fix-zsh-dynamic-completion951536e
chore: Release3c527af
chore: Update transitive clap8520a7a
chore: Release2826eed
chore(nushell): Require newer clap_completec17d25f
docs: Update changelog493a71a
Merge pull request #5999
from cenviity/push-tqqzyttsoktub49dae2
chore: Release9414b8f
version 1.1.15436d08
fix test_pipe_inheritance on macOS0348c93
test_pipe_inheritance (failing on macOS)Sourced from flate2's releases.
1.1.5
This bugfix release fixes #508, as flush didn't always work anymore in conjunction with
miniz_oxide.What's Changed
- Revert flush change by
@finteliain rust-lang/flate2-rs#509Full Changelog: https://github.com/rust-lang/flate2-rs/compare/1.1.4...1.1.5
1.1.3
What's Changed
- use
zlibVersion()instead of aconstfor the version by@folkertdevin rust-lang/flate2-rs#491- Switch from adler2 to simd-adler32 crate when using miniz_oxide backend by
@Shnatselin rust-lang/flate2-rs#492- Correct documentation typo by
@finteliain rust-lang/flate2-rs#495- Use partial flushes with miniz_oxide backend by
@finteliain rust-lang/flate2-rs#496- Undo introducing straight up incorrect documentation by
@Shnatselin rust-lang/flate2-rs#497- Update cloudflare-zlib-sys crate by
@jongiddyin rust-lang/flate2-rs#503- Add
(de)compress_uninitthat accepts&[MaybeUninit<u8>]by@NobodyXuin rust-lang/flate2-rs#502- bump the patch level for a new release by
@Byronin rust-lang/flate2-rs#504New Contributors
@finteliamade their first contribution in rust-lang/flate2-rs#495Full Changelog: https://github.com/rust-lang/flate2-rs/compare/1.1.2...1.1.3
2661fbb
Merge pull request #509
from fintelia/revert-flush-changebc36cf4
Bump patch version4341fe2
Revert "Use partial flushes with miniz_oxide backend"ac412e9
Merge pull request #506
from NobodyXu/patch-1bf0315b
Release flste2 1.1.4350de28
Merge pull request #505
from NobodyXu/patch-129552c7
Fix docs.rs build3be6590
Merge pull request #504
from Byron/release7ad1bad
bump the patch level for a new release3cae7da
Merge pull request #502
from NobodyXu/patch-1Sourced from goblin's changelog.
[0.10.3] - 2025-10-16
Fixed
pe: fix regression in PE relocs, thanks
@PJB3005: m4b/goblin#496[0.10.2] - 2025-10-5
Added
pe: make
LoadConfigData::directorypublic, thanks@kkent030315: m4b/goblin#488Fixed
pe: remove alignment in rva helper function, huge amount of great details in the linked PR, thanks
@makubacki: m4b/goblin#491 elf, pe: Add/Extend ELF/PE permissive parsing mode to better handle packed, broken, or malware samples, thanks@chf0x: m4b/goblin#479 pe: fix resource parsing issues, thanks@x0rb3l: m4b/goblin#490 pe: fix bad lifetime annotation, thanks@Hexorg: m4b/goblin#493 pe, mach, elf: fix lifetime warnings (no pr): fddcc4747ccf306469ff6092a953bd667ec8ed7d
Sourced from hyper's releases.
v1.8.1
Bug Fixes
Full Changelog: https://github.com/hyperium/hyper/compare/v1.8.0...v1.8.1
v1.8.0
Highlights
Features
Bug Fixes
- http1: fix rare missed write wakeup on connections (#3952) (2377b893)
- http2: fix internals of HTTP/2 CONNECT upgrades (#3967) (58e0e7dc, closes #3966)
Breaking Changes
While technically breaking, it's assumed you will not need to do anything or be affected.
The HTTP/2 client connection no longer allows an executor that can not spawn itself.
This was an oversight originally. The client connection will now include spawning a future that keeps a copy of the executor to spawn other futures. Thus, if it is
!Send, it needs to spawn!Sendfutures. The likelihood of executors that match the previously allowed behavior should be very remote.There is also technically a semver break in here, which is that the
Http2ClientConnExectrait no longer dyn-compatible, because it now expects to beClone. This should not break usage of theconnbuilder, because it already separately hadE: Clonebounds. If someone were usingdyn Http2ClientConnExec, that will break. However, there is no purpose for doing so, and it is not usable otherwise, since the trait only exists to propagate bounds into hyper. Thus, the breakage should not affect anyone. (58e0e7dc)What's Changed
- chore(ci): update to actions/checkout@v5 by
@tottotoin hyperium/hyper#3935- refactor(ffi): specify "C" ABI explicitly in ffi_fn! macro by
@1911860538in hyperium/hyper#3937- Update documented default values for
http1::Builderby@Will-Lowin hyperium/hyper#3938- fix(client): port tests to in-memory socket by
@cratelynin hyperium/hyper#3947- feat: allow overriding the instant returned from Timer by
@arielb1in hyperium/hyper#3965- fix(http1): poll_loop writes when ready by
@lthieryin hyperium/hyper#3952- test(ready_stream): replace tracing with printlns by
@seanmonstarin hyperium/hyper#3973
... (truncated)
Sourced from hyper's changelog.
v1.8.1 (2025-11-13)
Bug Fixes
v1.8.0 (2025-11-11)
Bug Fixes
- http1: fix rare missed write wakeup on connections (#3952) (2377b893)
- http2: fix internals of HTTP/2 CONNECT upgrades (#3967) (58e0e7dc, closes #3966)
Features
Breaking Changes
The HTTP/2 client connection no longer allows an executor that can not spawn itself.
This was an oversight originally. The client connection will now include spawning a future that keeps a copy of the executor to spawn other futures. Thus, if it is
!Send, it needs to spawn!Sendfutures. The likelihood of executors that match the previously allowed behavior should be very remote.There is also technically a semver break in here, which is that the
Http2ClientConnExectrait no longer dyn-compatible, because it now expects to beClone. This should not break usage of theconnbuilder, because it already separately hadE: Clonebounds. If someone were usingdyn Http2ClientConnExec, that will break. However, there is no purpose for doing so, and it is not usable otherwise, since the trait only exists to propagate bounds into hyper. Thus, the breakage should not affect anyone. (58e0e7dc)
166c6ca
v1.8.14492f31
fix(http1): fix consuming extra CPU from previous change (#3977)dbe6f25
v1.8.058e0e7d
fix(http2): fix internals of HTTP/2 CONNECT upgrades (#3967)0a37a8c
test(ready_stream): replace tracing with printlns (#3973)2377b89
fix(http1): fix rare missed write wakeup on connections (#3952)5509ebe
feat(rt): add Timer::now() method to allow overriding the
instant returned ...f9f8f44
tests(client): port tests to in-memory socket (#3947)5803a9c
docs(server): update default values for http1::Builder (#3938)e1e1f2b
refactor(ffi): specify "C" ABI explicitly in ffi_fn! macro (#3937)Sourced from hyper-util's releases.
v0.1.18
Highlights
- Fix
rt::TokioTimerto support Tokio's paused time.- Fix
client::proxy::match::Matcherto parse auth without passwords.What's Changed
- chore(ci): add a github actions workflow to preview rustdocs of a PR by
@seanmonstarin hyperium/hyper-util#229- chore(ci): fix rustdoc preview job by
@seanmonstarin hyperium/hyper-util#231- chore(ci): fix rustdoc preview workflow typo by
@seanmonstarin hyperium/hyper-util#232- docs: replace auto_doc_cfg by
@seanmonstarin hyperium/hyper-util#237- perf(client): avoid redundant memory copies of Host header by
@0x676e67in hyperium/hyper-util#235- chore: bump windows-registry to 0.6 by
@Vaizin hyperium/hyper-util#236- fix: fix msrv on windows and macos target by
@tottotoin hyperium/hyper-util#239- chore(ci): update to actions/checkout@v5 by
@tottotoin hyperium/hyper-util#240- fix: allow proxy env URIs without password by
@karanabein hyperium/hyper-util#241- fix: support fake time by
@arielb1in hyperium/hyper-util#238New Contributors
@Vaizmade their first contribution in hyperium/hyper-util#236@karanabemade their first contribution in hyperium/hyper-util#241@arielb1made their first contribution in hyperium/hyper-util#238Thanks
Full Changelog: https://github.com/hyperium/hyper-util/compare/v0.1.17...v0.1.18
Sourced from hyper-util's changelog.
0.1.18 (2025-11-13)
- Fix
rt::TokioTimerto support Tokio's paused time.- Fix
client::proxy::match::Matcherto parse auth without passwords.
203c956
v0.1.18d91ea8e
fix(rt): support fake time in legacy client and TokioTimer (#238)dde14d3
fix(client): Proxy Matcher to handle proxy auth without password (#241)b9dc3d2
chore(ci): update to actions/checkout@v5 (#240)d4f5706
ci: fix msrv on windows and macos target (#239)3c8dbe4
chore: bump windows-registry to 0.6 (#236)72bbd22
perf(client): avoid redundant memory copies of Host header (#235)1c8f7c6
docs: replace auto_doc_cfg (#237)66afc93
chore(ci): use auto pr ref in rustdoc-preview workflowfaf5ca2
chore(ci): fix rustdoc preview workflow typo (#232)Sourced from octocrab's releases.
v0.47.1
Added
- add missing list workflows filters (#820)
Other
- Modify
_putmethod documentation (#818)- Feature/interactions 537 (#817)
- Added Feature/classrooms #524 (#815)
v0.47.0
Added
- add
immutableRelease field (#806)Other
- added creating a review (POST "/repos/{owner}/{repo}/pulls/{pull_number}/reviews") (#805)
v0.46.0
Fixed
- [breaking] make CommitAuthor email nullable (#799)
Other
Sourced from octocrab's changelog.
0.47.1 - 2025-11-03
Added
- add missing list workflows filters (#820)
Other
- Modify
_putmethod documentation (#818)- Feature/interactions 537 (#817)
- Added Feature/classrooms #524 (#815)
0.47.0 - 2025-10-06
Added
- add
immutableRelease field (#806)Other
- added creating a review (POST "/repos/{owner}/{repo}/pulls/{pull_number}/reviews") (#805)
0.46.0 - 2025-09-28
Fixed
- [breaking] make CommitAuthor email nullable (#799)
Other
6e4ae26
chore: release v0.47.1 (#816)8114a6b
feat: add missing list workflows filters (#820)8918c90
docs: Modify _put method documentation (#818)14a95d0
Feature/interactions 537 (#817)e95fc40
Added Feature/classrooms #524
(#815)73a4dd0
chore: release v0.46.1 (#807)0e0e43d
feat: add immutable Release field (#806)eac8ccb
added creating a review (POST
"/repos/{owner}/{repo}/pulls/{pull_number}/revi...e37b2c0
chore: release v0.46.0 (#800)a6e52f7
Expose digest field in Asset model (#804)Sourced from reqwest's releases.
v0.12.24
Highlights
- Refactor cookie handling to an internal middleware.
- Refactor internal random generator.
- Refactor base64 encoding to reduce a copy.
- Documentation updates.
What's Changed
- build(deps): silence unused deps in WASM build by
@0x676e67in seanmonstar/reqwest#2799- perf(util): avoid extra copy when base64 encoding by
@0x676e67in seanmonstar/reqwest#2805- docs: fix method name in changelog entry by
@johannespfrangin seanmonstar/reqwest#2807- chore: Align the name usage of TotalTimeout by
@Xuanwoin seanmonstar/reqwest#2657- refactor(cookie): add
CookieServiceby@linyihaiin seanmonstar/reqwest#2787- Fixes typo in retry max_retries_per_request doc comment re 2813 by
@dmackinnin seanmonstar/reqwest#2824- test(multipart): fix build failure with
no-default-featuresby@0x676e67in seanmonstar/reqwest#2801- refactor(cookie): avoid duplicate cookie insertion by
@0x676e67in seanmonstar/reqwest#2834New Contributors
@johannespfrangmade their first contribution in seanmonstar/reqwest#2807@dmackinnmade their first contribution in seanmonstar/reqwest#2824Full Changelog: https://github.com/seanmonstar/reqwest/compare/v0.12.23...v0.12.24
Sourced from reqwest's changelog.
v0.12.24
- Refactor cookie handling to an internal middleware.
- Refactor internal random generator.
- Refactor base64 encoding to reduce a copy.
- Documentation updates.
b126ca4
v0.12.244023493
refactor: change fast_random from xorshift to siphash a counterfd61bc9
refactor(cookie): avoid duplicate cookie insertion (#2834)0bfa526
test(multipart): fix build failure with no-default-features
(#2801)994b8a0
docs: typo in retry max_retries_per_request (#2824)da0702b
refactor(cookie): de-duplicate cookie support as
CookieService middleware (...7ebddea
chore: align internal name usage of TotalTimeout (#2657)b540a4e
chore(readme): use correct CI status badgee4550c4
docs: fix method name in changelog entry (#2807)f4694a2
perf(util): avoid extra copy when base64 encoding (#2805)Sourced from serde's releases.
v1.0.228
- Allow building documentation with
RUSTDOCFLAGS='--cfg=docsrs'set for the whole dependency graph (#2995)v1.0.227
- Documentation improvements (#2991)
v1.0.226
a866b33
Release 1.0.2285adc9e8
Merge pull request #2995
from dtolnay/rustdocflagsab58178
Workaround for RUSTDOCFLAGS='--cfg=docsrs'415d9fc
Release 1.0.2277c58427
Merge pull request #2991
from dtolnay/inlinecoredoc9d3410e
Merge pull request #2992
from dtolnay/inplaceseed2fb6748
Remove InPlaceSeed public re-exportf8137c7
Inline serde_core into serde in docsrs modeb7dbf7e
Merge pull request #2990
from dtolnay/integer1287c83691
No longer macro_use integer128 moduleSourced from tempfile's changelog.
3.23.0
- Remove need for the "nightly" feature to compile with "wasip2".
Sourced from tokio's releases.
Tokio v1.48.0
1.48.0 (October 14th, 2025)
The MSRV is increased to 1.71.
Added
- fs: add
File::max_buf_size(#7594)- io: export
ChainofAsyncReadExt::chain(#7599)- net: add
SocketAddr::as_abstract_name(#7491)- net: add
TcpStream::quickackandTcpStream::set_quickack(#7490)- net: implement
AsRef<Self>forTcpStreamandUnixStream(#7573)- task: add
LocalKey::try_get(#7666)- task: implement
Ordfortask::Id(#7530)Changed
- deps: bump windows-sys to version 0.61 (#7645)
- fs: preserve
max_buf_sizewhen cloning aFile(#7593)- macros: suppress
clippy::unwrap_in_resultin#[tokio::main](#7651)- net: remove
PollEventednoise from Debug formats (#7675)- process: upgrade
Command::spawn_withto useFnOnce(#7511)- sync: remove inner mutex in
SetOnce(#7554)- sync: use
UnsafeCell::get_mutinMutex::get_mutandRwLock::get_mut(#7569)- time: reduce the generated code size of
Timeout<T>::poll(#7535)Fixed
- macros: fix hygiene issue in
join!andtry_join!(#7638)- net: fix copy/paste errors in udp peek methods (#7604)
- process: fix error when runtime is shut down on nightly-2025-10-12 (#7672)
- runtime: use release ordering in
wake_by_ref()even if already woken (#7622)- sync: close the
broadcast::Senderinbroadcast::Sender::new()(#7629)- sync: fix implementation of unused
RwLock::try_*methods (#7587)Unstable
- tokio: use cargo features instead of
--cfgflags fortaskdumpandio_uring(#7655, #7621)- fs: support
io_uringinfs::write(#7567)- fs: support
io_uringwithFile::open()(#7617)- fs: support
io_uringwithOpenOptions(#7321)- macros: add
localruntime flavor (#7375, #7597)Documented
- io: clarify the zero capacity case of
AsyncRead::poll_read(#7580)- io: fix typos in the docs of
AsyncFdreadiness guards (#7583)- net: clarify socket gets closed on drop (#7526)
- net: clarify the behavior of
UCred::pid()on Cygwin (#7611)- net: clarify the supported platform of
set_reuseport()andreuseport()(#7628)
... (truncated)
556820f
chore: prepare Tokio v1.48.0 (#7677)fd1659a
chore: prepare tokio-macros v2.6.0 (#7676)53e8aca
ci: update nightly version to 2025-10-12 (#7670)9e5527d
process: fix error when runtime is shut down on nightly-2025-10-12 (#7672)25a24de
net: remove PollEvented noise from Debug formats (#7675)c1fa25f
task: clarify the behavior of several spawn_local methods
(#7669)e7e02fc
fs: use FileOptions inside fs::File to support
uring (#7617)f7a7f62
ci: remove cargo-deny Unicode-DFS-2016 license exception config (#7619)d1f1499
tokio: use cargo feature for taskdump support instead of cfg (#7655)ad6f618
runtime: clarify the behavior of Handle::block_on (#7665)454fd8c
chore: prepare tokio-util v0.7.17 (#7719)4421022
codec: remove unnecessary trait bounds on all Framed
constructors (#7716)5a709e3
io_uring: change Completable to not return io::Result (#7702)5efb1c3
io: doc that AsyncWrite does not inherit from
Write (#7705)f490029
runtime: revert "replace manual vtable definitions with
Wake" (#7699)d25778f
task: add tests for task::Builder::spawn_local (#7697)b8318fa
task: add tests for spawn_local in panic scenarios (#7694)acfdb87
task: use #[tokio::test] explicitly in tests/tas...
_Description has been truncated_
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
Cargo.lock | 153 ++++++++++++++++++-----------------------------------
Cargo.toml | 32 +++++------
2 files changed, 68 insertions(+), 117 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index 87c0d27..dfb2abf 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2,15 +2,6 @@
# It is not intended for manual editing.
version = 4
-[[package]]
-name = "addr2line"
-version = "0.24.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1"
-dependencies = [
- "gimli",
-]
-
[[package]]
name = "adler2"
version = "2.0.0"
@@ -95,9 +86,9 @@ dependencies = [
[[package]]
name = "anyhow"
-version = "1.0.99"
+version = "1.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100"
+checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
[[package]]
name = "apple-sdk"
@@ -148,21 +139,6 @@ version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
-[[package]]
-name = "backtrace"
-version = "0.3.74"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
-dependencies = [
- "addr2line",
- "cfg-if",
- "libc",
- "miniz_oxide",
- "object 0.36.7",
- "rustc-demangle",
- "windows-targets 0.52.6",
-]
-
[[package]]
name = "base64"
version = "0.21.7"
@@ -210,9 +186,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
[[package]]
name = "bytes"
-version = "1.10.1"
+version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
+checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3"
[[package]]
name = "bzip2"
@@ -273,18 +249,18 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.5.47"
+version = "4.5.52"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931"
+checksum = "aa8120877db0e5c011242f96806ce3c94e0737ab8108532a76a3300a01db2ab8"
dependencies = [
"clap_builder",
]
[[package]]
name = "clap_builder"
-version = "4.5.47"
+version = "4.5.52"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6"
+checksum = "02576b399397b659c26064fbc92a75fede9d18ffd5f80ca1cd74ddab167016e1"
dependencies = [
"anstream",
"anstyle",
@@ -454,9 +430,9 @@ dependencies = [
[[package]]
name = "duct"
-version = "1.1.0"
+version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7478638a31d1f1f3d6c9f5e57c76b906a04ac4879d6fd0fb6245bc88f73fd0b"
+checksum = "7e66e9c0c03d094e1a0ba1be130b849034aa80c3a2ab8ee94316bc809f3fa684"
dependencies = [
"libc",
"os_pipe",
@@ -521,9 +497,9 @@ dependencies = [
[[package]]
name = "flate2"
-version = "1.1.2"
+version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d"
+checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb"
dependencies = [
"crc32fast",
"libz-rs-sys",
@@ -684,17 +660,11 @@ dependencies = [
"windows-targets 0.52.6",
]
-[[package]]
-name = "gimli"
-version = "0.31.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
-
[[package]]
name = "goblin"
-version = "0.10.1"
+version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6a80adfd63bd7ffd94fefc3d22167880c440a724303080e5aa686fa36abaa96"
+checksum = "51876e3748c4a347fe65b906f2b1ae46a1e55a497b22c94c1f4f2c469ff7673a"
dependencies = [
"log",
"plain",
@@ -789,9 +759,9 @@ checksum = "f2d708df4e7140240a16cd6ab0ab65c972d7433ab77819ea693fde9c43811e2a"
[[package]]
name = "hyper"
-version = "1.7.0"
+version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e"
+checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11"
dependencies = [
"atomic-waker",
"bytes",
@@ -860,9 +830,9 @@ dependencies = [
[[package]]
name = "hyper-util"
-version = "0.1.17"
+version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8"
+checksum = "52e9a2a24dc5c6821e71a7030e1e14b7b632acac55c40e9d2e082c621261bb56"
dependencies = [
"base64 0.22.1",
"bytes",
@@ -1077,17 +1047,6 @@ dependencies = [
"web-sys",
]
-[[package]]
-name = "io-uring"
-version = "0.7.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b"
-dependencies = [
- "bitflags 2.8.0",
- "cfg-if",
- "libc",
-]
-
[[package]]
name = "ipnet"
version = "2.11.0"
@@ -1251,6 +1210,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
dependencies = [
"adler2",
+ "simd-adler32",
]
[[package]]
@@ -1321,15 +1281,6 @@ dependencies = [
"autocfg",
]
-[[package]]
-name = "object"
-version = "0.36.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
-dependencies = [
- "memchr",
-]
-
[[package]]
name = "object"
version = "0.37.3"
@@ -1343,9 +1294,9 @@ dependencies = [
[[package]]
name = "octocrab"
-version = "0.45.0"
+version = "0.47.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9142159757f166a7b20e3dcd410a5af008a63747c73e836a01fa4f7af84d2c4"
+checksum = "76f50b2657b7e31c849c612c4ca71527861631fe3c392f931fb28990b045f972"
dependencies = [
"arc-swap",
"async-trait",
@@ -1621,7 +1572,7 @@ dependencies = [
"hyper",
"hyper-util",
"normalize-path",
- "object 0.37.3",
+ "object",
"octocrab",
"once_cell",
"pdb",
@@ -1786,9 +1737,9 @@ dependencies = [
[[package]]
name = "reqwest"
-version = "0.12.23"
+version = "0.12.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb"
+checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f"
dependencies = [
"base64 0.22.1",
"bytes",
@@ -1891,12 +1842,6 @@ dependencies = [
"windows-sys 0.52.0",
]
-[[package]]
-name = "rustc-demangle"
-version = "0.1.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
-
[[package]]
name = "rustc-hash"
version = "2.1.1"
@@ -1926,7 +1871,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys 0.11.0",
- "windows-sys 0.60.2",
+ "windows-sys 0.61.1",
]
[[package]]
@@ -2091,9 +2036,9 @@ checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
[[package]]
name = "serde"
-version = "1.0.225"
+version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd6c24dee235d0da097043389623fb913daddf92c76e9f5a1db88607a0bcbd1d"
+checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
"serde_core",
"serde_derive",
@@ -2101,18 +2046,18 @@ dependencies = [
[[package]]
name = "serde_core"
-version = "1.0.225"
+version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "659356f9a0cb1e529b24c01e43ad2bdf520ec4ceaf83047b83ddcc2251f96383"
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.225"
+version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ea936adf78b1f766949a4977b91d2f5595825bd6ec079aa9543ad2685fc4516"
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
@@ -2399,15 +2344,15 @@ dependencies = [
[[package]]
name = "tempfile"
-version = "3.22.0"
+version = "3.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53"
+checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16"
dependencies = [
"fastrand",
"getrandom 0.3.1",
"once_cell",
"rustix 1.1.2",
- "windows-sys 0.60.2",
+ "windows-sys 0.61.1",
]
[[package]]
@@ -2519,19 +2464,16 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
-version = "1.47.1"
+version = "1.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038"
+checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408"
dependencies = [
- "backtrace",
"bytes",
- "io-uring",
"libc",
"mio",
"pin-project-lite",
- "slab",
"socket2 0.6.0",
- "windows-sys 0.59.0",
+ "windows-sys 0.61.1",
]
[[package]]
@@ -2556,9 +2498,9 @@ dependencies = [
[[package]]
name = "tokio-util"
-version = "0.7.16"
+version = "0.7.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5"
+checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594"
dependencies = [
"bytes",
"futures-core",
@@ -2739,9 +2681,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
[[package]]
name = "version-compare"
-version = "0.2.0"
+version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b"
+checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e"
[[package]]
name = "version_check"
@@ -3010,6 +2952,15 @@ dependencies = [
"windows-targets 0.53.4",
]
+[[package]]
+name = "windows-sys"
+version = "0.61.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f"
+dependencies = [
+ "windows-link 0.2.0",
+]
+
[[package]]
name = "windows-targets"
version = "0.52.6"
@@ -3290,9 +3241,9 @@ dependencies = [
[[package]]
name = "zip"
-version = "5.1.1"
+version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f852905151ac8d4d06fdca66520a661c09730a74c6d4e2b0f27b436b382e532"
+checksum = "eb2a05c7c36fde6c09b08576c9f7fb4cda705990f73b58fe011abf7dfb24168b"
dependencies = [
"aes",
"arbitrary",
diff --git a/Cargo.toml b/Cargo.toml
index bbc9460..6360516 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,40 +5,40 @@ authors = ["Gregory Szorc "]
edition = "2024"
[dependencies]
-anyhow = "1.0.99"
+anyhow = "1.0.100"
apple-sdk = "0.6.0"
-bytes = "1.10.1"
-clap = "4.5.47"
-duct = "1.1.0"
-flate2 = "1.1.2"
+bytes = "1.11.0"
+clap = "4.5.52"
+duct = "1.1.1"
+flate2 = "1.1.5"
futures = "0.3.30"
-goblin = "0.10.1"
+goblin = "0.10.3"
hex = "0.4.3"
http = "1.3.1"
http-body-util = "0.1.3"
-hyper = { version = "1.7.0", features = ["client"] }
-hyper-util = { version = "0.1.17" }
+hyper = { version = "1.8.1", features = ["client"] }
+hyper-util = { version = "0.1.18" }
normalize-path = "0.2.1"
object = "0.37.3"
-octocrab = { version = "0.45.0", features = ["rustls", "stream"] }
+octocrab = { version = "0.47.1", features = ["rustls", "stream"] }
once_cell = "1.21.3"
pdb = "0.8.0"
pep440_rs = "0.7.3"
rayon = "1.11.0"
-reqwest = { version = "0.12.23", features = ["rustls-tls-webpki-roots", "stream"] }
+reqwest = { version = "0.12.24", features = ["rustls-tls-webpki-roots", "stream"] }
reqwest-middleware = "0.4.2"
reqwest-retry = "0.7.0"
scroll = "0.13.0"
semver = "1.0.27"
-serde = { version = "1.0.225", features = ["derive"] }
+serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.145"
sha2 = "0.10.9"
tar = "0.4.44"
-tempfile = "3.22.0"
+tempfile = "3.23.0"
text-stub-library = "0.9.0"
-tokio = "1.47.1"
-tokio-util = "0.7.16"
+tokio = "1.48.0"
+tokio-util = "0.7.17"
url = "2.5.7"
-version-compare = "0.2.0"
-zip = "5.1.1"
+version-compare = "0.2.1"
+zip = "6.0.0"
zstd = "0.13.3"
From 6945a61508c2fd1e79a69b267d2346a30af39353 Mon Sep 17 00:00:00 2001
From: Zanie Blue
Date: Tue, 2 Dec 2025 13:16:59 -0600
Subject: [PATCH 50/66] Bump to 3.14.1 and 3.13.10 (#900)
- **Bump to CPython 3.14.1**
- **Bump to CPython 3.13.10**
---
cpython-unix/build-cpython.sh | 4 ++--
pythonbuild/downloads.py | 16 ++++++++--------
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh
index b2b195f..d7db75a 100755
--- a/cpython-unix/build-cpython.sh
+++ b/cpython-unix/build-cpython.sh
@@ -563,9 +563,9 @@ if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_14}" && -n "${CROSS_COMPILING}" && "$
PROFILE_TASK="${PROFILE_TASK} --ignore test_strftime_y2k"
fi
-# On 3.15+ `test_json.test_recursion.TestCRecursion.test_highly_nested_objects_decoding` fails during
+# On 3.14+ `test_json.test_recursion.TestCRecursion.test_highly_nested_objects_decoding` fails during
# PGO due to RecursionError not being raised as expected. See https://github.com/python/cpython/issues/140125
-if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_15}" ]]; then
+if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_14}" ]]; then
PROFILE_TASK="${PROFILE_TASK} --ignore test_json"
fi
diff --git a/pythonbuild/downloads.py b/pythonbuild/downloads.py
index 75686a9..c95f052 100644
--- a/pythonbuild/downloads.py
+++ b/pythonbuild/downloads.py
@@ -75,19 +75,19 @@
"python_tag": "cp312",
},
"cpython-3.13": {
- "url": "https://www.python.org/ftp/python/3.13.9/Python-3.13.9.tar.xz",
- "size": 22681368,
- "sha256": "ed5ef34cda36cfa2f3a340f07cac7e7814f91c7f3c411f6d3562323a866c5c66",
- "version": "3.13.9",
+ "url": "https://www.python.org/ftp/python/3.13.10/Python-3.13.10.tar.xz",
+ "size": 22714348,
+ "sha256": "bc673c04375a1a3f0808c27ba8f0411ab811ad390a8740318ccb9c60fad8fd77",
+ "version": "3.13.10",
"licenses": ["Python-2.0", "CNRI-Python"],
"license_file": "LICENSE.cpython.txt",
"python_tag": "cp313",
},
"cpython-3.14": {
- "url": "https://www.python.org/ftp/python/3.14.0/Python-3.14.0.tar.xz",
- "size": 23595844,
- "sha256": "2299dae542d395ce3883aca00d3c910307cd68e0b2f7336098c8e7b7eee9f3e9",
- "version": "3.14.0",
+ "url": "https://www.python.org/ftp/python/3.14.1/Python-3.14.1.tar.xz",
+ "size": 23563532,
+ "sha256": "8dfa08b1959d9d15838a1c2dab77dc8d8ff4a553a1ed046dfacbc8095c6d42fc",
+ "version": "3.14.1",
"licenses": ["Python-2.0", "CNRI-Python"],
"license_file": "LICENSE.cpython.txt",
"python_tag": "cp314",
From fa176fef605f891faf08e14525c0777c6acf022b Mon Sep 17 00:00:00 2001
From: "Jonathan J. Helmus"
Date: Tue, 2 Dec 2025 13:22:23 -0600
Subject: [PATCH 51/66] use uv to bootstrap the host system Python environment
(#892)
Add a new build script which uses uv to bootstrap the Python environment
on the host and runs the build.
To use this new script on a host with uv installed use:
```
./build-uv.py
```
---
.github/workflows/linux.yml | 34 +-
.github/workflows/macos.yml | 14 +-
.github/workflows/windows.yml | 16 +-
.python-version | 1 +
build-uv.py | 46 ++
cpython-windows/build.py | 4 +-
pyproject.toml | 25 +
uv.lock | 912 ++++++++++++++++++++++++++++++++++
8 files changed, 1022 insertions(+), 30 deletions(-)
create mode 100644 .python-version
create mode 100755 build-uv.py
create mode 100644 pyproject.toml
create mode 100644 uv.lock
diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
index 8d05a86..b6fe34a 100644
--- a/.github/workflows/linux.yml
+++ b/.github/workflows/linux.yml
@@ -71,10 +71,10 @@ jobs:
with:
persist-credentials: false
- - name: Install Python
- uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
+ - name: Set up uv
+ uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7.1.4
with:
- python-version: "3.11"
+ enable-cache: false
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
@@ -88,7 +88,7 @@ jobs:
- name: Generate Dockerfiles
run: |
- ./build-linux.py --make-target empty
+ ./build-uv.py --make-target empty
repo_name=$(echo "${GITHUB_REPOSITORY,,}" | sed 's|\.|_|g')
git_ref_name=$(echo "${GITHUB_REF_NAME,,}" | sed 's|[^a-z0-9_-]|_|g')
echo "REPO_NAME=${repo_name}" >> "${GITHUB_ENV}"
@@ -150,8 +150,10 @@ jobs:
fetch-depth: 0
persist-credentials: false
- - name: Set up Python
- uses: astral-sh/setup-uv@38f3f104447c67c051c4a08e39b64a148898af3a # v4.2.0
+ - name: Set up uv
+ uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7.1.4
+ with:
+ enable-cache: false
- name: Get pull request labels
id: get-labels
@@ -222,10 +224,10 @@ jobs:
fetch-depth: 0
persist-credentials: false
- - name: Install Python
- uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
+ - name: Set up uv
+ uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7.1.4
with:
- python-version: "3.11"
+ enable-cache: false
- name: Download pythonbuild
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
@@ -265,12 +267,12 @@ jobs:
if: ${{ ! matrix.dry-run }}
run: |
# Do empty target so all generated files are touched.
- ./build-linux.py --make-target empty
+ ./build-uv.py --make-target empty
# Touch mtimes of all images so they are newer than autogenerated files above.
touch build/image-*
- ./build-linux.py --target-triple ${MATRIX_TARGET_TRIPLE} --python cpython-${MATRIX_PYTHON} --options ${MATRIX_BUILD_OPTIONS}
+ ./build-uv.py --target-triple ${MATRIX_TARGET_TRIPLE} --python cpython-${MATRIX_PYTHON} --options ${MATRIX_BUILD_OPTIONS}
env:
MATRIX_TARGET_TRIPLE: ${{ matrix.target_triple }}
MATRIX_PYTHON: ${{ matrix.python }}
@@ -330,10 +332,10 @@ jobs:
fetch-depth: 0
persist-credentials: false
- - name: Install Python
- uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
+ - name: Set up uv
+ uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7.1.4
with:
- python-version: "3.11"
+ enable-cache: false
- name: Download pythonbuild
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
@@ -373,12 +375,12 @@ jobs:
if: ${{ ! matrix.dry-run }}
run: |
# Do empty target so all generated files are touched.
- ./build-linux.py --make-target empty
+ ./build-uv.py --make-target empty
# Touch mtimes of all images so they are newer than autogenerated files above.
touch build/image-*
- ./build-linux.py --target-triple ${MATRIX_TARGET_TRIPLE} --python cpython-${MATRIX_PYTHON} --options ${MATRIX_BUILD_OPTIONS}
+ ./build-uv.py --target-triple ${MATRIX_TARGET_TRIPLE} --python cpython-${MATRIX_PYTHON} --options ${MATRIX_BUILD_OPTIONS}
env:
MATRIX_TARGET_TRIPLE: ${{ matrix.target_triple }}
MATRIX_PYTHON: ${{ matrix.python }}
diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml
index ed58b3d..9b08a2e 100644
--- a/.github/workflows/macos.yml
+++ b/.github/workflows/macos.yml
@@ -63,8 +63,10 @@ jobs:
fetch-depth: 0
persist-credentials: false
- - name: Set up Python
- uses: astral-sh/setup-uv@38f3f104447c67c051c4a08e39b64a148898af3a # v4.2.0
+ - name: Set up uv
+ uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7.1.4
+ with:
+ enable-cache: false
- name: Get pull request labels
id: get-labels
@@ -128,10 +130,10 @@ jobs:
fetch-depth: 0
persist-credentials: false
- - name: Install Python
- uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
+ - name: Set up uv
+ uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7.1.4
with:
- python-version: "3.11"
+ enable-cache: false
- name: Download pythonbuild
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
@@ -142,7 +144,7 @@ jobs:
- name: Build
if: ${{ ! matrix.dry-run }}
run: |
- ./build-macos.py --target-triple ${MATRIX_TARGET_TRIPLE} --python cpython-${MATRIX_PYTHON} --options ${MATRIX_BUILD_OPTIONS}
+ ./build-uv.py --target-triple ${MATRIX_TARGET_TRIPLE} --python cpython-${MATRIX_PYTHON} --options ${MATRIX_BUILD_OPTIONS}
env:
MATRIX_TARGET_TRIPLE: ${{ matrix.target_triple }}
MATRIX_PYTHON: ${{ matrix.python }}
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml
index 86d02af..5d89e95 100644
--- a/.github/workflows/windows.yml
+++ b/.github/workflows/windows.yml
@@ -63,8 +63,10 @@ jobs:
fetch-depth: 0
persist-credentials: false
- - name: Set up Python
- uses: astral-sh/setup-uv@38f3f104447c67c051c4a08e39b64a148898af3a # v4.2.0
+ - name: Set up uv
+ uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7.1.4
+ with:
+ enable-cache: false
- name: Get pull request labels
id: get-labels
@@ -134,10 +136,10 @@ jobs:
with:
packages: autoconf automake libtool
- - name: Install Python
- uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
+ - name: Set up uv
+ uses: astral-sh/setup-uv@1e862dfacbd1d6d858c55d9b792c756523627244 # v7.1.4
with:
- python-version: "3.12"
+ enable-cache: false
- name: Download pythonbuild Executable
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
@@ -148,14 +150,14 @@ jobs:
# don't get compiled properly.
- name: Bootstrap Python environment
run: |
- py.exe -3.12 build-windows.py --help
+ uv run build-uv.py --help
- name: Build
if: ${{ ! matrix.dry-run }}
shell: cmd
run: |
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\%MATRIX_VCVARS%"
- py.exe -3.12 build-windows.py --python cpython-%MATRIX_PYTHON% --sh c:\cygwin\bin\sh.exe --options %MATRIX_BUILD_OPTIONS%
+ uv run build-uv.py --python cpython-%MATRIX_PYTHON% --sh c:\cygwin\bin\sh.exe --options %MATRIX_BUILD_OPTIONS%
env:
MATRIX_VCVARS: ${{ matrix.vcvars }}
MATRIX_PYTHON: ${{ matrix.python }}
diff --git a/.python-version b/.python-version
new file mode 100644
index 0000000..24ee5b1
--- /dev/null
+++ b/.python-version
@@ -0,0 +1 @@
+3.13
diff --git a/build-uv.py b/build-uv.py
new file mode 100755
index 0000000..39e1e00
--- /dev/null
+++ b/build-uv.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env -S uv run
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at https://mozilla.org/MPL/2.0/.
+
+import os
+import pathlib
+import platform
+import subprocess
+import sys
+
+ROOT = pathlib.Path(os.path.abspath(__file__)).parent
+
+
+def run():
+ env = dict(os.environ)
+ env["PYTHONUNBUFFERED"] = "1"
+ python = sys.executable
+ system = platform.system()
+
+ if system == "Darwin" or system == "Linux":
+ args = [
+ python,
+ "build-main.py",
+ *sys.argv[1:],
+ ]
+ make_dir = ROOT / "cpython-unix"
+ os.chdir(make_dir)
+ return os.execve(python, args, env)
+ elif system == "Windows":
+ args = [
+ python,
+ "build.py",
+ *sys.argv[1:],
+ ]
+ cwd = str(ROOT / "cpython-windows")
+ return subprocess.run(args, cwd=cwd, env=env, check=True, bufsize=0)
+ else:
+ raise Exception(f"Unsupported host system: {system}")
+
+
+if __name__ == "__main__":
+ try:
+ run()
+ except subprocess.CalledProcessError as e:
+ sys.exit(e.returncode)
diff --git a/cpython-windows/build.py b/cpython-windows/build.py
index d4048da..d0c3970 100644
--- a/cpython-windows/build.py
+++ b/cpython-windows/build.py
@@ -1512,7 +1512,8 @@ def build_cpython(
p for p in env["PATH"].split(";") if p != str(BUILD / "venv" / "bin")
]
env["PATH"] = ";".join(paths)
- del env["PYTHONPATH"]
+ if "PYTHONPATH" in env:
+ del env["PYTHONPATH"]
env["PYTHONHOME"] = str(cpython_source_path)
@@ -1974,6 +1975,7 @@ def main() -> None:
release_tag = release_tag_from_git()
# Create, e.g., `cpython-3.10.13+20240224-x86_64-pc-windows-msvc-pgo.tar.zst`.
+ DIST.mkdir(exist_ok=True)
compress_python_archive(
tar_path,
DIST,
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..e36457b
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,25 @@
+[project]
+name = "python-build-standalone"
+version = "0.1.0"
+description = "Produces standalone, highly-redistributable builds of Python."
+readme = "README.rst"
+requires-python = ">=3.10"
+dependencies = [
+ "docker>=7.1.0",
+ "jinja2>=3.1.5",
+ "jsonschema>=4.23.0",
+ "pygithub>=2.6.1 ; platform_machine != 'aarch64' or sys_platform != 'win32'",
+ "pyyaml>=6.0.2",
+ "six>=1.17.0",
+ "tomli>=2.2.1",
+ "typing-extensions>=4.14.1",
+ "zstandard>=0.23.0",
+]
+
+[build-system]
+requires = ["uv_build>=0.9.12,<0.10.0"]
+build-backend = "uv_build"
+
+[tool.uv.build-backend]
+module-name = "pythonbuild"
+module-root = ""
diff --git a/uv.lock b/uv.lock
new file mode 100644
index 0000000..7d5ad0a
--- /dev/null
+++ b/uv.lock
@@ -0,0 +1,912 @@
+version = 1
+revision = 3
+requires-python = ">=3.10"
+
+[[package]]
+name = "attrs"
+version = "25.4.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" },
+]
+
+[[package]]
+name = "certifi"
+version = "2025.11.12"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538, upload-time = "2025-11-12T02:54:51.517Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438, upload-time = "2025-11-12T02:54:49.735Z" },
+]
+
+[[package]]
+name = "cffi"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pycparser", marker = "implementation_name != 'PyPy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" },
+ { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" },
+ { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" },
+ { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" },
+ { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" },
+ { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" },
+ { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" },
+ { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" },
+ { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" },
+ { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" },
+ { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" },
+ { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" },
+ { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" },
+ { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" },
+ { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" },
+ { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" },
+ { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" },
+ { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" },
+ { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" },
+ { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" },
+ { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" },
+ { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" },
+ { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" },
+ { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" },
+ { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" },
+ { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" },
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709, upload-time = "2025-10-14T04:40:11.385Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814, upload-time = "2025-10-14T04:40:13.135Z" },
+ { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467, upload-time = "2025-10-14T04:40:14.728Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280, upload-time = "2025-10-14T04:40:16.14Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454, upload-time = "2025-10-14T04:40:17.567Z" },
+ { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609, upload-time = "2025-10-14T04:40:19.08Z" },
+ { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849, upload-time = "2025-10-14T04:40:20.607Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586, upload-time = "2025-10-14T04:40:21.719Z" },
+ { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290, upload-time = "2025-10-14T04:40:23.069Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663, upload-time = "2025-10-14T04:40:24.17Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964, upload-time = "2025-10-14T04:40:25.368Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064, upload-time = "2025-10-14T04:40:26.806Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015, upload-time = "2025-10-14T04:40:28.284Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792, upload-time = "2025-10-14T04:40:29.613Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198, upload-time = "2025-10-14T04:40:30.644Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262, upload-time = "2025-10-14T04:40:32.108Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" },
+ { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" },
+ { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" },
+ { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" },
+ { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" },
+ { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" },
+ { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" },
+ { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" },
+ { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" },
+ { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" },
+ { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" },
+ { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" },
+ { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" },
+ { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" },
+ { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" },
+ { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" },
+ { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" },
+ { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" },
+ { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" },
+ { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" },
+ { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" },
+ { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" },
+ { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" },
+ { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" },
+ { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" },
+ { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" },
+ { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" },
+ { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" },
+ { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" },
+ { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" },
+]
+
+[[package]]
+name = "cryptography"
+version = "46.0.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
+ { name = "typing-extensions", marker = "python_full_version < '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1d/42/9c391dd801d6cf0d561b5890549d4b27bafcc53b39c31a817e69d87c625b/cryptography-46.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:109d4ddfadf17e8e7779c39f9b18111a09efb969a301a31e987416a0191ed93a", size = 7225004, upload-time = "2025-10-15T23:16:52.239Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/67/38769ca6b65f07461eb200e85fc1639b438bdc667be02cf7f2cd6a64601c/cryptography-46.0.3-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:09859af8466b69bc3c27bdf4f5d84a665e0f7ab5088412e9e2ec49758eca5cbc", size = 4296667, upload-time = "2025-10-15T23:16:54.369Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/49/498c86566a1d80e978b42f0d702795f69887005548c041636df6ae1ca64c/cryptography-46.0.3-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:01ca9ff2885f3acc98c29f1860552e37f6d7c7d013d7334ff2a9de43a449315d", size = 4450807, upload-time = "2025-10-15T23:16:56.414Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/0a/863a3604112174c8624a2ac3c038662d9e59970c7f926acdcfaed8d61142/cryptography-46.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6eae65d4c3d33da080cff9c4ab1f711b15c1d9760809dad6ea763f3812d254cb", size = 4299615, upload-time = "2025-10-15T23:16:58.442Z" },
+ { url = "https://files.pythonhosted.org/packages/64/02/b73a533f6b64a69f3cd3872acb6ebc12aef924d8d103133bb3ea750dc703/cryptography-46.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5bf0ed4490068a2e72ac03d786693adeb909981cc596425d09032d372bcc849", size = 4016800, upload-time = "2025-10-15T23:17:00.378Z" },
+ { url = "https://files.pythonhosted.org/packages/25/d5/16e41afbfa450cde85a3b7ec599bebefaef16b5c6ba4ec49a3532336ed72/cryptography-46.0.3-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5ecfccd2329e37e9b7112a888e76d9feca2347f12f37918facbb893d7bb88ee8", size = 4984707, upload-time = "2025-10-15T23:17:01.98Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/56/e7e69b427c3878352c2fb9b450bd0e19ed552753491d39d7d0a2f5226d41/cryptography-46.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a2c0cd47381a3229c403062f764160d57d4d175e022c1df84e168c6251a22eec", size = 4482541, upload-time = "2025-10-15T23:17:04.078Z" },
+ { url = "https://files.pythonhosted.org/packages/78/f6/50736d40d97e8483172f1bb6e698895b92a223dba513b0ca6f06b2365339/cryptography-46.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:549e234ff32571b1f4076ac269fcce7a808d3bf98b76c8dd560e42dbc66d7d91", size = 4299464, upload-time = "2025-10-15T23:17:05.483Z" },
+ { url = "https://files.pythonhosted.org/packages/00/de/d8e26b1a855f19d9994a19c702fa2e93b0456beccbcfe437eda00e0701f2/cryptography-46.0.3-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:c0a7bb1a68a5d3471880e264621346c48665b3bf1c3759d682fc0864c540bd9e", size = 4950838, upload-time = "2025-10-15T23:17:07.425Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/29/798fc4ec461a1c9e9f735f2fc58741b0daae30688f41b2497dcbc9ed1355/cryptography-46.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:10b01676fc208c3e6feeb25a8b83d81767e8059e1fe86e1dc62d10a3018fa926", size = 4481596, upload-time = "2025-10-15T23:17:09.343Z" },
+ { url = "https://files.pythonhosted.org/packages/15/8d/03cd48b20a573adfff7652b76271078e3045b9f49387920e7f1f631d125e/cryptography-46.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0abf1ffd6e57c67e92af68330d05760b7b7efb243aab8377e583284dbab72c71", size = 4426782, upload-time = "2025-10-15T23:17:11.22Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/b1/ebacbfe53317d55cf33165bda24c86523497a6881f339f9aae5c2e13e57b/cryptography-46.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a04bee9ab6a4da801eb9b51f1b708a1b5b5c9eb48c03f74198464c66f0d344ac", size = 4698381, upload-time = "2025-10-15T23:17:12.829Z" },
+ { url = "https://files.pythonhosted.org/packages/96/92/8a6a9525893325fc057a01f654d7efc2c64b9de90413adcf605a85744ff4/cryptography-46.0.3-cp311-abi3-win32.whl", hash = "sha256:f260d0d41e9b4da1ed1e0f1ce571f97fe370b152ab18778e9e8f67d6af432018", size = 3055988, upload-time = "2025-10-15T23:17:14.65Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/bf/80fbf45253ea585a1e492a6a17efcb93467701fa79e71550a430c5e60df0/cryptography-46.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:a9a3008438615669153eb86b26b61e09993921ebdd75385ddd748702c5adfddb", size = 3514451, upload-time = "2025-10-15T23:17:16.142Z" },
+ { url = "https://files.pythonhosted.org/packages/2e/af/9b302da4c87b0beb9db4e756386a7c6c5b8003cd0e742277888d352ae91d/cryptography-46.0.3-cp311-abi3-win_arm64.whl", hash = "sha256:5d7f93296ee28f68447397bf5198428c9aeeab45705a55d53a6343455dcb2c3c", size = 2928007, upload-time = "2025-10-15T23:17:18.04Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/e2/a510aa736755bffa9d2f75029c229111a1d02f8ecd5de03078f4c18d91a3/cryptography-46.0.3-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:00a5e7e87938e5ff9ff5447ab086a5706a957137e6e433841e9d24f38a065217", size = 7158012, upload-time = "2025-10-15T23:17:19.982Z" },
+ { url = "https://files.pythonhosted.org/packages/73/dc/9aa866fbdbb95b02e7f9d086f1fccfeebf8953509b87e3f28fff927ff8a0/cryptography-46.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c8daeb2d2174beb4575b77482320303f3d39b8e81153da4f0fb08eb5fe86a6c5", size = 4288728, upload-time = "2025-10-15T23:17:21.527Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/fd/bc1daf8230eaa075184cbbf5f8cd00ba9db4fd32d63fb83da4671b72ed8a/cryptography-46.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:39b6755623145ad5eff1dab323f4eae2a32a77a7abef2c5089a04a3d04366715", size = 4435078, upload-time = "2025-10-15T23:17:23.042Z" },
+ { url = "https://files.pythonhosted.org/packages/82/98/d3bd5407ce4c60017f8ff9e63ffee4200ab3e23fe05b765cab805a7db008/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:db391fa7c66df6762ee3f00c95a89e6d428f4d60e7abc8328f4fe155b5ac6e54", size = 4293460, upload-time = "2025-10-15T23:17:24.885Z" },
+ { url = "https://files.pythonhosted.org/packages/26/e9/e23e7900983c2b8af7a08098db406cf989d7f09caea7897e347598d4cd5b/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:78a97cf6a8839a48c49271cdcbd5cf37ca2c1d6b7fdd86cc864f302b5e9bf459", size = 3995237, upload-time = "2025-10-15T23:17:26.449Z" },
+ { url = "https://files.pythonhosted.org/packages/91/15/af68c509d4a138cfe299d0d7ddb14afba15233223ebd933b4bbdbc7155d3/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:dfb781ff7eaa91a6f7fd41776ec37c5853c795d3b358d4896fdbb5df168af422", size = 4967344, upload-time = "2025-10-15T23:17:28.06Z" },
+ { url = "https://files.pythonhosted.org/packages/ca/e3/8643d077c53868b681af077edf6b3cb58288b5423610f21c62aadcbe99f4/cryptography-46.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:6f61efb26e76c45c4a227835ddeae96d83624fb0d29eb5df5b96e14ed1a0afb7", size = 4466564, upload-time = "2025-10-15T23:17:29.665Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/43/c1e8726fa59c236ff477ff2b5dc071e54b21e5a1e51aa2cee1676f1c986f/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:23b1a8f26e43f47ceb6d6a43115f33a5a37d57df4ea0ca295b780ae8546e8044", size = 4292415, upload-time = "2025-10-15T23:17:31.686Z" },
+ { url = "https://files.pythonhosted.org/packages/42/f9/2f8fefdb1aee8a8e3256a0568cffc4e6d517b256a2fe97a029b3f1b9fe7e/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b419ae593c86b87014b9be7396b385491ad7f320bde96826d0dd174459e54665", size = 4931457, upload-time = "2025-10-15T23:17:33.478Z" },
+ { url = "https://files.pythonhosted.org/packages/79/30/9b54127a9a778ccd6d27c3da7563e9f2d341826075ceab89ae3b41bf5be2/cryptography-46.0.3-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:50fc3343ac490c6b08c0cf0d704e881d0d660be923fd3076db3e932007e726e3", size = 4466074, upload-time = "2025-10-15T23:17:35.158Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/68/b4f4a10928e26c941b1b6a179143af9f4d27d88fe84a6a3c53592d2e76bf/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22d7e97932f511d6b0b04f2bfd818d73dcd5928db509460aaf48384778eb6d20", size = 4420569, upload-time = "2025-10-15T23:17:37.188Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/49/3746dab4c0d1979888f125226357d3262a6dd40e114ac29e3d2abdf1ec55/cryptography-46.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d55f3dffadd674514ad19451161118fd010988540cee43d8bc20675e775925de", size = 4681941, upload-time = "2025-10-15T23:17:39.236Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/30/27654c1dbaf7e4a3531fa1fc77986d04aefa4d6d78259a62c9dc13d7ad36/cryptography-46.0.3-cp314-cp314t-win32.whl", hash = "sha256:8a6e050cb6164d3f830453754094c086ff2d0b2f3a897a1d9820f6139a1f0914", size = 3022339, upload-time = "2025-10-15T23:17:40.888Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/30/640f34ccd4d2a1bc88367b54b926b781b5a018d65f404d409aba76a84b1c/cryptography-46.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:760f83faa07f8b64e9c33fc963d790a2edb24efb479e3520c14a45741cd9b2db", size = 3494315, upload-time = "2025-10-15T23:17:42.769Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/8b/88cc7e3bd0a8e7b861f26981f7b820e1f46aa9d26cc482d0feba0ecb4919/cryptography-46.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:516ea134e703e9fe26bcd1277a4b59ad30586ea90c365a87781d7887a646fe21", size = 2919331, upload-time = "2025-10-15T23:17:44.468Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/23/45fe7f376a7df8daf6da3556603b36f53475a99ce4faacb6ba2cf3d82021/cryptography-46.0.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:cb3d760a6117f621261d662bccc8ef5bc32ca673e037c83fbe565324f5c46936", size = 7218248, upload-time = "2025-10-15T23:17:46.294Z" },
+ { url = "https://files.pythonhosted.org/packages/27/32/b68d27471372737054cbd34c84981f9edbc24fe67ca225d389799614e27f/cryptography-46.0.3-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4b7387121ac7d15e550f5cb4a43aef2559ed759c35df7336c402bb8275ac9683", size = 4294089, upload-time = "2025-10-15T23:17:48.269Z" },
+ { url = "https://files.pythonhosted.org/packages/26/42/fa8389d4478368743e24e61eea78846a0006caffaf72ea24a15159215a14/cryptography-46.0.3-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:15ab9b093e8f09daab0f2159bb7e47532596075139dd74365da52ecc9cb46c5d", size = 4440029, upload-time = "2025-10-15T23:17:49.837Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/eb/f483db0ec5ac040824f269e93dd2bd8a21ecd1027e77ad7bdf6914f2fd80/cryptography-46.0.3-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:46acf53b40ea38f9c6c229599a4a13f0d46a6c3fa9ef19fc1a124d62e338dfa0", size = 4297222, upload-time = "2025-10-15T23:17:51.357Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/cf/da9502c4e1912cb1da3807ea3618a6829bee8207456fbbeebc361ec38ba3/cryptography-46.0.3-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10ca84c4668d066a9878890047f03546f3ae0a6b8b39b697457b7757aaf18dbc", size = 4012280, upload-time = "2025-10-15T23:17:52.964Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/8f/9adb86b93330e0df8b3dcf03eae67c33ba89958fc2e03862ef1ac2b42465/cryptography-46.0.3-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:36e627112085bb3b81b19fed209c05ce2a52ee8b15d161b7c643a7d5a88491f3", size = 4978958, upload-time = "2025-10-15T23:17:54.965Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/a0/5fa77988289c34bdb9f913f5606ecc9ada1adb5ae870bd0d1054a7021cc4/cryptography-46.0.3-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1000713389b75c449a6e979ffc7dcc8ac90b437048766cef052d4d30b8220971", size = 4473714, upload-time = "2025-10-15T23:17:56.754Z" },
+ { url = "https://files.pythonhosted.org/packages/14/e5/fc82d72a58d41c393697aa18c9abe5ae1214ff6f2a5c18ac470f92777895/cryptography-46.0.3-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:b02cf04496f6576afffef5ddd04a0cb7d49cf6be16a9059d793a30b035f6b6ac", size = 4296970, upload-time = "2025-10-15T23:17:58.588Z" },
+ { url = "https://files.pythonhosted.org/packages/78/06/5663ed35438d0b09056973994f1aec467492b33bd31da36e468b01ec1097/cryptography-46.0.3-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:71e842ec9bc7abf543b47cf86b9a743baa95f4677d22baa4c7d5c69e49e9bc04", size = 4940236, upload-time = "2025-10-15T23:18:00.897Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/59/873633f3f2dcd8a053b8dd1d38f783043b5fce589c0f6988bf55ef57e43e/cryptography-46.0.3-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:402b58fc32614f00980b66d6e56a5b4118e6cb362ae8f3fda141ba4689bd4506", size = 4472642, upload-time = "2025-10-15T23:18:02.749Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/39/8e71f3930e40f6877737d6f69248cf74d4e34b886a3967d32f919cc50d3b/cryptography-46.0.3-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ef639cb3372f69ec44915fafcd6698b6cc78fbe0c2ea41be867f6ed612811963", size = 4423126, upload-time = "2025-10-15T23:18:04.85Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/c7/f65027c2810e14c3e7268353b1681932b87e5a48e65505d8cc17c99e36ae/cryptography-46.0.3-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b51b8ca4f1c6453d8829e1eb7299499ca7f313900dd4d89a24b8b87c0a780d4", size = 4686573, upload-time = "2025-10-15T23:18:06.908Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" },
+ { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/cd/1a8633802d766a0fa46f382a77e096d7e209e0817892929655fe0586ae32/cryptography-46.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a23582810fedb8c0bc47524558fb6c56aac3fc252cb306072fd2815da2a47c32", size = 3689163, upload-time = "2025-10-15T23:18:13.821Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/59/6b26512964ace6480c3e54681a9859c974172fb141c38df11eadd8416947/cryptography-46.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e7aec276d68421f9574040c26e2a7c3771060bc0cff408bae1dcb19d3ab1e63c", size = 3429474, upload-time = "2025-10-15T23:18:15.477Z" },
+ { url = "https://files.pythonhosted.org/packages/06/8a/e60e46adab4362a682cf142c7dcb5bf79b782ab2199b0dcb81f55970807f/cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea", size = 3698132, upload-time = "2025-10-15T23:18:17.056Z" },
+ { url = "https://files.pythonhosted.org/packages/da/38/f59940ec4ee91e93d3311f7532671a5cef5570eb04a144bf203b58552d11/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b", size = 4243992, upload-time = "2025-10-15T23:18:18.695Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/0c/35b3d92ddebfdfda76bb485738306545817253d0a3ded0bfe80ef8e67aa5/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb", size = 4409944, upload-time = "2025-10-15T23:18:20.597Z" },
+ { url = "https://files.pythonhosted.org/packages/99/55/181022996c4063fc0e7666a47049a1ca705abb9c8a13830f074edb347495/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9394673a9f4de09e28b5356e7fff97d778f8abad85c9d5ac4a4b7e25a0de7717", size = 4242957, upload-time = "2025-10-15T23:18:22.18Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/af/72cd6ef29f9c5f731251acadaeb821559fe25f10852f44a63374c9ca08c1/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94cd0549accc38d1494e1f8de71eca837d0509d0d44bf11d158524b0e12cebf9", size = 4409447, upload-time = "2025-10-15T23:18:24.209Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/c3/e90f4a4feae6410f914f8ebac129b9ae7a8c92eb60a638012dde42030a9d/cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c", size = 3438528, upload-time = "2025-10-15T23:18:26.227Z" },
+]
+
+[[package]]
+name = "docker"
+version = "7.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pywin32", marker = "sys_platform == 'win32'" },
+ { name = "requests" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834, upload-time = "2024-05-23T11:13:57.216Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774, upload-time = "2024-05-23T11:13:55.01Z" },
+]
+
+[[package]]
+name = "idna"
+version = "3.11"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
+]
+
+[[package]]
+name = "jinja2"
+version = "3.1.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markupsafe" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
+]
+
+[[package]]
+name = "jsonschema"
+version = "4.25.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "attrs" },
+ { name = "jsonschema-specifications" },
+ { name = "referencing" },
+ { name = "rpds-py" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342, upload-time = "2025-08-18T17:03:50.038Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040, upload-time = "2025-08-18T17:03:48.373Z" },
+]
+
+[[package]]
+name = "jsonschema-specifications"
+version = "2025.9.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "referencing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" },
+]
+
+[[package]]
+name = "markupsafe"
+version = "3.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" },
+ { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" },
+ { 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", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" },
+ { 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", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" },
+ { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" },
+ { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" },
+ { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" },
+ { 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", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" },
+ { 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", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" },
+ { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" },
+ { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" },
+ { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" },
+ { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" },
+ { 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", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" },
+ { 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", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" },
+ { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" },
+ { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" },
+ { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" },
+ { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" },
+ { 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", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" },
+ { 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", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" },
+ { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" },
+ { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" },
+ { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" },
+ { 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", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" },
+ { 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", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" },
+ { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" },
+ { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" },
+ { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" },
+ { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" },
+ { 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", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" },
+ { 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", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" },
+ { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" },
+ { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" },
+ { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" },
+ { 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", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" },
+ { 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", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" },
+ { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" },
+ { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" },
+ { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" },
+ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" },
+]
+
+[[package]]
+name = "pycparser"
+version = "2.23"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" },
+]
+
+[[package]]
+name = "pygithub"
+version = "2.8.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pyjwt", extra = ["crypto"] },
+ { name = "pynacl" },
+ { name = "requests" },
+ { name = "typing-extensions" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c1/74/e560bdeffea72ecb26cff27f0fad548bbff5ecc51d6a155311ea7f9e4c4c/pygithub-2.8.1.tar.gz", hash = "sha256:341b7c78521cb07324ff670afd1baa2bf5c286f8d9fd302c1798ba594a5400c9", size = 2246994, upload-time = "2025-09-02T17:41:54.674Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/07/ba/7049ce39f653f6140aac4beb53a5aaf08b4407b6a3019aae394c1c5244ff/pygithub-2.8.1-py3-none-any.whl", hash = "sha256:23a0a5bca93baef082e03411bf0ce27204c32be8bfa7abc92fe4a3e132936df0", size = 432709, upload-time = "2025-09-02T17:41:52.947Z" },
+]
+
+[[package]]
+name = "pyjwt"
+version = "2.10.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" },
+]
+
+[package.optional-dependencies]
+crypto = [
+ { name = "cryptography" },
+]
+
+[[package]]
+name = "pynacl"
+version = "1.6.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b2/46/aeca065d227e2265125aea590c9c47fbf5786128c9400ee0eb7c88931f06/pynacl-1.6.1.tar.gz", hash = "sha256:8d361dac0309f2b6ad33b349a56cd163c98430d409fa503b10b70b3ad66eaa1d", size = 3506616, upload-time = "2025-11-10T16:02:13.195Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/75/d6/4b2dca33ed512de8f54e5c6074aa06eaeb225bfbcd9b16f33a414389d6bd/pynacl-1.6.1-cp314-cp314t-macosx_10_10_universal2.whl", hash = "sha256:7d7c09749450c385301a3c20dca967a525152ae4608c0a096fe8464bfc3df93d", size = 389109, upload-time = "2025-11-10T16:01:28.79Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/30/e8dbb8ff4fa2559bbbb2187ba0d0d7faf728d17cb8396ecf4a898b22d3da/pynacl-1.6.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc734c1696ffd49b40f7c1779c89ba908157c57345cf626be2e0719488a076d3", size = 808254, upload-time = "2025-11-10T16:01:37.839Z" },
+ { url = "https://files.pythonhosted.org/packages/44/f9/f5449c652f31da00249638dbab065ad4969c635119094b79b17c3a4da2ab/pynacl-1.6.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3cd787ec1f5c155dc8ecf39b1333cfef41415dc96d392f1ce288b4fe970df489", size = 1407365, upload-time = "2025-11-10T16:01:40.454Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/2f/9aa5605f473b712065c0a193ebf4ad4725d7a245533f0cd7e5dcdbc78f35/pynacl-1.6.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b35d93ab2df03ecb3aa506be0d3c73609a51449ae0855c2e89c7ed44abde40b", size = 843842, upload-time = "2025-11-10T16:01:30.524Z" },
+ { url = "https://files.pythonhosted.org/packages/32/8d/748f0f6956e207453da8f5f21a70885fbbb2e060d5c9d78e0a4a06781451/pynacl-1.6.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dece79aecbb8f4640a1adbb81e4aa3bfb0e98e99834884a80eb3f33c7c30e708", size = 1445559, upload-time = "2025-11-10T16:01:33.663Z" },
+ { url = "https://files.pythonhosted.org/packages/78/d0/2387f0dcb0e9816f38373999e48db4728ed724d31accdd4e737473319d35/pynacl-1.6.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:c2228054f04bf32d558fb89bb99f163a8197d5a9bf4efa13069a7fa8d4b93fc3", size = 825791, upload-time = "2025-11-10T16:01:34.823Z" },
+ { url = "https://files.pythonhosted.org/packages/18/3d/ef6fb7eb072aaf15f280bc66f26ab97e7fc9efa50fb1927683013ef47473/pynacl-1.6.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:2b12f1b97346f177affcdfdc78875ff42637cb40dcf79484a97dae3448083a78", size = 1410843, upload-time = "2025-11-10T16:01:36.401Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/fb/23824a017526850ee7d8a1cc4cd1e3e5082800522c10832edbbca8619537/pynacl-1.6.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e735c3a1bdfde3834503baf1a6d74d4a143920281cb724ba29fb84c9f49b9c48", size = 801140, upload-time = "2025-11-10T16:01:42.013Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/d1/ebc6b182cb98603a35635b727d62f094bc201bf610f97a3bb6357fe688d2/pynacl-1.6.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3384a454adf5d716a9fadcb5eb2e3e72cd49302d1374a60edc531c9957a9b014", size = 1371966, upload-time = "2025-11-10T16:01:43.297Z" },
+ { url = "https://files.pythonhosted.org/packages/64/f4/c9d7b6f02924b1f31db546c7bd2a83a2421c6b4a8e6a2e53425c9f2802e0/pynacl-1.6.1-cp314-cp314t-win32.whl", hash = "sha256:d8615ee34d01c8e0ab3f302dcdd7b32e2bcf698ba5f4809e7cc407c8cdea7717", size = 230482, upload-time = "2025-11-10T16:01:47.688Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/2c/942477957fba22da7bf99131850e5ebdff66623418ab48964e78a7a8293e/pynacl-1.6.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5f5b35c1a266f8a9ad22525049280a600b19edd1f785bccd01ae838437dcf935", size = 243232, upload-time = "2025-11-10T16:01:45.208Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/0c/bdbc0d04a53b96a765ab03aa2cf9a76ad8653d70bf1665459b9a0dedaa1c/pynacl-1.6.1-cp314-cp314t-win_arm64.whl", hash = "sha256:d984c91fe3494793b2a1fb1e91429539c6c28e9ec8209d26d25041ec599ccf63", size = 187907, upload-time = "2025-11-10T16:01:46.328Z" },
+ { url = "https://files.pythonhosted.org/packages/49/41/3cfb3b4f3519f6ff62bf71bf1722547644bcfb1b05b8fdbdc300249ba113/pynacl-1.6.1-cp38-abi3-macosx_10_10_universal2.whl", hash = "sha256:a6f9fd6d6639b1e81115c7f8ff16b8dedba1e8098d2756275d63d208b0e32021", size = 387591, upload-time = "2025-11-10T16:01:49.1Z" },
+ { url = "https://files.pythonhosted.org/packages/18/21/b8a6563637799f617a3960f659513eccb3fcc655d5fc2be6e9dc6416826f/pynacl-1.6.1-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e49a3f3d0da9f79c1bec2aa013261ab9fa651c7da045d376bd306cf7c1792993", size = 798866, upload-time = "2025-11-10T16:01:55.688Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/6c/dc38033bc3ea461e05ae8f15a81e0e67ab9a01861d352ae971c99de23e7c/pynacl-1.6.1-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7713f8977b5d25f54a811ec9efa2738ac592e846dd6e8a4d3f7578346a841078", size = 1398001, upload-time = "2025-11-10T16:01:57.101Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/05/3ec0796a9917100a62c5073b20c4bce7bf0fea49e99b7906d1699cc7b61b/pynacl-1.6.1-cp38-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a3becafc1ee2e5ea7f9abc642f56b82dcf5be69b961e782a96ea52b55d8a9fc", size = 834024, upload-time = "2025-11-10T16:01:50.228Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/b7/ae9982be0f344f58d9c64a1c25d1f0125c79201634efe3c87305ac7cb3e3/pynacl-1.6.1-cp38-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4ce50d19f1566c391fedc8dc2f2f5be265ae214112ebe55315e41d1f36a7f0a9", size = 1436766, upload-time = "2025-11-10T16:01:51.886Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/51/b2ccbf89cf3025a02e044dd68a365cad593ebf70f532299f2c047d2b7714/pynacl-1.6.1-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:543f869140f67d42b9b8d47f922552d7a967e6c116aad028c9bfc5f3f3b3a7b7", size = 817275, upload-time = "2025-11-10T16:01:53.351Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/6c/dd9ee8214edf63ac563b08a9b30f98d116942b621d39a751ac3256694536/pynacl-1.6.1-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a2bb472458c7ca959aeeff8401b8efef329b0fc44a89d3775cffe8fad3398ad8", size = 1401891, upload-time = "2025-11-10T16:01:54.587Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/c1/97d3e1c83772d78ee1db3053fd674bc6c524afbace2bfe8d419fd55d7ed1/pynacl-1.6.1-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:3206fa98737fdc66d59b8782cecc3d37d30aeec4593d1c8c145825a345bba0f0", size = 772291, upload-time = "2025-11-10T16:01:58.111Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/ca/691ff2fe12f3bb3e43e8e8df4b806f6384593d427f635104d337b8e00291/pynacl-1.6.1-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:53543b4f3d8acb344f75fd4d49f75e6572fce139f4bfb4815a9282296ff9f4c0", size = 1370839, upload-time = "2025-11-10T16:01:59.252Z" },
+ { url = "https://files.pythonhosted.org/packages/30/27/06fe5389d30391fce006442246062cc35773c84fbcad0209fbbf5e173734/pynacl-1.6.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:319de653ef84c4f04e045eb250e6101d23132372b0a61a7acf91bac0fda8e58c", size = 791371, upload-time = "2025-11-10T16:02:01.075Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/7a/e2bde8c9d39074a5aa046c7d7953401608d1f16f71e237f4bef3fb9d7e49/pynacl-1.6.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:262a8de6bba4aee8a66f5edf62c214b06647461c9b6b641f8cd0cb1e3b3196fe", size = 1363031, upload-time = "2025-11-10T16:02:02.656Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/b6/63fd77264dae1087770a1bb414bc604470f58fbc21d83822fc9c76248076/pynacl-1.6.1-cp38-abi3-win32.whl", hash = "sha256:9fd1a4eb03caf8a2fe27b515a998d26923adb9ddb68db78e35ca2875a3830dde", size = 226585, upload-time = "2025-11-10T16:02:07.116Z" },
+ { url = "https://files.pythonhosted.org/packages/12/c8/b419180f3fdb72ab4d45e1d88580761c267c7ca6eda9a20dcbcba254efe6/pynacl-1.6.1-cp38-abi3-win_amd64.whl", hash = "sha256:a569a4069a7855f963940040f35e87d8bc084cb2d6347428d5ad20550a0a1a21", size = 238923, upload-time = "2025-11-10T16:02:04.401Z" },
+ { url = "https://files.pythonhosted.org/packages/35/76/c34426d532e4dce7ff36e4d92cb20f4cbbd94b619964b93d24e8f5b5510f/pynacl-1.6.1-cp38-abi3-win_arm64.whl", hash = "sha256:5953e8b8cfadb10889a6e7bd0f53041a745d1b3d30111386a1bb37af171e6daf", size = 183970, upload-time = "2025-11-10T16:02:05.786Z" },
+]
+
+[[package]]
+name = "python-build-standalone"
+version = "0.1.0"
+source = { editable = "." }
+dependencies = [
+ { name = "docker" },
+ { name = "jinja2" },
+ { name = "jsonschema" },
+ { name = "pygithub", marker = "platform_machine != 'aarch64' or sys_platform != 'win32'" },
+ { name = "pyyaml" },
+ { name = "six" },
+ { name = "tomli" },
+ { name = "typing-extensions" },
+ { name = "zstandard" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "docker", specifier = ">=7.1.0" },
+ { name = "jinja2", specifier = ">=3.1.5" },
+ { name = "jsonschema", specifier = ">=4.23.0" },
+ { name = "pygithub", marker = "platform_machine != 'aarch64' or sys_platform != 'win32'", specifier = ">=2.6.1" },
+ { name = "pyyaml", specifier = ">=6.0.2" },
+ { name = "six", specifier = ">=1.17.0" },
+ { name = "tomli", specifier = ">=2.2.1" },
+ { name = "typing-extensions", specifier = ">=4.14.1" },
+ { name = "zstandard", specifier = ">=0.23.0" },
+]
+
+[[package]]
+name = "pywin32"
+version = "311"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432, upload-time = "2025-07-14T20:13:05.9Z" },
+ { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103, upload-time = "2025-07-14T20:13:07.698Z" },
+ { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557, upload-time = "2025-07-14T20:13:11.11Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" },
+ { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" },
+ { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" },
+ { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" },
+ { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" },
+]
+
+[[package]]
+name = "pyyaml"
+version = "6.0.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" },
+ { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" },
+ { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" },
+ { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" },
+ { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" },
+ { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" },
+ { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" },
+ { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" },
+ { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" },
+ { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" },
+ { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" },
+ { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" },
+ { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" },
+ { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" },
+ { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" },
+ { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" },
+ { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" },
+ { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" },
+ { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" },
+ { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" },
+ { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" },
+ { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" },
+ { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" },
+ { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" },
+ { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
+]
+
+[[package]]
+name = "referencing"
+version = "0.37.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "attrs" },
+ { name = "rpds-py" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" },
+]
+
+[[package]]
+name = "requests"
+version = "2.32.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "idna" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" },
+]
+
+[[package]]
+name = "rpds-py"
+version = "0.29.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/98/33/23b3b3419b6a3e0f559c7c0d2ca8fc1b9448382b25245033788785921332/rpds_py-0.29.0.tar.gz", hash = "sha256:fe55fe686908f50154d1dc599232016e50c243b438c3b7432f24e2895b0e5359", size = 69359, upload-time = "2025-11-16T14:50:39.532Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/7a/c5b2ff381b74bc742768e8d870f26babac4ef256ba160bdbf8d57af56461/rpds_py-0.29.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4ae4b88c6617e1b9e5038ab3fccd7bac0842fdda2b703117b2aa99bc85379113", size = 372385, upload-time = "2025-11-16T14:47:36.287Z" },
+ { url = "https://files.pythonhosted.org/packages/28/36/531f1eb4d5bed4a9c150f363a7ec4a98d2dc746151bba5473bc38ee85dec/rpds_py-0.29.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7d9128ec9d8cecda6f044001fde4fb71ea7c24325336612ef8179091eb9596b9", size = 362869, upload-time = "2025-11-16T14:47:38.196Z" },
+ { url = "https://files.pythonhosted.org/packages/54/df/7e9c0493a2015d9c82807a2d5f023ea9774e27a4c15b33ef1cdb7456138d/rpds_py-0.29.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37812c3da8e06f2bb35b3cf10e4a7b68e776a706c13058997238762b4e07f4f", size = 391582, upload-time = "2025-11-16T14:47:39.746Z" },
+ { url = "https://files.pythonhosted.org/packages/15/38/42a981c3592ef46fbd7e17adbf8730cc5ec87e6aa1770c658c44bbb52960/rpds_py-0.29.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:66786c3fb1d8de416a7fa8e1cb1ec6ba0a745b2b0eee42f9b7daa26f1a495545", size = 405685, upload-time = "2025-11-16T14:47:41.472Z" },
+ { url = "https://files.pythonhosted.org/packages/12/45/628b8c15856c3849c3f52ec6dac93c046ed5faeed4a435af03b70525fd29/rpds_py-0.29.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58f5c77f1af888b5fd1876c9a0d9858f6f88a39c9dd7c073a88e57e577da66d", size = 527067, upload-time = "2025-11-16T14:47:43.036Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/ba/6b56d09badeabd95098016d72a437d4a0fd82d4672ce92a7607df5d70a42/rpds_py-0.29.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:799156ef1f3529ed82c36eb012b5d7a4cf4b6ef556dd7cc192148991d07206ae", size = 412532, upload-time = "2025-11-16T14:47:44.484Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/39/2f1f3db92888314b50b8f9641f679188bd24b3665a8cb9923b7201ae8011/rpds_py-0.29.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:453783477aa4f2d9104c4b59b08c871431647cb7af51b549bbf2d9eb9c827756", size = 392736, upload-time = "2025-11-16T14:47:46.053Z" },
+ { url = "https://files.pythonhosted.org/packages/60/43/3c3b1dcd827e50f2ae28786d846b8a351080d8a69a3b49bc10ae44cc39b1/rpds_py-0.29.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:24a7231493e3c4a4b30138b50cca089a598e52c34cf60b2f35cebf62f274fdea", size = 406300, upload-time = "2025-11-16T14:47:47.268Z" },
+ { url = "https://files.pythonhosted.org/packages/da/02/bc96021b67f8525e6bcdd68935c4543ada61e1f3dcb067ed037d68b8c6d2/rpds_py-0.29.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7033c1010b1f57bb44d8067e8c25aa6fa2e944dbf46ccc8c92b25043839c3fd2", size = 423641, upload-time = "2025-11-16T14:47:48.878Z" },
+ { url = "https://files.pythonhosted.org/packages/38/e9/c435ddb602ced19a80b8277a41371734f33ad3f91cc4ceb4d82596800a3c/rpds_py-0.29.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0248b19405422573621172ab8e3a1f29141362d13d9f72bafa2e28ea0cdca5a2", size = 574153, upload-time = "2025-11-16T14:47:50.435Z" },
+ { url = "https://files.pythonhosted.org/packages/84/82/dc3c32e1f89ecba8a59600d4cd65fe0ad81b6c636ccdbf6cd177fd6a7bac/rpds_py-0.29.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f9f436aee28d13b9ad2c764fc273e0457e37c2e61529a07b928346b219fcde3b", size = 600304, upload-time = "2025-11-16T14:47:51.599Z" },
+ { url = "https://files.pythonhosted.org/packages/35/98/785290e0b7142470735dc1b1f68fb33aae29e5296f062c88396eedf796c8/rpds_py-0.29.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24a16cb7163933906c62c272de20ea3c228e4542c8c45c1d7dc2b9913e17369a", size = 562211, upload-time = "2025-11-16T14:47:53.094Z" },
+ { url = "https://files.pythonhosted.org/packages/30/58/4eeddcb0737c6875f3e30c65dc9d7e7a10dfd5779646a990fa602c6d56c5/rpds_py-0.29.0-cp310-cp310-win32.whl", hash = "sha256:1a409b0310a566bfd1be82119891fefbdce615ccc8aa558aff7835c27988cbef", size = 221803, upload-time = "2025-11-16T14:47:54.404Z" },
+ { url = "https://files.pythonhosted.org/packages/54/77/b35a8dbdcbeb32505500547cdafaa9f8863e85f8faac50ef34464ec5a256/rpds_py-0.29.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5523b0009e7c3c1263471b69d8da1c7d41b3ecb4cb62ef72be206b92040a950", size = 235530, upload-time = "2025-11-16T14:47:56.061Z" },
+ { url = "https://files.pythonhosted.org/packages/36/ab/7fb95163a53ab122c74a7c42d2d2f012819af2cf3deb43fb0d5acf45cc1a/rpds_py-0.29.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9b9c764a11fd637e0322a488560533112837f5334ffeb48b1be20f6d98a7b437", size = 372344, upload-time = "2025-11-16T14:47:57.279Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/45/f3c30084c03b0d0f918cb4c5ae2c20b0a148b51ba2b3f6456765b629bedd/rpds_py-0.29.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fd2164d73812026ce970d44c3ebd51e019d2a26a4425a5dcbdfa93a34abc383", size = 363041, upload-time = "2025-11-16T14:47:58.908Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/e9/4d044a1662608c47a87cbb37b999d4d5af54c6d6ebdda93a4d8bbf8b2a10/rpds_py-0.29.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a097b7f7f7274164566ae90a221fd725363c0e9d243e2e9ed43d195ccc5495c", size = 391775, upload-time = "2025-11-16T14:48:00.197Z" },
+ { url = "https://files.pythonhosted.org/packages/50/c9/7616d3ace4e6731aeb6e3cd85123e03aec58e439044e214b9c5c60fd8eb1/rpds_py-0.29.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cdc0490374e31cedefefaa1520d5fe38e82fde8748cbc926e7284574c714d6b", size = 405624, upload-time = "2025-11-16T14:48:01.496Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/e2/6d7d6941ca0843609fd2d72c966a438d6f22617baf22d46c3d2156c31350/rpds_py-0.29.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89ca2e673ddd5bde9b386da9a0aac0cab0e76f40c8f0aaf0d6311b6bbf2aa311", size = 527894, upload-time = "2025-11-16T14:48:03.167Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/f7/aee14dc2db61bb2ae1e3068f134ca9da5f28c586120889a70ff504bb026f/rpds_py-0.29.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a5d9da3ff5af1ca1249b1adb8ef0573b94c76e6ae880ba1852f033bf429d4588", size = 412720, upload-time = "2025-11-16T14:48:04.413Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/e2/2293f236e887c0360c2723d90c00d48dee296406994d6271faf1712e94ec/rpds_py-0.29.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8238d1d310283e87376c12f658b61e1ee23a14c0e54c7c0ce953efdbdc72deed", size = 392945, upload-time = "2025-11-16T14:48:06.252Z" },
+ { url = "https://files.pythonhosted.org/packages/14/cd/ceea6147acd3bd1fd028d1975228f08ff19d62098078d5ec3eed49703797/rpds_py-0.29.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:2d6fb2ad1c36f91c4646989811e84b1ea5e0c3cf9690b826b6e32b7965853a63", size = 406385, upload-time = "2025-11-16T14:48:07.575Z" },
+ { url = "https://files.pythonhosted.org/packages/52/36/fe4dead19e45eb77a0524acfdbf51e6cda597b26fc5b6dddbff55fbbb1a5/rpds_py-0.29.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:534dc9df211387547267ccdb42253aa30527482acb38dd9b21c5c115d66a96d2", size = 423943, upload-time = "2025-11-16T14:48:10.175Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/7b/4551510803b582fa4abbc8645441a2d15aa0c962c3b21ebb380b7e74f6a1/rpds_py-0.29.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d456e64724a075441e4ed648d7f154dc62e9aabff29bcdf723d0c00e9e1d352f", size = 574204, upload-time = "2025-11-16T14:48:11.499Z" },
+ { url = "https://files.pythonhosted.org/packages/64/ba/071ccdd7b171e727a6ae079f02c26f75790b41555f12ca8f1151336d2124/rpds_py-0.29.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a738f2da2f565989401bd6fd0b15990a4d1523c6d7fe83f300b7e7d17212feca", size = 600587, upload-time = "2025-11-16T14:48:12.822Z" },
+ { url = "https://files.pythonhosted.org/packages/03/09/96983d48c8cf5a1e03c7d9cc1f4b48266adfb858ae48c7c2ce978dbba349/rpds_py-0.29.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a110e14508fd26fd2e472bb541f37c209409876ba601cf57e739e87d8a53cf95", size = 562287, upload-time = "2025-11-16T14:48:14.108Z" },
+ { url = "https://files.pythonhosted.org/packages/40/f0/8c01aaedc0fa92156f0391f39ea93b5952bc0ec56b897763858f95da8168/rpds_py-0.29.0-cp311-cp311-win32.whl", hash = "sha256:923248a56dd8d158389a28934f6f69ebf89f218ef96a6b216a9be6861804d3f4", size = 221394, upload-time = "2025-11-16T14:48:15.374Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/a5/a8b21c54c7d234efdc83dc034a4d7cd9668e3613b6316876a29b49dece71/rpds_py-0.29.0-cp311-cp311-win_amd64.whl", hash = "sha256:539eb77eb043afcc45314d1be09ea6d6cafb3addc73e0547c171c6d636957f60", size = 235713, upload-time = "2025-11-16T14:48:16.636Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/1f/df3c56219523947b1be402fa12e6323fe6d61d883cf35d6cb5d5bb6db9d9/rpds_py-0.29.0-cp311-cp311-win_arm64.whl", hash = "sha256:bdb67151ea81fcf02d8f494703fb728d4d34d24556cbff5f417d74f6f5792e7c", size = 229157, upload-time = "2025-11-16T14:48:17.891Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/50/bc0e6e736d94e420df79be4deb5c9476b63165c87bb8f19ef75d100d21b3/rpds_py-0.29.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0891cfd8db43e085c0ab93ab7e9b0c8fee84780d436d3b266b113e51e79f954", size = 376000, upload-time = "2025-11-16T14:48:19.141Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/3a/46676277160f014ae95f24de53bed0e3b7ea66c235e7de0b9df7bd5d68ba/rpds_py-0.29.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3897924d3f9a0361472d884051f9a2460358f9a45b1d85a39a158d2f8f1ad71c", size = 360575, upload-time = "2025-11-16T14:48:20.443Z" },
+ { url = "https://files.pythonhosted.org/packages/75/ba/411d414ed99ea1afdd185bbabeeaac00624bd1e4b22840b5e9967ade6337/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21deb8e0d1571508c6491ce5ea5e25669b1dd4adf1c9d64b6314842f708b5d", size = 392159, upload-time = "2025-11-16T14:48:22.12Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/b1/e18aa3a331f705467a48d0296778dc1fea9d7f6cf675bd261f9a846c7e90/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9efe71687d6427737a0a2de9ca1c0a216510e6cd08925c44162be23ed7bed2d5", size = 410602, upload-time = "2025-11-16T14:48:23.563Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/6c/04f27f0c9f2299274c76612ac9d2c36c5048bb2c6c2e52c38c60bf3868d9/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40f65470919dc189c833e86b2c4bd21bd355f98436a2cef9e0a9a92aebc8e57e", size = 515808, upload-time = "2025-11-16T14:48:24.949Z" },
+ { url = "https://files.pythonhosted.org/packages/83/56/a8412aa464fb151f8bc0d91fb0bb888adc9039bd41c1c6ba8d94990d8cf8/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:def48ff59f181130f1a2cb7c517d16328efac3ec03951cca40c1dc2049747e83", size = 416015, upload-time = "2025-11-16T14:48:26.782Z" },
+ { url = "https://files.pythonhosted.org/packages/04/4c/f9b8a05faca3d9e0a6397c90d13acb9307c9792b2bff621430c58b1d6e76/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad7bd570be92695d89285a4b373006930715b78d96449f686af422debb4d3949", size = 395325, upload-time = "2025-11-16T14:48:28.055Z" },
+ { url = "https://files.pythonhosted.org/packages/34/60/869f3bfbf8ed7b54f1ad9a5543e0fdffdd40b5a8f587fe300ee7b4f19340/rpds_py-0.29.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:5a572911cd053137bbff8e3a52d31c5d2dba51d3a67ad902629c70185f3f2181", size = 410160, upload-time = "2025-11-16T14:48:29.338Z" },
+ { url = "https://files.pythonhosted.org/packages/91/aa/e5b496334e3aba4fe4c8a80187b89f3c1294c5c36f2a926da74338fa5a73/rpds_py-0.29.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d583d4403bcbf10cffc3ab5cee23d7643fcc960dff85973fd3c2d6c86e8dbb0c", size = 425309, upload-time = "2025-11-16T14:48:30.691Z" },
+ { url = "https://files.pythonhosted.org/packages/85/68/4e24a34189751ceb6d66b28f18159922828dd84155876551f7ca5b25f14f/rpds_py-0.29.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:070befbb868f257d24c3bb350dbd6e2f645e83731f31264b19d7231dd5c396c7", size = 574644, upload-time = "2025-11-16T14:48:31.964Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/cf/474a005ea4ea9c3b4f17b6108b6b13cebfc98ebaff11d6e1b193204b3a93/rpds_py-0.29.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fc935f6b20b0c9f919a8ff024739174522abd331978f750a74bb68abd117bd19", size = 601605, upload-time = "2025-11-16T14:48:33.252Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/b1/c56f6a9ab8c5f6bb5c65c4b5f8229167a3a525245b0773f2c0896686b64e/rpds_py-0.29.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c5a8ecaa44ce2d8d9d20a68a2483a74c07f05d72e94a4dff88906c8807e77b0", size = 564593, upload-time = "2025-11-16T14:48:34.643Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/13/0494cecce4848f68501e0a229432620b4b57022388b071eeff95f3e1e75b/rpds_py-0.29.0-cp312-cp312-win32.whl", hash = "sha256:ba5e1aeaf8dd6d8f6caba1f5539cddda87d511331714b7b5fc908b6cfc3636b7", size = 223853, upload-time = "2025-11-16T14:48:36.419Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/6a/51e9aeb444a00cdc520b032a28b07e5f8dc7bc328b57760c53e7f96997b4/rpds_py-0.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:b5f6134faf54b3cb83375db0f113506f8b7770785be1f95a631e7e2892101977", size = 239895, upload-time = "2025-11-16T14:48:37.956Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/d4/8bce56cdad1ab873e3f27cb31c6a51d8f384d66b022b820525b879f8bed1/rpds_py-0.29.0-cp312-cp312-win_arm64.whl", hash = "sha256:b016eddf00dca7944721bf0cd85b6af7f6c4efaf83ee0b37c4133bd39757a8c7", size = 230321, upload-time = "2025-11-16T14:48:39.71Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/d9/c5de60d9d371bbb186c3e9bf75f4fc5665e11117a25a06a6b2e0afb7380e/rpds_py-0.29.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1585648d0760b88292eecab5181f5651111a69d90eff35d6b78aa32998886a61", size = 375710, upload-time = "2025-11-16T14:48:41.063Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/b3/0860cdd012291dc21272895ce107f1e98e335509ba986dd83d72658b82b9/rpds_py-0.29.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:521807963971a23996ddaf764c682b3e46459b3c58ccd79fefbe16718db43154", size = 360582, upload-time = "2025-11-16T14:48:42.423Z" },
+ { url = "https://files.pythonhosted.org/packages/92/8a/a18c2f4a61b3407e56175f6aab6deacdf9d360191a3d6f38566e1eaf7266/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a8896986efaa243ab713c69e6491a4138410f0fe36f2f4c71e18bd5501e8014", size = 391172, upload-time = "2025-11-16T14:48:43.75Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/49/e93354258508c50abc15cdcd5fcf7ac4117f67bb6233ad7859f75e7372a0/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1d24564a700ef41480a984c5ebed62b74e6ce5860429b98b1fede76049e953e6", size = 409586, upload-time = "2025-11-16T14:48:45.498Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/8d/a27860dae1c19a6bdc901f90c81f0d581df1943355802961a57cdb5b6cd1/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6596b93c010d386ae46c9fba9bfc9fc5965fa8228edeac51576299182c2e31c", size = 516339, upload-time = "2025-11-16T14:48:47.308Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/ad/a75e603161e79b7110c647163d130872b271c6b28712c803c65d492100f7/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5cc58aac218826d054c7da7f95821eba94125d88be673ff44267bb89d12a5866", size = 416201, upload-time = "2025-11-16T14:48:48.615Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/42/555b4ee17508beafac135c8b450816ace5a96194ce97fefc49d58e5652ea/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de73e40ebc04dd5d9556f50180395322193a78ec247e637e741c1b954810f295", size = 395095, upload-time = "2025-11-16T14:48:50.027Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/f0/c90b671b9031e800ec45112be42ea9f027f94f9ac25faaac8770596a16a1/rpds_py-0.29.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:295ce5ac7f0cf69a651ea75c8f76d02a31f98e5698e82a50a5f4d4982fbbae3b", size = 410077, upload-time = "2025-11-16T14:48:51.515Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/80/9af8b640b81fe21e6f718e9dec36c0b5f670332747243130a5490f292245/rpds_py-0.29.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ea59b23ea931d494459c8338056fe7d93458c0bf3ecc061cd03916505369d55", size = 424548, upload-time = "2025-11-16T14:48:53.237Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/0b/b5647446e991736e6a495ef510e6710df91e880575a586e763baeb0aa770/rpds_py-0.29.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f49d41559cebd608042fdcf54ba597a4a7555b49ad5c1c0c03e0af82692661cd", size = 573661, upload-time = "2025-11-16T14:48:54.769Z" },
+ { url = "https://files.pythonhosted.org/packages/f7/b3/1b1c9576839ff583d1428efbf59f9ee70498d8ce6c0b328ac02f1e470879/rpds_py-0.29.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:05a2bd42768ea988294ca328206efbcc66e220d2d9b7836ee5712c07ad6340ea", size = 600937, upload-time = "2025-11-16T14:48:56.247Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/7b/b6cfca2f9fee4c4494ce54f7fb1b9f578867495a9aa9fc0d44f5f735c8e0/rpds_py-0.29.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33ca7bdfedd83339ca55da3a5e1527ee5870d4b8369456b5777b197756f3ca22", size = 564496, upload-time = "2025-11-16T14:48:57.691Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/fb/ba29ec7f0f06eb801bac5a23057a9ff7670623b5e8013bd59bec4aa09de8/rpds_py-0.29.0-cp313-cp313-win32.whl", hash = "sha256:20c51ae86a0bb9accc9ad4e6cdeec58d5ebb7f1b09dd4466331fc65e1766aae7", size = 223126, upload-time = "2025-11-16T14:48:59.058Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/6b/0229d3bed4ddaa409e6d90b0ae967ed4380e4bdd0dad6e59b92c17d42457/rpds_py-0.29.0-cp313-cp313-win_amd64.whl", hash = "sha256:6410e66f02803600edb0b1889541f4b5cc298a5ccda0ad789cc50ef23b54813e", size = 239771, upload-time = "2025-11-16T14:49:00.872Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/38/d2868f058b164f8efd89754d85d7b1c08b454f5c07ac2e6cc2e9bd4bd05b/rpds_py-0.29.0-cp313-cp313-win_arm64.whl", hash = "sha256:56838e1cd9174dc23c5691ee29f1d1be9eab357f27efef6bded1328b23e1ced2", size = 229994, upload-time = "2025-11-16T14:49:02.673Z" },
+ { url = "https://files.pythonhosted.org/packages/52/91/5de91c5ec7d41759beec9b251630824dbb8e32d20c3756da1a9a9d309709/rpds_py-0.29.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:37d94eadf764d16b9a04307f2ab1d7af6dc28774bbe0535c9323101e14877b4c", size = 365886, upload-time = "2025-11-16T14:49:04.133Z" },
+ { url = "https://files.pythonhosted.org/packages/85/7c/415d8c1b016d5f47ecec5145d9d6d21002d39dce8761b30f6c88810b455a/rpds_py-0.29.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d472cf73efe5726a067dce63eebe8215b14beabea7c12606fd9994267b3cfe2b", size = 355262, upload-time = "2025-11-16T14:49:05.543Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/14/bf83e2daa4f980e4dc848aed9299792a8b84af95e12541d9e7562f84a6ef/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72fdfd5ff8992e4636621826371e3ac5f3e3b8323e9d0e48378e9c13c3dac9d0", size = 384826, upload-time = "2025-11-16T14:49:07.301Z" },
+ { url = "https://files.pythonhosted.org/packages/33/b8/53330c50a810ae22b4fbba5e6cf961b68b9d72d9bd6780a7c0a79b070857/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2549d833abdf8275c901313b9e8ff8fba57e50f6a495035a2a4e30621a2f7cc4", size = 394234, upload-time = "2025-11-16T14:49:08.782Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/32/01e2e9645cef0e584f518cfde4567563e57db2257244632b603f61b40e50/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4448dad428f28a6a767c3e3b80cde3446a22a0efbddaa2360f4bb4dc836d0688", size = 520008, upload-time = "2025-11-16T14:49:10.253Z" },
+ { url = "https://files.pythonhosted.org/packages/98/c3/0d1b95a81affae2b10f950782e33a1fd2edd6ce2a479966cac98c9a66f57/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:115f48170fd4296a33938d8c11f697f5f26e0472e43d28f35624764173a60e4d", size = 409569, upload-time = "2025-11-16T14:49:12.478Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/60/aa3b8678f3f009f675b99174fa2754302a7fbfe749162e8043d111de2d88/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e5bb73ffc029820f4348e9b66b3027493ae00bca6629129cd433fd7a76308ee", size = 385188, upload-time = "2025-11-16T14:49:13.88Z" },
+ { url = "https://files.pythonhosted.org/packages/92/02/5546c1c8aa89c18d40c1fcffdcc957ba730dee53fb7c3ca3a46f114761d2/rpds_py-0.29.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:b1581fcde18fcdf42ea2403a16a6b646f8eb1e58d7f90a0ce693da441f76942e", size = 398587, upload-time = "2025-11-16T14:49:15.339Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/e0/ad6eeaf47e236eba052fa34c4073078b9e092bd44da6bbb35aaae9580669/rpds_py-0.29.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16e9da2bda9eb17ea318b4c335ec9ac1818e88922cbe03a5743ea0da9ecf74fb", size = 416641, upload-time = "2025-11-16T14:49:16.832Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/93/0acedfd50ad9cdd3879c615a6dc8c5f1ce78d2fdf8b87727468bb5bb4077/rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:28fd300326dd21198f311534bdb6d7e989dd09b3418b3a91d54a0f384c700967", size = 566683, upload-time = "2025-11-16T14:49:18.342Z" },
+ { url = "https://files.pythonhosted.org/packages/62/53/8c64e0f340a9e801459fc6456821abc15b3582cb5dc3932d48705a9d9ac7/rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2aba991e041d031c7939e1358f583ae405a7bf04804ca806b97a5c0e0af1ea5e", size = 592730, upload-time = "2025-11-16T14:49:19.767Z" },
+ { url = "https://files.pythonhosted.org/packages/85/ef/3109b6584f8c4b0d2490747c916df833c127ecfa82be04d9a40a376f2090/rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f437026dbbc3f08c99cc41a5b2570c6e1a1ddbe48ab19a9b814254128d4ea7a", size = 557361, upload-time = "2025-11-16T14:49:21.574Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/3b/61586475e82d57f01da2c16edb9115a618afe00ce86fe1b58936880b15af/rpds_py-0.29.0-cp313-cp313t-win32.whl", hash = "sha256:6e97846e9800a5d0fe7be4d008f0c93d0feeb2700da7b1f7528dabafb31dfadb", size = 211227, upload-time = "2025-11-16T14:49:23.03Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/3a/12dc43f13594a54ea0c9d7e9d43002116557330e3ad45bc56097ddf266e2/rpds_py-0.29.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f49196aec7c4b406495f60e6f947ad71f317a765f956d74bbd83996b9edc0352", size = 225248, upload-time = "2025-11-16T14:49:24.841Z" },
+ { url = "https://files.pythonhosted.org/packages/89/b1/0b1474e7899371d9540d3bbb2a499a3427ae1fc39c998563fe9035a1073b/rpds_py-0.29.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:394d27e4453d3b4d82bb85665dc1fcf4b0badc30fc84282defed71643b50e1a1", size = 363731, upload-time = "2025-11-16T14:49:26.683Z" },
+ { url = "https://files.pythonhosted.org/packages/28/12/3b7cf2068d0a334ed1d7b385a9c3c8509f4c2bcba3d4648ea71369de0881/rpds_py-0.29.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:55d827b2ae95425d3be9bc9a5838b6c29d664924f98146557f7715e331d06df8", size = 354343, upload-time = "2025-11-16T14:49:28.24Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/73/5afcf8924bc02a749416eda64e17ac9c9b28f825f4737385295a0e99b0c1/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc31a07ed352e5462d3ee1b22e89285f4ce97d5266f6d1169da1142e78045626", size = 385406, upload-time = "2025-11-16T14:49:29.943Z" },
+ { url = "https://files.pythonhosted.org/packages/c8/37/5db736730662508535221737a21563591b6f43c77f2e388951c42f143242/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c4695dd224212f6105db7ea62197144230b808d6b2bba52238906a2762f1d1e7", size = 396162, upload-time = "2025-11-16T14:49:31.833Z" },
+ { url = "https://files.pythonhosted.org/packages/70/0d/491c1017d14f62ce7bac07c32768d209a50ec567d76d9f383b4cfad19b80/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcae1770b401167f8b9e1e3f566562e6966ffa9ce63639916248a9e25fa8a244", size = 517719, upload-time = "2025-11-16T14:49:33.804Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/25/b11132afcb17cd5d82db173f0c8dab270ffdfaba43e5ce7a591837ae9649/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:90f30d15f45048448b8da21c41703b31c61119c06c216a1bf8c245812a0f0c17", size = 409498, upload-time = "2025-11-16T14:49:35.222Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/7d/e6543cedfb2e6403a1845710a5ab0e0ccf8fc288e0b5af9a70bfe2c12053/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a91e0ab77bdc0004b43261a4b8cd6d6b451e8d443754cfda830002b5745b32", size = 382743, upload-time = "2025-11-16T14:49:36.704Z" },
+ { url = "https://files.pythonhosted.org/packages/75/11/a4ebc9f654293ae9fefb83b2b6be7f3253e85ea42a5db2f77d50ad19aaeb/rpds_py-0.29.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:4aa195e5804d32c682e453b34474f411ca108e4291c6a0f824ebdc30a91c973c", size = 400317, upload-time = "2025-11-16T14:49:39.132Z" },
+ { url = "https://files.pythonhosted.org/packages/52/18/97677a60a81c7f0e5f64e51fb3f8271c5c8fcabf3a2df18e97af53d7c2bf/rpds_py-0.29.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7971bdb7bf4ee0f7e6f67fa4c7fbc6019d9850cc977d126904392d363f6f8318", size = 416979, upload-time = "2025-11-16T14:49:40.575Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/69/28ab391a9968f6c746b2a2db181eaa4d16afaa859fedc9c2f682d19f7e18/rpds_py-0.29.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8ae33ad9ce580c7a47452c3b3f7d8a9095ef6208e0a0c7e4e2384f9fc5bf8212", size = 567288, upload-time = "2025-11-16T14:49:42.24Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/d3/0c7afdcdb830eee94f5611b64e71354ffe6ac8df82d00c2faf2bfffd1d4e/rpds_py-0.29.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c661132ab2fb4eeede2ef69670fd60da5235209874d001a98f1542f31f2a8a94", size = 593157, upload-time = "2025-11-16T14:49:43.782Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/ac/a0fcbc2feed4241cf26d32268c195eb88ddd4bd862adfc9d4b25edfba535/rpds_py-0.29.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:bb78b3a0d31ac1bde132c67015a809948db751cb4e92cdb3f0b242e430b6ed0d", size = 554741, upload-time = "2025-11-16T14:49:45.557Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/f1/fcc24137c470df8588674a677f33719d5800ec053aaacd1de8a5d5d84d9e/rpds_py-0.29.0-cp314-cp314-win32.whl", hash = "sha256:f475f103488312e9bd4000bc890a95955a07b2d0b6e8884aef4be56132adbbf1", size = 215508, upload-time = "2025-11-16T14:49:47.562Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/c7/1d169b2045512eac019918fc1021ea07c30e84a4343f9f344e3e0aa8c788/rpds_py-0.29.0-cp314-cp314-win_amd64.whl", hash = "sha256:b9cf2359a4fca87cfb6801fae83a76aedf66ee1254a7a151f1341632acf67f1b", size = 228125, upload-time = "2025-11-16T14:49:49.064Z" },
+ { url = "https://files.pythonhosted.org/packages/be/36/0cec88aaba70ec4a6e381c444b0d916738497d27f0c30406e3d9fcbd3bc2/rpds_py-0.29.0-cp314-cp314-win_arm64.whl", hash = "sha256:9ba8028597e824854f0f1733d8b964e914ae3003b22a10c2c664cb6927e0feb9", size = 221992, upload-time = "2025-11-16T14:49:50.777Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/fa/a2e524631717c9c0eb5d90d30f648cfba6b731047821c994acacb618406c/rpds_py-0.29.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:e71136fd0612556b35c575dc2726ae04a1669e6a6c378f2240312cf5d1a2ab10", size = 366425, upload-time = "2025-11-16T14:49:52.691Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/a4/6d43ebe0746ff694a30233f63f454aed1677bd50ab7a59ff6b2bb5ac61f2/rpds_py-0.29.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:76fe96632d53f3bf0ea31ede2f53bbe3540cc2736d4aec3b3801b0458499ef3a", size = 355282, upload-time = "2025-11-16T14:49:54.292Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/a7/52fd8270e0320b09eaf295766ae81dd175f65394687906709b3e75c71d06/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9459a33f077130dbb2c7c3cea72ee9932271fb3126404ba2a2661e4fe9eb7b79", size = 384968, upload-time = "2025-11-16T14:49:55.857Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/7d/e6bc526b7a14e1ef80579a52c1d4ad39260a058a51d66c6039035d14db9d/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c9546cfdd5d45e562cc0444b6dddc191e625c62e866bf567a2c69487c7ad28a", size = 394714, upload-time = "2025-11-16T14:49:57.343Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/3f/f0ade3954e7db95c791e7eaf978aa7e08a756d2046e8bdd04d08146ed188/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12597d11d97b8f7e376c88929a6e17acb980e234547c92992f9f7c058f1a7310", size = 520136, upload-time = "2025-11-16T14:49:59.162Z" },
+ { url = "https://files.pythonhosted.org/packages/87/b3/07122ead1b97009715ab9d4082be6d9bd9546099b2b03fae37c3116f72be/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28de03cf48b8a9e6ec10318f2197b83946ed91e2891f651a109611be4106ac4b", size = 409250, upload-time = "2025-11-16T14:50:00.698Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/c6/dcbee61fd1dc892aedcb1b489ba661313101aa82ec84b1a015d4c63ebfda/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7951c964069039acc9d67a8ff1f0a7f34845ae180ca542b17dc1456b1f1808", size = 384940, upload-time = "2025-11-16T14:50:02.312Z" },
+ { url = "https://files.pythonhosted.org/packages/47/11/914ecb6f3574cf9bf8b38aced4063e0f787d6e1eb30b181a7efbc6c1da9a/rpds_py-0.29.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:c07d107b7316088f1ac0177a7661ca0c6670d443f6fe72e836069025e6266761", size = 399392, upload-time = "2025-11-16T14:50:03.829Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/fd/2f4bd9433f58f816434bb934313584caa47dbc6f03ce5484df8ac8980561/rpds_py-0.29.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1de2345af363d25696969befc0c1688a6cb5e8b1d32b515ef84fc245c6cddba3", size = 416796, upload-time = "2025-11-16T14:50:05.558Z" },
+ { url = "https://files.pythonhosted.org/packages/79/a5/449f0281af33efa29d5c71014399d74842342ae908d8cd38260320167692/rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:00e56b12d2199ca96068057e1ae7f9998ab6e99cda82431afafd32f3ec98cca9", size = 566843, upload-time = "2025-11-16T14:50:07.243Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/32/0a6a1ccee2e37fcb1b7ba9afde762b77182dbb57937352a729c6cd3cf2bb/rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3919a3bbecee589300ed25000b6944174e07cd20db70552159207b3f4bbb45b8", size = 593956, upload-time = "2025-11-16T14:50:09.029Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/3d/eb820f95dce4306f07a495ede02fb61bef36ea201d9137d4fcd5ab94ec1e/rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7fa2ccc312bbd91e43aa5e0869e46bc03278a3dddb8d58833150a18b0f0283a", size = 557288, upload-time = "2025-11-16T14:50:10.73Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/f8/b8ff786f40470462a252918e0836e0db903c28e88e3eec66bc4a7856ee5d/rpds_py-0.29.0-cp314-cp314t-win32.whl", hash = "sha256:97c817863ffc397f1e6a6e9d2d89fe5408c0a9922dac0329672fb0f35c867ea5", size = 211382, upload-time = "2025-11-16T14:50:12.827Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/7f/1a65ae870bc9d0576aebb0c501ea5dccf1ae2178fe2821042150ebd2e707/rpds_py-0.29.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2023473f444752f0f82a58dfcbee040d0a1b3d1b3c2ec40e884bd25db6d117d2", size = 225919, upload-time = "2025-11-16T14:50:14.734Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/ac/b97e80bf107159e5b9ba9c91df1ab95f69e5e41b435f27bdd737f0d583ac/rpds_py-0.29.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:acd82a9e39082dc5f4492d15a6b6c8599aa21db5c35aaf7d6889aea16502c07d", size = 373963, upload-time = "2025-11-16T14:50:16.205Z" },
+ { url = "https://files.pythonhosted.org/packages/40/5a/55e72962d5d29bd912f40c594e68880d3c7a52774b0f75542775f9250712/rpds_py-0.29.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:715b67eac317bf1c7657508170a3e011a1ea6ccb1c9d5f296e20ba14196be6b3", size = 364644, upload-time = "2025-11-16T14:50:18.22Z" },
+ { url = "https://files.pythonhosted.org/packages/99/2a/6b6524d0191b7fc1351c3c0840baac42250515afb48ae40c7ed15499a6a2/rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3b1b87a237cb2dba4db18bcfaaa44ba4cd5936b91121b62292ff21df577fc43", size = 393847, upload-time = "2025-11-16T14:50:20.012Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/b8/c5692a7df577b3c0c7faed7ac01ee3c608b81750fc5d89f84529229b6873/rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1c3c3e8101bb06e337c88eb0c0ede3187131f19d97d43ea0e1c5407ea74c0cbf", size = 407281, upload-time = "2025-11-16T14:50:21.64Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/57/0546c6f84031b7ea08b76646a8e33e45607cc6bd879ff1917dc077bb881e/rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b8e54d6e61f3ecd3abe032065ce83ea63417a24f437e4a3d73d2f85ce7b7cfe", size = 529213, upload-time = "2025-11-16T14:50:23.219Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/c1/01dd5f444233605555bc11fe5fed6a5c18f379f02013870c176c8e630a23/rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3fbd4e9aebf110473a420dea85a238b254cf8a15acb04b22a5a6b5ce8925b760", size = 413808, upload-time = "2025-11-16T14:50:25.262Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/0a/60f98b06156ea2a7af849fb148e00fbcfdb540909a5174a5ed10c93745c7/rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fdf53d36e6c72819993e35d1ebeeb8e8fc688d0c6c2b391b55e335b3afba5a", size = 394600, upload-time = "2025-11-16T14:50:26.956Z" },
+ { url = "https://files.pythonhosted.org/packages/37/f1/dc9312fc9bec040ece08396429f2bd9e0977924ba7a11c5ad7056428465e/rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:ea7173df5d86f625f8dde6d5929629ad811ed8decda3b60ae603903839ac9ac0", size = 408634, upload-time = "2025-11-16T14:50:28.989Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/41/65024c9fd40c89bb7d604cf73beda4cbdbcebe92d8765345dd65855b6449/rpds_py-0.29.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:76054d540061eda273274f3d13a21a4abdde90e13eaefdc205db37c05230efce", size = 426064, upload-time = "2025-11-16T14:50:30.674Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/e0/cf95478881fc88ca2fdbf56381d7df36567cccc39a05394beac72182cd62/rpds_py-0.29.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:9f84c549746a5be3bc7415830747a3a0312573afc9f95785eb35228bb17742ec", size = 575871, upload-time = "2025-11-16T14:50:33.428Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/c0/df88097e64339a0218b57bd5f9ca49898e4c394db756c67fccc64add850a/rpds_py-0.29.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:0ea962671af5cb9a260489e311fa22b2e97103e3f9f0caaea6f81390af96a9ed", size = 601702, upload-time = "2025-11-16T14:50:36.051Z" },
+ { url = "https://files.pythonhosted.org/packages/87/f4/09ffb3ebd0cbb9e2c7c9b84d252557ecf434cd71584ee1e32f66013824df/rpds_py-0.29.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:f7728653900035fb7b8d06e1e5900545d8088efc9d5d4545782da7df03ec803f", size = 564054, upload-time = "2025-11-16T14:50:37.733Z" },
+]
+
+[[package]]
+name = "six"
+version = "1.17.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload-time = "2025-10-08T22:01:47.119Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/2e/299f62b401438d5fe1624119c723f5d877acc86a4c2492da405626665f12/tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", size = 153236, upload-time = "2025-10-08T22:01:00.137Z" },
+ { url = "https://files.pythonhosted.org/packages/86/7f/d8fffe6a7aefdb61bced88fcb5e280cfd71e08939da5894161bd71bea022/tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", size = 148084, upload-time = "2025-10-08T22:01:01.63Z" },
+ { url = "https://files.pythonhosted.org/packages/47/5c/24935fb6a2ee63e86d80e4d3b58b222dafaf438c416752c8b58537c8b89a/tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", size = 234832, upload-time = "2025-10-08T22:01:02.543Z" },
+ { url = "https://files.pythonhosted.org/packages/89/da/75dfd804fc11e6612846758a23f13271b76d577e299592b4371a4ca4cd09/tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", size = 242052, upload-time = "2025-10-08T22:01:03.836Z" },
+ { url = "https://files.pythonhosted.org/packages/70/8c/f48ac899f7b3ca7eb13af73bacbc93aec37f9c954df3c08ad96991c8c373/tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", size = 239555, upload-time = "2025-10-08T22:01:04.834Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/28/72f8afd73f1d0e7829bfc093f4cb98ce0a40ffc0cc997009ee1ed94ba705/tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", size = 245128, upload-time = "2025-10-08T22:01:05.84Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/eb/a7679c8ac85208706d27436e8d421dfa39d4c914dcf5fa8083a9305f58d9/tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", size = 96445, upload-time = "2025-10-08T22:01:06.896Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/fe/3d3420c4cb1ad9cb462fb52967080575f15898da97e21cb6f1361d505383/tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", size = 107165, upload-time = "2025-10-08T22:01:08.107Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891, upload-time = "2025-10-08T22:01:09.082Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796, upload-time = "2025-10-08T22:01:10.266Z" },
+ { url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121, upload-time = "2025-10-08T22:01:11.332Z" },
+ { url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070, upload-time = "2025-10-08T22:01:12.498Z" },
+ { url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859, upload-time = "2025-10-08T22:01:13.551Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296, upload-time = "2025-10-08T22:01:14.614Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124, upload-time = "2025-10-08T22:01:15.629Z" },
+ { url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698, upload-time = "2025-10-08T22:01:16.51Z" },
+ { url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819, upload-time = "2025-10-08T22:01:17.964Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766, upload-time = "2025-10-08T22:01:18.959Z" },
+ { url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771, upload-time = "2025-10-08T22:01:20.106Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586, upload-time = "2025-10-08T22:01:21.164Z" },
+ { url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792, upload-time = "2025-10-08T22:01:22.417Z" },
+ { url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909, upload-time = "2025-10-08T22:01:23.859Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946, upload-time = "2025-10-08T22:01:24.893Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705, upload-time = "2025-10-08T22:01:26.153Z" },
+ { url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244, upload-time = "2025-10-08T22:01:27.06Z" },
+ { url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637, upload-time = "2025-10-08T22:01:28.059Z" },
+ { url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925, upload-time = "2025-10-08T22:01:29.066Z" },
+ { url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045, upload-time = "2025-10-08T22:01:31.98Z" },
+ { url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835, upload-time = "2025-10-08T22:01:32.989Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109, upload-time = "2025-10-08T22:01:34.052Z" },
+ { url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930, upload-time = "2025-10-08T22:01:35.082Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964, upload-time = "2025-10-08T22:01:36.057Z" },
+ { url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065, upload-time = "2025-10-08T22:01:37.27Z" },
+ { url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088, upload-time = "2025-10-08T22:01:38.235Z" },
+ { url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193, upload-time = "2025-10-08T22:01:39.712Z" },
+ { url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488, upload-time = "2025-10-08T22:01:40.773Z" },
+ { url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669, upload-time = "2025-10-08T22:01:41.824Z" },
+ { url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709, upload-time = "2025-10-08T22:01:43.177Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563, upload-time = "2025-10-08T22:01:44.233Z" },
+ { url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756, upload-time = "2025-10-08T22:01:45.234Z" },
+ { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.15.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
+]
+
+[[package]]
+name = "urllib3"
+version = "2.5.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
+]
+
+[[package]]
+name = "zstandard"
+version = "0.25.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513, upload-time = "2025-09-14T22:15:54.002Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/56/7a/28efd1d371f1acd037ac64ed1c5e2b41514a6cc937dd6ab6a13ab9f0702f/zstandard-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd", size = 795256, upload-time = "2025-09-14T22:15:56.415Z" },
+ { url = "https://files.pythonhosted.org/packages/96/34/ef34ef77f1ee38fc8e4f9775217a613b452916e633c4f1d98f31db52c4a5/zstandard-0.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7", size = 640565, upload-time = "2025-09-14T22:15:58.177Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/1b/4fdb2c12eb58f31f28c4d28e8dc36611dd7205df8452e63f52fb6261d13e/zstandard-0.25.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:ab85470ab54c2cb96e176f40342d9ed41e58ca5733be6a893b730e7af9c40550", size = 5345306, upload-time = "2025-09-14T22:16:00.165Z" },
+ { url = "https://files.pythonhosted.org/packages/73/28/a44bdece01bca027b079f0e00be3b6bd89a4df180071da59a3dd7381665b/zstandard-0.25.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e05ab82ea7753354bb054b92e2f288afb750e6b439ff6ca78af52939ebbc476d", size = 5055561, upload-time = "2025-09-14T22:16:02.22Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/74/68341185a4f32b274e0fc3410d5ad0750497e1acc20bd0f5b5f64ce17785/zstandard-0.25.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:78228d8a6a1c177a96b94f7e2e8d012c55f9c760761980da16ae7546a15a8e9b", size = 5402214, upload-time = "2025-09-14T22:16:04.109Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/67/f92e64e748fd6aaffe01e2b75a083c0c4fd27abe1c8747fee4555fcee7dd/zstandard-0.25.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b6bd67528ee8b5c5f10255735abc21aa106931f0dbaf297c7be0c886353c3d0", size = 5449703, upload-time = "2025-09-14T22:16:06.312Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/e5/6d36f92a197c3c17729a2125e29c169f460538a7d939a27eaaa6dcfcba8e/zstandard-0.25.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4b6d83057e713ff235a12e73916b6d356e3084fd3d14ced499d84240f3eecee0", size = 5556583, upload-time = "2025-09-14T22:16:08.457Z" },
+ { url = "https://files.pythonhosted.org/packages/d7/83/41939e60d8d7ebfe2b747be022d0806953799140a702b90ffe214d557638/zstandard-0.25.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9174f4ed06f790a6869b41cba05b43eeb9a35f8993c4422ab853b705e8112bbd", size = 5045332, upload-time = "2025-09-14T22:16:10.444Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/87/d3ee185e3d1aa0133399893697ae91f221fda79deb61adbe998a7235c43f/zstandard-0.25.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:25f8f3cd45087d089aef5ba3848cd9efe3ad41163d3400862fb42f81a3a46701", size = 5572283, upload-time = "2025-09-14T22:16:12.128Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/1d/58635ae6104df96671076ac7d4ae7816838ce7debd94aecf83e30b7121b0/zstandard-0.25.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3756b3e9da9b83da1796f8809dd57cb024f838b9eeafde28f3cb472012797ac1", size = 4959754, upload-time = "2025-09-14T22:16:14.225Z" },
+ { url = "https://files.pythonhosted.org/packages/75/d6/57e9cb0a9983e9a229dd8fd2e6e96593ef2aa82a3907188436f22b111ccd/zstandard-0.25.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:81dad8d145d8fd981b2962b686b2241d3a1ea07733e76a2f15435dfb7fb60150", size = 5266477, upload-time = "2025-09-14T22:16:16.343Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/a9/ee891e5edf33a6ebce0a028726f0bbd8567effe20fe3d5808c42323e8542/zstandard-0.25.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a5a419712cf88862a45a23def0ae063686db3d324cec7edbe40509d1a79a0aab", size = 5440914, upload-time = "2025-09-14T22:16:18.453Z" },
+ { url = "https://files.pythonhosted.org/packages/58/08/a8522c28c08031a9521f27abc6f78dbdee7312a7463dd2cfc658b813323b/zstandard-0.25.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e7360eae90809efd19b886e59a09dad07da4ca9ba096752e61a2e03c8aca188e", size = 5819847, upload-time = "2025-09-14T22:16:20.559Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/11/4c91411805c3f7b6f31c60e78ce347ca48f6f16d552fc659af6ec3b73202/zstandard-0.25.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:75ffc32a569fb049499e63ce68c743155477610532da1eb38e7f24bf7cd29e74", size = 5363131, upload-time = "2025-09-14T22:16:22.206Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/d6/8c4bd38a3b24c4c7676a7a3d8de85d6ee7a983602a734b9f9cdefb04a5d6/zstandard-0.25.0-cp310-cp310-win32.whl", hash = "sha256:106281ae350e494f4ac8a80470e66d1fe27e497052c8d9c3b95dc4cf1ade81aa", size = 436469, upload-time = "2025-09-14T22:16:25.002Z" },
+ { url = "https://files.pythonhosted.org/packages/93/90/96d50ad417a8ace5f841b3228e93d1bb13e6ad356737f42e2dde30d8bd68/zstandard-0.25.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea9d54cc3d8064260114a0bbf3479fc4a98b21dffc89b3459edd506b69262f6e", size = 506100, upload-time = "2025-09-14T22:16:23.569Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/83/c3ca27c363d104980f1c9cee1101cc8ba724ac8c28a033ede6aab89585b1/zstandard-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:933b65d7680ea337180733cf9e87293cc5500cc0eb3fc8769f4d3c88d724ec5c", size = 795254, upload-time = "2025-09-14T22:16:26.137Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/4d/e66465c5411a7cf4866aeadc7d108081d8ceba9bc7abe6b14aa21c671ec3/zstandard-0.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f", size = 640559, upload-time = "2025-09-14T22:16:27.973Z" },
+ { url = "https://files.pythonhosted.org/packages/12/56/354fe655905f290d3b147b33fe946b0f27e791e4b50a5f004c802cb3eb7b/zstandard-0.25.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0bbc9a0c65ce0eea3c34a691e3c4b6889f5f3909ba4822ab385fab9057099431", size = 5348020, upload-time = "2025-09-14T22:16:29.523Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/13/2b7ed68bd85e69a2069bcc72141d378f22cae5a0f3b353a2c8f50ef30c1b/zstandard-0.25.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:01582723b3ccd6939ab7b3a78622c573799d5d8737b534b86d0e06ac18dbde4a", size = 5058126, upload-time = "2025-09-14T22:16:31.811Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/dd/fdaf0674f4b10d92cb120ccff58bbb6626bf8368f00ebfd2a41ba4a0dc99/zstandard-0.25.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5f1ad7bf88535edcf30038f6919abe087f606f62c00a87d7e33e7fc57cb69fcc", size = 5405390, upload-time = "2025-09-14T22:16:33.486Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/67/354d1555575bc2490435f90d67ca4dd65238ff2f119f30f72d5cde09c2ad/zstandard-0.25.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:06acb75eebeedb77b69048031282737717a63e71e4ae3f77cc0c3b9508320df6", size = 5452914, upload-time = "2025-09-14T22:16:35.277Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/1f/e9cfd801a3f9190bf3e759c422bbfd2247db9d7f3d54a56ecde70137791a/zstandard-0.25.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9300d02ea7c6506f00e627e287e0492a5eb0371ec1670ae852fefffa6164b072", size = 5559635, upload-time = "2025-09-14T22:16:37.141Z" },
+ { url = "https://files.pythonhosted.org/packages/21/88/5ba550f797ca953a52d708c8e4f380959e7e3280af029e38fbf47b55916e/zstandard-0.25.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfd06b1c5584b657a2892a6014c2f4c20e0db0208c159148fa78c65f7e0b0277", size = 5048277, upload-time = "2025-09-14T22:16:38.807Z" },
+ { url = "https://files.pythonhosted.org/packages/46/c0/ca3e533b4fa03112facbe7fbe7779cb1ebec215688e5df576fe5429172e0/zstandard-0.25.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313", size = 5574377, upload-time = "2025-09-14T22:16:40.523Z" },
+ { url = "https://files.pythonhosted.org/packages/12/9b/3fb626390113f272abd0799fd677ea33d5fc3ec185e62e6be534493c4b60/zstandard-0.25.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c0e5a65158a7946e7a7affa6418878ef97ab66636f13353b8502d7ea03c8097", size = 4961493, upload-time = "2025-09-14T22:16:43.3Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/d3/23094a6b6a4b1343b27ae68249daa17ae0651fcfec9ed4de09d14b940285/zstandard-0.25.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c8e167d5adf59476fa3e37bee730890e389410c354771a62e3c076c86f9f7778", size = 5269018, upload-time = "2025-09-14T22:16:45.292Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/a7/bb5a0c1c0f3f4b5e9d5b55198e39de91e04ba7c205cc46fcb0f95f0383c1/zstandard-0.25.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:98750a309eb2f020da61e727de7d7ba3c57c97cf6213f6f6277bb7fb42a8e065", size = 5443672, upload-time = "2025-09-14T22:16:47.076Z" },
+ { url = "https://files.pythonhosted.org/packages/27/22/503347aa08d073993f25109c36c8d9f029c7d5949198050962cb568dfa5e/zstandard-0.25.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:22a086cff1b6ceca18a8dd6096ec631e430e93a8e70a9ca5efa7561a00f826fa", size = 5822753, upload-time = "2025-09-14T22:16:49.316Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/be/94267dc6ee64f0f8ba2b2ae7c7a2df934a816baaa7291db9e1aa77394c3c/zstandard-0.25.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:72d35d7aa0bba323965da807a462b0966c91608ef3a48ba761678cb20ce5d8b7", size = 5366047, upload-time = "2025-09-14T22:16:51.328Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/a3/732893eab0a3a7aecff8b99052fecf9f605cf0fb5fb6d0290e36beee47a4/zstandard-0.25.0-cp311-cp311-win32.whl", hash = "sha256:f5aeea11ded7320a84dcdd62a3d95b5186834224a9e55b92ccae35d21a8b63d4", size = 436484, upload-time = "2025-09-14T22:16:55.005Z" },
+ { url = "https://files.pythonhosted.org/packages/43/a3/c6155f5c1cce691cb80dfd38627046e50af3ee9ddc5d0b45b9b063bfb8c9/zstandard-0.25.0-cp311-cp311-win_amd64.whl", hash = "sha256:daab68faadb847063d0c56f361a289c4f268706b598afbf9ad113cbe5c38b6b2", size = 506183, upload-time = "2025-09-14T22:16:52.753Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/3e/8945ab86a0820cc0e0cdbf38086a92868a9172020fdab8a03ac19662b0e5/zstandard-0.25.0-cp311-cp311-win_arm64.whl", hash = "sha256:22a06c5df3751bb7dc67406f5374734ccee8ed37fc5981bf1ad7041831fa1137", size = 462533, upload-time = "2025-09-14T22:16:53.878Z" },
+ { url = "https://files.pythonhosted.org/packages/82/fc/f26eb6ef91ae723a03e16eddb198abcfce2bc5a42e224d44cc8b6765e57e/zstandard-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b3c3a3ab9daa3eed242d6ecceead93aebbb8f5f84318d82cee643e019c4b73b", size = 795738, upload-time = "2025-09-14T22:16:56.237Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/1c/d920d64b22f8dd028a8b90e2d756e431a5d86194caa78e3819c7bf53b4b3/zstandard-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00", size = 640436, upload-time = "2025-09-14T22:16:57.774Z" },
+ { url = "https://files.pythonhosted.org/packages/53/6c/288c3f0bd9fcfe9ca41e2c2fbfd17b2097f6af57b62a81161941f09afa76/zstandard-0.25.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64", size = 5343019, upload-time = "2025-09-14T22:16:59.302Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/15/efef5a2f204a64bdb5571e6161d49f7ef0fffdbca953a615efbec045f60f/zstandard-0.25.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea", size = 5063012, upload-time = "2025-09-14T22:17:01.156Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/37/a6ce629ffdb43959e92e87ebdaeebb5ac81c944b6a75c9c47e300f85abdf/zstandard-0.25.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb", size = 5394148, upload-time = "2025-09-14T22:17:03.091Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/79/2bf870b3abeb5c070fe2d670a5a8d1057a8270f125ef7676d29ea900f496/zstandard-0.25.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a", size = 5451652, upload-time = "2025-09-14T22:17:04.979Z" },
+ { url = "https://files.pythonhosted.org/packages/53/60/7be26e610767316c028a2cbedb9a3beabdbe33e2182c373f71a1c0b88f36/zstandard-0.25.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902", size = 5546993, upload-time = "2025-09-14T22:17:06.781Z" },
+ { url = "https://files.pythonhosted.org/packages/85/c7/3483ad9ff0662623f3648479b0380d2de5510abf00990468c286c6b04017/zstandard-0.25.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f", size = 5046806, upload-time = "2025-09-14T22:17:08.415Z" },
+ { url = "https://files.pythonhosted.org/packages/08/b3/206883dd25b8d1591a1caa44b54c2aad84badccf2f1de9e2d60a446f9a25/zstandard-0.25.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b", size = 5576659, upload-time = "2025-09-14T22:17:10.164Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/31/76c0779101453e6c117b0ff22565865c54f48f8bd807df2b00c2c404b8e0/zstandard-0.25.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6", size = 4953933, upload-time = "2025-09-14T22:17:11.857Z" },
+ { url = "https://files.pythonhosted.org/packages/18/e1/97680c664a1bf9a247a280a053d98e251424af51f1b196c6d52f117c9720/zstandard-0.25.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:809c5bcb2c67cd0ed81e9229d227d4ca28f82d0f778fc5fea624a9def3963f91", size = 5268008, upload-time = "2025-09-14T22:17:13.627Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/73/316e4010de585ac798e154e88fd81bb16afc5c5cb1a72eeb16dd37e8024a/zstandard-0.25.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708", size = 5433517, upload-time = "2025-09-14T22:17:16.103Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/60/dd0f8cfa8129c5a0ce3ea6b7f70be5b33d2618013a161e1ff26c2b39787c/zstandard-0.25.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512", size = 5814292, upload-time = "2025-09-14T22:17:17.827Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/5f/75aafd4b9d11b5407b641b8e41a57864097663699f23e9ad4dbb91dc6bfe/zstandard-0.25.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa", size = 5360237, upload-time = "2025-09-14T22:17:19.954Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/8d/0309daffea4fcac7981021dbf21cdb2e3427a9e76bafbcdbdf5392ff99a4/zstandard-0.25.0-cp312-cp312-win32.whl", hash = "sha256:23ebc8f17a03133b4426bcc04aabd68f8236eb78c3760f12783385171b0fd8bd", size = 436922, upload-time = "2025-09-14T22:17:24.398Z" },
+ { url = "https://files.pythonhosted.org/packages/79/3b/fa54d9015f945330510cb5d0b0501e8253c127cca7ebe8ba46a965df18c5/zstandard-0.25.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01", size = 506276, upload-time = "2025-09-14T22:17:21.429Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/6b/8b51697e5319b1f9ac71087b0af9a40d8a6288ff8025c36486e0c12abcc4/zstandard-0.25.0-cp312-cp312-win_arm64.whl", hash = "sha256:181eb40e0b6a29b3cd2849f825e0fa34397f649170673d385f3598ae17cca2e9", size = 462679, upload-time = "2025-09-14T22:17:23.147Z" },
+ { url = "https://files.pythonhosted.org/packages/35/0b/8df9c4ad06af91d39e94fa96cc010a24ac4ef1378d3efab9223cc8593d40/zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94", size = 795735, upload-time = "2025-09-14T22:17:26.042Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/06/9ae96a3e5dcfd119377ba33d4c42a7d89da1efabd5cb3e366b156c45ff4d/zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1", size = 640440, upload-time = "2025-09-14T22:17:27.366Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/14/933d27204c2bd404229c69f445862454dcc101cd69ef8c6068f15aaec12c/zstandard-0.25.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f", size = 5343070, upload-time = "2025-09-14T22:17:28.896Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/db/ddb11011826ed7db9d0e485d13df79b58586bfdec56e5c84a928a9a78c1c/zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea", size = 5063001, upload-time = "2025-09-14T22:17:31.044Z" },
+ { url = "https://files.pythonhosted.org/packages/db/00/87466ea3f99599d02a5238498b87bf84a6348290c19571051839ca943777/zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e", size = 5394120, upload-time = "2025-09-14T22:17:32.711Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/95/fc5531d9c618a679a20ff6c29e2b3ef1d1f4ad66c5e161ae6ff847d102a9/zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551", size = 5451230, upload-time = "2025-09-14T22:17:34.41Z" },
+ { url = "https://files.pythonhosted.org/packages/63/4b/e3678b4e776db00f9f7b2fe58e547e8928ef32727d7a1ff01dea010f3f13/zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a", size = 5547173, upload-time = "2025-09-14T22:17:36.084Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/d5/ba05ed95c6b8ec30bd468dfeab20589f2cf709b5c940483e31d991f2ca58/zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611", size = 5046736, upload-time = "2025-09-14T22:17:37.891Z" },
+ { url = "https://files.pythonhosted.org/packages/50/d5/870aa06b3a76c73eced65c044b92286a3c4e00554005ff51962deef28e28/zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3", size = 5576368, upload-time = "2025-09-14T22:17:40.206Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/35/398dc2ffc89d304d59bc12f0fdd931b4ce455bddf7038a0a67733a25f550/zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b", size = 4954022, upload-time = "2025-09-14T22:17:41.879Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/5c/36ba1e5507d56d2213202ec2b05e8541734af5f2ce378c5d1ceaf4d88dc4/zstandard-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851", size = 5267889, upload-time = "2025-09-14T22:17:43.577Z" },
+ { url = "https://files.pythonhosted.org/packages/70/e8/2ec6b6fb7358b2ec0113ae202647ca7c0e9d15b61c005ae5225ad0995df5/zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250", size = 5433952, upload-time = "2025-09-14T22:17:45.271Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/01/b5f4d4dbc59ef193e870495c6f1275f5b2928e01ff5a81fecb22a06e22fb/zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98", size = 5814054, upload-time = "2025-09-14T22:17:47.08Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/e5/fbd822d5c6f427cf158316d012c5a12f233473c2f9c5fe5ab1ae5d21f3d8/zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf", size = 5360113, upload-time = "2025-09-14T22:17:48.893Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/e0/69a553d2047f9a2c7347caa225bb3a63b6d7704ad74610cb7823baa08ed7/zstandard-0.25.0-cp313-cp313-win32.whl", hash = "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09", size = 436936, upload-time = "2025-09-14T22:17:52.658Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/82/b9c06c870f3bd8767c201f1edbdf9e8dc34be5b0fbc5682c4f80fe948475/zstandard-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5", size = 506232, upload-time = "2025-09-14T22:17:50.402Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/57/60c3c01243bb81d381c9916e2a6d9e149ab8627c0c7d7abb2d73384b3c0c/zstandard-0.25.0-cp313-cp313-win_arm64.whl", hash = "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049", size = 462671, upload-time = "2025-09-14T22:17:51.533Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/5c/f8923b595b55fe49e30612987ad8bf053aef555c14f05bb659dd5dbe3e8a/zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3", size = 795887, upload-time = "2025-09-14T22:17:54.198Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/09/d0a2a14fc3439c5f874042dca72a79c70a532090b7ba0003be73fee37ae2/zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f", size = 640658, upload-time = "2025-09-14T22:17:55.423Z" },
+ { url = "https://files.pythonhosted.org/packages/5d/7c/8b6b71b1ddd517f68ffb55e10834388d4f793c49c6b83effaaa05785b0b4/zstandard-0.25.0-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c", size = 5379849, upload-time = "2025-09-14T22:17:57.372Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/86/a48e56320d0a17189ab7a42645387334fba2200e904ee47fc5a26c1fd8ca/zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439", size = 5058095, upload-time = "2025-09-14T22:17:59.498Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/ad/eb659984ee2c0a779f9d06dbfe45e2dc39d99ff40a319895df2d3d9a48e5/zstandard-0.25.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043", size = 5551751, upload-time = "2025-09-14T22:18:01.618Z" },
+ { url = "https://files.pythonhosted.org/packages/61/b3/b637faea43677eb7bd42ab204dfb7053bd5c4582bfe6b1baefa80ac0c47b/zstandard-0.25.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859", size = 6364818, upload-time = "2025-09-14T22:18:03.769Z" },
+ { url = "https://files.pythonhosted.org/packages/31/dc/cc50210e11e465c975462439a492516a73300ab8caa8f5e0902544fd748b/zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0", size = 5560402, upload-time = "2025-09-14T22:18:05.954Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/ae/56523ae9c142f0c08efd5e868a6da613ae76614eca1305259c3bf6a0ed43/zstandard-0.25.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7", size = 4955108, upload-time = "2025-09-14T22:18:07.68Z" },
+ { url = "https://files.pythonhosted.org/packages/98/cf/c899f2d6df0840d5e384cf4c4121458c72802e8bda19691f3b16619f51e9/zstandard-0.25.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2", size = 5269248, upload-time = "2025-09-14T22:18:09.753Z" },
+ { url = "https://files.pythonhosted.org/packages/1b/c0/59e912a531d91e1c192d3085fc0f6fb2852753c301a812d856d857ea03c6/zstandard-0.25.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344", size = 5430330, upload-time = "2025-09-14T22:18:11.966Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/1d/7e31db1240de2df22a58e2ea9a93fc6e38cc29353e660c0272b6735d6669/zstandard-0.25.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c", size = 5811123, upload-time = "2025-09-14T22:18:13.907Z" },
+ { url = "https://files.pythonhosted.org/packages/f6/49/fac46df5ad353d50535e118d6983069df68ca5908d4d65b8c466150a4ff1/zstandard-0.25.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088", size = 5359591, upload-time = "2025-09-14T22:18:16.465Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/38/f249a2050ad1eea0bb364046153942e34abba95dd5520af199aed86fbb49/zstandard-0.25.0-cp314-cp314-win32.whl", hash = "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12", size = 444513, upload-time = "2025-09-14T22:18:20.61Z" },
+ { url = "https://files.pythonhosted.org/packages/3a/43/241f9615bcf8ba8903b3f0432da069e857fc4fd1783bd26183db53c4804b/zstandard-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2", size = 516118, upload-time = "2025-09-14T22:18:17.849Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/ef/da163ce2450ed4febf6467d77ccb4cd52c4c30ab45624bad26ca0a27260c/zstandard-0.25.0-cp314-cp314-win_arm64.whl", hash = "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d", size = 476940, upload-time = "2025-09-14T22:18:19.088Z" },
+]
From f4b05df914ea7ed4fed62c75efa8a19509f877f1 Mon Sep 17 00:00:00 2001
From: Zanie Blue
Date: Thu, 4 Dec 2025 14:04:04 -0600
Subject: [PATCH 52/66] Futz with the macOS CI target definitions (#902)
---
.github/workflows/macos.yml | 8 +++++++-
ci-runners.yaml | 4 ++--
ci-targets.yaml | 1 +
3 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml
index 9b08a2e..f0fec33 100644
--- a/.github/workflows/macos.yml
+++ b/.github/workflows/macos.yml
@@ -177,4 +177,10 @@ jobs:
run: |
chmod +x build/pythonbuild
- build/pythonbuild validate-distribution --macos-sdks-path macosx-sdks --run dist/*.tar.zst
+ if [ "${MATRIX_RUN}" == "true" ]; then
+ EXTRA_ARGS="--run"
+ fi
+
+ build/pythonbuild validate-distribution --macos-sdks-path macosx-sdks ${EXTRA_ARGS} dist/*.tar.zst
+ env:
+ MATRIX_RUN: ${{ matrix.run }}
diff --git a/ci-runners.yaml b/ci-runners.yaml
index dae6aab..22a7bbf 100644
--- a/ci-runners.yaml
+++ b/ci-runners.yaml
@@ -11,7 +11,7 @@ depot-ubuntu-22.04-arm:
free: false
depot-macos-latest:
- arch: x86_64
+ arch: aarch64
platform: darwin
free: false
@@ -21,7 +21,7 @@ ubuntu-latest:
free: true
macos-latest:
- arch: x86_64
+ arch: aarch64
platform: darwin
free: true
diff --git a/ci-targets.yaml b/ci-targets.yaml
index fa3eb03..1a8908c 100644
--- a/ci-targets.yaml
+++ b/ci-targets.yaml
@@ -36,6 +36,7 @@ darwin:
- freethreaded+debug
- freethreaded+pgo+lto
minimum-python-version: "3.13"
+ run: true
linux:
aarch64-unknown-linux-gnu:
From ef1b25eeabc0ce8bf2d00a4076fdc2512af467a7 Mon Sep 17 00:00:00 2001
From: "Jonathan J. Helmus"
Date: Fri, 5 Dec 2025 13:32:23 -0600
Subject: [PATCH 53/66] Bump to 3.14.2 (#906)
---
pythonbuild/downloads.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/pythonbuild/downloads.py b/pythonbuild/downloads.py
index c95f052..b1579cb 100644
--- a/pythonbuild/downloads.py
+++ b/pythonbuild/downloads.py
@@ -84,10 +84,10 @@
"python_tag": "cp313",
},
"cpython-3.14": {
- "url": "https://www.python.org/ftp/python/3.14.1/Python-3.14.1.tar.xz",
- "size": 23563532,
- "sha256": "8dfa08b1959d9d15838a1c2dab77dc8d8ff4a553a1ed046dfacbc8095c6d42fc",
- "version": "3.14.1",
+ "url": "https://www.python.org/ftp/python/3.14.2/Python-3.14.2.tar.xz",
+ "size": 23566248,
+ "sha256": "ce543ab854bc256b61b71e9b27f831ffd1bfd60a479d639f8be7f9757cf573e9",
+ "version": "3.14.2",
"licenses": ["Python-2.0", "CNRI-Python"],
"license_file": "LICENSE.cpython.txt",
"python_tag": "cp314",
From 91c11ac94ad7e79409a4477d7227f705295bfa05 Mon Sep 17 00:00:00 2001
From: Geoffrey Thomas
Date: Fri, 5 Dec 2025 14:37:30 -0500
Subject: [PATCH 54/66] Use the symlink-resolved location of Python in getpath
on 3.14+ (#896)
Mostly fixes #380, and also fixes #713 because we prefer the actual
binary path to argv[0].
There are two changes here. The second one is taken from PR #903 (and
indirectly from CPython upstream). The reason for that is the first
change doesn't quite work on some aarch64 configs, but the second change
doesn't cover the case of weird argv[0].
Co-authored-by: Jonathan Helmus
---
cpython-unix/build-cpython.sh | 18 +++
...se_executable-for-executable_dir-314.patch | 14 ++
...e-base_executable-for-executable_dir.patch | 15 ++
cpython-unix/patch-python-getpath-3.14.patch | 135 ++++++++++++++++++
src/verify_distribution.py | 35 +++++
5 files changed, 217 insertions(+)
create mode 100644 cpython-unix/patch-getpath-use-base_executable-for-executable_dir-314.patch
create mode 100644 cpython-unix/patch-getpath-use-base_executable-for-executable_dir.patch
create mode 100644 cpython-unix/patch-python-getpath-3.14.patch
diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh
index d7db75a..be45a34 100755
--- a/cpython-unix/build-cpython.sh
+++ b/cpython-unix/build-cpython.sh
@@ -629,6 +629,24 @@ if [ -n "${CROSS_COMPILING}" ]; then
# TODO: There are probably more of these, see #599.
fi
+# Adjust the Python startup logic (getpath.py) to properly locate the installation, even when
+# invoked through a symlink or through an incorrect argv[0]. Because this Python is relocatable, we
+# don't get to rely on the fallback to the compiled-in installation prefix.
+if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_14}" ]]; then
+ patch -p1 -i "${ROOT}/patch-python-getpath-3.14.patch"
+fi
+
+# Another, similar change to getpath: When reading inside a venv use the base_executable path to
+# determine executable_dir when valid. This allows venv to be created from symlinks and covers some
+# cases the above patch doesn't. See:
+# https://github.com/python/cpython/issues/106045#issuecomment-2594628161
+# 3.10 does not use getpath.py only getpath.c, no patch is applied
+if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_14}" ]; then
+ patch -p1 -i "${ROOT}/patch-getpath-use-base_executable-for-executable_dir-314.patch"
+elif [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_11}" ]; then
+ patch -p1 -i "${ROOT}/patch-getpath-use-base_executable-for-executable_dir.patch"
+fi
+
# We patched configure.ac above. Reflect those changes.
autoconf
diff --git a/cpython-unix/patch-getpath-use-base_executable-for-executable_dir-314.patch b/cpython-unix/patch-getpath-use-base_executable-for-executable_dir-314.patch
new file mode 100644
index 0000000..581a91a
--- /dev/null
+++ b/cpython-unix/patch-getpath-use-base_executable-for-executable_dir-314.patch
@@ -0,0 +1,14 @@
+diff --git a/Modules/getpath.py b/Modules/getpath.py
+index ceb605a75c8..164d708ffca 100644
+--- a/Modules/getpath.py
++++ b/Modules/getpath.py
+@@ -411,6 +411,9 @@ def search_up(prefix, *landmarks, test=isfile):
+ if isfile(candidate):
+ base_executable = candidate
+ break
++ if base_executable and isfile(base_executable):
++ # Update the executable directory to be based on the resolved base executable
++ executable_dir = real_executable_dir = dirname(base_executable)
+ # home key found; stop iterating over lines
+ break
+
diff --git a/cpython-unix/patch-getpath-use-base_executable-for-executable_dir.patch b/cpython-unix/patch-getpath-use-base_executable-for-executable_dir.patch
new file mode 100644
index 0000000..e6c740a
--- /dev/null
+++ b/cpython-unix/patch-getpath-use-base_executable-for-executable_dir.patch
@@ -0,0 +1,15 @@
+diff --git a/Modules/getpath.py b/Modules/getpath.py
+index 1f1bfcb4f64..ff5b18cc385 100644
+--- a/Modules/getpath.py
++++ b/Modules/getpath.py
+@@ -398,6 +398,9 @@ def search_up(prefix, *landmarks, test=isfile):
+ if isfile(candidate):
+ base_executable = candidate
+ break
++ if base_executable and isfile(base_executable):
++ # Update the executable directory to be based on the resolved base executable
++ executable_dir = real_executable_dir = dirname(base_executable)
+ break
+ else:
+ venv_prefix = None
+
diff --git a/cpython-unix/patch-python-getpath-3.14.patch b/cpython-unix/patch-python-getpath-3.14.patch
new file mode 100644
index 0000000..af237c4
--- /dev/null
+++ b/cpython-unix/patch-python-getpath-3.14.patch
@@ -0,0 +1,135 @@
+From 4fb328cb883504dde04dfdd0b4d182a0130a0909 Mon Sep 17 00:00:00 2001
+From: Geoffrey Thomas
+Date: Mon, 1 Dec 2025 14:11:43 -0500
+Subject: [PATCH 1/1] getpath: Fix library detection and canonicalize paths on
+ Linux
+Forwarded: no
+
+The code in getpath.py to look for the stdlib relative to the Python
+library did not work in the common layout where libpython itself is in
+the lib/ directory; it added an extra lib/ segment. It is also equally
+applicable and useful when statically linking libpython into bin/python;
+in both cases, we want to go up a directory and then look into
+lib/python3.x/. Add an extra dirname() call in getpath.py, and
+unconditionally attempt to fill in the "library" variable in getpath.c,
+even on builds that are statically linking libpython.
+
+Also, we want to use the realpath'd version of the library's path to
+locate the standard library, particularly in the case where the library
+is a symlink to an executable statically linking libpython. On macOS
+dyld, this is done automatically. On glibc and musl, we often get
+relative paths and they are not canonicalized, so instead, use
+/proc/self/maps to find the file where libpython is coming from.
+
+(We could instead use the origin, which is canonicalized, but there is
+no safe API on glibc to read it and no API at all on musl. Note that and
+glibc also uses procfs to do so; see discussion at
+https://sourceware.org/bugzilla/show_bug.cgi?id=25263)
+---
+ Modules/getpath.c | 52 ++++++++++++++++++++++++++++++++++++++++------
+ Modules/getpath.py | 4 ++--
+ 2 files changed, 48 insertions(+), 8 deletions(-)
+
+diff --git a/Modules/getpath.c b/Modules/getpath.c
+index 1e75993480a..72860807133 100644
+--- a/Modules/getpath.c
++++ b/Modules/getpath.c
+@@ -802,14 +802,19 @@ progname_to_dict(PyObject *dict, const char *key)
+ }
+
+
++static void
++fclose_cleanup(FILE **pf) {
++ if (*pf) {
++ fclose(*pf);
++ *pf = NULL;
++ }
++}
++
++
+ /* Add the runtime library's path to the dict */
+ static int
+ library_to_dict(PyObject *dict, const char *key)
+ {
+-/* macOS framework builds do not link against a libpython dynamic library, but
+- instead link against a macOS Framework. */
+-#if defined(Py_ENABLE_SHARED) || defined(WITH_NEXT_FRAMEWORK)
+-
+ #ifdef MS_WINDOWS
+ extern HMODULE PyWin_DLLhModule;
+ if (PyWin_DLLhModule) {
+@@ -817,12 +822,47 @@ library_to_dict(PyObject *dict, const char *key)
+ }
+ #endif
+
++ const void *target = (void *)Py_Initialize;
++
++#ifdef __linux__
++ /* Linux libcs do not reliably report the realpath in dladdr dli_fname and
++ * sometimes return relative paths, especially if the returned object is
++ * the main program itself. However, /proc/self/maps will give absolute
++ * realpaths (from the kernel, for the same reason that /proc/self/exe is
++ * canonical), so try to parse and look it up there. (dyld seems to
++ * reliably report the canonical path, so doing this matches the behavior
++ * on macOS.) */
++
++ __attribute__((cleanup(fclose_cleanup)))
++ FILE *maps = fopen("/proc/self/maps", "r");
++ if (maps != NULL) {
++ /* See implementation in fs/proc/task_mmu.c for spacing. The pathname
++ * is the last field and has any \n characters escaped, so we can read
++ * until \n. Note that the filename may have " (deleted)" appended;
++ * we don't bother to handle that specially as the only user of this
++ * value calls dirname() anyway.
++ * TODO(geofft): Consider using PROCMAP_QUERY if supported.
++ */
++ uintptr_t low, high;
++ char filename[PATH_MAX];
++ while (fscanf(maps,
++ "%lx-%lx %*s %*s %*s %*s %[^\n]",
++ &low, &high, filename) == 3) {
++ if (low <= (uintptr_t)target && (uintptr_t)target < high) {
++ if (filename[0] == '/') {
++ return decode_to_dict(dict, key, filename);
++ }
++ break;
++ }
++ }
++ }
++#endif
++
+ #if HAVE_DLADDR
+ Dl_info libpython_info;
+- if (dladdr(&Py_Initialize, &libpython_info) && libpython_info.dli_fname) {
++ if (dladdr(target, &libpython_info) && libpython_info.dli_fname) {
+ return decode_to_dict(dict, key, libpython_info.dli_fname);
+ }
+-#endif
+ #endif
+
+ return PyDict_SetItemString(dict, key, Py_None) == 0;
+diff --git a/Modules/getpath.py b/Modules/getpath.py
+index b89d7427e3f..8c431e53be2 100644
+--- a/Modules/getpath.py
++++ b/Modules/getpath.py
+@@ -436,7 +436,7 @@ def search_up(prefix, *landmarks, test=isfile):
+
+ if not executable_dir and os_name == 'darwin' and library:
+ # QUIRK: macOS checks adjacent to its library early
+- library_dir = dirname(library)
++ library_dir = dirname(dirname(library))
+ if any(isfile(joinpath(library_dir, p)) for p in STDLIB_LANDMARKS):
+ # Exceptions here should abort the whole process (to match
+ # previous behavior)
+@@ -570,7 +570,7 @@ def search_up(prefix, *landmarks, test=isfile):
+
+ # First try to detect prefix by looking alongside our runtime library, if known
+ if library and not prefix:
+- library_dir = dirname(library)
++ library_dir = dirname(dirname(library))
+ if ZIP_LANDMARK:
+ if os_name == 'nt':
+ # QUIRK: Windows does not search up for ZIP file
+--
+2.50.1 (Apple Git-155)
+
diff --git a/src/verify_distribution.py b/src/verify_distribution.py
index 8a25b1b..baeec2b 100644
--- a/src/verify_distribution.py
+++ b/src/verify_distribution.py
@@ -5,8 +5,11 @@
import importlib.machinery
import os
import struct
+import subprocess
import sys
+import tempfile
import unittest
+from pathlib import Path
TERMINFO_DIRS = [
"/etc/terminfo",
@@ -269,6 +272,38 @@ def assertLibc(value):
assertLibc(importlib.machinery.EXTENSION_SUFFIXES[0])
+ @unittest.skipIf(
+ sys.version_info[:2] < (3, 11),
+ "not yet implemented",
+ )
+ @unittest.skipIf(os.name == "nt", "no symlinks or argv[0] on Windows")
+ def test_getpath(self):
+ def assertPythonWorks(path: Path, argv0: str = None):
+ output = subprocess.check_output(
+ [argv0 or path, "-c", "print(42)"], executable=path, text=True
+ )
+ self.assertEqual(output.strip(), "42")
+
+ with tempfile.TemporaryDirectory(prefix="verify-distribution-") as t:
+ tmpdir = Path(t)
+ symlink = tmpdir / "python"
+ symlink.symlink_to(sys.executable)
+ with self.subTest(msg="symlink without venv"):
+ assertPythonWorks(symlink)
+
+ # TODO: --copies does not work right
+ for flag in ("--symlinks",):
+ with self.subTest(flag=flag):
+ venv = tmpdir / f"venv_{flag}"
+ subprocess.check_call(
+ [symlink, "-m", "venv", flag, "--without-pip", venv]
+ )
+ assertPythonWorks(venv / "bin" / "python")
+
+ # TODO: does not yet work on ARM64
+ # with self.subTest(msg="weird argv[0]"):
+ # assertPythonWorks(sys.executable, argv0="/dev/null")
+
if __name__ == "__main__":
unittest.main()
From 06b721601b4492853ebf58f7105bc7957edf49b1 Mon Sep 17 00:00:00 2001
From: "Jonathan J. Helmus"
Date: Fri, 5 Dec 2025 14:00:01 -0600
Subject: [PATCH 55/66] Bump to 3.13.11 (#908)
cpython-3.13 3.13.10 -> 3.13.11
---
pythonbuild/downloads.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/pythonbuild/downloads.py b/pythonbuild/downloads.py
index b1579cb..db9a11c 100644
--- a/pythonbuild/downloads.py
+++ b/pythonbuild/downloads.py
@@ -75,10 +75,10 @@
"python_tag": "cp312",
},
"cpython-3.13": {
- "url": "https://www.python.org/ftp/python/3.13.10/Python-3.13.10.tar.xz",
- "size": 22714348,
- "sha256": "bc673c04375a1a3f0808c27ba8f0411ab811ad390a8740318ccb9c60fad8fd77",
- "version": "3.13.10",
+ "url": "https://www.python.org/ftp/python/3.13.11/Python-3.13.11.tar.xz",
+ "size": 22704352,
+ "sha256": "16ede7bb7cdbfa895d11b0642fa0e523f291e6487194d53cf6d3b338c3a17ea2",
+ "version": "3.13.11",
"licenses": ["Python-2.0", "CNRI-Python"],
"license_file": "LICENSE.cpython.txt",
"python_tag": "cp313",
From 91f343f560718ec370b0339839b7287abc868c2a Mon Sep 17 00:00:00 2001
From: Keith Smiley
Date: Tue, 9 Dec 2025 07:21:48 -0800
Subject: [PATCH 56/66] Correctly set install_name for macOS libpython (#914)
Previously the `install_name` for libpython on macOS was just the prefix
`/install/lib/...` which was knowingly invalid. The post-build scripts
fixed this for `python3` itself, but don't fix the dylib itself for the
case where downstream users of the toolchain try to link libpython. Now
libpython has the standard install_name relative to rpaths, and
downstream binaries need to add a rpath to the toolchain's lib directory
to load it. This is also now the same behavior as the linux toolchain
---
cpython-unix/build-cpython.sh | 14 +++++++++-----
src/validation.rs | 36 +++++++++++++++++------------------
2 files changed, 27 insertions(+), 23 deletions(-)
diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh
index be45a34..a971b05 100755
--- a/cpython-unix/build-cpython.sh
+++ b/cpython-unix/build-cpython.sh
@@ -704,16 +704,19 @@ if [ "${PYBUILD_SHARED}" = "1" ]; then
LIBPYTHON_SHARED_LIBRARY_BASENAME=libpython${PYTHON_MAJMIN_VERSION}${PYTHON_BINARY_SUFFIX}.dylib
LIBPYTHON_SHARED_LIBRARY=${ROOT}/out/python/install/lib/${LIBPYTHON_SHARED_LIBRARY_BASENAME}
+ # Fix the Python binary to reference libpython via @rpath and add
+ # an rpath entry so it can find the library.
install_name_tool \
- -change /install/lib/${LIBPYTHON_SHARED_LIBRARY_BASENAME} @executable_path/../lib/${LIBPYTHON_SHARED_LIBRARY_BASENAME} \
+ -change /install/lib/${LIBPYTHON_SHARED_LIBRARY_BASENAME} @rpath/${LIBPYTHON_SHARED_LIBRARY_BASENAME} \
+ -add_rpath @executable_path/../lib \
${ROOT}/out/python/install/bin/python${PYTHON_MAJMIN_VERSION}
# Python's build system doesn't make this file writable.
- # TODO(geofft): @executable_path/ is a weird choice here, who is
- # relying on it? Should probably be @loader_path.
chmod 755 ${ROOT}/out/python/install/lib/${LIBPYTHON_SHARED_LIBRARY_BASENAME}
+ # Set libpython's install name to @rpath so binaries linking against it
+ # can locate it via their own rpath entries.
install_name_tool \
- -change /install/lib/${LIBPYTHON_SHARED_LIBRARY_BASENAME} @executable_path/${LIBPYTHON_SHARED_LIBRARY_BASENAME} \
+ -id @rpath/${LIBPYTHON_SHARED_LIBRARY_BASENAME} \
${ROOT}/out/python/install/lib/${LIBPYTHON_SHARED_LIBRARY_BASENAME}
# We also normalize /tools/deps/lib/libz.1.dylib to the system location.
@@ -726,7 +729,8 @@ if [ "${PYBUILD_SHARED}" = "1" ]; then
if [ -n "${PYTHON_BINARY_SUFFIX}" ]; then
install_name_tool \
- -change /install/lib/${LIBPYTHON_SHARED_LIBRARY_BASENAME} @executable_path/../lib/${LIBPYTHON_SHARED_LIBRARY_BASENAME} \
+ -change /install/lib/${LIBPYTHON_SHARED_LIBRARY_BASENAME} @rpath/${LIBPYTHON_SHARED_LIBRARY_BASENAME} \
+ -add_rpath @executable_path/../lib \
${ROOT}/out/python/install/bin/python${PYTHON_MAJMIN_VERSION}${PYTHON_BINARY_SUFFIX}
fi
diff --git a/src/validation.rs b/src/validation.rs
index ef64d29..5886f1e 100644
--- a/src/validation.rs
+++ b/src/validation.rs
@@ -297,92 +297,92 @@ static ELF_ALLOWED_LIBRARIES_BY_MODULE: Lazy> = Lazy::new(|| {
[
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.10.dylib".to_string(),
+ name: "@rpath/libpython3.10.dylib".to_string(),
max_compatibility_version: "3.10.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.10d.dylib".to_string(),
+ name: "@rpath/libpython3.10d.dylib".to_string(),
max_compatibility_version: "3.10.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.11.dylib".to_string(),
+ name: "@rpath/libpython3.11.dylib".to_string(),
max_compatibility_version: "3.11.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.11d.dylib".to_string(),
+ name: "@rpath/libpython3.11d.dylib".to_string(),
max_compatibility_version: "3.11.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.12.dylib".to_string(),
+ name: "@rpath/libpython3.12.dylib".to_string(),
max_compatibility_version: "3.12.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.12d.dylib".to_string(),
+ name: "@rpath/libpython3.12d.dylib".to_string(),
max_compatibility_version: "3.12.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.13.dylib".to_string(),
+ name: "@rpath/libpython3.13.dylib".to_string(),
max_compatibility_version: "3.13.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.13d.dylib".to_string(),
+ name: "@rpath/libpython3.13d.dylib".to_string(),
max_compatibility_version: "3.13.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.13t.dylib".to_string(),
+ name: "@rpath/libpython3.13t.dylib".to_string(),
max_compatibility_version: "3.13.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.13td.dylib".to_string(),
+ name: "@rpath/libpython3.13td.dylib".to_string(),
max_compatibility_version: "3.13.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.14.dylib".to_string(),
+ name: "@rpath/libpython3.14.dylib".to_string(),
max_compatibility_version: "3.14.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.14d.dylib".to_string(),
+ name: "@rpath/libpython3.14d.dylib".to_string(),
max_compatibility_version: "3.14.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.14t.dylib".to_string(),
+ name: "@rpath/libpython3.14t.dylib".to_string(),
max_compatibility_version: "3.14.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.14td.dylib".to_string(),
+ name: "@rpath/libpython3.14td.dylib".to_string(),
max_compatibility_version: "3.14.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.15.dylib".to_string(),
+ name: "@rpath/libpython3.15.dylib".to_string(),
max_compatibility_version: "3.15.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.15d.dylib".to_string(),
+ name: "@rpath/libpython3.15d.dylib".to_string(),
max_compatibility_version: "3.15.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.15t.dylib".to_string(),
+ name: "@rpath/libpython3.15t.dylib".to_string(),
max_compatibility_version: "3.15.0".try_into().unwrap(),
required: false,
},
MachOAllowedDylib {
- name: "@executable_path/../lib/libpython3.15td.dylib".to_string(),
+ name: "@rpath/libpython3.15td.dylib".to_string(),
max_compatibility_version: "3.15.0".try_into().unwrap(),
required: false,
},
From 29c7b9ab81698fabdb70126c549c9b8eb4bcb9ea Mon Sep 17 00:00:00 2001
From: "Jonathan J. Helmus"
Date: Tue, 9 Dec 2025 12:40:36 -0600
Subject: [PATCH 57/66] BUG: restore tcl/tk patch on python 3.14+ (#915)
Restore patch used to find Tcl/Tk libraries relative to the base prefix
on Python 3.14+.
This patches was accidentally removed in #845.
Rewrite the conditionals in the patch block to make it more obvious what
patch is applied for each python version.
closes #913
---
cpython-unix/build-cpython.sh | 10 ++-
cpython-unix/patch-tkinter-3.14.patch | 117 ++++++++++++++++++++++++++
2 files changed, 123 insertions(+), 4 deletions(-)
create mode 100644 cpython-unix/patch-tkinter-3.14.patch
diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh
index a971b05..8504fb8 100755
--- a/cpython-unix/build-cpython.sh
+++ b/cpython-unix/build-cpython.sh
@@ -188,13 +188,15 @@ fi
# On Windows, CPython looks for the Tcl/Tk libraries relative to the base prefix,
# which we want. But on Unix, it doesn't. This patch applies similar behavior on Unix,
# thereby ensuring that the Tcl/Tk libraries are found in the correct location.
-if [ "${PYTHON_MAJMIN_VERSION}" = "3.13" ]; then
+if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_14}" ]; then
+ patch -p1 -i ${ROOT}/patch-tkinter-3.14.patch
+elif [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_13}" ]; then
patch -p1 -i ${ROOT}/patch-tkinter-3.13.patch
-elif [ "${PYTHON_MAJMIN_VERSION}" = "3.12" ]; then
+elif [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then
patch -p1 -i ${ROOT}/patch-tkinter-3.12.patch
-elif [ "${PYTHON_MAJMIN_VERSION}" = "3.11" ]; then
+elif [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_11}" ]; then
patch -p1 -i ${ROOT}/patch-tkinter-3.11.patch
-elif [ "${PYTHON_MAJMIN_VERSION}" = "3.10" ]; then
+elif [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_10}" ]; then
patch -p1 -i ${ROOT}/patch-tkinter-3.10.patch
fi
diff --git a/cpython-unix/patch-tkinter-3.14.patch b/cpython-unix/patch-tkinter-3.14.patch
new file mode 100644
index 0000000..3e99eb3
--- /dev/null
+++ b/cpython-unix/patch-tkinter-3.14.patch
@@ -0,0 +1,117 @@
+diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
+index e153047b778..02f5d12db1a 100644
+--- a/Modules/_tkinter.c
++++ b/Modules/_tkinter.c
+@@ -115,6 +115,7 @@ Copyright (C) 1994 Steen Lumholt.
+ #ifdef MS_WINDOWS
+ #include
+ #define WAIT_FOR_STDIN
++#endif
+
+ static PyObject *
+ _get_tcl_lib_path()
+@@ -132,6 +133,7 @@ _get_tcl_lib_path()
+ return NULL;
+ }
+
++#ifdef MS_WINDOWS
+ /* Check expected location for an installed Python first */
+ tcl_library_path = PyUnicode_FromString("\\tcl\\tcl" TCL_VERSION);
+ if (tcl_library_path == NULL) {
+@@ -169,11 +171,31 @@ _get_tcl_lib_path()
+ tcl_library_path = NULL;
+ #endif
+ }
++#else
++ /* Check expected location for an installed Python first */
++ tcl_library_path = PyUnicode_FromString("/lib/tcl" TCL_VERSION);
++ if (tcl_library_path == NULL) {
++ return NULL;
++ }
++ tcl_library_path = PyUnicode_Concat(prefix, tcl_library_path);
++ if (tcl_library_path == NULL) {
++ return NULL;
++ }
++ stat_return_value = _Py_stat(tcl_library_path, &stat_buf);
++ if (stat_return_value == -2) {
++ return NULL;
++ }
++ if (stat_return_value == -1) {
++ /* install location doesn't exist, reset errno and leave Tcl
++ to its own devices */
++ errno = 0;
++ tcl_library_path = NULL;
++ }
++#endif
+ already_checked = 1;
+ }
+ return tcl_library_path;
+ }
+-#endif /* MS_WINDOWS */
+
+ /* The threading situation is complicated. Tcl is not thread-safe, except
+ when configured with --enable-threads.
+@@ -822,6 +844,30 @@ Tkapp_New(const char *screenName, const char *className,
+
+ ret = GetEnvironmentVariableW(L"TCL_LIBRARY", NULL, 0);
+ if (!ret && GetLastError() == ERROR_ENVVAR_NOT_FOUND) {
++ str_path = _get_tcl_lib_path();
++ if (str_path == NULL && PyErr_Occurred()) {
++ return NULL;
++ }
++ if (str_path != NULL) {
++ utf8_path = PyUnicode_AsUTF8String(str_path);
++ if (utf8_path == NULL) {
++ return NULL;
++ }
++ Tcl_SetVar(v->interp,
++ "tcl_library",
++ PyBytes_AS_STRING(utf8_path),
++ TCL_GLOBAL_ONLY);
++ Py_DECREF(utf8_path);
++ }
++ }
++ }
++#else
++ {
++ const char *env_val = getenv("TCL_LIBRARY");
++ if (!env_val) {
++ PyObject *str_path;
++ PyObject *utf8_path;
++
+ str_path = _get_tcl_lib_path();
+ if (str_path == NULL && PyErr_Occurred()) {
+ return NULL;
+@@ -3631,7 +3677,32 @@ PyInit__tkinter(void)
+ PyMem_Free(wcs_path);
+ }
+ #else
++ int set_var = 0;
++ PyObject *str_path;
++ char *path;
++
++ if (!getenv("TCL_LIBRARY")) {
++ str_path = _get_tcl_lib_path();
++ if (str_path == NULL && PyErr_Occurred()) {
++ Py_DECREF(m);
++ return NULL;
++ }
++ if (str_path != NULL) {
++ path = PyUnicode_AsUTF8(str_path);
++ if (path == NULL) {
++ Py_DECREF(m);
++ return NULL;
++ }
++ setenv("TCL_LIBRARY", path, 1);
++ set_var = 1;
++ }
++ }
++
+ Tcl_FindExecutable(PyBytes_AS_STRING(cexe));
++
++ if (set_var) {
++ unsetenv("TCL_LIBRARY");
++ }
+ #endif /* MS_WINDOWS */
+ }
+ Py_XDECREF(cexe);
From f322ad6509c11ba2856c6866fc58a466710b9c19 Mon Sep 17 00:00:00 2001
From: "Jonathan J. Helmus"
Date: Wed, 10 Dec 2025 08:28:40 -0600
Subject: [PATCH 58/66] Use latest LLVM for musl builds (#916)
closes #829
---
cpython-unix/build-tcl.sh | 11 +++++++----
pythonbuild/downloads.py | 6 ------
pythonbuild/utils.py | 6 +-----
3 files changed, 8 insertions(+), 15 deletions(-)
diff --git a/cpython-unix/build-tcl.sh b/cpython-unix/build-tcl.sh
index bfbc22f..f619a08 100755
--- a/cpython-unix/build-tcl.sh
+++ b/cpython-unix/build-tcl.sh
@@ -19,12 +19,14 @@ export PKG_CONFIG_PATH=${TOOLS_PATH}/deps/share/pkgconfig:${TOOLS_PATH}/deps/lib
tar -xf tcl${TCL_VERSION}-src.tar.gz
pushd tcl${TCL_VERSION}
+EXTRA_CONFIGURE=
if [ -n "${STATIC}" ]; then
if echo "${TARGET_TRIPLE}" | grep -q -- "-unknown-linux-musl"; then
- # tcl misbehaves when performing static musl builds
- # `checking whether musl-clang accepts -g...` fails with a duplicate definition error
- TARGET_TRIPLE="$(echo "${TARGET_TRIPLE}" | sed -e 's/-unknown-linux-musl/-unknown-linux-gnu/g')"
+ # tcl will use an internal implementation of certain POSIX function when
+ # cross-compiling. The implementation of strtoul create multiple definitions
+ # when linked against the static musl libc. Exclude the internal implementation.
+ EXTRA_CONFIGURE="${EXTRA_CONFIGURE} tcl_cv_strtoul_unbroken=ok"
fi
patch -p1 << 'EOF'
@@ -59,7 +61,8 @@ CFLAGS="${CFLAGS}" CPPFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}" ./configure \
--host=${TARGET_TRIPLE} \
--prefix=/tools/deps \
--enable-shared"${STATIC:+=no}" \
- --enable-threads
+ --enable-threads \
+ ${EXTRA_CONFIGURE}
make -j ${NUM_CPUS} DYLIB_INSTALL_DIR=@rpath
make -j ${NUM_CPUS} install DESTDIR=${ROOT}/out DYLIB_INSTALL_DIR=@rpath
diff --git a/pythonbuild/downloads.py b/pythonbuild/downloads.py
index db9a11c..7c2184e 100644
--- a/pythonbuild/downloads.py
+++ b/pythonbuild/downloads.py
@@ -176,12 +176,6 @@
"licenses": ["MIT"],
"license_file": "LICENSE.libxcb.txt",
},
- "llvm-14-x86_64-linux": {
- "url": "https://github.com/indygreg/toolchain-tools/releases/download/toolchain-bootstrap%2F20220508/llvm-14.0.3+20220508-gnu_only-x86_64-unknown-linux-gnu.tar.zst",
- "size": 158614671,
- "sha256": "04cb77c660f09df017a57738ae9635ef23a506024789f2f18da1304b45af2023",
- "version": "14.0.3+20220508",
- },
# Remember to update LLVM_URL in src/release.rs whenever upgrading.
"llvm-21-aarch64-linux": {
"url": "https://github.com/indygreg/toolchain-tools/releases/download/toolchain-bootstrap%2F20251029/llvm-21.1.4+20251029-gnu_only-aarch64-unknown-linux-gnu.tar.zst",
diff --git a/pythonbuild/utils.py b/pythonbuild/utils.py
index 36c3f9f..dc6f736 100644
--- a/pythonbuild/utils.py
+++ b/pythonbuild/utils.py
@@ -475,11 +475,7 @@ def sort_key(v):
def clang_toolchain(host_platform: str, target_triple: str) -> str:
if host_platform == "linux_x86_64":
- # musl currently has issues with LLVM 15+.
- if "musl" in target_triple:
- return "llvm-14-x86_64-linux"
- else:
- return "llvm-21-x86_64-linux"
+ return "llvm-21-x86_64-linux"
elif host_platform == "linux_aarch64":
return "llvm-21-aarch64-linux"
elif host_platform == "macos_arm64":
From 0d07a8b271b7af75940678757285d390c476dddd Mon Sep 17 00:00:00 2001
From: "Jonathan J. Helmus"
Date: Wed, 10 Dec 2025 14:41:15 -0600
Subject: [PATCH 59/66] Remove multiarch patch (#917)
--print-multiarch reporting an incorrect triple was a bug in LLVM that
was fixed. With the project now using LLVM 21+ (#916) the patches to
remove this check during configuration are no necessary.
closes #865
---
cpython-unix/build-cpython-host.sh | 11 -----------
cpython-unix/build-cpython.sh | 11 -----------
cpython-unix/build.py | 2 --
cpython-unix/patch-disable-multiarch-13.patch | 17 -----------------
cpython-unix/patch-disable-multiarch.patch | 17 -----------------
5 files changed, 58 deletions(-)
delete mode 100644 cpython-unix/patch-disable-multiarch-13.patch
delete mode 100644 cpython-unix/patch-disable-multiarch.patch
diff --git a/cpython-unix/build-cpython-host.sh b/cpython-unix/build-cpython-host.sh
index 93fdea7..9dd8553 100755
--- a/cpython-unix/build-cpython-host.sh
+++ b/cpython-unix/build-cpython-host.sh
@@ -34,17 +34,6 @@ tar -xf Python-${PYTHON_VERSION}.tar.xz
pushd "Python-${PYTHON_VERSION}"
-# Clang 13 actually prints something with --print-multiarch, confusing CPython's
-# configure. This is reported as https://bugs.python.org/issue45405. We nerf the
-# check since we know what we're doing.
-if [[ "${CC}" = "clang" || "${CC}" = "musl-clang" ]]; then
- if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_13}" ]; then
- patch -p1 -i ${ROOT}/patch-disable-multiarch-13.patch
- else
- patch -p1 -i ${ROOT}/patch-disable-multiarch.patch
- fi
-fi
-
autoconf
# When cross-compiling, we need to build a host Python that has working zlib
diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh
index 8504fb8..b9277ea 100755
--- a/cpython-unix/build-cpython.sh
+++ b/cpython-unix/build-cpython.sh
@@ -116,17 +116,6 @@ elif [ -n "${PYTHON_MEETS_MAXIMUM_VERSION_3_12}" ]; then
patch -p1 -i ${ROOT}/patch-cpython-configure-target-triple-musl-3.12.patch
fi
-# Clang 13 actually prints something with --print-multiarch, confusing CPython's
-# configure. This is reported as https://bugs.python.org/issue45405. We nerf the
-# check since we know what we're doing.
-if [[ "${CC}" = "clang" || "${CC}" = "musl-clang" ]]; then
- if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_13}" ]; then
- patch -p1 -i ${ROOT}/patch-disable-multiarch-13.patch
- else
- patch -p1 -i ${ROOT}/patch-disable-multiarch.patch
- fi
-fi
-
# Python 3.11 supports using a provided Python to use during bootstrapping
# (e.g. freezing). Normally it only uses this Python during cross-compiling.
# This patch forces always using it. See comment related to
diff --git a/cpython-unix/build.py b/cpython-unix/build.py
index 7c72c56..fd9810c 100755
--- a/cpython-unix/build.py
+++ b/cpython-unix/build.py
@@ -428,8 +428,6 @@ def build_cpython_host(
support = {
"build-cpython-host.sh",
- "patch-disable-multiarch.patch",
- "patch-disable-multiarch-13.patch",
}
for s in sorted(support):
build_env.copy_file(SUPPORT / s)
diff --git a/cpython-unix/patch-disable-multiarch-13.patch b/cpython-unix/patch-disable-multiarch-13.patch
deleted file mode 100644
index 3ff3324..0000000
--- a/cpython-unix/patch-disable-multiarch-13.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-diff -u 13-a/configure.ac 13-b/configure.ac
---- 13-a/configure.ac 2024-05-08 05:21:00.000000000 -0400
-+++ 13-b/configure.ac 2024-05-19 07:42:23.294762624 -0400
-@@ -1090,12 +1090,7 @@
- dnl architecture. PLATFORM_TRIPLET will be a pair or single value for these
- dnl platforms.
- AC_MSG_CHECKING([for multiarch])
--AS_CASE([$ac_sys_system],
-- [Darwin*], [MULTIARCH=""],
-- [iOS], [MULTIARCH=""],
-- [FreeBSD*], [MULTIARCH=""],
-- [MULTIARCH=$($CC --print-multiarch 2>/dev/null)]
--)
-+MULTIARCH=
- AC_SUBST([MULTIARCH])
-
- if test x$PLATFORM_TRIPLET != x && test x$MULTIARCH != x; then
diff --git a/cpython-unix/patch-disable-multiarch.patch b/cpython-unix/patch-disable-multiarch.patch
deleted file mode 100644
index b9f1d24..0000000
--- a/cpython-unix/patch-disable-multiarch.patch
+++ /dev/null
@@ -1,17 +0,0 @@
-diff --git a/configure.ac b/configure.ac
-index cc69015b10..c77e92affc 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -873,11 +873,7 @@ fi
- rm -f conftest.c conftest.out
-
- AC_MSG_CHECKING([for multiarch])
--AS_CASE([$ac_sys_system],
-- [Darwin*], [MULTIARCH=""],
-- [FreeBSD*], [MULTIARCH=""],
-- [MULTIARCH=$($CC --print-multiarch 2>/dev/null)]
--)
-+MULTIARCH=
- AC_SUBST([MULTIARCH])
- AC_MSG_RESULT([$MULTIARCH])
-
From d1684b0b1374b091f904ac4d05ff5ff5f5cfb872 Mon Sep 17 00:00:00 2001
From: "Jonathan J. Helmus"
Date: Wed, 10 Dec 2025 15:39:31 -0600
Subject: [PATCH 60/66] limit test-embed patch to Python 3.12 and 3.13 (#918)
A version of `patch-test-embed-prevent-segfault.patch` was merged
upstream in https://github.com/python/cpython/pull/128474. It is not
needed in CPython 3.14+
---
cpython-unix/build-cpython.sh | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh
index b9277ea..2afeb13 100755
--- a/cpython-unix/build-cpython.sh
+++ b/cpython-unix/build-cpython.sh
@@ -284,8 +284,8 @@ fi
# BOLT instrumented binaries segfault in some test_embed tests for unknown reasons.
# On 3.12 (minimum BOLT version), the segfault causes the test harness to
# abort and BOLT optimization uses the partial test results. On 3.13, the segfault
-# is a fatal error.
-if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then
+# is a fatal error. Fixed in 3.14+, https://github.com/python/cpython/pull/128474
+if [ "${PYTHON_MAJMIN_VERSION}" = 3.12 ] || [ "${PYTHON_MAJMIN_VERSION}" = 3.13 ]; then
patch -p1 -i ${ROOT}/patch-test-embed-prevent-segfault.patch
fi
From 182c038cb400ed0c76229b517b786c7efbc51b9a Mon Sep 17 00:00:00 2001
From: "Jonathan J. Helmus"
Date: Thu, 11 Dec 2025 15:19:12 -0600
Subject: [PATCH 61/66] rename build-uv.py -> build.py (#920)
Rename the script used to start a build from `build-uv.py` to
`build.py`.
On all platforms builds can be done using:
```
uv run ./build.py ...
```
Additionally on Linux and macOS `./build.py ...` can be used.
---
.github/workflows/linux.yml | 10 +++++-----
.github/workflows/macos.yml | 2 +-
.github/workflows/windows.yml | 4 ++--
build-uv.py => build.py | 0
4 files changed, 8 insertions(+), 8 deletions(-)
rename build-uv.py => build.py (100%)
diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
index b6fe34a..3c57cbb 100644
--- a/.github/workflows/linux.yml
+++ b/.github/workflows/linux.yml
@@ -88,7 +88,7 @@ jobs:
- name: Generate Dockerfiles
run: |
- ./build-uv.py --make-target empty
+ ./build.py --make-target empty
repo_name=$(echo "${GITHUB_REPOSITORY,,}" | sed 's|\.|_|g')
git_ref_name=$(echo "${GITHUB_REF_NAME,,}" | sed 's|[^a-z0-9_-]|_|g')
echo "REPO_NAME=${repo_name}" >> "${GITHUB_ENV}"
@@ -267,12 +267,12 @@ jobs:
if: ${{ ! matrix.dry-run }}
run: |
# Do empty target so all generated files are touched.
- ./build-uv.py --make-target empty
+ ./build.py --make-target empty
# Touch mtimes of all images so they are newer than autogenerated files above.
touch build/image-*
- ./build-uv.py --target-triple ${MATRIX_TARGET_TRIPLE} --python cpython-${MATRIX_PYTHON} --options ${MATRIX_BUILD_OPTIONS}
+ ./build.py --target-triple ${MATRIX_TARGET_TRIPLE} --python cpython-${MATRIX_PYTHON} --options ${MATRIX_BUILD_OPTIONS}
env:
MATRIX_TARGET_TRIPLE: ${{ matrix.target_triple }}
MATRIX_PYTHON: ${{ matrix.python }}
@@ -375,12 +375,12 @@ jobs:
if: ${{ ! matrix.dry-run }}
run: |
# Do empty target so all generated files are touched.
- ./build-uv.py --make-target empty
+ ./build.py --make-target empty
# Touch mtimes of all images so they are newer than autogenerated files above.
touch build/image-*
- ./build-uv.py --target-triple ${MATRIX_TARGET_TRIPLE} --python cpython-${MATRIX_PYTHON} --options ${MATRIX_BUILD_OPTIONS}
+ ./build.py --target-triple ${MATRIX_TARGET_TRIPLE} --python cpython-${MATRIX_PYTHON} --options ${MATRIX_BUILD_OPTIONS}
env:
MATRIX_TARGET_TRIPLE: ${{ matrix.target_triple }}
MATRIX_PYTHON: ${{ matrix.python }}
diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml
index f0fec33..2e98e70 100644
--- a/.github/workflows/macos.yml
+++ b/.github/workflows/macos.yml
@@ -144,7 +144,7 @@ jobs:
- name: Build
if: ${{ ! matrix.dry-run }}
run: |
- ./build-uv.py --target-triple ${MATRIX_TARGET_TRIPLE} --python cpython-${MATRIX_PYTHON} --options ${MATRIX_BUILD_OPTIONS}
+ ./build.py --target-triple ${MATRIX_TARGET_TRIPLE} --python cpython-${MATRIX_PYTHON} --options ${MATRIX_BUILD_OPTIONS}
env:
MATRIX_TARGET_TRIPLE: ${{ matrix.target_triple }}
MATRIX_PYTHON: ${{ matrix.python }}
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml
index 5d89e95..ee1b2d0 100644
--- a/.github/workflows/windows.yml
+++ b/.github/workflows/windows.yml
@@ -150,14 +150,14 @@ jobs:
# don't get compiled properly.
- name: Bootstrap Python environment
run: |
- uv run build-uv.py --help
+ uv run build.py --help
- name: Build
if: ${{ ! matrix.dry-run }}
shell: cmd
run: |
call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\%MATRIX_VCVARS%"
- uv run build-uv.py --python cpython-%MATRIX_PYTHON% --sh c:\cygwin\bin\sh.exe --options %MATRIX_BUILD_OPTIONS%
+ uv run build.py --python cpython-%MATRIX_PYTHON% --sh c:\cygwin\bin\sh.exe --options %MATRIX_BUILD_OPTIONS%
env:
MATRIX_VCVARS: ${{ matrix.vcvars }}
MATRIX_PYTHON: ${{ matrix.python }}
diff --git a/build-uv.py b/build.py
similarity index 100%
rename from build-uv.py
rename to build.py
From 5cbc49ffb1bc4b587ab9feb4bb92dc2b5402f501 Mon Sep 17 00:00:00 2001
From: "Jonathan J. Helmus"
Date: Mon, 15 Dec 2025 09:56:45 -0600
Subject: [PATCH 62/66] add section on CI labels to CONTRIBUTING.rst (#921)
closes #430
---
CONTRIBUTING.rst | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index cd9fa8d..b0125ff 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -8,6 +8,28 @@ Building distributions
See the [documentation](https://gregoryszorc.com/docs/python-build-standalone/main/building.html)
for instructions on building distributions locally.
+CI labels
+=========
+By default, submitting a pull request triggers a complete build of all
+distributions in CI, which can be time-consuming.
+
+To conserve CI resources and reduce build times, you can limit the matrix of
+distributions built by applying specific labels to your pull request. Only
+distributions matching the specified labels will be built.
+
+The following label prefixes can be used to customize the build matrix:
+* `platform`
+* `python`
+* `build`
+* `arch`
+* `libc`
+
+To bypass CI entirely for changes that do not affect the build (such as
+documentation updates), use the `ci:skip` label.
+
+Please utilize these tags when appropriate for your changes to minimize CI
+resource consumption.
+
Releases
========
From 2b04093cfd72b81e2a76a9773b2733c11c40692e Mon Sep 17 00:00:00 2001
From: Geoffrey Thomas
Date: Tue, 16 Dec 2025 09:01:23 -0500
Subject: [PATCH 63/66] getpath: Fix /proc/self/maps parsing (#922)
Correctly handle lines missing a filename (which have a space between
fields immediately followed by a newline; scanf will skip over both of
those as whitespace and try to parse the next line).
Also use __builtin_return_address to provide some robustness against
running into issues with the PLT.
---
cpython-unix/patch-python-getpath-3.14.patch | 38 ++++++++++++++------
src/verify_distribution.py | 6 ++--
2 files changed, 30 insertions(+), 14 deletions(-)
diff --git a/cpython-unix/patch-python-getpath-3.14.patch b/cpython-unix/patch-python-getpath-3.14.patch
index af237c4..5c500f3 100644
--- a/cpython-unix/patch-python-getpath-3.14.patch
+++ b/cpython-unix/patch-python-getpath-3.14.patch
@@ -1,4 +1,4 @@
-From 4fb328cb883504dde04dfdd0b4d182a0130a0909 Mon Sep 17 00:00:00 2001
+From 60d6a76dcee2a5647d69874d9b5c24f701a6722d Mon Sep 17 00:00:00 2001
From: Geoffrey Thomas
Date: Mon, 1 Dec 2025 14:11:43 -0500
Subject: [PATCH 1/1] getpath: Fix library detection and canonicalize paths on
@@ -25,13 +25,19 @@ relative paths and they are not canonicalized, so instead, use
no safe API on glibc to read it and no API at all on musl. Note that and
glibc also uses procfs to do so; see discussion at
https://sourceware.org/bugzilla/show_bug.cgi?id=25263)
+
+Finally, switch the target address for lookups to the current function's
+return address. This avoids issues on some build configurations and
+platforms where the addresses Python library functions are behind a
+layer of indirection like the PLT. (See also the BUGS section of Linux
+man-pages' dladdr(3).)
---
- Modules/getpath.c | 52 ++++++++++++++++++++++++++++++++++++++++------
- Modules/getpath.py | 4 ++--
- 2 files changed, 48 insertions(+), 8 deletions(-)
+ Modules/getpath.c | 62 +++++++++++++++++++++++++++++++++++++++++-----
+ Modules/getpath.py | 4 +--
+ 2 files changed, 58 insertions(+), 8 deletions(-)
diff --git a/Modules/getpath.c b/Modules/getpath.c
-index 1e75993480a..72860807133 100644
+index 1e75993480a..347c21e7387 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -802,14 +802,19 @@ progname_to_dict(PyObject *dict, const char *key)
@@ -58,11 +64,13 @@ index 1e75993480a..72860807133 100644
#ifdef MS_WINDOWS
extern HMODULE PyWin_DLLhModule;
if (PyWin_DLLhModule) {
-@@ -817,12 +822,47 @@ library_to_dict(PyObject *dict, const char *key)
+@@ -817,12 +822,57 @@ library_to_dict(PyObject *dict, const char *key)
}
#endif
-+ const void *target = (void *)Py_Initialize;
++ const void *target = __builtin_extract_return_addr(
++ __builtin_return_address(0)
++ );
+
+#ifdef __linux__
+ /* Linux libcs do not reliably report the realpath in dladdr dli_fname and
@@ -84,11 +92,19 @@ index 1e75993480a..72860807133 100644
+ * TODO(geofft): Consider using PROCMAP_QUERY if supported.
+ */
+ uintptr_t low, high;
-+ char filename[PATH_MAX];
-+ while (fscanf(maps,
-+ "%lx-%lx %*s %*s %*s %*s %[^\n]",
-+ &low, &high, filename) == 3) {
++ char rest[PATH_MAX + 1];
++ while (fscanf(maps, "%lx-%lx %*s %*s %*s %*s", &low, &high) == 2) {
++ if (fgets(rest, PATH_MAX + 1, maps) == NULL) {
++ break;
++ }
++ if (strlen(rest) >= PATH_MAX) {
++ // If the line is too long our parsing will be out of sync.
++ break;
++ }
++
+ if (low <= (uintptr_t)target && (uintptr_t)target < high) {
++ // Skip past padding spaces in the filename.
++ const char *filename = rest + strspn(rest, " ");
+ if (filename[0] == '/') {
+ return decode_to_dict(dict, key, filename);
+ }
diff --git a/src/verify_distribution.py b/src/verify_distribution.py
index baeec2b..440ac9d 100644
--- a/src/verify_distribution.py
+++ b/src/verify_distribution.py
@@ -300,9 +300,9 @@ def assertPythonWorks(path: Path, argv0: str = None):
)
assertPythonWorks(venv / "bin" / "python")
- # TODO: does not yet work on ARM64
- # with self.subTest(msg="weird argv[0]"):
- # assertPythonWorks(sys.executable, argv0="/dev/null")
+ if sys.version_info[:2] >= (3, 14):
+ with self.subTest(msg="weird argv[0]"):
+ assertPythonWorks(sys.executable, argv0="/dev/null")
if __name__ == "__main__":
From 135c79e7acc2547f1316eb182a9bb4387a06ce66 Mon Sep 17 00:00:00 2001
From: Geoffrey Thomas
Date: Tue, 16 Dec 2025 16:37:42 -0500
Subject: [PATCH 64/66] Apply the getpath library name patch to 3.11+ (#924)
Backport the changes to library_to_dict() (the function we're patching
in 3.14) in Modules/getpath.c with the help of
git checkout -p v3.14.0 -- Modules/getpath.c
---
cpython-unix/build-cpython.sh | 8 +-
.../patch-python-getpath-backport-3.11.patch | 109 +++++++++++++++++
.../patch-python-getpath-backport-3.12.patch | 110 ++++++++++++++++++
.../patch-python-getpath-backport-3.13.patch | 109 +++++++++++++++++
...tch => patch-python-getpath-library.patch} | 0
src/verify_distribution.py | 5 +-
6 files changed, 336 insertions(+), 5 deletions(-)
create mode 100644 cpython-unix/patch-python-getpath-backport-3.11.patch
create mode 100644 cpython-unix/patch-python-getpath-backport-3.12.patch
create mode 100644 cpython-unix/patch-python-getpath-backport-3.13.patch
rename cpython-unix/{patch-python-getpath-3.14.patch => patch-python-getpath-library.patch} (100%)
diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh
index 2afeb13..e5f5c05 100755
--- a/cpython-unix/build-cpython.sh
+++ b/cpython-unix/build-cpython.sh
@@ -623,8 +623,12 @@ fi
# Adjust the Python startup logic (getpath.py) to properly locate the installation, even when
# invoked through a symlink or through an incorrect argv[0]. Because this Python is relocatable, we
# don't get to rely on the fallback to the compiled-in installation prefix.
-if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_14}" ]]; then
- patch -p1 -i "${ROOT}/patch-python-getpath-3.14.patch"
+if [[ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_11}" ]]; then
+ if [ -e "${ROOT}/patch-python-getpath-backport-${PYTHON_MAJMIN_VERSION}.patch" ]; then
+ # Sync the getpath logic in older minor releases to the current version.
+ patch -p1 -i "${ROOT}/patch-python-getpath-backport-${PYTHON_MAJMIN_VERSION}.patch"
+ fi
+ patch -p1 -i "${ROOT}/patch-python-getpath-library.patch"
fi
# Another, similar change to getpath: When reading inside a venv use the base_executable path to
diff --git a/cpython-unix/patch-python-getpath-backport-3.11.patch b/cpython-unix/patch-python-getpath-backport-3.11.patch
new file mode 100644
index 0000000..9f79b36
--- /dev/null
+++ b/cpython-unix/patch-python-getpath-backport-3.11.patch
@@ -0,0 +1,109 @@
+From fe34b57349c57df0f1443f622985b872807ad1a0 Mon Sep 17 00:00:00 2001
+From: Geoffrey Thomas
+Date: Tue, 16 Dec 2025 09:33:06 -0500
+Subject: [PATCH 1/1] Backport relevant parts of 3.14 getpath.c to 3.11
+Forwarded: not-needed
+
+---
+ Modules/getpath.c | 42 ++++++++++++++++--------------------------
+ configure.ac | 2 +-
+ pyconfig.h.in | 3 +++
+ 3 files changed, 20 insertions(+), 27 deletions(-)
+
+diff --git a/Modules/getpath.c b/Modules/getpath.c
+index 61d654065fd..7457f70109f 100644
+--- a/Modules/getpath.c
++++ b/Modules/getpath.c
+@@ -18,6 +18,10 @@
+ # include
+ #endif
+
++#ifdef HAVE_DLFCN_H
++# include
++#endif
++
+ /* Reference the precompiled getpath.py */
+ #include "../Python/frozen_modules/getpath.h"
+
+@@ -762,39 +766,25 @@ progname_to_dict(PyObject *dict, const char *key)
+ static int
+ library_to_dict(PyObject *dict, const char *key)
+ {
++/* macOS framework builds do not link against a libpython dynamic library, but
++ instead link against a macOS Framework. */
++#if defined(Py_ENABLE_SHARED) || defined(WITH_NEXT_FRAMEWORK)
++
+ #ifdef MS_WINDOWS
+ extern HMODULE PyWin_DLLhModule;
+ if (PyWin_DLLhModule) {
+ return winmodule_to_dict(dict, key, PyWin_DLLhModule);
+ }
+-#elif defined(WITH_NEXT_FRAMEWORK)
+- static char modPath[MAXPATHLEN + 1];
+- static int modPathInitialized = -1;
+- if (modPathInitialized < 0) {
+- modPathInitialized = 0;
+-
+- /* On Mac OS X we have a special case if we're running from a framework.
+- This is because the python home should be set relative to the library,
+- which is in the framework, not relative to the executable, which may
+- be outside of the framework. Except when we're in the build
+- directory... */
+- NSSymbol symbol = NSLookupAndBindSymbol("_Py_Initialize");
+- if (symbol != NULL) {
+- NSModule pythonModule = NSModuleForSymbol(symbol);
+- if (pythonModule != NULL) {
+- /* Use dylib functions to find out where the framework was loaded from */
+- const char *path = NSLibraryNameForModule(pythonModule);
+- if (path) {
+- strncpy(modPath, path, MAXPATHLEN);
+- modPathInitialized = 1;
+- }
+- }
+- }
+- }
+- if (modPathInitialized > 0) {
+- return decode_to_dict(dict, key, modPath);
++#endif
++
++#if HAVE_DLADDR
++ Dl_info libpython_info;
++ if (dladdr(&Py_Initialize, &libpython_info) && libpython_info.dli_fname) {
++ return decode_to_dict(dict, key, libpython_info.dli_fname);
+ }
+ #endif
++#endif
++
+ return PyDict_SetItemString(dict, key, Py_None) == 0;
+ }
+
+diff --git a/configure.ac b/configure.ac
+index 7b4000fa9c3..e1c537fd153 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -4594,7 +4594,7 @@ fi
+ # checks for library functions
+ AC_CHECK_FUNCS([ \
+ accept4 alarm bind_textdomain_codeset chmod chown clock close_range confstr \
+- copy_file_range ctermid dup dup3 execv explicit_bzero explicit_memset \
++ copy_file_range ctermid dladdr dup dup3 execv explicit_bzero explicit_memset \
+ faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
+ fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \
+ gai_strerror getegid getentropy geteuid getgid getgrgid getgrgid_r \
+diff --git a/pyconfig.h.in b/pyconfig.h.in
+index a8c35bba448..422a1cd0878 100644
+--- a/pyconfig.h.in
++++ b/pyconfig.h.in
+@@ -281,6 +281,9 @@
+ /* Define if you have the 'dirfd' function or macro. */
+ #undef HAVE_DIRFD
+
++/* Define to 1 if you have the 'dladdr' function. */
++#undef HAVE_DLADDR
++
+ /* Define to 1 if you have the header file. */
+ #undef HAVE_DLFCN_H
+
+--
+2.50.1 (Apple Git-155)
+
diff --git a/cpython-unix/patch-python-getpath-backport-3.12.patch b/cpython-unix/patch-python-getpath-backport-3.12.patch
new file mode 100644
index 0000000..79085f6
--- /dev/null
+++ b/cpython-unix/patch-python-getpath-backport-3.12.patch
@@ -0,0 +1,110 @@
+From 3cf84081c92fe6ea1edc24aa579b34a0934b3c2d Mon Sep 17 00:00:00 2001
+From: Geoffrey Thomas
+Date: Tue, 16 Dec 2025 09:32:12 -0500
+Subject: [PATCH 1/1] Backport relevant parts of 3.14 getpath.c to 3.12
+Forwarded: not-needed
+
+---
+ Modules/getpath.c | 42 +++++++++++++++---------------------------
+ configure.ac | 2 +-
+ pyconfig.h.in | 3 +++
+ 3 files changed, 19 insertions(+), 28 deletions(-)
+
+diff --git a/Modules/getpath.c b/Modules/getpath.c
+index 0a310000751..9cea2d7bd20 100644
+--- a/Modules/getpath.c
++++ b/Modules/getpath.c
+@@ -18,6 +18,10 @@
+ # include
+ #endif
+
++#ifdef HAVE_DLFCN_H
++# include
++#endif
++
+ /* Reference the precompiled getpath.py */
+ #include "../Python/frozen_modules/getpath.h"
+
+@@ -752,41 +756,25 @@ progname_to_dict(PyObject *dict, const char *key)
+ static int
+ library_to_dict(PyObject *dict, const char *key)
+ {
++/* macOS framework builds do not link against a libpython dynamic library, but
++ instead link against a macOS Framework. */
++#if defined(Py_ENABLE_SHARED) || defined(WITH_NEXT_FRAMEWORK)
++
+ #ifdef MS_WINDOWS
+-#ifdef Py_ENABLE_SHARED
+ extern HMODULE PyWin_DLLhModule;
+ if (PyWin_DLLhModule) {
+ return winmodule_to_dict(dict, key, PyWin_DLLhModule);
+ }
+ #endif
+-#elif defined(WITH_NEXT_FRAMEWORK)
+- static char modPath[MAXPATHLEN + 1];
+- static int modPathInitialized = -1;
+- if (modPathInitialized < 0) {
+- modPathInitialized = 0;
+-
+- /* On Mac OS X we have a special case if we're running from a framework.
+- This is because the python home should be set relative to the library,
+- which is in the framework, not relative to the executable, which may
+- be outside of the framework. Except when we're in the build
+- directory... */
+- NSSymbol symbol = NSLookupAndBindSymbol("_Py_Initialize");
+- if (symbol != NULL) {
+- NSModule pythonModule = NSModuleForSymbol(symbol);
+- if (pythonModule != NULL) {
+- /* Use dylib functions to find out where the framework was loaded from */
+- const char *path = NSLibraryNameForModule(pythonModule);
+- if (path) {
+- strncpy(modPath, path, MAXPATHLEN);
+- modPathInitialized = 1;
+- }
+- }
+- }
+- }
+- if (modPathInitialized > 0) {
+- return decode_to_dict(dict, key, modPath);
++
++#if HAVE_DLADDR
++ Dl_info libpython_info;
++ if (dladdr(&Py_Initialize, &libpython_info) && libpython_info.dli_fname) {
++ return decode_to_dict(dict, key, libpython_info.dli_fname);
+ }
+ #endif
++#endif
++
+ return PyDict_SetItemString(dict, key, Py_None) == 0;
+ }
+
+diff --git a/configure.ac b/configure.ac
+index 1a02d19f1b2..1177525f88f 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -4920,7 +4920,7 @@ fi
+ # checks for library functions
+ AC_CHECK_FUNCS([ \
+ accept4 alarm bind_textdomain_codeset chmod chown clock close_range confstr \
+- copy_file_range ctermid dup dup3 execv explicit_bzero explicit_memset \
++ copy_file_range ctermid dladdr dup dup3 execv explicit_bzero explicit_memset \
+ faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
+ fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \
+ gai_strerror getegid getentropy geteuid getgid getgrgid getgrgid_r \
+diff --git a/pyconfig.h.in b/pyconfig.h.in
+index df4d29fe549..f2f09a7ec8c 100644
+--- a/pyconfig.h.in
++++ b/pyconfig.h.in
+@@ -280,6 +280,9 @@
+ /* Define if you have the 'dirfd' function or macro. */
+ #undef HAVE_DIRFD
+
++/* Define to 1 if you have the 'dladdr' function. */
++#undef HAVE_DLADDR
++
+ /* Define to 1 if you have the header file. */
+ #undef HAVE_DLFCN_H
+
+--
+2.50.1 (Apple Git-155)
+
diff --git a/cpython-unix/patch-python-getpath-backport-3.13.patch b/cpython-unix/patch-python-getpath-backport-3.13.patch
new file mode 100644
index 0000000..d6c853d
--- /dev/null
+++ b/cpython-unix/patch-python-getpath-backport-3.13.patch
@@ -0,0 +1,109 @@
+From 3342daa091b0a8e6cf15fdaaa2c6fc2f9dcc8a60 Mon Sep 17 00:00:00 2001
+From: Geoffrey Thomas
+Date: Tue, 16 Dec 2025 09:29:55 -0500
+Subject: [PATCH 1/1] Backport relevant parts of 3.14 getpath.c to 3.13
+Forwarded: not-needed
+
+---
+ Modules/getpath.c | 38 +++++++++++++++-----------------------
+ configure.ac | 2 +-
+ pyconfig.h.in | 3 +++
+ 3 files changed, 19 insertions(+), 24 deletions(-)
+
+diff --git a/Modules/getpath.c b/Modules/getpath.c
+index d0128b20fae..50612432027 100644
+--- a/Modules/getpath.c
++++ b/Modules/getpath.c
+@@ -17,10 +17,13 @@
+ #endif
+
+ #ifdef __APPLE__
+-# include
+ # include
+ #endif
+
++#ifdef HAVE_DLFCN_H
++# include
++#endif
++
+ /* Reference the precompiled getpath.py */
+ #include "Python/frozen_modules/getpath.h"
+
+@@ -803,36 +806,25 @@ progname_to_dict(PyObject *dict, const char *key)
+ static int
+ library_to_dict(PyObject *dict, const char *key)
+ {
++/* macOS framework builds do not link against a libpython dynamic library, but
++ instead link against a macOS Framework. */
++#if defined(Py_ENABLE_SHARED) || defined(WITH_NEXT_FRAMEWORK)
++
+ #ifdef MS_WINDOWS
+-#ifdef Py_ENABLE_SHARED
+ extern HMODULE PyWin_DLLhModule;
+ if (PyWin_DLLhModule) {
+ return winmodule_to_dict(dict, key, PyWin_DLLhModule);
+ }
+ #endif
+-#elif defined(WITH_NEXT_FRAMEWORK)
+- static char modPath[MAXPATHLEN + 1];
+- static int modPathInitialized = -1;
+- if (modPathInitialized < 0) {
+- modPathInitialized = 0;
+-
+- /* On Mac OS X we have a special case if we're running from a framework.
+- This is because the python home should be set relative to the library,
+- which is in the framework, not relative to the executable, which may
+- be outside of the framework. Except when we're in the build
+- directory... */
+- Dl_info pythonInfo;
+- if (dladdr(&Py_Initialize, &pythonInfo)) {
+- if (pythonInfo.dli_fname) {
+- strncpy(modPath, pythonInfo.dli_fname, MAXPATHLEN);
+- modPathInitialized = 1;
+- }
+- }
+- }
+- if (modPathInitialized > 0) {
+- return decode_to_dict(dict, key, modPath);
++
++#if HAVE_DLADDR
++ Dl_info libpython_info;
++ if (dladdr(&Py_Initialize, &libpython_info) && libpython_info.dli_fname) {
++ return decode_to_dict(dict, key, libpython_info.dli_fname);
+ }
+ #endif
++#endif
++
+ return PyDict_SetItemString(dict, key, Py_None) == 0;
+ }
+
+diff --git a/configure.ac b/configure.ac
+index 94776540d1b..fbc6cfd0de4 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -5217,7 +5217,7 @@ fi
+ # checks for library functions
+ AC_CHECK_FUNCS([ \
+ accept4 alarm bind_textdomain_codeset chmod chown clock closefrom close_range confstr \
+- copy_file_range ctermid dup dup3 execv explicit_bzero explicit_memset \
++ copy_file_range ctermid dladdr dup dup3 execv explicit_bzero explicit_memset \
+ faccessat fchmod fchmodat fchown fchownat fdopendir fdwalk fexecve \
+ fork fork1 fpathconf fstatat ftime ftruncate futimens futimes futimesat \
+ gai_strerror getegid geteuid getgid getgrent getgrgid getgrgid_r \
+diff --git a/pyconfig.h.in b/pyconfig.h.in
+index e18a6426b06..10b0cc1dafd 100644
+--- a/pyconfig.h.in
++++ b/pyconfig.h.in
+@@ -284,6 +284,9 @@
+ /* Define if you have the 'dirfd' function or macro. */
+ #undef HAVE_DIRFD
+
++/* Define to 1 if you have the 'dladdr' function. */
++#undef HAVE_DLADDR
++
+ /* Define to 1 if you have the header file. */
+ #undef HAVE_DLFCN_H
+
+--
+2.50.1 (Apple Git-155)
+
diff --git a/cpython-unix/patch-python-getpath-3.14.patch b/cpython-unix/patch-python-getpath-library.patch
similarity index 100%
rename from cpython-unix/patch-python-getpath-3.14.patch
rename to cpython-unix/patch-python-getpath-library.patch
diff --git a/src/verify_distribution.py b/src/verify_distribution.py
index 440ac9d..1e2ce0b 100644
--- a/src/verify_distribution.py
+++ b/src/verify_distribution.py
@@ -300,9 +300,8 @@ def assertPythonWorks(path: Path, argv0: str = None):
)
assertPythonWorks(venv / "bin" / "python")
- if sys.version_info[:2] >= (3, 14):
- with self.subTest(msg="weird argv[0]"):
- assertPythonWorks(sys.executable, argv0="/dev/null")
+ with self.subTest(msg="weird argv[0]"):
+ assertPythonWorks(sys.executable, argv0="/dev/null")
if __name__ == "__main__":
From 85fdc74d0153799b6807702865a8a29df3ced47a Mon Sep 17 00:00:00 2001
From: "Jonathan J. Helmus"
Date: Wed, 17 Dec 2025 14:47:10 -0600
Subject: [PATCH 65/66] Update to CPython 3.15.0a3 (#927)
---
cpython-unix/build-cpython.sh | 13 ++++++++---
cpython-unix/extension-modules.yml | 16 ++++++++++++--
.../patch-checksharedmods-disable-3.15.patch | 13 +++++++++++
...ch-configure-disable-stdlib-mod-3.12.patch | 22 ++++++++-----------
pythonbuild/cpython.py | 13 +++++++++--
pythonbuild/downloads.py | 8 +++----
6 files changed, 61 insertions(+), 24 deletions(-)
create mode 100644 cpython-unix/patch-checksharedmods-disable-3.15.patch
diff --git a/cpython-unix/build-cpython.sh b/cpython-unix/build-cpython.sh
index e5f5c05..01abca1 100755
--- a/cpython-unix/build-cpython.sh
+++ b/cpython-unix/build-cpython.sh
@@ -96,7 +96,8 @@ fi
# TODO this may not be needed after removing support for i686 builds. But it
# may still be useful since CPython's definition of cross-compiling has historically
# been very liberal and kicks in when it arguably shouldn't.
-if [ -n "${CROSS_COMPILING}" ]; then
+# Merged upstream in Python 3.15, https://github.com/python/cpython/pull/141958
+if [[ -n "${CROSS_COMPILING}" && -n "${PYTHON_MEETS_MAXIMUM_VERSION_3_14}" ]]; then
if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_14}" ]; then
patch -p1 -i ${ROOT}/patch-dont-clear-runshared-14.patch
elif [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_13}" ]; then
@@ -229,6 +230,10 @@ fi
# everything.
if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_11}" ]; then
if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then
+ # This sets MODULE__STATE=disabled in the Makefile for all extension
+ # modules that are not unavailable (n/a) based on the platform.
+ # Valid STATE variables are needed to create the _missing_stdlib_info.py
+ # file during the build in Python 3.15+
patch -p1 -i ${ROOT}/patch-configure-disable-stdlib-mod-3.12.patch
else
patch -p1 -i ${ROOT}/patch-configure-disable-stdlib-mod.patch
@@ -270,7 +275,9 @@ fi
# the configure-based module building and replacing it with our
# own Setup-derived version completely breaks assumptions in this
# script. So leave it off for now... at our own peril.
-if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then
+if [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_15}" ]; then
+ patch -p1 -i ${ROOT}/patch-checksharedmods-disable-3.15.patch
+elif [ -n "${PYTHON_MEETS_MINIMUM_VERSION_3_12}" ]; then
patch -p1 -i ${ROOT}/patch-checksharedmods-disable.patch
fi
@@ -1228,7 +1235,7 @@ ${BUILD_PYTHON} ${ROOT}/fix_shebangs.py ${ROOT}/out/python/install
# downstream consumers.
OBJECT_DIRS="Objects Parser Parser/lexer Parser/pegen Parser/tokenizer Programs Python Python/deepfreeze"
OBJECT_DIRS="${OBJECT_DIRS} Modules"
-for ext in _blake2 cjkcodecs _ctypes _ctypes/darwin _decimal _expat _hacl _io _multiprocessing _sha3 _sqlite _sre _testinternalcapi _xxtestfuzz _zstd; do
+for ext in _blake2 cjkcodecs _ctypes _ctypes/darwin _decimal _expat _hacl _io _multiprocessing _remote_debugging _sha3 _sqlite _sre _testinternalcapi _xxtestfuzz _zstd; do
OBJECT_DIRS="${OBJECT_DIRS} Modules/${ext}"
done
diff --git a/cpython-unix/extension-modules.yml b/cpython-unix/extension-modules.yml
index 1fb0860..739cf08 100644
--- a/cpython-unix/extension-modules.yml
+++ b/cpython-unix/extension-modules.yml
@@ -431,8 +431,20 @@ _random:
_remote_debugging:
minimum-python-version: "3.14"
- sources:
- - _remote_debugging_module.c
+ sources-conditional:
+ - sources:
+ - _remote_debugging_module.c
+ maximum-python-version: "3.14"
+ - sources:
+ - _remote_debugging/module.c
+ - _remote_debugging/object_reading.c
+ - _remote_debugging/code_objects.c
+ - _remote_debugging/frames.c
+ - _remote_debugging/frame_cache.c
+ - _remote_debugging/threads.c
+ - _remote_debugging/asyncio.c
+ - _remote_debugging/subprocess.c
+ minimum-python-version: "3.15"
_scproxy:
# _scproxy is Apple OS only.
diff --git a/cpython-unix/patch-checksharedmods-disable-3.15.patch b/cpython-unix/patch-checksharedmods-disable-3.15.patch
new file mode 100644
index 0000000..18952a0
--- /dev/null
+++ b/cpython-unix/patch-checksharedmods-disable-3.15.patch
@@ -0,0 +1,13 @@
+diff --git a/Makefile.pre.in b/Makefile.pre.in
+index a6beb96d12a..bb4e1ecd49b 100644
+--- a/Makefile.pre.in
++++ b/Makefile.pre.in
+@@ -1610,7 +1610,7 @@ checksharedmods: sharedmods $(PYTHON_FOR_BUILD_DEPS) $(BUILDPYTHON)
+ else \
+ $(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py --generate-missing-stdlib-info; \
+ fi
+- @$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py
++ @echo "module checking disabled"
+
+ .PHONY: rundsymutil
+ rundsymutil: sharedmods $(PYTHON_FOR_BUILD_DEPS) $(BUILDPYTHON)
diff --git a/cpython-unix/patch-configure-disable-stdlib-mod-3.12.patch b/cpython-unix/patch-configure-disable-stdlib-mod-3.12.patch
index 3f0266e..675c310 100644
--- a/cpython-unix/patch-configure-disable-stdlib-mod-3.12.patch
+++ b/cpython-unix/patch-configure-disable-stdlib-mod-3.12.patch
@@ -1,30 +1,26 @@
diff --git a/configure.ac b/configure.ac
-index ba768aea93..031d5c897f 100644
+index a284a118f02..7e536c41fda 100644
--- a/configure.ac
+++ b/configure.ac
-@@ -7288,13 +7288,7 @@ dnl sets MODULE_$NAME_CFLAGS and MODULE_$NAME_LDFLAGS
- AC_DEFUN([PY_STDLIB_MOD], [
- AC_MSG_CHECKING([for stdlib extension module $1])
+@@ -7859,11 +7859,7 @@ AC_DEFUN([PY_STDLIB_MOD], [
m4_pushdef([modcond], [MODULE_]m4_toupper([$1]))dnl
-- m4_pushdef([modstate], [py_cv_module_$1])dnl
-- dnl Check if module has been disabled by PY_STDLIB_MOD_SET_NA()
+ m4_pushdef([modstate], [py_cv_module_$1])dnl
+ dnl Check if module has been disabled by PY_STDLIB_MOD_SET_NA()
- AS_IF([test "$modstate" != "n/a"], [
- AS_IF([m4_ifblank([$2], [true], [$2])],
- [AS_IF([m4_ifblank([$3], [true], [$3])], [modstate=yes], [modstate=missing])],
- [modstate=disabled])
- ])
-+ m4_pushdef([modstate], [disabled])dnl
++ AS_IF([test "$modstate" != "n/a"], [modstate=disabled])
_MODULE_BLOCK_ADD(modcond[_STATE], [$modstate])
AS_VAR_IF([modstate], [yes], [
m4_ifblank([$4], [], [_MODULE_BLOCK_ADD([MODULE_]m4_toupper([$1])[_CFLAGS], [$4])])
-@@ -7312,9 +7306,7 @@ dnl PY_STDLIB_MOD_SIMPLE([NAME], [CFLAGS], [LDFLAGS])
- dnl cflags and ldflags are optional
- AC_DEFUN([PY_STDLIB_MOD_SIMPLE], [
+@@ -7883,7 +7879,7 @@ AC_DEFUN([PY_STDLIB_MOD_SIMPLE], [
m4_pushdef([modcond], [MODULE_]m4_toupper([$1]))dnl
-- m4_pushdef([modstate], [py_cv_module_$1])dnl
-- dnl Check if module has been disabled by PY_STDLIB_MOD_SET_NA()
+ m4_pushdef([modstate], [py_cv_module_$1])dnl
+ dnl Check if module has been disabled by PY_STDLIB_MOD_SET_NA()
- AS_IF([test "$modstate" != "n/a"], [modstate=yes])
-+ m4_pushdef([modstate], [disabled])dnl
++ AS_IF([test "$modstate" != "n/a"], [modstate=disabled])
AM_CONDITIONAL(modcond, [test "$modstate" = yes])
_MODULE_BLOCK_ADD(modcond[_STATE], [$modstate])
AS_VAR_IF([modstate], [yes], [
diff --git a/pythonbuild/cpython.py b/pythonbuild/cpython.py
index bd7213b..6ff60ab 100644
--- a/pythonbuild/cpython.py
+++ b/pythonbuild/cpython.py
@@ -53,6 +53,7 @@
"type": "object",
"properties": {
"path": {"type": "string"},
+ "includes": {"type": "array", "items": {"type": "string"}},
"targets": {"type": "array", "items": {"type": "string"}},
"minimum-python-version": {"type": "string"},
"maximum-python-version": {"type": "string"},
@@ -109,12 +110,20 @@
"type": "object",
"properties": {
"source": {"type": "string"},
+ "sources": {"type": "array", "items": {"type": "string"}},
"targets": {"type": "array", "items": {"type": "string"}},
"minimum-python-version": {"type": "string"},
"maximum-python-version": {"type": "string"},
},
"additionalProperties": False,
- "required": ["source"],
+ "oneOf": [
+ {
+ "required": ["source"],
+ },
+ {
+ "required": ["sources"],
+ },
+ ],
},
},
},
@@ -124,7 +133,7 @@
EXTENSION_MODULES_SCHEMA = {
"type": "object",
"patternProperties": {
- "^[a-z_]+$": EXTENSION_MODULE_SCHEMA,
+ "^[a-z0-9_]+$": EXTENSION_MODULE_SCHEMA,
},
}
diff --git a/pythonbuild/downloads.py b/pythonbuild/downloads.py
index 7c2184e..1d2ec65 100644
--- a/pythonbuild/downloads.py
+++ b/pythonbuild/downloads.py
@@ -93,10 +93,10 @@
"python_tag": "cp314",
},
"cpython-3.15": {
- "url": "https://www.python.org/ftp/python/3.15.0/Python-3.15.0a2.tar.xz",
- "size": 23728836,
- "sha256": "d8a0a2f4a7f3d7090cf195e81814efe95f70554955557f40e149d8694a662751",
- "version": "3.15.0a2",
+ "url": "https://www.python.org/ftp/python/3.15.0/Python-3.15.0a3.tar.xz",
+ "size": 34723712,
+ "sha256": "6ab02cdac24505779877bb1d9189432d67e90ddf2a9b8b7b373ead54ac07b607",
+ "version": "3.15.0a3",
"licenses": ["Python-2.0", "CNRI-Python"],
"license_file": "LICENSE.cpython.txt",
"python_tag": "cp315",
From de54d2de355998491763f49bd9348d66b2ba6fe9 Mon Sep 17 00:00:00 2001
From: "Jonathan J. Helmus"
Date: Fri, 19 Dec 2025 10:53:15 -0600
Subject: [PATCH 66/66] fix list block in contributing (#929)
---
CONTRIBUTING.rst | 1 +
1 file changed, 1 insertion(+)
diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst
index b0125ff..d4bbaa3 100644
--- a/CONTRIBUTING.rst
+++ b/CONTRIBUTING.rst
@@ -18,6 +18,7 @@ distributions built by applying specific labels to your pull request. Only
distributions matching the specified labels will be built.
The following label prefixes can be used to customize the build matrix:
+
* `platform`
* `python`
* `build`