diff --git a/README.rst b/README.rst index a5f445e9..de5208ae 100644 --- a/README.rst +++ b/README.rst @@ -6,7 +6,7 @@ Copyright @ 2012-2013 Pierre Raybaut Copyright @ 2014-2025+ The Winpython development team https://github.com/winpython/ Licensed under the terms of the MIT License -(see winpython/__init__.py for details) +(see wppm/__init__.py for details) Overview @@ -15,21 +15,26 @@ Overview WinPython is a portable distribution of the Python programming language for Windows (https://winpython.github.io). -This is the `winpython` Python package, not the distribution itself. +This is the `wppm` Python package and build toolchain repository, not the distribution itself. It includes two main features: WinPython Package Manager (WPPM) - a complementary tool to navigate provided package list or register WinPython. - pip is the recommanded way to add or remove packages + a complementary tool to navigate provided packages, install packages from included Wheelhouse, or register WinPython. + pip is the recommanded way to add or remove packages otherwise WinPython build toolchain - make.py is the script used to + generate_a_winpython_distro.bat and make.py are the toolchain used to build a WinPython distribution from (almost) scratch. +WinPython set of Wheel + You can get also the equivalent of the WinPython distribution by using one of the provided pylock.toml + or by using provided requirements-with-hash.txt until pip does support pylock.toml files + + Dependencies ------------ -* Python3 >= 3.9 +* Python3 >= 3.10 Requirements @@ -38,26 +43,33 @@ Requirements * installer can be 7-Zip or nothing (just .zip-it) -Installation ------------- +Wppm build +---------- From the source package (see section 'Building dependencies'), you may -install WinPython using the following commands: +build WPPM using the following commands: **python -m pip install flit** **python -m flit build** -**python -m pip install --no-index --trusted-host=None --find-links=.\dist winpython** +Winpython Distribution wheels installation +------------------------------------------ + +To only install the wheels assembled per WinPython Distribution, you may +**python -m pip install --no-deps --require-hashes https://github.com/winpython/winpython/releases/download/16.6.20250620final/requir.64-3_13_5_0slim.txt + +A pylock file is also available, when you package manager can handle it +**https://github.com/winpython/winpython/releases/download/16.6.20250620final/pylock.64-3_13_5_0slim.toml But the easiest way to install the last stable release of WinPython is -by using an executable installer: https://winpython.github.io/ +by using a zipped distribution with or without auto-extractor: https://winpython.github.io/ More informations ----------------- * Downloads: https://sourceforge.net/projects/winpython/files/ or https://github.com/winpython/winpython/releases -* Development, bug reports and feature requests: https://github.com/winpython/winpython +* Development, bug reports, discussions and feature requests: https://github.com/winpython/winpython -* Discussions: https://groups.google.com/group/winpython +* Discussions: https://github.com/winpython/winpython/discussions diff --git a/changelogs/WinPythondot-64bit-3.12.10.1.md b/changelogs/WinPythondot-64bit-3.12.10.1.md new file mode 100644 index 00000000..75cf9d16 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.12.10.1.md @@ -0,0 +1,36 @@ +## WinPython 3.12.10.1dot + +The following packages are included in WinPython-64bit v3.12.10.1dot 3.10.11.1dot. + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.10 | Python programming language with standard library + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 25.0 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 16.5.20250614 | WinPython distribution tools, including WPPM + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ + + +
diff --git a/changelogs/WinPythondot-64bit-3.12.10.1_History.md b/changelogs/WinPythondot-64bit-3.12.10.1_History.md new file mode 100644 index 00000000..1b70bafc --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.12.10.1_History.md @@ -0,0 +1,34 @@ +## History of changes for WinPython-64bit 3.12.10.1dot + +The following changes were made to WinPython-64bit distribution since version 3.12.10.0dot. + + +
+ +### Tools + + +New packages: + * Python 3.12.10 (Python programming language with standard library) + +### Python packages + + +Upgraded packages: + * packaging 24.2 → 25.0 (Core utilities for Python packages) + * pip 25.0.1 → 25.1.1 (The PyPA recommended tool for installing Python packages.) + * setuptools 75.8.2 → 79.0.1 (Easily download, build, install, upgrade, and uninstall Python packages) + * winpython 15.3.20250425 → 16.5.20250614 (WinPython distribution tools, including WPPM) + +Removed packages: + * Python 3.12.10 (Python programming language with standard library) + +### WheelHouse packages + + +No differences found. + + +
+ +* * * diff --git a/changelogs/WinPythondot-64bit-3.13.5.0.md b/changelogs/WinPythondot-64bit-3.13.5.0.md new file mode 100644 index 00000000..e012294a --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.13.5.0.md @@ -0,0 +1,36 @@ +## WinPython 3.13.5.0dot + +The following packages are included in WinPython-64bit v3.13.5.0dot 3.10.11.1dot. + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.13.5 | Python programming language with standard library + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 25.0 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 16.6.20250620 | WinPython distribution tools, including WPPM + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ + + +
diff --git a/changelogs/WinPythondot-64bit-3.13.5.0_History.md b/changelogs/WinPythondot-64bit-3.13.5.0_History.md new file mode 100644 index 00000000..fb07f130 --- /dev/null +++ b/changelogs/WinPythondot-64bit-3.13.5.0_History.md @@ -0,0 +1,34 @@ +## History of changes for WinPython-64bit 3.13.5.0dot + +The following changes were made to WinPython-64bit distribution since version 3.13.3.0dot. + + +
+ +### Tools + + +New packages: + * Python 3.13.5 (Python programming language with standard library) + +### Python packages + + +Upgraded packages: + * packaging 24.2 → 25.0 (Core utilities for Python packages) + * pip 25.0.1 → 25.1.1 (The PyPA recommended tool for installing Python packages.) + * setuptools 75.8.2 → 79.0.1 (Easily download, build, install, upgrade, and uninstall Python packages) + * winpython 15.3.20250425 → 16.6.20250620 (WinPython distribution tools, including WPPM) + +Removed packages: + * Python 3.13.3 (Python programming language with standard library) + +### WheelHouse packages + + +No differences found. + + +
+ +* * * diff --git a/changelogs/WinPythondot-64bit-3.14.0.0.md b/changelogs/WinPythondot-64bit-3.14.0.0.md index a97b3e37..32acdb7e 100644 --- a/changelogs/WinPythondot-64bit-3.14.0.0.md +++ b/changelogs/WinPythondot-64bit-3.14.0.0.md @@ -1,6 +1,6 @@ ## WinPython 3.14.0.0dot -The following packages are included in WinPython-64bit v3.14.0.0dot a5b. +The following packages are included in WinPython-64bit v3.14.0.0dot b3.
@@ -8,21 +8,29 @@ The following packages are included in WinPython-64bit v3.14.0.0dot a5b. Name | Version | Description -----|---------|------------ +[Python](http://www.python.org/) | 3.14.0b3 | Python programming language with standard library ### Python packages Name | Version | Description -----|---------|------------ -[Python](http://www.python.org/) | 3.14.0 | Python programming language with standard library [build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend [colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. -[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages -[pip](https://pypi.org/project/pip) | 25.0.1 | The PyPA recommended tool for installing Python packages. -[pyproject_hooks](https://pypi.org/project/pyproject_hooks) | 1.1.0 | Wrappers to call pyproject.toml-based build backend hooks. -[setuptools](https://pypi.org/project/setuptools) | 75.6.0 | Easily download, build, install, upgrade, and uninstall Python packages -[sqlite_bro](https://pypi.org/project/sqlite_bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[packaging](https://pypi.org/project/packaging) | 25.0 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI [wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python -[winpython](https://pypi.org/project/winpython) | 13.1.20250222 | WinPython distribution tools, including WPPM +[winpython](https://pypi.org/project/winpython) | 16.6.20250620 | WinPython distribution tools, including WPPM + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ +
diff --git a/changelogs/WinPythondot-64bit-3.14.0.0_History.md b/changelogs/WinPythondot-64bit-3.14.0.0_History.md index 5b7848f1..d692feba 100644 --- a/changelogs/WinPythondot-64bit-3.14.0.0_History.md +++ b/changelogs/WinPythondot-64bit-3.14.0.0_History.md @@ -1,8 +1,26 @@ -## History of changes for WinPython-64bit 3.14.0.0dot +## History of changes for WinPython-64bit 3.14.0.0dot -The following changes were made to WinPython-64bit distribution since version 3.14.0.0dot. - -
- -
-* * * +The following changes were made to WinPython-64bit distribution since version 3.13.5.0dot. + + +
+ +### Tools + + +Upgraded packages: + +### Python packages + + +No differences found. + +### WheelHouse packages + + +No differences found. + + +
+ +* * * diff --git a/changelogs/WinPythonfree-64bit-3.14.0.0.md b/changelogs/WinPythonfree-64bit-3.14.0.0.md new file mode 100644 index 00000000..763af9fc --- /dev/null +++ b/changelogs/WinPythonfree-64bit-3.14.0.0.md @@ -0,0 +1,36 @@ +## WinPython 3.14.0.0free + +The following packages are included in WinPython-64bit v3.14.0.0free b3. + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.14.0b3 | Python programming language with standard library + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 25.0 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 16.6.20250620 | WinPython distribution tools, including WPPM + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ + + +
diff --git a/changelogs/WinPythonfree-64bit-3.14.0.0_History.md b/changelogs/WinPythonfree-64bit-3.14.0.0_History.md new file mode 100644 index 00000000..e70c94b5 --- /dev/null +++ b/changelogs/WinPythonfree-64bit-3.14.0.0_History.md @@ -0,0 +1,58 @@ +## History of changes for WinPython-64bit 3.14.0.0free + +The following changes were made to WinPython-64bit distribution since version 3.13.0.1free. + + +
+ +### Tools + + +New packages: + * Python 3.14.0b3 (Python programming language with standard library) + +### Python packages + + +New packages: + * sv-ttk 2.6.0 (A gorgeous theme for Tkinter, based on Windows 11's UI) + +Upgraded packages: + * build 1.2.1 → 1.2.2.post1 (A simple, correct Python build frontend) + * packaging 24.1 → 25.0 (Core utilities for Python packages) + * pip 24.2 → 25.1.1 (The PyPA recommended tool for installing Python packages.) + * setuptools 72.2.0 → 79.0.1 (Easily download, build, install, upgrade, and uninstall Python packages) + * wheel 0.44.0 → 0.45.1 (A built-package format for Python) + * winpython 10.7.20240908 → 16.6.20250620 (WinPython distribution tools, including WPPM) + +Removed packages: + * Python 3.13.0 (Python programming language with standard library) + * appdirs 1.4.4 (A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir".) + * asttokens 2.4.1 (Annotate AST trees with source code positions) + * cython 3.1.0a0 (The Cython compiler for writing C extensions in the Python language.) + * decorator 5.1.1 (Decorators for Humans) + * executing 2.0.1 (Get the currently executing AST node of a frame, and other information) + * interpreters_pep_734 0.1.0 (Use this module to try out multiple interpreters and a per-interpreter GIL in Python 3.13+. Do not use this for anything important yet.) + * ipython 8.26.0 (IPython: Productive Interactive Computing) + * jedi 0.19.1 (An autocompletion tool for Python that can be used for text editors.) + * matplotlib_inline 0.1.7 (Inline Matplotlib backend for Jupyter) + * msvc_runtime 14.40.33807 (Install the Microsoft™ Visual C++™ runtime DLLs to the sys.prefix and Scripts directories) + * parso 0.8.4 (A Python Parser) + * prompt_toolkit 3.0.47 (Library for building powerful interactive command lines in Python) + * ptpython 3.0.29 (Python REPL build on top of prompt_toolkit) + * pure_eval 0.2.2 (Safely evaluate AST nodes without side effects) + * pygments 2.18.0 (Pygments is a syntax highlighting package written in Python.) + * six 1.16.0 (Python 2 and 3 compatibility utilities) + * stack_data 0.6.3 (Extract data from python stack frames and tracebacks for informative displays) + * traitlets 5.14.1 (Traitlets Python configuration system) + * wcwidth 0.2.13 (Measures the displayed width of unicode strings in a terminal) + +### WheelHouse packages + + +No differences found. + + +
+ +* * * diff --git a/changelogs/WinPythonslim-64bit-3.12.10.1.md b/changelogs/WinPythonslim-64bit-3.12.10.1.md new file mode 100644 index 00000000..7c78fc18 --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.12.10.1.md @@ -0,0 +1,528 @@ +## WinPython 3.12.10.1slim + +The following packages are included in WinPython-64bit v3.12.10.1slim 3.10.11.1dot. + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ +[Pandoc](https://pandoc.org) | 3.1.9 | an universal document converter +[Python](http://www.python.org/) | 3.12.10 | Python programming language with standard library + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[absl-py](https://pypi.org/project/absl-py) | 2.2.2 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc-driver-manager](https://pypi.org/project/adbc-driver-manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.6.1 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.18 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.2 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.15.2 | A database migration tool for SQLAlchemy. +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[annotated-types](https://pypi.org/project/annotated-types) | 0.7.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.51.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.9.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.18 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argcomplete](https://pypi.org/project/argcomplete) | 3.6.2 | Bash tab completion for argparse +[argon2-cffi](https://pypi.org/project/argon2-cffi) | 23.1.0 | Argon2 for Python +[argon2-cffi-bindings](https://pypi.org/project/argon2-cffi-bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array-api-compat](https://pypi.org/project/array-api-compat) | 1.12.0 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi-csrf](https://pypi.org/project/asgi-csrf) | 0.11 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 1.0.5 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.3.9 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy-iers-data](https://pypi.org/project/astropy-iers-data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 3.0.0 | Annotate AST trees with source code positions +[async-lru](https://pypi.org/project/async-lru) | 2.0.5 | Simple LRU cache for asyncio +[asyncssh](https://pypi.org/project/asyncssh) | 2.20.0 | AsyncSSH: Asynchronous SSHv2 client and server library +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 25.3.0 | Classes Without Boilerplate +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure-core](https://pypi.org/project/azure-core) | 1.32.0 | Microsoft Azure Core Library for Python +[azure-cosmos](https://pypi.org/project/azure-cosmos) | 4.9.0 | Microsoft Azure Cosmos Client Library for Python +[azure-identity](https://pypi.org/project/azure-identity) | 1.21.0 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.17.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 1.0.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.3.0 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.13.3 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 25.1.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.2.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.9.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.7.3 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.1 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachetools](https://pypi.org/project/cachetools) | 5.5.2 | Extensible memoizing collections and decorators +[certifi](https://pypi.org/project/certifi) | 2025.1.31 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset-normalizer](https://pypi.org/project/charset-normalizer) | 3.4.2 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.8 | Composable command line interface toolkit +[click-default-group](https://pypi.org/project/click-default-group) | 1.2.4 | click_default_group +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.1.1 | Pickler class to extend the standard pickle.Pickler functionality +[cohere](https://pypi.org/project/cohere) | 5.15.0 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | Collection of perceptually uniform colormaps +[colorlog](https://pypi.org/project/colorlog) | 6.9.0 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.2 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g. +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | Convex optimization package +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.4 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.1.1 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2025.4.1 | Parallel PyData with Task Scheduling +[datasette](https://pypi.org/project/datasette) | 0.65.1 | An open source multi-tool for exploring and publishing data +[datasette-graphql](https://pypi.org/project/datasette-graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[datashader](https://pypi.org/project/datashader) | 0.17.0 | Data visualization toolchain based on aggregating into a grid +[deap](https://pypi.org/project/deap) | 1.4.2 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.13 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.2.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[deprecated](https://pypi.org/project/deprecated) | 1.2.14 | Python @deprecated decorator to deprecate old python classes, functions or methods. +[diff-match-patch](https://pypi.org/project/diff-match-patch) | 20241021 | Repackaging of Google's Diff Match and Patch libraries. +[dill](https://pypi.org/project/dill) | 0.4.0 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2025.4.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.9.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.2 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.7.0 | DNS toolkit +[docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) | 0.17 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.21.2 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.3.0 | DuckDB in-process database +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et-xmlfile](https://pypi.org/project/et-xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval-type-backport](https://pypi.org/project/eval-type-backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.2.0 | Get the currently executing AST node of a frame, and other information +[faker](https://pypi.org/project/faker) | 37.1.0 | Faker is a Python package that generates fake data for you. +[fasta2a](https://pypi.org/project/fasta2a) | 0.2.9 | Convert an AI Agent into a A2A server! ✨ +[fastapi](https://pypi.org/project/fastapi) | 0.115.12 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | Fast read/write of AVRO files +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.21.1 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.18.0 | A platform independent file lock. +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.1.0 | A simple framework for building complex web applications. +[flexcache](https://pypi.org/project/flexcache) | 0.3 | Saves and loads to the cache a transformed versions of a source object. +[flexparser](https://pypi.org/project/flexparser) | 0.4 | Parsing made fun ... using typing. +[flit](https://pypi.org/project/flit) | 3.12.0 | A simple packaging tool for simple packages. +[flit-core](https://pypi.org/project/flit-core) | 3.12.0 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.19.5 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.57.0 | Tools to manipulate font files +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2025.3.2 | File-system specification +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.12 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.44 | GitPython is a Python library used to interact with Git repositories +[google-auth](https://pypi.org/project/google-auth) | 2.38.0 | Google Authentication Library +[google-genai](https://pypi.org/project/google-genai) | 1.16.1 | GenAI Python SDK +[graphene](https://pypi.org/project/graphene) | 3.4.3 | GraphQL Framework for Python +[graphql-core](https://pypi.org/project/graphql-core) | 3.2.6 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql-relay](https://pypi.org/project/graphql-relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.7.2 | Signatures for entire Python programs. +[groq](https://pypi.org/project/groq) | 0.25.0 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.9.0 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.2.0 | Pure-Python HTTP/2 protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[holoviews](https://pypi.org/project/holoviews) | 1.20.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hpack](https://pypi.org/project/hpack) | 4.1.0 | Pure-Python HPACK header encoding +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.7 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.28.1 | The next generation HTTP client. +[httpx-sse](https://pypi.org/project/httpx-sse) | 0.4.0 | Consume Server-Sent Event (SSE) messages with HTTPX. +[huggingface-hub](https://pypi.org/project/huggingface-hub) | 0.33.0 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12.1 | Integrated process monitor for developing and reloading daemons. +[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hypercorn](https://pypi.org/project/hypercorn) | 0.17.3 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.1.0 | Pure-Python HTTP/2 framing +[hypothesis](https://pypi.org/project/hypothesis) | 6.130.4 | A library for property-based testing +[id](https://pypi.org/project/id) | 1.5.0 | A tool for generating OIDC identities +[idna](https://pypi.org/project/idna) | 3.10 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.37.0 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced-learn](https://pypi.org/project/imbalanced-learn) | 0.13.0 | Toolbox for imbalanced dataset in machine learning +[importlib-metadata](https://pypi.org/project/importlib-metadata) | 8.6.1 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.1.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.1.0 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.7 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.36.0 | IPython: Productive Interactive Computing +[ipython-genutils](https://pypi.org/project/ipython-genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython-sql](https://pypi.org/project/ipython-sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.6 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 2.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco-classes](https://pypi.org/project/jaraco-classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco-context](https://pypi.org/project/jaraco-context) | 6.0.1 | Useful decorators and context managers +[jaraco-functools](https://pypi.org/project/jaraco-functools) | 4.1.0 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.2 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.6 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.9.0 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.10.0 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpointer](https://pypi.org/project/jsonpointer) | 3.0.0 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.23.0 | An implementation of JSON Schema validation for Python +[jsonschema-specifications](https://pypi.org/project/jsonschema-specifications) | 2024.10.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter-bokeh](https://pypi.org/project/jupyter-bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter-client](https://pypi.org/project/jupyter-client) | 8.6.3 | Jupyter protocol implementation and client libraries +[jupyter-console](https://pypi.org/project/jupyter-console) | 6.6.3 | Jupyter terminal console +[jupyter-core](https://pypi.org/project/jupyter-core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter-events](https://pypi.org/project/jupyter-events) | 0.12.0 | Jupyter Event System library +[jupyter-leaflet](https://pypi.org/project/jupyter-leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter-lsp](https://pypi.org/project/jupyter-lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter-server](https://pypi.org/project/jupyter-server) | 2.15.0 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter-server-terminals](https://pypi.org/project/jupyter-server-terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.4.2 | JupyterLab computational environment +[jupyterlab-pygments](https://pypi.org/project/jupyterlab-pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab-server](https://pypi.org/project/jupyterlab-server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) | 3.0.14 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.10.0 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.6.0 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.25 | Building applications with LLMs through composability +[langchain-core](https://pypi.org/project/langchain-core) | 0.3.59 | Building applications with LLMs through composability +[langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) | 0.3.8 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.3.42 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy-loader](https://pypi.org/project/lazy-loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[linkify-it-py](https://pypi.org/project/linkify-it-py) | 2.0.3 | Links recognition library with FULL unicode support. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.3 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire-api](https://pypi.org/project/logfire-api) | 3.12.0 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.9 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.7 | Python implementation of John Gruber's Markdown. +[markdown-it-py](https://pypi.org/project/markdown-it-py) | 3.0.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.3 | Python plotting package +[matplotlib-inline](https://pypi.org/project/matplotlib-inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.8.3 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mcp](https://pypi.org/project/mcp) | 1.9.3 | Model Context Protocol SDK +[mdit-py-plugins](https://pypi.org/project/mdit-py-plugins) | 0.4.2 | Collection of plugins for markdown-it-py +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.2 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.8.1 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 3.1.3 | A sane and fast Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml-dtypes](https://pypi.org/project/ml-dtypes) | 0.5.1 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | Machine Learning Library Extensions +[more-itertools](https://pypi.org/project/more-itertools) | 10.6.0 | More routines for operating on iterables, beyond itertools +[mpld3](https://pypi.org/project/mpld3) | 0.5.10 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal-extensions](https://pypi.org/project/msal-extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.4.3 | multidict implementation +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | Multiple dispatch +[mypy](https://pypi.org/project/mypy) | 1.15.0 | Optional static typing for Python +[mypy-extensions](https://pypi.org/project/mypy-extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[mysql-connector-python](https://pypi.org/project/mysql-connector-python) | 9.2.0 | A self-contained Python driver for communicating with MySQL servers, using an API that is compliant with the Python Database API Specification v +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.36.0 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.2 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.6 | Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest-asyncio](https://pypi.org/project/nest-asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nh3](https://pypi.org/project/nh3) | 0.2.18 | Python bindings to the ammonia HTML sanitization library. +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.4.2 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook-shim](https://pypi.org/project/notebook-shim) | 0.2.4 | A shim layer for notebook traits and config +[numba](https://pypi.org/project/numba) | 0.61.2 | compiling Python code using LLVM +[numpy](https://pypi.org/project/numpy) | 2.2.6 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.8.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.82.0 | The official Python library for the openai API +[opencv-python](https://pypi.org/project/opencv-python) | 4.11.0.86 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.5 | A Python library to read/write Excel 2010 xlsx/xlsm files +[opentelemetry-api](https://pypi.org/project/opentelemetry-api) | 1.32.1 | OpenTelemetry Python API +[optree](https://pypi.org/project/optree) | 0.14.1 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 4.2.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.16 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | OSQP: The Operator Splitting QP Solver +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.1 | Utilities for writing pandoc filters in python +[panel](https://pypi.org/project/panel) | 1.6.3 | The powerful data exploration & web app framework for Python. +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[param](https://pypi.org/project/param) | 2.2.0 | Make your Python code clearer and more reliable by declaring Parameters. +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.2 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.12.1 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 1.0.1 | A Python package for describing statistical models and for building design matrices. +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.9.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.31.2 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.1.0 | Python Imaging Library (Fork) +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.3.7 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 6.0.1 | An open-source interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.4 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.31.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[prettytable](https://pypi.org/project/prettytable) | 3.16.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[prince](https://pypi.org/project/prince) | 0.16.0 | Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus-client](https://pypi.org/project/prometheus-client) | 0.21.1 | Python client for the Prometheus monitoring system. +[prompt-toolkit](https://pypi.org/project/prompt-toolkit) | 3.0.51 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.3.1 | Accelerated property cache +[protobuf](https://pypi.org/project/protobuf) | 6.30.2 | +[psutil](https://pypi.org/project/psutil) | 7.0.0 | Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7. +[psygnal](https://pypi.org/project/psygnal) | 0.12.0 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pure-eval](https://pypi.org/project/pure-eval) | 0.2.3 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 20.0.0 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.6.1 | Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208) +[pyasn1-modules](https://pypi.org/project/pyasn1-modules) | 0.4.1 | A collection of ASN.1-based protocols modules +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pyct](https://pypi.org/project/pyct) | 0.5.0 | Python package common tasks for users (e.g. copy examples, fetch data, ...) +[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | Data validation using Python type hints +[pydantic-ai-slim](https://pypi.org/project/pydantic-ai-slim) | 0.2.9 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic-core](https://pypi.org/project/pydantic-core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydantic-evals](https://pypi.org/project/pydantic-evals) | 0.2.9 | Framework for evaluating stochastic code execution, especially code making use of LLMs +[pydantic-graph](https://pypi.org/project/pydantic-graph) | 0.2.9 | Graph and state machine library +[pydantic-settings](https://pypi.org/project/pydantic-settings) | 2.8.1 | Settings management using Pydantic +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.5 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygithub](https://pypi.org/project/pygithub) | 2.6.1 | Use the full Github API v3 +[pygments](https://pypi.org/project/pygments) | 2.19.1 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.10.1 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.3.6 | python code static checker +[pylint-venv](https://pypi.org/project/pylint-venv) | 3.0.4 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls-spyder](https://pypi.org/project/pyls-spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pympler](https://pypi.org/project/pympler) | 1.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.13 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | Vectorized spatial vector file format I/O using GDAL/OGR +[pyomo](https://pypi.org/project/pyomo) | 6.9.2 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.15 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.3 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 5.4.0 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.11 | Python bindings for the Qt cross platform application toolkit +[pyqt5-qt5](https://pypi.org/project/pyqt5-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5-sip](https://pypi.org/project/pyqt5-sip) | 12.17.0 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.7 | Python bindings for the Qt WebEngine framework +[pyqtwebengine-qt5](https://pypi.org/project/pyqtwebengine-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | Windows Negotiate Authentication Client and Server +[pytest](https://pypi.org/project/pytest) | 8.3.5 | pytest: simple powerful testing with Python +[python-barcode](https://pypi.org/project/python-barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python-dateutil](https://pypi.org/project/python-dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python-dotenv](https://pypi.org/project/python-dotenv) | 1.1.0 | Read key-value pairs from a .env file and set them as environment variables +[python-json-logger](https://pypi.org/project/python-json-logger) | 3.3.0 | JSON Log Formatter for the Python Logging Package +[python-lsp-black](https://pypi.org/project/python-lsp-black) | 2.0.0 | Black plugin for the Python LSP Server +[python-lsp-jsonrpc](https://pypi.org/project/python-lsp-jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python-lsp-server](https://pypi.org/project/python-lsp-server) | 1.12.2 | Python Language Server for the Language Server Protocol +[python-multipart](https://pypi.org/project/python-multipart) | 0.0.20 | A streaming multipart parser for Python +[python-slugify](https://pypi.org/project/python-slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.5 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2025.2 | World timezone definitions, modern and historical +[pyuca](https://pypi.org/project/pyuca) | 1.2 | a Python implementation of the Unicode Collation Algorithm +[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | Easy USB access for Python +[pyviz-comms](https://pypi.org/project/pyviz-comms) | 3.0.4 | A JupyterLab extension for rendering HoloViz content. +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | PyWavelets, wavelet transform module +[pywin32](https://pypi.org/project/pywin32) | 310 | Python for Window Extensions +[pywin32-ctypes](https://pypi.org/project/pywin32-ctypes) | 0.2.3 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.15 | Pseudo terminal support for Windows from Python. +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.4.0 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | QDLDL, a free LDL factorization routine. +[qrcode](https://pypi.org/project/qrcode) | 8.0 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.4 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.4.0 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.6.1 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.3 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.20.0 | A Python ASGI web framework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.13.0 | rapid fuzzy string matching +[readme-renderer](https://pypi.org/project/readme-renderer) | 44.0 | readme_renderer is a library for rendering readme descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.2.1 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.36.2 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.3.1 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests-ntlm](https://pypi.org/project/requests-ntlm) | 1.3.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests-toolbelt](https://pypi.org/project/requests-toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339-validator](https://pypi.org/project/rfc3339-validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986-validator](https://pypi.org/project/rfc3986-validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 14.0.0 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.13.0 | a python refactoring library... +[rpds-py](https://pypi.org/project/rpds-py) | 0.24.0 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.4.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.2.0 | Reactive Extensions (Rx) for Python +[scikit-image](https://pypi.org/project/scikit-image) | 0.25.2 | Image processing in Python +[scikit-learn](https://pypi.org/project/scikit-learn) | 1.6.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.15.3 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.5 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.7.post2 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.3 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.1.0 | Manipulation and analysis of geometric objects +[shellingham](https://pypi.org/project/shellingham) | 1.5.4 | Tool to Detect Surrounding Shell +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.1.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.17.0 | Python 2 and 3 compatibility utilities +[sklearn-compat](https://pypi.org/project/sklearn-compat) | 0.1.3 | Ease support for compatible scikit-learn estimators across versions +[skrub](https://pypi.org/project/skrub) | 0.5.3 | Prepping tables for machine learning +[smmap](https://pypi.org/project/smmap) | 5.0.2 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.1 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 8.1.3 | Python documentation generator +[sphinx-rtd-theme](https://pypi.org/project/sphinx-rtd-theme) | 3.0.2 | Read the Docs theme for Sphinx +[sphinxcontrib-applehelp](https://pypi.org/project/sphinxcontrib-applehelp) | 2.0.0 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib-devhelp](https://pypi.org/project/sphinxcontrib-devhelp) | 2.0.0 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib-htmlhelp](https://pypi.org/project/sphinxcontrib-htmlhelp) | 2.1.0 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib-jquery](https://pypi.org/project/sphinxcontrib-jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib-jsmath](https://pypi.org/project/sphinxcontrib-jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib-qthelp](https://pypi.org/project/sphinxcontrib-qthelp) | 2.0.0 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib-serializinghtml](https://pypi.org/project/sphinxcontrib-serializinghtml) | 2.0.0 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 6.0.7 | The Scientific Python Development Environment +[spyder-kernels](https://pypi.org/project/spyder-kernels) | 3.0.5 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.40 | Database Abstraction Library +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite-fts4](https://pypi.org/project/sqlite-fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite-utils](https://pypi.org/project/sqlite-utils) | 3.38 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | A non-validating SQL parser. +[squarify](https://pypi.org/project/squarify) | 0.4.4 | Pure Python implementation of the squarify treemap layout algorithm +[sse-starlette](https://pypi.org/project/sse-starlette) | 2.2.1 | SSE plugin for Starlette +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | SSPI API bindings for Python +[stack-data](https://pypi.org/project/stack-data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.46.2 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.46.0 | A faster way to build and share data apps +[superqt](https://pypi.org/project/superqt) | 0.7.3 | Missing widgets and components for PyQt/PySide +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[sympy](https://pypi.org/project/sympy) | 1.14.0 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.1.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 9.1.2 | Retry code until it succeeds +[termcolor](https://pypi.org/project/termcolor) | 3.1.0 | ANSI color formatting for output in terminal +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text-unidecode](https://pypi.org/project/text-unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | Compute distance between the two texts. +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | Fuzzy string matching in python +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.6.0 | threadpoolctl +[three-merge](https://pypi.org/project/three-merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2025.3.30 | Read and write TIFF files +[tiktoken](https://pypi.org/project/tiktoken) | 0.9.0 | tiktoken is a fast BPE tokeniser for use with OpenAI's models +[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | A tiny CSS parser +[tokenizers](https://pypi.org/project/tokenizers) | 0.21.1 | +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.2.1 | A lil' TOML parser +[tomli-w](https://pypi.org/project/tomli-w) | 1.2.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 1.0.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.5.1 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.67.1 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.3 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.30.0 | A friendly Python library for async concurrency and I/O +[trove-classifiers](https://pypi.org/project/trove-classifiers) | 2025.5.9.12 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 6.1.0 | Collection of utilities for publishing packages on PyPI +[typer](https://pypi.org/project/typer) | 0.15.2 | Typer, build great CLIs. Easy to code. Based on Python type hints. +[types-python-dateutil](https://pypi.org/project/types-python-dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[types-requests](https://pypi.org/project/types-requests) | 2.32.0.20250328 | Typing stubs for requests +[typing-extensions](https://pypi.org/project/typing-extensions) | 4.13.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing-inspection](https://pypi.org/project/typing-inspection) | 0.4.0 | Runtime typing introspection tools +[tzdata](https://pypi.org/project/tzdata) | 2025.2 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.3.1 | tzinfo object for the local timezone +[uc-micro-py](https://pypi.org/project/uc-micro-py) | 1.0.3 | Micro subset of unicode data files for linkify-it-py projects. +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap-learn](https://pypi.org/project/umap-learn) | 0.5.7 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | calculations with values with uncertainties, error propagation +[uri-template](https://pypi.org/project/uri-template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.4.0 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.34.2 | The lightning-fast ASGI server. +[vega-datasets](https://pypi.org/project/vega-datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | A library for working with the color formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket-client](https://pypi.org/project/websocket-client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 14.2 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.14 | Jupyter interactive widgets for Jupyter Notebook +[winpython](https://pypi.org/project/winpython) | 16.6.20250620 | WinPython distribution tools, including WPPM +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | Module for decorators, wrappers and monkey patching. +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2025.4.0 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.2.3 | A Python module for creating Excel XLSX files. +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt-dlp](https://pypi.org/project/yt-dlp) | 2025.2.19 | A feature-rich command-line audio/video downloader +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.21.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ + + +
diff --git a/changelogs/WinPythonslim-64bit-3.12.10.1_History.md b/changelogs/WinPythonslim-64bit-3.12.10.1_History.md new file mode 100644 index 00000000..27c73ef0 --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.12.10.1_History.md @@ -0,0 +1,201 @@ +## History of changes for WinPython-64bit 3.12.10.1slim + +The following changes were made to WinPython-64bit distribution since version 3.12.10.0slim. + + +
+ +### Tools + + +New packages: + * Python 3.12.10 (Python programming language with standard library) + +### Python packages + + +New packages: + * argcomplete 3.6.2 (Bash tab completion for argparse) + * bcrypt 4.3.0 (Modern password hashing for your software and your servers) + * fasta2a 0.2.9 (Convert an AI Agent into a A2A server! ✨) + * google-genai 1.16.1 (GenAI Python SDK) + * mcp 1.9.3 (Model Context Protocol SDK) + * opentelemetry-api 1.32.1 (OpenTelemetry Python API) + * pydantic-evals 0.2.9 (Framework for evaluating stochastic code execution, especially code making use of LLMs) + * pydantic-settings 2.8.1 (Settings management using Pydantic) + * sse-starlette 2.2.1 (SSE plugin for Starlette) + * typing-inspection 0.4.0 (Runtime typing introspection tools) + * websockets 14.2 (An implementation of the WebSocket Protocol (RFC 6455 & 7692)) + +Upgraded packages: + * aiohappyeyeballs 2.4.4 → 2.6.1 (Happy Eyeballs for asyncio) + * aiohttp 3.11.11 → 3.11.18 (Async http client/server framework (asyncio)) + * aiosignal 1.3.1 → 1.3.2 (aiosignal: a list of registered asynchronous callbacks) + * alembic 1.15.1 → 1.15.2 (A database migration tool for SQLAlchemy.) + * anthropic 0.49.0 → 0.51.0 (The official Python library for the anthropic API) + * anyio 4.8.0 → 4.9.0 (High level compatibility layer for multiple asynchronous event loop implementations) + * anywidget 0.9.12 → 0.9.18 (custom jupyter widgets made easy) + * asteval 0.9.31 → 1.0.5 (Safe, minimalistic evaluator of python expression using ast module) + * astroid 3.1.0 → 3.3.9 (An abstract syntax tree for Python with inference support.) + * asttokens 2.4.1 → 3.0.0 (Annotate AST trees with source code positions) + * attrs 23.2.0 → 25.3.0 (Classes Without Boilerplate) + * babel 2.16.0 → 2.17.0 (Internationalization utilities) + * beautifulsoup4 4.12.2 → 4.13.3 (Screen-scraping library) + * bleach 6.1.0 → 6.2.0 (An easy safelist-based HTML-sanitizing tool.) + * bokeh 3.7.2 → 3.7.3 (Interactive plots and applications in the browser from Python) + * branca 0.8.0 → 0.8.1 (Generate complex HTML+JS pages with Python) + * cohere 5.13.12 → 5.15.0 () + * colorlog 6.8.2 → 6.9.0 (Add colours to the output of Python's logging module.) + * contourpy 1.3.1 → 1.3.2 (Python library for calculating contours of 2D quadrilateral grids) + * cython 3.0.12 → 3.1.1 (The Cython compiler for writing C extensions in the Python language.) + * dask 2025.3.0 → 2025.4.1 (Parallel PyData with Task Scheduling) + * debugpy 1.8.0 → 1.8.13 (An implementation of the Debug Adapter Protocol for Python) + * decorator 5.1.1 → 5.2.1 (Decorators for Humans) + * dill 0.3.9 → 0.4.0 (serialize all of Python) + * distributed 2025.3.0 → 2025.4.1 (Distributed scheduler for Dask) + * distro 1.8.0 → 1.9.0 (Distro - an OS platform information API) + * django 5.0.7 → 5.2 (A high-level Python web framework that encourages rapid development and clean, pragmatic design.) + * dnspython 2.6.1 → 2.7.0 (DNS toolkit) + * duckdb 1.2.2 → 1.3.0 (DuckDB in-process database) + * executing 2.0.1 → 2.2.0 (Get the currently executing AST node of a frame, and other information) + * faker 36.1.1 → 37.1.0 (Faker is a Python package that generates fake data for you.) + * fastapi 0.115.8 → 0.115.12 (FastAPI framework, high performance, easy to learn, fast to code, ready for production) + * fastjsonschema 2.18.0 → 2.21.1 (Fastest Python implementation of JSON schema) + * filelock 3.17.0 → 3.18.0 (A platform independent file lock.) + * flit 3.10.1 → 3.12.0 (A simple packaging tool for simple packages.) + * fonttools 4.55.3 → 4.57.0 (Tools to manipulate font files) + * fsspec 2024.6.1 → 2025.3.2 (File-system specification) + * gitdb 4.0.10 → 4.0.12 (Git Object Database) + * gitpython 3.1.32 → 3.1.44 (GitPython is a Python library used to interact with Git repositories) + * graphene 3.3 → 3.4.3 (GraphQL Framework for Python) + * griffe 1.5.5 → 1.7.2 (Signatures for entire Python programs.) + * groq 0.13.1 → 0.25.0 (The official Python library for the groq API) + * guidata 3.7.1 → 3.9.0 (Automatic GUI generation for easy dataset editing and display) + * h2 4.1.0 → 4.2.0 (Pure-Python HTTP/2 protocol implementation) + * httpcore 1.0.5 → 1.0.7 (A minimal low-level HTTP client.) + * httpx 0.27.2 → 0.28.1 (The next generation HTTP client.) + * hupper 1.12 → 1.12.1 (Integrated process monitor for developing and reloading daemons.) + * iniconfig 2.0.0 → 2.1.0 (brain-dead simple config-ini parsing) + * intervaltree 3.0.2 → 3.1.0 (Editable interval tree data structure for Python 2 and 3) + * ipython 8.34.0 → 8.36.0 (IPython: Productive Interactive Computing) + * jinja2 3.1.2 → 3.1.6 (A very fast and expressive template engine.) + * jiter 0.8.2 → 0.9.0 (Fast iterable JSON parser.) + * json5 0.9.14 → 0.10.0 (A Python implementation of the JSON5 data format.) + * jsonpointer 2.4 → 3.0.0 (Identify specific nodes in a JSON document (RFC 6901)) + * jsonschema 4.19.2 → 4.23.0 (An implementation of JSON Schema validation for Python) + * jupyterlab 4.4.1 → 4.4.2 (JupyterLab computational environment) + * keras 3.9.2 → 3.10.0 (Multi-backend Keras) + * langchain 0.3.23 → 0.3.25 (Building applications with LLMs through composability) + * langsmith 0.3.24 → 0.3.42 (Client library to connect to the LangSmith LLM Tracing and Evaluation Platform.) + * lmfit 1.3.1 → 1.3.3 (Least-Squares Minimization with Bounds and Constraints) + * mako 1.3.5 → 1.3.9 (A super-fast templating language that borrows the best ideas from the existing templating languages.) + * matplotlib 3.10.1 → 3.10.3 (Python plotting package) + * maturin 1.8.1 → 1.8.3 (Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages) + * missingno 0.5.1 → 0.5.2 (Missing data visualization module for Python.) + * mistralai 1.2.5 → 1.8.1 (Python Client SDK for the Mistral AI API.) + * mistune 2.0.5 → 3.1.3 (A sane and fast Markdown parser with useful plugins and renderers) + * mpld3 0.5.8 → 0.5.10 (D3 Viewer for Matplotlib) + * multidict 6.1.0 → 6.4.3 (multidict implementation) + * narwhals 1.30.0 → 1.36.0 (Extremely lightweight compatibility layer between dataframe libraries) + * nbclient 0.10.0 → 0.10.2 (A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor.) + * nbconvert 7.16.1 → 7.16.6 (Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script.) + * notebook 7.4.0 → 7.4.2 (Jupyter Notebook - A web-based notebook environment for interactive computing) + * numpy 2.2.4 → 2.2.6 (Fundamental package for array computing in Python) + * numpydoc 1.6.0 → 1.8.0 (Sphinx extension to support docstrings in Numpy format) + * openai 1.72.0 → 1.82.0 (The official Python library for the openai API) + * openpyxl 3.1.2 → 3.1.5 (A Python library to read/write Excel 2010 xlsx/xlsm files) + * optree 0.14.0 → 0.14.1 (Optimized PyTree Utilities.) + * optuna 3.6.1 → 4.2.1 (A hyperparameter optimization framework) + * orjson 3.10.12 → 3.10.16 (Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy) + * pandocfilters 1.5.0 → 1.5.1 (Utilities for writing pandoc filters in python) + * panel 1.6.2 → 1.6.3 (The powerful data exploration & web app framework for Python.) + * partd 1.4.0 → 1.4.2 (Appendable key-value storage) + * pathspec 0.11.0 → 0.12.1 (Utility library for gitignore style pattern matching of file paths.) + * patsy 0.5.6 → 1.0.1 (A Python package for describing statistical models and for building design matrices.) + * pexpect 4.8.0 → 4.9.0 (Pexpect allows easy control of interactive console applications.) + * pg8000 1.23.0 → 1.31.2 (PostgreSQL interface library) + * pip 25.0.1 → 25.1.1 (The PyPA recommended tool for installing Python packages.) + * platformdirs 4.3.6 → 4.3.7 (A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`.) + * plotpy 2.7.2 → 2.7.4 (Curve and image plotting tools for Python/Qt applications) + * polars 1.27.1 → 1.31.0 (Blazingly fast DataFrame library) + * prettytable 3.3.0 → 3.16.0 (A simple Python library for easily displaying tabular data in a visually appealing ASCII table format) + * prince 0.15.0 → 0.16.0 (Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA) + * propcache 0.2.1 → 0.3.1 (Accelerated property cache) + * protobuf 5.27.3 → 6.30.2 () + * psutil 5.9.8 → 7.0.0 (Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7.) + * psygnal 0.11.1 → 0.12.0 (Fast python callback/event system modeled after Qt Signals) + * pyarrow 19.0.1 → 20.0.0 (Python library for Apache Arrow) + * pyerfa 2.0.1.4 → 2.0.1.5 (Python bindings for ERFA) + * pylint 3.1.0 → 3.3.6 (python code static checker) + * pynndescent 0.5.12 → 0.5.13 (Nearest Neighbor Descent) + * pyomo 6.9.1 → 6.9.2 (Pyomo: Python Optimization Modeling Objects) + * pyparsing 3.2.1 → 3.2.3 (pyparsing module - Classes and methods to define and execute parsing grammars) + * pypdf 5.1.0 → 5.4.0 (A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files) + * pyqt5 5.15.10 → 5.15.11 (Python bindings for the Qt cross platform application toolkit) + * pyqtwebengine 5.15.6 → 5.15.7 (Python bindings for the Qt WebEngine framework) + * pytest 8.3.4 → 8.3.5 (pytest: simple powerful testing with Python) + * pythonqwt 0.14.4 → 0.14.5 (Qt plotting widgets for Python) + * pytz 2024.2 → 2025.2 (World timezone definitions, modern and historical) + * pywin32 308 → 310 (Python for Window Extensions) + * pywinpty 2.0.14 → 2.0.15 (Pseudo terminal support for Windows from Python.) + * pyzmq 26.2.1 → 26.4.0 (Python bindings for 0MQ) + * qstylizer 0.2.2 → 0.2.4 (Stylesheet Generator for PyQt{4-5}/PySide{1-2}) + * qtpy 2.4.1 → 2.4.3 (Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6).) + * rapidfuzz 3.9.6 → 3.13.0 (rapid fuzzy string matching) + * redis 5.0.8 → 5.2.1 (Python client for Redis database and key-value store) + * referencing 0.35.1 → 0.36.2 (JSON Referencing + Python) + * reportlab 4.2.5 → 4.3.1 (The Reportlab Toolkit) + * rich 13.9.4 → 14.0.0 (Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal) + * rope 1.12.0 → 1.13.0 (a python refactoring library...) + * rtree 1.3.0 → 1.4.0 (R-Tree spatial index for Python GIS) + * scipy 1.15.2 → 1.15.3 (Fundamental algorithms for scientific computing in Python) + * setuptools 75.8.2 → 79.0.1 (Easily download, build, install, upgrade, and uninstall Python packages) + * shapely 2.0.6 → 2.1.0 (Manipulation and analysis of geometric objects) + * six 1.16.0 → 1.17.0 (Python 2 and 3 compatibility utilities) + * skrub 0.5.1 → 0.5.3 (Prepping tables for machine learning) + * smmap 5.0.0 → 5.0.2 (A pure Python implementation of a sliding window memory map manager) + * sniffio 1.3.0 → 1.3.1 (Sniff out which async library your code is running under) + * sphinx 7.3.7 → 8.1.3 (Python documentation generator) + * spyder 6.0.5 → 6.0.7 (The Scientific Python Development Environment) + * sqlalchemy 2.0.38 → 2.0.40 (Database Abstraction Library) + * starlette 0.45.3 → 0.46.2 (The little ASGI library that shines.) + * streamlit 1.44.0 → 1.46.0 (A faster way to build and share data apps) + * superqt 0.7.1 → 0.7.3 (Missing widgets and components for PyQt/PySide) + * sympy 1.13.3 → 1.14.0 (Computer algebra system (CAS) in Python) + * tblib 3.0.0 → 3.1.0 (Traceback serialization library.) + * tenacity 9.0.0 → 9.1.2 (Retry code until it succeeds) + * termcolor 2.5.0 → 3.1.0 (ANSI color formatting for output in terminal) + * threadpoolctl 3.5.0 → 3.6.0 (threadpoolctl) + * tifffile 2025.1.10 → 2025.3.30 (Read and write TIFF files) + * tiktoken 0.8.0 → 0.9.0 (tiktoken is a fast BPE tokeniser for use with OpenAI's models) + * tokenizers 0.21.0 → 0.21.1 () + * tornado 6.4.2 → 6.5.1 (Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.) + * tqdm 4.66.4 → 4.67.1 (Fast, Extensible Progress Meter) + * traitlets 5.14.1 → 5.14.3 (Traitlets Python configuration system) + * trio 0.29.0 → 0.30.0 (A friendly Python library for async concurrency and I/O) + * tzdata 2024.1 → 2025.2 (Provider of IANA time zone data) + * tzlocal 5.2 → 5.3.1 (tzinfo object for the local timezone) + * urllib3 2.2.3 → 2.4.0 (HTTP library with thread-safe connection pooling, file post, and more.) + * uvicorn 0.34.0 → 0.34.2 (The lightning-fast ASGI server.) + * winpython 15.3.20250425 → 16.6.20250620 (WinPython distribution tools, including WPPM) + * xarray 2025.3.0 → 2025.4.0 (N-D labeled arrays and datasets in Python) + * xlsxwriter 3.1.9 → 3.2.3 (A Python module for creating Excel XLSX files.) + +Removed packages: + * Python 3.12.10 (Python programming language with standard library) + * aniso8601 9.0.1 (A library for parsing ISO 8601 strings.) + * fast-histogram 0.14 (Fast simple 1D and 2D histograms) + * jsonpath-python 1.0.6 (A more powerful JSONPath implementation in modern python) + * mpl-scatter-density 0.7 (Matplotlib helpers to make density scatter plots) + * pydantic-ai 0.0.24 (Agent Framework / shim to use Pydantic with LLMs) + * typing-inspect 0.9.0 (Runtime inspection utilities for typing module.) + +### WheelHouse packages + + +No differences found. + + +
+ +* * * diff --git a/changelogs/WinPythonslim-64bit-3.13.5.0.md b/changelogs/WinPythonslim-64bit-3.13.5.0.md new file mode 100644 index 00000000..e20a7b65 --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.13.5.0.md @@ -0,0 +1,528 @@ +## WinPython 3.13.5.0slim + +The following packages are included in WinPython-64bit v3.13.5.0slim 3.10.11.1dot. + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ +[Pandoc](https://pandoc.org) | 3.1.9 | an universal document converter +[Python](http://www.python.org/) | 3.13.5 | Python programming language with standard library + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[absl-py](https://pypi.org/project/absl-py) | 2.2.2 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc-driver-manager](https://pypi.org/project/adbc-driver-manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.6.1 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.18 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.2 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.15.2 | A database migration tool for SQLAlchemy. +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[annotated-types](https://pypi.org/project/annotated-types) | 0.7.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.51.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.9.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.18 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argcomplete](https://pypi.org/project/argcomplete) | 3.6.2 | Bash tab completion for argparse +[argon2-cffi](https://pypi.org/project/argon2-cffi) | 23.1.0 | Argon2 for Python +[argon2-cffi-bindings](https://pypi.org/project/argon2-cffi-bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array-api-compat](https://pypi.org/project/array-api-compat) | 1.12.0 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi-csrf](https://pypi.org/project/asgi-csrf) | 0.11 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 1.0.5 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.3.9 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy-iers-data](https://pypi.org/project/astropy-iers-data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 3.0.0 | Annotate AST trees with source code positions +[async-lru](https://pypi.org/project/async-lru) | 2.0.5 | Simple LRU cache for asyncio +[asyncssh](https://pypi.org/project/asyncssh) | 2.20.0 | AsyncSSH: Asynchronous SSHv2 client and server library +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 25.3.0 | Classes Without Boilerplate +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure-core](https://pypi.org/project/azure-core) | 1.32.0 | Microsoft Azure Core Library for Python +[azure-cosmos](https://pypi.org/project/azure-cosmos) | 4.9.0 | Microsoft Azure Cosmos Client Library for Python +[azure-identity](https://pypi.org/project/azure-identity) | 1.21.0 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.17.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 1.0.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.3.0 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.13.3 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 25.1.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.2.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.9.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.7.3 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.1 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachetools](https://pypi.org/project/cachetools) | 5.5.2 | Extensible memoizing collections and decorators +[certifi](https://pypi.org/project/certifi) | 2025.1.31 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset-normalizer](https://pypi.org/project/charset-normalizer) | 3.4.2 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.8 | Composable command line interface toolkit +[click-default-group](https://pypi.org/project/click-default-group) | 1.2.4 | click_default_group +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.1.1 | Pickler class to extend the standard pickle.Pickler functionality +[cohere](https://pypi.org/project/cohere) | 5.15.0 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorcet](https://pypi.org/project/colorcet) | 3.1.0 | Collection of perceptually uniform colormaps +[colorlog](https://pypi.org/project/colorlog) | 6.9.0 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.2 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g. +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxopt](https://pypi.org/project/cvxopt) | 1.3.2 | Convex optimization package +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.4 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.1.1 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2025.4.1 | Parallel PyData with Task Scheduling +[datasette](https://pypi.org/project/datasette) | 0.65.1 | An open source multi-tool for exploring and publishing data +[datasette-graphql](https://pypi.org/project/datasette-graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[datashader](https://pypi.org/project/datashader) | 0.17.0 | Data visualization toolchain based on aggregating into a grid +[deap](https://pypi.org/project/deap) | 1.4.2 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.13 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.2.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[deprecated](https://pypi.org/project/deprecated) | 1.2.14 | Python @deprecated decorator to deprecate old python classes, functions or methods. +[diff-match-patch](https://pypi.org/project/diff-match-patch) | 20241021 | Repackaging of Google's Diff Match and Patch libraries. +[dill](https://pypi.org/project/dill) | 0.4.0 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2025.4.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.9.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.2 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.7.0 | DNS toolkit +[docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) | 0.17 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.21.2 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.3.0 | DuckDB in-process database +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et-xmlfile](https://pypi.org/project/et-xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval-type-backport](https://pypi.org/project/eval-type-backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.2.0 | Get the currently executing AST node of a frame, and other information +[faker](https://pypi.org/project/faker) | 37.1.0 | Faker is a Python package that generates fake data for you. +[fasta2a](https://pypi.org/project/fasta2a) | 0.2.9 | Convert an AI Agent into a A2A server! ✨ +[fastapi](https://pypi.org/project/fastapi) | 0.115.12 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | Fast read/write of AVRO files +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.21.1 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.18.0 | A platform independent file lock. +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.1.0 | A simple framework for building complex web applications. +[flexcache](https://pypi.org/project/flexcache) | 0.3 | Saves and loads to the cache a transformed versions of a source object. +[flexparser](https://pypi.org/project/flexparser) | 0.4 | Parsing made fun ... using typing. +[flit](https://pypi.org/project/flit) | 3.12.0 | A simple packaging tool for simple packages. +[flit-core](https://pypi.org/project/flit-core) | 3.12.0 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.19.5 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.57.0 | Tools to manipulate font files +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2025.3.2 | File-system specification +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.12 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.44 | GitPython is a Python library used to interact with Git repositories +[google-auth](https://pypi.org/project/google-auth) | 2.38.0 | Google Authentication Library +[google-genai](https://pypi.org/project/google-genai) | 1.16.1 | GenAI Python SDK +[graphene](https://pypi.org/project/graphene) | 3.4.3 | GraphQL Framework for Python +[graphql-core](https://pypi.org/project/graphql-core) | 3.2.6 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql-relay](https://pypi.org/project/graphql-relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.7.2 | Signatures for entire Python programs. +[groq](https://pypi.org/project/groq) | 0.25.0 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.9.0 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.2.0 | Pure-Python HTTP/2 protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[holoviews](https://pypi.org/project/holoviews) | 1.20.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hpack](https://pypi.org/project/hpack) | 4.1.0 | Pure-Python HPACK header encoding +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.7 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.28.1 | The next generation HTTP client. +[httpx-sse](https://pypi.org/project/httpx-sse) | 0.4.0 | Consume Server-Sent Event (SSE) messages with HTTPX. +[huggingface-hub](https://pypi.org/project/huggingface-hub) | 0.33.0 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12.1 | Integrated process monitor for developing and reloading daemons. +[hvplot](https://pypi.org/project/hvplot) | 0.11.2 | A high-level plotting API for the PyData ecosystem built on HoloViews. +[hypercorn](https://pypi.org/project/hypercorn) | 0.17.3 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.1.0 | Pure-Python HTTP/2 framing +[hypothesis](https://pypi.org/project/hypothesis) | 6.130.4 | A library for property-based testing +[id](https://pypi.org/project/id) | 1.5.0 | A tool for generating OIDC identities +[idna](https://pypi.org/project/idna) | 3.10 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.37.0 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced-learn](https://pypi.org/project/imbalanced-learn) | 0.13.0 | Toolbox for imbalanced dataset in machine learning +[importlib-metadata](https://pypi.org/project/importlib-metadata) | 8.6.1 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.1.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.1.0 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.7 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.36.0 | IPython: Productive Interactive Computing +[ipython-genutils](https://pypi.org/project/ipython-genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython-sql](https://pypi.org/project/ipython-sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.6 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 2.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco-classes](https://pypi.org/project/jaraco-classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco-context](https://pypi.org/project/jaraco-context) | 6.0.1 | Useful decorators and context managers +[jaraco-functools](https://pypi.org/project/jaraco-functools) | 4.1.0 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.2 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.6 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.9.0 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.10.0 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpointer](https://pypi.org/project/jsonpointer) | 3.0.0 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.23.0 | An implementation of JSON Schema validation for Python +[jsonschema-specifications](https://pypi.org/project/jsonschema-specifications) | 2024.10.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter-bokeh](https://pypi.org/project/jupyter-bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter-client](https://pypi.org/project/jupyter-client) | 8.6.3 | Jupyter protocol implementation and client libraries +[jupyter-console](https://pypi.org/project/jupyter-console) | 6.6.3 | Jupyter terminal console +[jupyter-core](https://pypi.org/project/jupyter-core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter-events](https://pypi.org/project/jupyter-events) | 0.12.0 | Jupyter Event System library +[jupyter-leaflet](https://pypi.org/project/jupyter-leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter-lsp](https://pypi.org/project/jupyter-lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter-server](https://pypi.org/project/jupyter-server) | 2.15.0 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter-server-terminals](https://pypi.org/project/jupyter-server-terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.4.2 | JupyterLab computational environment +[jupyterlab-pygments](https://pypi.org/project/jupyterlab-pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab-server](https://pypi.org/project/jupyterlab-server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) | 3.0.14 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.10.0 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.6.0 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.25 | Building applications with LLMs through composability +[langchain-core](https://pypi.org/project/langchain-core) | 0.3.59 | Building applications with LLMs through composability +[langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) | 0.3.8 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.3.42 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy-loader](https://pypi.org/project/lazy-loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[linkify-it-py](https://pypi.org/project/linkify-it-py) | 2.0.3 | Links recognition library with FULL unicode support. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.3 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire-api](https://pypi.org/project/logfire-api) | 3.12.0 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.9 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.7 | Python implementation of John Gruber's Markdown. +[markdown-it-py](https://pypi.org/project/markdown-it-py) | 3.0.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.3 | Python plotting package +[matplotlib-inline](https://pypi.org/project/matplotlib-inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.8.3 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mcp](https://pypi.org/project/mcp) | 1.9.3 | Model Context Protocol SDK +[mdit-py-plugins](https://pypi.org/project/mdit-py-plugins) | 0.4.2 | Collection of plugins for markdown-it-py +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.2 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.8.1 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 3.1.3 | A sane and fast Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml-dtypes](https://pypi.org/project/ml-dtypes) | 0.5.1 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | Machine Learning Library Extensions +[more-itertools](https://pypi.org/project/more-itertools) | 10.6.0 | More routines for operating on iterables, beyond itertools +[mpld3](https://pypi.org/project/mpld3) | 0.5.10 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal-extensions](https://pypi.org/project/msal-extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.4.3 | multidict implementation +[multipledispatch](https://pypi.org/project/multipledispatch) | 1.0.0 | Multiple dispatch +[mypy](https://pypi.org/project/mypy) | 1.15.0 | Optional static typing for Python +[mypy-extensions](https://pypi.org/project/mypy-extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[mysql-connector-python](https://pypi.org/project/mysql-connector-python) | 9.2.0 | A self-contained Python driver for communicating with MySQL servers, using an API that is compliant with the Python Database API Specification v +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.36.0 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.2 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.6 | Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest-asyncio](https://pypi.org/project/nest-asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nh3](https://pypi.org/project/nh3) | 0.2.18 | Python bindings to the ammonia HTML sanitization library. +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.4.2 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook-shim](https://pypi.org/project/notebook-shim) | 0.2.4 | A shim layer for notebook traits and config +[numba](https://pypi.org/project/numba) | 0.61.2 | compiling Python code using LLVM +[numpy](https://pypi.org/project/numpy) | 2.2.6 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.8.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.82.0 | The official Python library for the openai API +[opencv-python](https://pypi.org/project/opencv-python) | 4.11.0.86 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.5 | A Python library to read/write Excel 2010 xlsx/xlsm files +[opentelemetry-api](https://pypi.org/project/opentelemetry-api) | 1.32.1 | OpenTelemetry Python API +[optree](https://pypi.org/project/optree) | 0.14.1 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 4.2.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.16 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | OSQP: The Operator Splitting QP Solver +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.1 | Utilities for writing pandoc filters in python +[panel](https://pypi.org/project/panel) | 1.6.3 | The powerful data exploration & web app framework for Python. +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[param](https://pypi.org/project/param) | 2.2.0 | Make your Python code clearer and more reliable by declaring Parameters. +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.2 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.12.1 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 1.0.1 | A Python package for describing statistical models and for building design matrices. +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.9.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.31.2 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.1.0 | Python Imaging Library (Fork) +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.3.7 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 6.0.1 | An open-source interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.4 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.31.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[prettytable](https://pypi.org/project/prettytable) | 3.16.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[prince](https://pypi.org/project/prince) | 0.16.0 | Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus-client](https://pypi.org/project/prometheus-client) | 0.21.1 | Python client for the Prometheus monitoring system. +[prompt-toolkit](https://pypi.org/project/prompt-toolkit) | 3.0.51 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.3.1 | Accelerated property cache +[protobuf](https://pypi.org/project/protobuf) | 6.30.2 | +[psutil](https://pypi.org/project/psutil) | 7.0.0 | Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7. +[psygnal](https://pypi.org/project/psygnal) | 0.12.0 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pure-eval](https://pypi.org/project/pure-eval) | 0.2.3 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 20.0.0 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.6.1 | Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208) +[pyasn1-modules](https://pypi.org/project/pyasn1-modules) | 0.4.1 | A collection of ASN.1-based protocols modules +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pyct](https://pypi.org/project/pyct) | 0.5.0 | Python package common tasks for users (e.g. copy examples, fetch data, ...) +[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | Data validation using Python type hints +[pydantic-ai-slim](https://pypi.org/project/pydantic-ai-slim) | 0.2.9 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic-core](https://pypi.org/project/pydantic-core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydantic-evals](https://pypi.org/project/pydantic-evals) | 0.2.9 | Framework for evaluating stochastic code execution, especially code making use of LLMs +[pydantic-graph](https://pypi.org/project/pydantic-graph) | 0.2.9 | Graph and state machine library +[pydantic-settings](https://pypi.org/project/pydantic-settings) | 2.8.1 | Settings management using Pydantic +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.5 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygithub](https://pypi.org/project/pygithub) | 2.6.1 | Use the full Github API v3 +[pygments](https://pypi.org/project/pygments) | 2.19.1 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.10.1 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.3.6 | python code static checker +[pylint-venv](https://pypi.org/project/pylint-venv) | 3.0.4 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls-spyder](https://pypi.org/project/pyls-spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pympler](https://pypi.org/project/pympler) | 1.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.13 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | Vectorized spatial vector file format I/O using GDAL/OGR +[pyomo](https://pypi.org/project/pyomo) | 6.9.2 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.15 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.3 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 5.4.0 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.11 | Python bindings for the Qt cross platform application toolkit +[pyqt5-qt5](https://pypi.org/project/pyqt5-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5-sip](https://pypi.org/project/pyqt5-sip) | 12.17.0 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.7 | Python bindings for the Qt WebEngine framework +[pyqtwebengine-qt5](https://pypi.org/project/pyqtwebengine-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | Windows Negotiate Authentication Client and Server +[pytest](https://pypi.org/project/pytest) | 8.3.5 | pytest: simple powerful testing with Python +[python-barcode](https://pypi.org/project/python-barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python-dateutil](https://pypi.org/project/python-dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python-dotenv](https://pypi.org/project/python-dotenv) | 1.1.0 | Read key-value pairs from a .env file and set them as environment variables +[python-json-logger](https://pypi.org/project/python-json-logger) | 3.3.0 | JSON Log Formatter for the Python Logging Package +[python-lsp-black](https://pypi.org/project/python-lsp-black) | 2.0.0 | Black plugin for the Python LSP Server +[python-lsp-jsonrpc](https://pypi.org/project/python-lsp-jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python-lsp-server](https://pypi.org/project/python-lsp-server) | 1.12.2 | Python Language Server for the Language Server Protocol +[python-multipart](https://pypi.org/project/python-multipart) | 0.0.20 | A streaming multipart parser for Python +[python-slugify](https://pypi.org/project/python-slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.5 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2025.2 | World timezone definitions, modern and historical +[pyuca](https://pypi.org/project/pyuca) | 1.2 | a Python implementation of the Unicode Collation Algorithm +[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | Easy USB access for Python +[pyviz-comms](https://pypi.org/project/pyviz-comms) | 3.0.4 | A JupyterLab extension for rendering HoloViz content. +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | PyWavelets, wavelet transform module +[pywin32](https://pypi.org/project/pywin32) | 310 | Python for Window Extensions +[pywin32-ctypes](https://pypi.org/project/pywin32-ctypes) | 0.2.3 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.15 | Pseudo terminal support for Windows from Python. +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.4.0 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | QDLDL, a free LDL factorization routine. +[qrcode](https://pypi.org/project/qrcode) | 8.0 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.4 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.4.0 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.6.1 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.3 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.20.0 | A Python ASGI web framework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.13.0 | rapid fuzzy string matching +[readme-renderer](https://pypi.org/project/readme-renderer) | 44.0 | readme_renderer is a library for rendering readme descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.2.1 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.36.2 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.3.1 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests-ntlm](https://pypi.org/project/requests-ntlm) | 1.3.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests-toolbelt](https://pypi.org/project/requests-toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339-validator](https://pypi.org/project/rfc3339-validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986-validator](https://pypi.org/project/rfc3986-validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 14.0.0 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.13.0 | a python refactoring library... +[rpds-py](https://pypi.org/project/rpds-py) | 0.24.0 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.4.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.2.0 | Reactive Extensions (Rx) for Python +[scikit-image](https://pypi.org/project/scikit-image) | 0.25.2 | Image processing in Python +[scikit-learn](https://pypi.org/project/scikit-learn) | 1.6.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.15.3 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.5 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.7.post2 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.3 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.1.0 | Manipulation and analysis of geometric objects +[shellingham](https://pypi.org/project/shellingham) | 1.5.4 | Tool to Detect Surrounding Shell +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.1.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.17.0 | Python 2 and 3 compatibility utilities +[sklearn-compat](https://pypi.org/project/sklearn-compat) | 0.1.3 | Ease support for compatible scikit-learn estimators across versions +[skrub](https://pypi.org/project/skrub) | 0.5.3 | Prepping tables for machine learning +[smmap](https://pypi.org/project/smmap) | 5.0.2 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.1 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 8.1.3 | Python documentation generator +[sphinx-rtd-theme](https://pypi.org/project/sphinx-rtd-theme) | 3.0.2 | Read the Docs theme for Sphinx +[sphinxcontrib-applehelp](https://pypi.org/project/sphinxcontrib-applehelp) | 2.0.0 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib-devhelp](https://pypi.org/project/sphinxcontrib-devhelp) | 2.0.0 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib-htmlhelp](https://pypi.org/project/sphinxcontrib-htmlhelp) | 2.1.0 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib-jquery](https://pypi.org/project/sphinxcontrib-jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib-jsmath](https://pypi.org/project/sphinxcontrib-jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib-qthelp](https://pypi.org/project/sphinxcontrib-qthelp) | 2.0.0 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib-serializinghtml](https://pypi.org/project/sphinxcontrib-serializinghtml) | 2.0.0 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 6.0.7 | The Scientific Python Development Environment +[spyder-kernels](https://pypi.org/project/spyder-kernels) | 3.0.5 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.40 | Database Abstraction Library +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite-fts4](https://pypi.org/project/sqlite-fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite-utils](https://pypi.org/project/sqlite-utils) | 3.38 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | A non-validating SQL parser. +[squarify](https://pypi.org/project/squarify) | 0.4.4 | Pure Python implementation of the squarify treemap layout algorithm +[sse-starlette](https://pypi.org/project/sse-starlette) | 2.2.1 | SSE plugin for Starlette +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | SSPI API bindings for Python +[stack-data](https://pypi.org/project/stack-data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.46.2 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.46.0 | A faster way to build and share data apps +[superqt](https://pypi.org/project/superqt) | 0.7.3 | Missing widgets and components for PyQt/PySide +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[sympy](https://pypi.org/project/sympy) | 1.14.0 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.1.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 9.1.2 | Retry code until it succeeds +[termcolor](https://pypi.org/project/termcolor) | 3.1.0 | ANSI color formatting for output in terminal +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text-unidecode](https://pypi.org/project/text-unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | Compute distance between the two texts. +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | Fuzzy string matching in python +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.6.0 | threadpoolctl +[three-merge](https://pypi.org/project/three-merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2025.3.30 | Read and write TIFF files +[tiktoken](https://pypi.org/project/tiktoken) | 0.9.0 | tiktoken is a fast BPE tokeniser for use with OpenAI's models +[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | A tiny CSS parser +[tokenizers](https://pypi.org/project/tokenizers) | 0.21.1 | +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.2.1 | A lil' TOML parser +[tomli-w](https://pypi.org/project/tomli-w) | 1.2.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 1.0.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.5.1 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.67.1 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.3 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.30.0 | A friendly Python library for async concurrency and I/O +[trove-classifiers](https://pypi.org/project/trove-classifiers) | 2025.5.9.12 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 6.1.0 | Collection of utilities for publishing packages on PyPI +[typer](https://pypi.org/project/typer) | 0.15.2 | Typer, build great CLIs. Easy to code. Based on Python type hints. +[types-python-dateutil](https://pypi.org/project/types-python-dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[types-requests](https://pypi.org/project/types-requests) | 2.32.0.20250328 | Typing stubs for requests +[typing-extensions](https://pypi.org/project/typing-extensions) | 4.13.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing-inspection](https://pypi.org/project/typing-inspection) | 0.4.0 | Runtime typing introspection tools +[tzdata](https://pypi.org/project/tzdata) | 2025.2 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.3.1 | tzinfo object for the local timezone +[uc-micro-py](https://pypi.org/project/uc-micro-py) | 1.0.3 | Micro subset of unicode data files for linkify-it-py projects. +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap-learn](https://pypi.org/project/umap-learn) | 0.5.7 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | calculations with values with uncertainties, error propagation +[uri-template](https://pypi.org/project/uri-template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.4.0 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.34.2 | The lightning-fast ASGI server. +[vega-datasets](https://pypi.org/project/vega-datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | A library for working with the color formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket-client](https://pypi.org/project/websocket-client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 14.2 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.14 | Jupyter interactive widgets for Jupyter Notebook +[winpython](https://pypi.org/project/winpython) | 16.6.20250620 | WinPython distribution tools, including WPPM +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | Module for decorators, wrappers and monkey patching. +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2025.4.0 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.2.3 | A Python module for creating Excel XLSX files. +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt-dlp](https://pypi.org/project/yt-dlp) | 2025.2.19 | A feature-rich command-line audio/video downloader +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.21.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ + + +
diff --git a/changelogs/WinPythonslim-64bit-3.13.5.0_History.md b/changelogs/WinPythonslim-64bit-3.13.5.0_History.md new file mode 100644 index 00000000..894ae809 --- /dev/null +++ b/changelogs/WinPythonslim-64bit-3.13.5.0_History.md @@ -0,0 +1,200 @@ +## History of changes for WinPython-64bit 3.13.5.0slim + +The following changes were made to WinPython-64bit distribution since version 3.13.3.0slim. + + +
+ +### Tools + + +New packages: + * Python 3.13.5 (Python programming language with standard library) + +### Python packages + + +New packages: + * argcomplete 3.6.2 (Bash tab completion for argparse) + * bcrypt 4.3.0 (Modern password hashing for your software and your servers) + * fasta2a 0.2.9 (Convert an AI Agent into a A2A server! ✨) + * google-genai 1.16.1 (GenAI Python SDK) + * mcp 1.9.3 (Model Context Protocol SDK) + * opentelemetry-api 1.32.1 (OpenTelemetry Python API) + * pydantic-evals 0.2.9 (Framework for evaluating stochastic code execution, especially code making use of LLMs) + * pydantic-settings 2.8.1 (Settings management using Pydantic) + * sse-starlette 2.2.1 (SSE plugin for Starlette) + * typing-inspection 0.4.0 (Runtime typing introspection tools) + * websockets 14.2 (An implementation of the WebSocket Protocol (RFC 6455 & 7692)) + +Upgraded packages: + * aiohappyeyeballs 2.4.4 → 2.6.1 (Happy Eyeballs for asyncio) + * aiohttp 3.11.11 → 3.11.18 (Async http client/server framework (asyncio)) + * aiosignal 1.3.1 → 1.3.2 (aiosignal: a list of registered asynchronous callbacks) + * alembic 1.15.1 → 1.15.2 (A database migration tool for SQLAlchemy.) + * anthropic 0.49.0 → 0.51.0 (The official Python library for the anthropic API) + * anyio 4.8.0 → 4.9.0 (High level compatibility layer for multiple asynchronous event loop implementations) + * anywidget 0.9.12 → 0.9.18 (custom jupyter widgets made easy) + * asteval 0.9.31 → 1.0.5 (Safe, minimalistic evaluator of python expression using ast module) + * astroid 3.1.0 → 3.3.9 (An abstract syntax tree for Python with inference support.) + * asttokens 2.4.1 → 3.0.0 (Annotate AST trees with source code positions) + * attrs 23.2.0 → 25.3.0 (Classes Without Boilerplate) + * babel 2.16.0 → 2.17.0 (Internationalization utilities) + * beautifulsoup4 4.12.2 → 4.13.3 (Screen-scraping library) + * bleach 6.1.0 → 6.2.0 (An easy safelist-based HTML-sanitizing tool.) + * bokeh 3.7.2 → 3.7.3 (Interactive plots and applications in the browser from Python) + * branca 0.8.0 → 0.8.1 (Generate complex HTML+JS pages with Python) + * cohere 5.13.12 → 5.15.0 () + * colorlog 6.8.2 → 6.9.0 (Add colours to the output of Python's logging module.) + * contourpy 1.3.1 → 1.3.2 (Python library for calculating contours of 2D quadrilateral grids) + * cython 3.0.12 → 3.1.1 (The Cython compiler for writing C extensions in the Python language.) + * dask 2025.3.0 → 2025.4.1 (Parallel PyData with Task Scheduling) + * debugpy 1.8.0 → 1.8.13 (An implementation of the Debug Adapter Protocol for Python) + * decorator 5.1.1 → 5.2.1 (Decorators for Humans) + * dill 0.3.9 → 0.4.0 (serialize all of Python) + * distributed 2025.3.0 → 2025.4.1 (Distributed scheduler for Dask) + * distro 1.8.0 → 1.9.0 (Distro - an OS platform information API) + * django 5.0.7 → 5.2 (A high-level Python web framework that encourages rapid development and clean, pragmatic design.) + * dnspython 2.6.1 → 2.7.0 (DNS toolkit) + * duckdb 1.2.2 → 1.3.0 (DuckDB in-process database) + * faker 36.1.1 → 37.1.0 (Faker is a Python package that generates fake data for you.) + * fastapi 0.115.8 → 0.115.12 (FastAPI framework, high performance, easy to learn, fast to code, ready for production) + * fastjsonschema 2.18.0 → 2.21.1 (Fastest Python implementation of JSON schema) + * filelock 3.17.0 → 3.18.0 (A platform independent file lock.) + * flit 3.10.1 → 3.12.0 (A simple packaging tool for simple packages.) + * fonttools 4.55.3 → 4.57.0 (Tools to manipulate font files) + * fsspec 2024.6.1 → 2025.3.2 (File-system specification) + * gitdb 4.0.10 → 4.0.12 (Git Object Database) + * gitpython 3.1.32 → 3.1.44 (GitPython is a Python library used to interact with Git repositories) + * graphene 3.3 → 3.4.3 (GraphQL Framework for Python) + * griffe 1.5.5 → 1.7.2 (Signatures for entire Python programs.) + * groq 0.13.1 → 0.25.0 (The official Python library for the groq API) + * guidata 3.7.1 → 3.9.0 (Automatic GUI generation for easy dataset editing and display) + * h2 4.1.0 → 4.2.0 (Pure-Python HTTP/2 protocol implementation) + * httpcore 1.0.5 → 1.0.7 (A minimal low-level HTTP client.) + * httpx 0.27.2 → 0.28.1 (The next generation HTTP client.) + * hupper 1.12 → 1.12.1 (Integrated process monitor for developing and reloading daemons.) + * iniconfig 2.0.0 → 2.1.0 (brain-dead simple config-ini parsing) + * intervaltree 3.0.2 → 3.1.0 (Editable interval tree data structure for Python 2 and 3) + * ipython 8.34.0 → 8.36.0 (IPython: Productive Interactive Computing) + * jinja2 3.1.2 → 3.1.6 (A very fast and expressive template engine.) + * jiter 0.8.2 → 0.9.0 (Fast iterable JSON parser.) + * json5 0.9.14 → 0.10.0 (A Python implementation of the JSON5 data format.) + * jsonpointer 2.4 → 3.0.0 (Identify specific nodes in a JSON document (RFC 6901)) + * jsonschema 4.19.2 → 4.23.0 (An implementation of JSON Schema validation for Python) + * jupyterlab 4.4.1 → 4.4.2 (JupyterLab computational environment) + * keras 3.9.2 → 3.10.0 (Multi-backend Keras) + * langchain 0.3.23 → 0.3.25 (Building applications with LLMs through composability) + * langsmith 0.3.24 → 0.3.42 (Client library to connect to the LangSmith LLM Tracing and Evaluation Platform.) + * lmfit 1.3.1 → 1.3.3 (Least-Squares Minimization with Bounds and Constraints) + * mako 1.3.5 → 1.3.9 (A super-fast templating language that borrows the best ideas from the existing templating languages.) + * matplotlib 3.10.1 → 3.10.3 (Python plotting package) + * maturin 1.8.1 → 1.8.3 (Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages) + * missingno 0.5.1 → 0.5.2 (Missing data visualization module for Python.) + * mistralai 1.2.5 → 1.8.1 (Python Client SDK for the Mistral AI API.) + * mistune 2.0.5 → 3.1.3 (A sane and fast Markdown parser with useful plugins and renderers) + * mpld3 0.5.8 → 0.5.10 (D3 Viewer for Matplotlib) + * multidict 6.1.0 → 6.4.3 (multidict implementation) + * narwhals 1.30.0 → 1.36.0 (Extremely lightweight compatibility layer between dataframe libraries) + * nbclient 0.10.0 → 0.10.2 (A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor.) + * nbconvert 7.16.1 → 7.16.6 (Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script.) + * notebook 7.4.0 → 7.4.2 (Jupyter Notebook - A web-based notebook environment for interactive computing) + * numpy 2.2.4 → 2.2.6 (Fundamental package for array computing in Python) + * numpydoc 1.6.0 → 1.8.0 (Sphinx extension to support docstrings in Numpy format) + * openai 1.72.0 → 1.82.0 (The official Python library for the openai API) + * openpyxl 3.1.2 → 3.1.5 (A Python library to read/write Excel 2010 xlsx/xlsm files) + * optree 0.14.0 → 0.14.1 (Optimized PyTree Utilities.) + * optuna 3.6.1 → 4.2.1 (A hyperparameter optimization framework) + * orjson 3.10.12 → 3.10.16 (Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy) + * pandocfilters 1.5.0 → 1.5.1 (Utilities for writing pandoc filters in python) + * panel 1.6.2 → 1.6.3 (The powerful data exploration & web app framework for Python.) + * partd 1.4.0 → 1.4.2 (Appendable key-value storage) + * pathspec 0.11.0 → 0.12.1 (Utility library for gitignore style pattern matching of file paths.) + * patsy 0.5.6 → 1.0.1 (A Python package for describing statistical models and for building design matrices.) + * pexpect 4.8.0 → 4.9.0 (Pexpect allows easy control of interactive console applications.) + * pg8000 1.23.0 → 1.31.2 (PostgreSQL interface library) + * pip 25.0.1 → 25.1.1 (The PyPA recommended tool for installing Python packages.) + * platformdirs 4.3.6 → 4.3.7 (A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`.) + * plotpy 2.7.2 → 2.7.4 (Curve and image plotting tools for Python/Qt applications) + * polars 1.27.1 → 1.31.0 (Blazingly fast DataFrame library) + * prettytable 3.3.0 → 3.16.0 (A simple Python library for easily displaying tabular data in a visually appealing ASCII table format) + * prince 0.15.0 → 0.16.0 (Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA) + * propcache 0.2.1 → 0.3.1 (Accelerated property cache) + * protobuf 5.27.3 → 6.30.2 () + * psutil 5.9.8 → 7.0.0 (Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7.) + * psygnal 0.11.1 → 0.12.0 (Fast python callback/event system modeled after Qt Signals) + * pyarrow 19.0.1 → 20.0.0 (Python library for Apache Arrow) + * pyerfa 2.0.1.4 → 2.0.1.5 (Python bindings for ERFA) + * pylint 3.1.0 → 3.3.6 (python code static checker) + * pynndescent 0.5.12 → 0.5.13 (Nearest Neighbor Descent) + * pyomo 6.9.1 → 6.9.2 (Pyomo: Python Optimization Modeling Objects) + * pyparsing 3.2.1 → 3.2.3 (pyparsing module - Classes and methods to define and execute parsing grammars) + * pypdf 5.1.0 → 5.4.0 (A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files) + * pyqt5 5.15.10 → 5.15.11 (Python bindings for the Qt cross platform application toolkit) + * pyqtwebengine 5.15.6 → 5.15.7 (Python bindings for the Qt WebEngine framework) + * pytest 8.3.4 → 8.3.5 (pytest: simple powerful testing with Python) + * pythonqwt 0.14.4 → 0.14.5 (Qt plotting widgets for Python) + * pytz 2024.2 → 2025.2 (World timezone definitions, modern and historical) + * pywin32 308 → 310 (Python for Window Extensions) + * pywinpty 2.0.14 → 2.0.15 (Pseudo terminal support for Windows from Python.) + * pyzmq 26.2.1 → 26.4.0 (Python bindings for 0MQ) + * qstylizer 0.2.2 → 0.2.4 (Stylesheet Generator for PyQt{4-5}/PySide{1-2}) + * qtpy 2.4.1 → 2.4.3 (Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6).) + * rapidfuzz 3.9.6 → 3.13.0 (rapid fuzzy string matching) + * redis 5.0.8 → 5.2.1 (Python client for Redis database and key-value store) + * referencing 0.35.1 → 0.36.2 (JSON Referencing + Python) + * reportlab 4.2.5 → 4.3.1 (The Reportlab Toolkit) + * rich 13.9.4 → 14.0.0 (Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal) + * rope 1.12.0 → 1.13.0 (a python refactoring library...) + * rtree 1.3.0 → 1.4.0 (R-Tree spatial index for Python GIS) + * scipy 1.15.2 → 1.15.3 (Fundamental algorithms for scientific computing in Python) + * setuptools 75.8.2 → 79.0.1 (Easily download, build, install, upgrade, and uninstall Python packages) + * shapely 2.0.6 → 2.1.0 (Manipulation and analysis of geometric objects) + * six 1.16.0 → 1.17.0 (Python 2 and 3 compatibility utilities) + * skrub 0.5.1 → 0.5.3 (Prepping tables for machine learning) + * smmap 5.0.0 → 5.0.2 (A pure Python implementation of a sliding window memory map manager) + * sniffio 1.3.0 → 1.3.1 (Sniff out which async library your code is running under) + * sphinx 7.3.7 → 8.1.3 (Python documentation generator) + * spyder 6.0.5 → 6.0.7 (The Scientific Python Development Environment) + * sqlalchemy 2.0.38 → 2.0.40 (Database Abstraction Library) + * starlette 0.45.3 → 0.46.2 (The little ASGI library that shines.) + * streamlit 1.44.0 → 1.46.0 (A faster way to build and share data apps) + * superqt 0.7.1 → 0.7.3 (Missing widgets and components for PyQt/PySide) + * sympy 1.13.3 → 1.14.0 (Computer algebra system (CAS) in Python) + * tblib 3.0.0 → 3.1.0 (Traceback serialization library.) + * tenacity 9.0.0 → 9.1.2 (Retry code until it succeeds) + * termcolor 2.5.0 → 3.1.0 (ANSI color formatting for output in terminal) + * threadpoolctl 3.5.0 → 3.6.0 (threadpoolctl) + * tifffile 2025.1.10 → 2025.3.30 (Read and write TIFF files) + * tiktoken 0.8.0 → 0.9.0 (tiktoken is a fast BPE tokeniser for use with OpenAI's models) + * tokenizers 0.21.0 → 0.21.1 () + * tornado 6.4.2 → 6.5.1 (Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.) + * tqdm 4.66.4 → 4.67.1 (Fast, Extensible Progress Meter) + * traitlets 5.14.1 → 5.14.3 (Traitlets Python configuration system) + * trio 0.29.0 → 0.30.0 (A friendly Python library for async concurrency and I/O) + * tzdata 2024.1 → 2025.2 (Provider of IANA time zone data) + * tzlocal 5.2 → 5.3.1 (tzinfo object for the local timezone) + * urllib3 2.2.3 → 2.4.0 (HTTP library with thread-safe connection pooling, file post, and more.) + * uvicorn 0.34.0 → 0.34.2 (The lightning-fast ASGI server.) + * winpython 15.3.20250425 → 16.6.20250620 (WinPython distribution tools, including WPPM) + * xarray 2025.3.0 → 2025.4.0 (N-D labeled arrays and datasets in Python) + * xlsxwriter 3.1.9 → 3.2.3 (A Python module for creating Excel XLSX files.) + +Removed packages: + * Python 3.13.3 (Python programming language with standard library) + * aniso8601 9.0.1 (A library for parsing ISO 8601 strings.) + * fast-histogram 0.14 (Fast simple 1D and 2D histograms) + * jsonpath-python 1.0.6 (A more powerful JSONPath implementation in modern python) + * mpl-scatter-density 0.7 (Matplotlib helpers to make density scatter plots) + * pydantic-ai 0.0.24 (Agent Framework / shim to use Pydantic with LLMs) + * typing-inspect 0.9.0 (Runtime inspection utilities for typing module.) + +### WheelHouse packages + + +No differences found. + + +
+ +* * * diff --git a/changelogs/WinPythonwhl-64bit-3.12.10.1.md b/changelogs/WinPythonwhl-64bit-3.12.10.1.md new file mode 100644 index 00000000..2872b31f --- /dev/null +++ b/changelogs/WinPythonwhl-64bit-3.12.10.1.md @@ -0,0 +1,522 @@ +## WinPython 3.12.10.1whl + +The following packages are included in WinPython-64bit v3.12.10.1whl 3.10.11.1dot. + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.12.10 | Python programming language with standard library + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 25.0 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 16.6.20250620 | WinPython distribution tools, including WPPM + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ +[absl-py](https://pypi.org/project/absl-py) | 2.2.2 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc-driver-manager](https://pypi.org/project/adbc-driver-manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.6.1 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.18 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.2 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.15.2 | A database migration tool for SQLAlchemy. +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[annotated-types](https://pypi.org/project/annotated-types) | 0.7.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.51.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.9.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.18 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argcomplete](https://pypi.org/project/argcomplete) | 3.6.2 | Bash tab completion for argparse +[argon2-cffi](https://pypi.org/project/argon2-cffi) | 23.1.0 | Argon2 for Python +[argon2-cffi-bindings](https://pypi.org/project/argon2-cffi-bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array-api-compat](https://pypi.org/project/array-api-compat) | 1.12.0 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi-csrf](https://pypi.org/project/asgi-csrf) | 0.11 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 1.0.5 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.3.9 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy-iers-data](https://pypi.org/project/astropy-iers-data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 3.0.0 | Annotate AST trees with source code positions +[async-lru](https://pypi.org/project/async-lru) | 2.0.5 | Simple LRU cache for asyncio +[asyncssh](https://pypi.org/project/asyncssh) | 2.20.0 | AsyncSSH: Asynchronous SSHv2 client and server library +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 25.3.0 | Classes Without Boilerplate +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure-core](https://pypi.org/project/azure-core) | 1.32.0 | Microsoft Azure Core Library for Python +[azure-cosmos](https://pypi.org/project/azure-cosmos) | 4.9.0 | Microsoft Azure Cosmos Client Library for Python +[azure-identity](https://pypi.org/project/azure-identity) | 1.21.0 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.17.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 1.0.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.3.0 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.13.3 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 25.1.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.2.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.9.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.7.3 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.1 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachetools](https://pypi.org/project/cachetools) | 5.5.2 | Extensible memoizing collections and decorators +[certifi](https://pypi.org/project/certifi) | 2025.1.31 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset-normalizer](https://pypi.org/project/charset-normalizer) | 3.4.2 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.8 | Composable command line interface toolkit +[click-default-group](https://pypi.org/project/click-default-group) | 1.2.4 | click_default_group +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.1.1 | Pickler class to extend the standard pickle.Pickler functionality +[cohere](https://pypi.org/project/cohere) | 5.15.0 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorlog](https://pypi.org/project/colorlog) | 6.9.0 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.2 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g. +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.4 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.1.1 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2025.4.1 | Parallel PyData with Task Scheduling +[datasette](https://pypi.org/project/datasette) | 0.65.1 | An open source multi-tool for exploring and publishing data +[datasette-graphql](https://pypi.org/project/datasette-graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[deap](https://pypi.org/project/deap) | 1.4.2 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.13 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.2.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[deprecated](https://pypi.org/project/deprecated) | 1.2.14 | Python @deprecated decorator to deprecate old python classes, functions or methods. +[diff-match-patch](https://pypi.org/project/diff-match-patch) | 20241021 | Repackaging of Google's Diff Match and Patch libraries. +[dill](https://pypi.org/project/dill) | 0.4.0 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2025.4.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.9.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.2 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.7.0 | DNS toolkit +[docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) | 0.17 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.21.2 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.3.0 | DuckDB in-process database +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et-xmlfile](https://pypi.org/project/et-xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval-type-backport](https://pypi.org/project/eval-type-backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.2.0 | Get the currently executing AST node of a frame, and other information +[faker](https://pypi.org/project/faker) | 37.1.0 | Faker is a Python package that generates fake data for you. +[fasta2a](https://pypi.org/project/fasta2a) | 0.2.9 | Convert an AI Agent into a A2A server! ✨ +[fastapi](https://pypi.org/project/fastapi) | 0.115.12 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | Fast read/write of AVRO files +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.21.1 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.18.0 | A platform independent file lock. +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.1.0 | A simple framework for building complex web applications. +[flexcache](https://pypi.org/project/flexcache) | 0.3 | Saves and loads to the cache a transformed versions of a source object. +[flexparser](https://pypi.org/project/flexparser) | 0.4 | Parsing made fun ... using typing. +[flit](https://pypi.org/project/flit) | 3.12.0 | A simple packaging tool for simple packages. +[flit-core](https://pypi.org/project/flit-core) | 3.12.0 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.19.5 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.57.0 | Tools to manipulate font files +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2025.3.2 | File-system specification +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.12 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.44 | GitPython is a Python library used to interact with Git repositories +[google-auth](https://pypi.org/project/google-auth) | 2.38.0 | Google Authentication Library +[google-genai](https://pypi.org/project/google-genai) | 1.16.1 | GenAI Python SDK +[graphene](https://pypi.org/project/graphene) | 3.4.3 | GraphQL Framework for Python +[graphql-core](https://pypi.org/project/graphql-core) | 3.2.6 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql-relay](https://pypi.org/project/graphql-relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.7.2 | Signatures for entire Python programs. +[groq](https://pypi.org/project/groq) | 0.25.0 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.9.0 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.2.0 | Pure-Python HTTP/2 protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[hpack](https://pypi.org/project/hpack) | 4.1.0 | Pure-Python HPACK header encoding +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.7 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.28.1 | The next generation HTTP client. +[httpx-sse](https://pypi.org/project/httpx-sse) | 0.4.0 | Consume Server-Sent Event (SSE) messages with HTTPX. +[huggingface-hub](https://pypi.org/project/huggingface-hub) | 0.33.0 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12.1 | Integrated process monitor for developing and reloading daemons. +[hypercorn](https://pypi.org/project/hypercorn) | 0.17.3 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.1.0 | Pure-Python HTTP/2 framing +[hypothesis](https://pypi.org/project/hypothesis) | 6.130.4 | A library for property-based testing +[id](https://pypi.org/project/id) | 1.5.0 | A tool for generating OIDC identities +[idna](https://pypi.org/project/idna) | 3.10 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.37.0 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced-learn](https://pypi.org/project/imbalanced-learn) | 0.13.0 | Toolbox for imbalanced dataset in machine learning +[importlib-metadata](https://pypi.org/project/importlib-metadata) | 8.6.1 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.1.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.1.0 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.7 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.36.0 | IPython: Productive Interactive Computing +[ipython-genutils](https://pypi.org/project/ipython-genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython-sql](https://pypi.org/project/ipython-sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.6 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 2.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco-classes](https://pypi.org/project/jaraco-classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco-context](https://pypi.org/project/jaraco-context) | 6.0.1 | Useful decorators and context managers +[jaraco-functools](https://pypi.org/project/jaraco-functools) | 4.1.0 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.2 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.6 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.9.0 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.10.0 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpointer](https://pypi.org/project/jsonpointer) | 3.0.0 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.23.0 | An implementation of JSON Schema validation for Python +[jsonschema-specifications](https://pypi.org/project/jsonschema-specifications) | 2024.10.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter-bokeh](https://pypi.org/project/jupyter-bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter-client](https://pypi.org/project/jupyter-client) | 8.6.3 | Jupyter protocol implementation and client libraries +[jupyter-console](https://pypi.org/project/jupyter-console) | 6.6.3 | Jupyter terminal console +[jupyter-core](https://pypi.org/project/jupyter-core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter-events](https://pypi.org/project/jupyter-events) | 0.12.0 | Jupyter Event System library +[jupyter-leaflet](https://pypi.org/project/jupyter-leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter-lsp](https://pypi.org/project/jupyter-lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter-server](https://pypi.org/project/jupyter-server) | 2.15.0 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter-server-terminals](https://pypi.org/project/jupyter-server-terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.4.2 | JupyterLab computational environment +[jupyterlab-pygments](https://pypi.org/project/jupyterlab-pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab-server](https://pypi.org/project/jupyterlab-server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) | 3.0.14 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.10.0 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.6.0 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.25 | Building applications with LLMs through composability +[langchain-core](https://pypi.org/project/langchain-core) | 0.3.59 | Building applications with LLMs through composability +[langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) | 0.3.8 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.3.42 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy-loader](https://pypi.org/project/lazy-loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.3 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire-api](https://pypi.org/project/logfire-api) | 3.12.0 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.9 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.7 | Python implementation of John Gruber's Markdown. +[markdown-it-py](https://pypi.org/project/markdown-it-py) | 3.0.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.3 | Python plotting package +[matplotlib-inline](https://pypi.org/project/matplotlib-inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.8.3 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mcp](https://pypi.org/project/mcp) | 1.9.3 | Model Context Protocol SDK +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.2 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.8.1 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 3.1.3 | A sane and fast Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml-dtypes](https://pypi.org/project/ml-dtypes) | 0.5.1 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | Machine Learning Library Extensions +[more-itertools](https://pypi.org/project/more-itertools) | 10.6.0 | More routines for operating on iterables, beyond itertools +[mpld3](https://pypi.org/project/mpld3) | 0.5.10 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal-extensions](https://pypi.org/project/msal-extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.4.3 | multidict implementation +[mypy](https://pypi.org/project/mypy) | 1.15.0 | Optional static typing for Python +[mypy-extensions](https://pypi.org/project/mypy-extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.36.0 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.2 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.6 | Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest-asyncio](https://pypi.org/project/nest-asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nh3](https://pypi.org/project/nh3) | 0.2.18 | Python bindings to the ammonia HTML sanitization library. +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.4.2 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook-shim](https://pypi.org/project/notebook-shim) | 0.2.4 | A shim layer for notebook traits and config +[numba](https://pypi.org/project/numba) | 0.61.2 | compiling Python code using LLVM +[numpy](https://pypi.org/project/numpy) | 2.2.6 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.8.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.82.0 | The official Python library for the openai API +[opencv-python](https://pypi.org/project/opencv-python) | 4.11.0.86 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.5 | A Python library to read/write Excel 2010 xlsx/xlsm files +[opentelemetry-api](https://pypi.org/project/opentelemetry-api) | 1.32.1 | OpenTelemetry Python API +[optree](https://pypi.org/project/optree) | 0.14.1 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 4.2.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.16 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | OSQP: The Operator Splitting QP Solver +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.1 | Utilities for writing pandoc filters in python +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.2 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.12.1 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 1.0.1 | A Python package for describing statistical models and for building design matrices. +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.9.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.31.2 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.1.0 | Python Imaging Library (Fork) +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.3.7 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 6.0.1 | An open-source interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.4 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.31.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[prettytable](https://pypi.org/project/prettytable) | 3.16.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[prince](https://pypi.org/project/prince) | 0.16.0 | Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus-client](https://pypi.org/project/prometheus-client) | 0.21.1 | Python client for the Prometheus monitoring system. +[prompt-toolkit](https://pypi.org/project/prompt-toolkit) | 3.0.51 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.3.1 | Accelerated property cache +[protobuf](https://pypi.org/project/protobuf) | 6.30.2 | +[psutil](https://pypi.org/project/psutil) | 7.0.0 | Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7. +[psygnal](https://pypi.org/project/psygnal) | 0.12.0 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pure-eval](https://pypi.org/project/pure-eval) | 0.2.3 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 20.0.0 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.6.1 | Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208) +[pyasn1-modules](https://pypi.org/project/pyasn1-modules) | 0.4.1 | A collection of ASN.1-based protocols modules +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | Data validation using Python type hints +[pydantic-ai-slim](https://pypi.org/project/pydantic-ai-slim) | 0.2.9 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic-core](https://pypi.org/project/pydantic-core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydantic-evals](https://pypi.org/project/pydantic-evals) | 0.2.9 | Framework for evaluating stochastic code execution, especially code making use of LLMs +[pydantic-graph](https://pypi.org/project/pydantic-graph) | 0.2.9 | Graph and state machine library +[pydantic-settings](https://pypi.org/project/pydantic-settings) | 2.8.1 | Settings management using Pydantic +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.5 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygithub](https://pypi.org/project/pygithub) | 2.6.1 | Use the full Github API v3 +[pygments](https://pypi.org/project/pygments) | 2.19.1 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.10.1 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.3.6 | python code static checker +[pylint-venv](https://pypi.org/project/pylint-venv) | 3.0.4 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls-spyder](https://pypi.org/project/pyls-spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pympler](https://pypi.org/project/pympler) | 1.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.13 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | Vectorized spatial vector file format I/O using GDAL/OGR +[pyomo](https://pypi.org/project/pyomo) | 6.9.2 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.15 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.3 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 5.4.0 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.11 | Python bindings for the Qt cross platform application toolkit +[pyqt5-qt5](https://pypi.org/project/pyqt5-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5-sip](https://pypi.org/project/pyqt5-sip) | 12.17.0 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.7 | Python bindings for the Qt WebEngine framework +[pyqtwebengine-qt5](https://pypi.org/project/pyqtwebengine-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | Windows Negotiate Authentication Client and Server +[pytest](https://pypi.org/project/pytest) | 8.3.5 | pytest: simple powerful testing with Python +[python-barcode](https://pypi.org/project/python-barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python-dateutil](https://pypi.org/project/python-dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python-dotenv](https://pypi.org/project/python-dotenv) | 1.1.0 | Read key-value pairs from a .env file and set them as environment variables +[python-json-logger](https://pypi.org/project/python-json-logger) | 3.3.0 | JSON Log Formatter for the Python Logging Package +[python-lsp-black](https://pypi.org/project/python-lsp-black) | 2.0.0 | Black plugin for the Python LSP Server +[python-lsp-jsonrpc](https://pypi.org/project/python-lsp-jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python-lsp-server](https://pypi.org/project/python-lsp-server) | 1.12.2 | Python Language Server for the Language Server Protocol +[python-multipart](https://pypi.org/project/python-multipart) | 0.0.20 | A streaming multipart parser for Python +[python-slugify](https://pypi.org/project/python-slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.5 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2025.2 | World timezone definitions, modern and historical +[pyuca](https://pypi.org/project/pyuca) | 1.2 | a Python implementation of the Unicode Collation Algorithm +[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | Easy USB access for Python +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | PyWavelets, wavelet transform module +[pywin32](https://pypi.org/project/pywin32) | 310 | Python for Window Extensions +[pywin32-ctypes](https://pypi.org/project/pywin32-ctypes) | 0.2.3 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.15 | Pseudo terminal support for Windows from Python. +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.4.0 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | QDLDL, a free LDL factorization routine. +[qrcode](https://pypi.org/project/qrcode) | 8.0 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.4 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.4.0 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.6.1 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.3 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.20.0 | A Python ASGI web framework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.13.0 | rapid fuzzy string matching +[readme-renderer](https://pypi.org/project/readme-renderer) | 44.0 | readme_renderer is a library for rendering readme descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.2.1 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.36.2 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.3.1 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests-ntlm](https://pypi.org/project/requests-ntlm) | 1.3.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests-toolbelt](https://pypi.org/project/requests-toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339-validator](https://pypi.org/project/rfc3339-validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986-validator](https://pypi.org/project/rfc3986-validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 14.0.0 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.13.0 | a python refactoring library... +[rpds-py](https://pypi.org/project/rpds-py) | 0.24.0 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.4.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.2.0 | Reactive Extensions (Rx) for Python +[scikit-image](https://pypi.org/project/scikit-image) | 0.25.2 | Image processing in Python +[scikit-learn](https://pypi.org/project/scikit-learn) | 1.6.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.15.3 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.5 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.7.post2 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.3 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.1.0 | Manipulation and analysis of geometric objects +[shellingham](https://pypi.org/project/shellingham) | 1.5.4 | Tool to Detect Surrounding Shell +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.1.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.17.0 | Python 2 and 3 compatibility utilities +[sklearn-compat](https://pypi.org/project/sklearn-compat) | 0.1.3 | Ease support for compatible scikit-learn estimators across versions +[skrub](https://pypi.org/project/skrub) | 0.5.3 | Prepping tables for machine learning +[smmap](https://pypi.org/project/smmap) | 5.0.2 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.1 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 8.1.3 | Python documentation generator +[sphinx-rtd-theme](https://pypi.org/project/sphinx-rtd-theme) | 3.0.2 | Read the Docs theme for Sphinx +[sphinxcontrib-applehelp](https://pypi.org/project/sphinxcontrib-applehelp) | 2.0.0 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib-devhelp](https://pypi.org/project/sphinxcontrib-devhelp) | 2.0.0 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib-htmlhelp](https://pypi.org/project/sphinxcontrib-htmlhelp) | 2.1.0 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib-jquery](https://pypi.org/project/sphinxcontrib-jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib-jsmath](https://pypi.org/project/sphinxcontrib-jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib-qthelp](https://pypi.org/project/sphinxcontrib-qthelp) | 2.0.0 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib-serializinghtml](https://pypi.org/project/sphinxcontrib-serializinghtml) | 2.0.0 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 6.0.7 | The Scientific Python Development Environment +[spyder-kernels](https://pypi.org/project/spyder-kernels) | 3.0.5 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.40 | Database Abstraction Library +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite-fts4](https://pypi.org/project/sqlite-fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite-utils](https://pypi.org/project/sqlite-utils) | 3.38 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | A non-validating SQL parser. +[squarify](https://pypi.org/project/squarify) | 0.4.4 | Pure Python implementation of the squarify treemap layout algorithm +[sse-starlette](https://pypi.org/project/sse-starlette) | 2.2.1 | SSE plugin for Starlette +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | SSPI API bindings for Python +[stack-data](https://pypi.org/project/stack-data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.46.2 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.46.0 | A faster way to build and share data apps +[superqt](https://pypi.org/project/superqt) | 0.7.3 | Missing widgets and components for PyQt/PySide +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[sympy](https://pypi.org/project/sympy) | 1.14.0 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.1.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 9.1.2 | Retry code until it succeeds +[termcolor](https://pypi.org/project/termcolor) | 3.1.0 | ANSI color formatting for output in terminal +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text-unidecode](https://pypi.org/project/text-unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | Compute distance between the two texts. +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | Fuzzy string matching in python +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.6.0 | threadpoolctl +[three-merge](https://pypi.org/project/three-merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2025.3.30 | Read and write TIFF files +[tiktoken](https://pypi.org/project/tiktoken) | 0.9.0 | tiktoken is a fast BPE tokeniser for use with OpenAI's models +[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | A tiny CSS parser +[tokenizers](https://pypi.org/project/tokenizers) | 0.21.1 | +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.2.1 | A lil' TOML parser +[tomli-w](https://pypi.org/project/tomli-w) | 1.2.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 1.0.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.5.1 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.67.1 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.3 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.30.0 | A friendly Python library for async concurrency and I/O +[trove-classifiers](https://pypi.org/project/trove-classifiers) | 2025.5.9.12 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 6.1.0 | Collection of utilities for publishing packages on PyPI +[typer](https://pypi.org/project/typer) | 0.15.2 | Typer, build great CLIs. Easy to code. Based on Python type hints. +[types-python-dateutil](https://pypi.org/project/types-python-dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[types-requests](https://pypi.org/project/types-requests) | 2.32.0.20250328 | Typing stubs for requests +[typing-extensions](https://pypi.org/project/typing-extensions) | 4.13.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing-inspection](https://pypi.org/project/typing-inspection) | 0.4.0 | Runtime typing introspection tools +[tzdata](https://pypi.org/project/tzdata) | 2025.2 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.3.1 | tzinfo object for the local timezone +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap-learn](https://pypi.org/project/umap-learn) | 0.5.7 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | calculations with values with uncertainties, error propagation +[uri-template](https://pypi.org/project/uri-template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.4.0 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.34.2 | The lightning-fast ASGI server. +[vega-datasets](https://pypi.org/project/vega-datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | A library for working with the color formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket-client](https://pypi.org/project/websocket-client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 14.2 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.14 | Jupyter interactive widgets for Jupyter Notebook +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | Module for decorators, wrappers and monkey patching. +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2025.4.0 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.2.3 | A Python module for creating Excel XLSX files. +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt-dlp](https://pypi.org/project/yt-dlp) | 2025.2.19 | A feature-rich command-line audio/video downloader +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.21.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + + +
diff --git a/changelogs/WinPythonwhl-64bit-3.12.10.1_History.md b/changelogs/WinPythonwhl-64bit-3.12.10.1_History.md new file mode 100644 index 00000000..49f45d21 --- /dev/null +++ b/changelogs/WinPythonwhl-64bit-3.12.10.1_History.md @@ -0,0 +1,26 @@ +## History of changes for WinPython-64bit 3.12.10.1whl + +The following changes were made to WinPython-64bit distribution since version 3.12.10.1whl. + + +
+ +### Tools + + +No differences found. + +### Python packages + + +No differences found. + +### WheelHouse packages + + +No differences found. + + +
+ +* * * diff --git a/changelogs/WinPythonwhl-64bit-3.13.5.0.md b/changelogs/WinPythonwhl-64bit-3.13.5.0.md new file mode 100644 index 00000000..c50ede47 --- /dev/null +++ b/changelogs/WinPythonwhl-64bit-3.13.5.0.md @@ -0,0 +1,522 @@ +## WinPython 3.13.5.0whl + +The following packages are included in WinPython-64bit v3.13.5.0whl 3.10.11.1dot. + +
+ +### Tools + +Name | Version | Description +-----|---------|------------ +[Python](http://www.python.org/) | 3.13.5 | Python programming language with standard library + + +### Python packages + +Name | Version | Description +-----|---------|------------ +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[packaging](https://pypi.org/project/packaging) | 25.0 | Core utilities for Python packages +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[winpython](https://pypi.org/project/winpython) | 16.6.20250620 | WinPython distribution tools, including WPPM + + +### WheelHouse packages + +Name | Version | Description +-----|---------|------------ +[absl-py](https://pypi.org/project/absl-py) | 2.2.2 | Abseil Python Common Libraries, see https://github.com/abseil/abseil-py. +[adbc-driver-manager](https://pypi.org/project/adbc-driver-manager) | 1.3.0 | A generic entrypoint for ADBC drivers. +[aiofiles](https://pypi.org/project/aiofiles) | 23.2.1 | File support for asyncio. +[aiohappyeyeballs](https://pypi.org/project/aiohappyeyeballs) | 2.6.1 | Happy Eyeballs for asyncio +[aiohttp](https://pypi.org/project/aiohttp) | 3.11.18 | Async http client/server framework (asyncio) +[aiosignal](https://pypi.org/project/aiosignal) | 1.3.2 | aiosignal: a list of registered asynchronous callbacks +[aiosqlite](https://pypi.org/project/aiosqlite) | 0.20.0 | asyncio bridge to the standard sqlite3 module +[alabaster](https://pypi.org/project/alabaster) | 0.7.16 | A light, configurable Sphinx theme +[alembic](https://pypi.org/project/alembic) | 1.15.2 | A database migration tool for SQLAlchemy. +[altair](https://pypi.org/project/altair) | 5.5.0 | Vega-Altair: A declarative statistical visualization library for Python. +[annotated-types](https://pypi.org/project/annotated-types) | 0.7.0 | Reusable constraint types to use with typing.Annotated +[ansicolors](https://pypi.org/project/ansicolors) | 1.1.8 | ANSI colors for Python +[anthropic](https://pypi.org/project/anthropic) | 0.51.0 | The official Python library for the anthropic API +[anyio](https://pypi.org/project/anyio) | 4.9.0 | High level compatibility layer for multiple asynchronous event loop implementations +[anywidget](https://pypi.org/project/anywidget) | 0.9.18 | custom jupyter widgets made easy +[appdirs](https://pypi.org/project/appdirs) | 1.4.4 | A small Python module for determining appropriate platform-specific dirs, e.g. a "user data dir". +[argcomplete](https://pypi.org/project/argcomplete) | 3.6.2 | Bash tab completion for argparse +[argon2-cffi](https://pypi.org/project/argon2-cffi) | 23.1.0 | Argon2 for Python +[argon2-cffi-bindings](https://pypi.org/project/argon2-cffi-bindings) | 21.2.0 | Low-level CFFI bindings for Argon2 +[array-api-compat](https://pypi.org/project/array-api-compat) | 1.12.0 | A wrapper around NumPy and other array libraries to make them compatible with the Array API standard +[arrow](https://pypi.org/project/arrow) | 1.3.0 | Better dates & times for Python +[asgi-csrf](https://pypi.org/project/asgi-csrf) | 0.11 | ASGI middleware for protecting against CSRF attacks +[asgiref](https://pypi.org/project/asgiref) | 3.8.1 | ASGI specs, helper code, and adapters +[asn1crypto](https://pypi.org/project/asn1crypto) | 1.5.1 | Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, +[asteval](https://pypi.org/project/asteval) | 1.0.5 | Safe, minimalistic evaluator of python expression using ast module +[astroid](https://pypi.org/project/astroid) | 3.3.9 | An abstract syntax tree for Python with inference support. +[astropy](https://pypi.org/project/astropy) | 6.1.6 | Astronomy and astrophysics core library +[astropy-iers-data](https://pypi.org/project/astropy-iers-data) | 0.2024.12.23.0.33.24 | IERS Earth Rotation and Leap Second tables for the astropy core package +[asttokens](https://pypi.org/project/asttokens) | 3.0.0 | Annotate AST trees with source code positions +[async-lru](https://pypi.org/project/async-lru) | 2.0.5 | Simple LRU cache for asyncio +[asyncssh](https://pypi.org/project/asyncssh) | 2.20.0 | AsyncSSH: Asynchronous SSHv2 client and server library +[atomicwrites](https://pypi.org/project/atomicwrites) | 1.4.0 | Atomic file writes. +[attrs](https://pypi.org/project/attrs) | 25.3.0 | Classes Without Boilerplate +[autopep8](https://pypi.org/project/autopep8) | 2.0.4 | A tool that automatically formats Python code to conform to the PEP 8 style guide +[azure-core](https://pypi.org/project/azure-core) | 1.32.0 | Microsoft Azure Core Library for Python +[azure-cosmos](https://pypi.org/project/azure-cosmos) | 4.9.0 | Microsoft Azure Cosmos Client Library for Python +[azure-identity](https://pypi.org/project/azure-identity) | 1.21.0 | Microsoft Azure Identity Library for Python +[babel](https://pypi.org/project/babel) | 2.17.0 | Internationalization utilities +[baresql](https://pypi.org/project/baresql) | 1.0.0 | playing SQL directly on Python datas +[bcrypt](https://pypi.org/project/bcrypt) | 4.3.0 | Modern password hashing for your software and your servers +[beautifulsoup4](https://pypi.org/project/beautifulsoup4) | 4.13.3 | Screen-scraping library +[binaryornot](https://pypi.org/project/binaryornot) | 0.4.4 | Ultra-lightweight pure Python package to check if a file is binary or text. +[black](https://pypi.org/project/black) | 25.1.0 | The uncompromising code formatter. +[bleach](https://pypi.org/project/bleach) | 6.2.0 | An easy safelist-based HTML-sanitizing tool. +[blinker](https://pypi.org/project/blinker) | 1.9.0 | Fast, simple object-to-object and broadcast signaling +[bokeh](https://pypi.org/project/bokeh) | 3.7.3 | Interactive plots and applications in the browser from Python +[branca](https://pypi.org/project/branca) | 0.8.1 | Generate complex HTML+JS pages with Python +[brotli](https://pypi.org/project/brotli) | 1.1.0 | Python bindings for the Brotli compression library +[build](https://pypi.org/project/build) | 1.2.2.post1 | A simple, correct Python build frontend +[cachetools](https://pypi.org/project/cachetools) | 5.5.2 | Extensible memoizing collections and decorators +[certifi](https://pypi.org/project/certifi) | 2025.1.31 | Python package for providing Mozilla's CA Bundle. +[cffi](https://pypi.org/project/cffi) | 1.17.1 | Foreign Function Interface for Python calling C code. +[chardet](https://pypi.org/project/chardet) | 5.2.0 | Universal encoding detector for Python 3 +[charset-normalizer](https://pypi.org/project/charset-normalizer) | 3.4.2 | The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet. +[clarabel](https://pypi.org/project/clarabel) | 0.10.0 | Clarabel Conic Interior Point Solver for Rust / Python +[click](https://pypi.org/project/click) | 8.1.8 | Composable command line interface toolkit +[click-default-group](https://pypi.org/project/click-default-group) | 1.2.4 | click_default_group +[cloudpickle](https://pypi.org/project/cloudpickle) | 3.1.1 | Pickler class to extend the standard pickle.Pickler functionality +[cohere](https://pypi.org/project/cohere) | 5.15.0 | +[colorama](https://pypi.org/project/colorama) | 0.4.6 | Cross-platform colored terminal text. +[colorlog](https://pypi.org/project/colorlog) | 6.9.0 | Add colours to the output of Python's logging module. +[comm](https://pypi.org/project/comm) | 0.2.2 | Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc. +[contourpy](https://pypi.org/project/contourpy) | 1.3.2 | Python library for calculating contours of 2D quadrilateral grids +[cookiecutter](https://pypi.org/project/cookiecutter) | 2.6.0 | A command-line utility that creates projects from project templates, e.g. +[cryptography](https://pypi.org/project/cryptography) | 44.0.0 | cryptography is a package which provides cryptographic recipes and primitives to Python developers. +[cvxpy](https://pypi.org/project/cvxpy) | 1.6.4 | A domain-specific language for modeling convex optimization problems in Python. +[cycler](https://pypi.org/project/cycler) | 0.12.1 | Composable style cycles +[cython](https://pypi.org/project/cython) | 3.1.1 | The Cython compiler for writing C extensions in the Python language. +[cytoolz](https://pypi.org/project/cytoolz) | 1.0.1 | Cython implementation of Toolz: High performance functional utilities +[dask](https://pypi.org/project/dask) | 2025.4.1 | Parallel PyData with Task Scheduling +[datasette](https://pypi.org/project/datasette) | 0.65.1 | An open source multi-tool for exploring and publishing data +[datasette-graphql](https://pypi.org/project/datasette-graphql) | 2.2 | Datasette plugin providing an automatic GraphQL API for your SQLite databases +[deap](https://pypi.org/project/deap) | 1.4.2 | Distributed Evolutionary Algorithms in Python +[debugpy](https://pypi.org/project/debugpy) | 1.8.13 | An implementation of the Debug Adapter Protocol for Python +[decorator](https://pypi.org/project/decorator) | 5.2.1 | Decorators for Humans +[defusedxml](https://pypi.org/project/defusedxml) | 0.7.1 | XML bomb protection for Python stdlib modules +[deprecated](https://pypi.org/project/deprecated) | 1.2.14 | Python @deprecated decorator to deprecate old python classes, functions or methods. +[diff-match-patch](https://pypi.org/project/diff-match-patch) | 20241021 | Repackaging of Google's Diff Match and Patch libraries. +[dill](https://pypi.org/project/dill) | 0.4.0 | serialize all of Python +[distributed](https://pypi.org/project/distributed) | 2025.4.1 | Distributed scheduler for Dask +[distro](https://pypi.org/project/distro) | 1.9.0 | Distro - an OS platform information API +[django](https://pypi.org/project/django) | 5.2 | A high-level Python web framework that encourages rapid development and clean, pragmatic design. +[dnspython](https://pypi.org/project/dnspython) | 2.7.0 | DNS toolkit +[docstring-to-markdown](https://pypi.org/project/docstring-to-markdown) | 0.17 | On the fly conversion of Python docstrings to markdown +[docutils](https://pypi.org/project/docutils) | 0.21.2 | Docutils -- Python Documentation Utilities +[duckdb](https://pypi.org/project/duckdb) | 1.3.0 | DuckDB in-process database +[entrypoints](https://pypi.org/project/entrypoints) | 0.4 | Discover and load entry points from installed packages. +[et-xmlfile](https://pypi.org/project/et-xmlfile) | 1.1.0 | An implementation of lxml.xmlfile for the standard library +[eval-type-backport](https://pypi.org/project/eval-type-backport) | 0.2.2 | Like `typing._eval_type`, but lets older Python versions use newer typing features. +[executing](https://pypi.org/project/executing) | 2.2.0 | Get the currently executing AST node of a frame, and other information +[faker](https://pypi.org/project/faker) | 37.1.0 | Faker is a Python package that generates fake data for you. +[fasta2a](https://pypi.org/project/fasta2a) | 0.2.9 | Convert an AI Agent into a A2A server! ✨ +[fastapi](https://pypi.org/project/fastapi) | 0.115.12 | FastAPI framework, high performance, easy to learn, fast to code, ready for production +[fastavro](https://pypi.org/project/fastavro) | 1.10.0 | Fast read/write of AVRO files +[fastjsonschema](https://pypi.org/project/fastjsonschema) | 2.21.1 | Fastest Python implementation of JSON schema +[filelock](https://pypi.org/project/filelock) | 3.18.0 | A platform independent file lock. +[flake8](https://pypi.org/project/flake8) | 7.1.1 | the modular source code checker: pep8 pyflakes and co +[flask](https://pypi.org/project/flask) | 3.1.0 | A simple framework for building complex web applications. +[flexcache](https://pypi.org/project/flexcache) | 0.3 | Saves and loads to the cache a transformed versions of a source object. +[flexparser](https://pypi.org/project/flexparser) | 0.4 | Parsing made fun ... using typing. +[flit](https://pypi.org/project/flit) | 3.12.0 | A simple packaging tool for simple packages. +[flit-core](https://pypi.org/project/flit-core) | 3.12.0 | Distribution-building parts of Flit. See flit package for more information +[folium](https://pypi.org/project/folium) | 0.19.5 | Make beautiful maps with Leaflet.js & Python +[fonttools](https://pypi.org/project/fonttools) | 4.57.0 | Tools to manipulate font files +[fqdn](https://pypi.org/project/fqdn) | 1.5.1 | Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers +[frozenlist](https://pypi.org/project/frozenlist) | 1.5.0 | A list-like structure which implements collections.abc.MutableSequence +[fsspec](https://pypi.org/project/fsspec) | 2025.3.2 | File-system specification +[fuzzywuzzy](https://pypi.org/project/fuzzywuzzy) | 0.18.0 | Fuzzy string matching in python +[geographiclib](https://pypi.org/project/geographiclib) | 2.0 | The geodesic routines from GeographicLib +[geopandas](https://pypi.org/project/geopandas) | 1.0.1 | Geographic pandas extensions +[geopy](https://pypi.org/project/geopy) | 2.4.1 | Python Geocoding Toolbox +[gitdb](https://pypi.org/project/gitdb) | 4.0.12 | Git Object Database +[gitpython](https://pypi.org/project/gitpython) | 3.1.44 | GitPython is a Python library used to interact with Git repositories +[google-auth](https://pypi.org/project/google-auth) | 2.38.0 | Google Authentication Library +[google-genai](https://pypi.org/project/google-genai) | 1.16.1 | GenAI Python SDK +[graphene](https://pypi.org/project/graphene) | 3.4.3 | GraphQL Framework for Python +[graphql-core](https://pypi.org/project/graphql-core) | 3.2.6 | GraphQL implementation for Python, a port of GraphQL.js, the JavaScript reference implementation for GraphQL. +[graphql-relay](https://pypi.org/project/graphql-relay) | 3.2.0 | Relay library for graphql-core +[greenlet](https://pypi.org/project/greenlet) | 3.1.1 | Lightweight in-process concurrent programming +[griffe](https://pypi.org/project/griffe) | 1.7.2 | Signatures for entire Python programs. +[groq](https://pypi.org/project/groq) | 0.25.0 | The official Python library for the groq API +[guidata](https://pypi.org/project/guidata) | 3.9.0 | Automatic GUI generation for easy dataset editing and display +[h11](https://pypi.org/project/h11) | 0.14.0 | A pure-Python, bring-your-own-I/O implementation of HTTP/1.1 +[h2](https://pypi.org/project/h2) | 4.2.0 | Pure-Python HTTP/2 protocol implementation +[h5py](https://pypi.org/project/h5py) | 3.12.1 | Read and write HDF5 files from Python +[hatchling](https://pypi.org/project/hatchling) | 1.27.0 | Modern, extensible Python build backend +[hpack](https://pypi.org/project/hpack) | 4.1.0 | Pure-Python HPACK header encoding +[html5lib](https://pypi.org/project/html5lib) | 1.1 | HTML parser based on the WHATWG HTML specification +[httpcore](https://pypi.org/project/httpcore) | 1.0.7 | A minimal low-level HTTP client. +[httpie](https://pypi.org/project/httpie) | 3.2.4 | HTTPie: modern, user-friendly command-line HTTP client for the API era. +[httpx](https://pypi.org/project/httpx) | 0.28.1 | The next generation HTTP client. +[httpx-sse](https://pypi.org/project/httpx-sse) | 0.4.0 | Consume Server-Sent Event (SSE) messages with HTTPX. +[huggingface-hub](https://pypi.org/project/huggingface-hub) | 0.33.0 | Client library to download and publish models, datasets and other repos on the huggingface.co hub +[hupper](https://pypi.org/project/hupper) | 1.12.1 | Integrated process monitor for developing and reloading daemons. +[hypercorn](https://pypi.org/project/hypercorn) | 0.17.3 | A ASGI Server based on Hyper libraries and inspired by Gunicorn +[hyperframe](https://pypi.org/project/hyperframe) | 6.1.0 | Pure-Python HTTP/2 framing +[hypothesis](https://pypi.org/project/hypothesis) | 6.130.4 | A library for property-based testing +[id](https://pypi.org/project/id) | 1.5.0 | A tool for generating OIDC identities +[idna](https://pypi.org/project/idna) | 3.10 | Internationalized Domain Names in Applications (IDNA) +[imageio](https://pypi.org/project/imageio) | 2.37.0 | Library for reading and writing a wide range of image, video, scientific, and volumetric data formats. +[imagesize](https://pypi.org/project/imagesize) | 1.4.1 | Getting image size from png/jpeg/jpeg2000/gif file +[imbalanced-learn](https://pypi.org/project/imbalanced-learn) | 0.13.0 | Toolbox for imbalanced dataset in machine learning +[importlib-metadata](https://pypi.org/project/importlib-metadata) | 8.6.1 | Read metadata from Python packages +[inflection](https://pypi.org/project/inflection) | 0.5.1 | A port of Ruby on Rails inflector to Python +[iniconfig](https://pypi.org/project/iniconfig) | 2.1.0 | brain-dead simple config-ini parsing +[intervaltree](https://pypi.org/project/intervaltree) | 3.1.0 | Editable interval tree data structure for Python 2 and 3 +[ipycanvas](https://pypi.org/project/ipycanvas) | 0.13.3 | Interactive widgets library exposing the browser's Canvas API +[ipykernel](https://pypi.org/project/ipykernel) | 6.29.5 | IPython Kernel for Jupyter +[ipyleaflet](https://pypi.org/project/ipyleaflet) | 0.19.2 | A Jupyter widget for dynamic Leaflet maps +[ipympl](https://pypi.org/project/ipympl) | 0.9.7 | Matplotlib Jupyter Extension +[ipython](https://pypi.org/project/ipython) | 8.36.0 | IPython: Productive Interactive Computing +[ipython-genutils](https://pypi.org/project/ipython-genutils) | 0.2.0 | Vestigial utilities from IPython +[ipython-sql](https://pypi.org/project/ipython-sql) | 0.5.0 | RDBMS access via IPython +[ipywidgets](https://pypi.org/project/ipywidgets) | 8.1.6 | Jupyter interactive widgets +[isoduration](https://pypi.org/project/isoduration) | 20.11.0 | Operations with ISO 8601 durations +[isort](https://pypi.org/project/isort) | 5.13.2 | A Python utility / library to sort Python imports. +[itsdangerous](https://pypi.org/project/itsdangerous) | 2.2.0 | Safely pass data to untrusted environments and back. +[janus](https://pypi.org/project/janus) | 2.0.0 | Mixed sync-async queue to interoperate between asyncio tasks and classic threads +[jaraco-classes](https://pypi.org/project/jaraco-classes) | 3.4.0 | Utility functions for Python class constructs +[jaraco-context](https://pypi.org/project/jaraco-context) | 6.0.1 | Useful decorators and context managers +[jaraco-functools](https://pypi.org/project/jaraco-functools) | 4.1.0 | Functools like those found in stdlib +[jedi](https://pypi.org/project/jedi) | 0.19.2 | An autocompletion tool for Python that can be used for text editors. +[jellyfish](https://pypi.org/project/jellyfish) | 1.1.3 | Approximate and phonetic matching of strings. +[jinja2](https://pypi.org/project/jinja2) | 3.1.6 | A very fast and expressive template engine. +[jiter](https://pypi.org/project/jiter) | 0.9.0 | Fast iterable JSON parser. +[joblib](https://pypi.org/project/joblib) | 1.4.2 | Lightweight pipelining with Python functions +[json5](https://pypi.org/project/json5) | 0.10.0 | A Python implementation of the JSON5 data format. +[jsonpatch](https://pypi.org/project/jsonpatch) | 1.33 | Apply JSON-Patches (RFC 6902) +[jsonpointer](https://pypi.org/project/jsonpointer) | 3.0.0 | Identify specific nodes in a JSON document (RFC 6901) +[jsonschema](https://pypi.org/project/jsonschema) | 4.23.0 | An implementation of JSON Schema validation for Python +[jsonschema-specifications](https://pypi.org/project/jsonschema-specifications) | 2024.10.1 | The JSON Schema meta-schemas and vocabularies, exposed as a Registry +[julia](https://pypi.org/project/julia) | 0.6.2 | Julia/Python bridge with IPython support. +[jupyter](https://pypi.org/project/jupyter) | 1.1.1 | Jupyter metapackage. Install all the Jupyter components in one go. +[jupyter-bokeh](https://pypi.org/project/jupyter-bokeh) | 4.0.5 | A Jupyter extension for rendering Bokeh content. +[jupyter-client](https://pypi.org/project/jupyter-client) | 8.6.3 | Jupyter protocol implementation and client libraries +[jupyter-console](https://pypi.org/project/jupyter-console) | 6.6.3 | Jupyter terminal console +[jupyter-core](https://pypi.org/project/jupyter-core) | 5.7.2 | Jupyter core package. A base package on which Jupyter projects rely. +[jupyter-events](https://pypi.org/project/jupyter-events) | 0.12.0 | Jupyter Event System library +[jupyter-leaflet](https://pypi.org/project/jupyter-leaflet) | 0.19.2 | ipyleaflet extensions for JupyterLab and Jupyter Notebook +[jupyter-lsp](https://pypi.org/project/jupyter-lsp) | 2.2.5 | Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server +[jupyter-server](https://pypi.org/project/jupyter-server) | 2.15.0 | The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications. +[jupyter-server-terminals](https://pypi.org/project/jupyter-server-terminals) | 0.5.3 | A Jupyter Server Extension Providing Terminals. +[jupyterlab](https://pypi.org/project/jupyterlab) | 4.4.2 | JupyterLab computational environment +[jupyterlab-pygments](https://pypi.org/project/jupyterlab-pygments) | 0.3.0 | Pygments theme using JupyterLab CSS variables +[jupyterlab-server](https://pypi.org/project/jupyterlab-server) | 2.27.3 | A set of server components for JupyterLab and JupyterLab like applications. +[jupyterlab-widgets](https://pypi.org/project/jupyterlab-widgets) | 3.0.14 | Jupyter interactive widgets for JupyterLab +[keras](https://pypi.org/project/keras) | 3.10.0 | Multi-backend Keras +[keyring](https://pypi.org/project/keyring) | 25.6.0 | Store and access your passwords safely. +[kiwisolver](https://pypi.org/project/kiwisolver) | 1.4.8 | A fast implementation of the Cassowary constraint solver +[langchain](https://pypi.org/project/langchain) | 0.3.25 | Building applications with LLMs through composability +[langchain-core](https://pypi.org/project/langchain-core) | 0.3.59 | Building applications with LLMs through composability +[langchain-text-splitters](https://pypi.org/project/langchain-text-splitters) | 0.3.8 | LangChain text splitting utilities +[langsmith](https://pypi.org/project/langsmith) | 0.3.42 | Client library to connect to the LangSmith LLM Tracing and Evaluation Platform. +[lazy-loader](https://pypi.org/project/lazy-loader) | 0.4 | Makes it easy to load subpackages and functions on demand. +[llvmlite](https://pypi.org/project/llvmlite) | 0.44.0 | lightweight wrapper around basic LLVM functionality +[lmfit](https://pypi.org/project/lmfit) | 1.3.3 | Least-Squares Minimization with Bounds and Constraints +[locket](https://pypi.org/project/locket) | 1.0.0 | File-based locks for Python on Linux and Windows +[logfire-api](https://pypi.org/project/logfire-api) | 3.12.0 | Shim for the Logfire SDK which does nothing unless Logfire is installed +[lxml](https://pypi.org/project/lxml) | 5.3.0 | Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API. +[mako](https://pypi.org/project/mako) | 1.3.9 | A super-fast templating language that borrows the best ideas from the existing templating languages. +[markdown](https://pypi.org/project/markdown) | 3.7 | Python implementation of John Gruber's Markdown. +[markdown-it-py](https://pypi.org/project/markdown-it-py) | 3.0.0 | Python port of markdown-it. Markdown parsing, done right! +[markupsafe](https://pypi.org/project/markupsafe) | 3.0.2 | Safely add untrusted strings to HTML/XML markup. +[matplotlib](https://pypi.org/project/matplotlib) | 3.10.3 | Python plotting package +[matplotlib-inline](https://pypi.org/project/matplotlib-inline) | 0.1.7 | Inline Matplotlib backend for Jupyter +[maturin](https://pypi.org/project/maturin) | 1.8.3 | Build and publish crates with pyo3, cffi and uniffi bindings as well as rust binaries as python packages +[mccabe](https://pypi.org/project/mccabe) | 0.7.0 | McCabe checker, plugin for flake8 +[mcp](https://pypi.org/project/mcp) | 1.9.3 | Model Context Protocol SDK +[mdurl](https://pypi.org/project/mdurl) | 0.1.2 | Markdown URL utilities +[mercantile](https://pypi.org/project/mercantile) | 1.2.1 | Web mercator XYZ tile utilities +[mergedeep](https://pypi.org/project/mergedeep) | 1.3.4 | A deep merge function for 🐍. +[missingno](https://pypi.org/project/missingno) | 0.5.2 | Missing data visualization module for Python. +[mistralai](https://pypi.org/project/mistralai) | 1.8.1 | Python Client SDK for the Mistral AI API. +[mistune](https://pypi.org/project/mistune) | 3.1.3 | A sane and fast Markdown parser with useful plugins and renderers +[mizani](https://pypi.org/project/mizani) | 0.11.4 | Scales for Python +[ml-dtypes](https://pypi.org/project/ml-dtypes) | 0.5.1 | +[mlxtend](https://pypi.org/project/mlxtend) | 0.23.3 | Machine Learning Library Extensions +[more-itertools](https://pypi.org/project/more-itertools) | 10.6.0 | More routines for operating on iterables, beyond itertools +[mpld3](https://pypi.org/project/mpld3) | 0.5.10 | D3 Viewer for Matplotlib +[mpmath](https://pypi.org/project/mpmath) | 1.3.0 | Python library for arbitrary-precision floating-point arithmetic +[msal](https://pypi.org/project/msal) | 1.30.0 | The Microsoft Authentication Library (MSAL) for Python library enables your app to access the Microsoft Cloud by supporting authentication of us +[msal-extensions](https://pypi.org/project/msal-extensions) | 1.2.0 | Microsoft Authentication Library extensions (MSAL EX) provides a persistence API that can save your data on disk, encrypted on Windows, macOS an +[msgpack](https://pypi.org/project/msgpack) | 1.1.0 | MessagePack serializer +[multidict](https://pypi.org/project/multidict) | 6.4.3 | multidict implementation +[mypy](https://pypi.org/project/mypy) | 1.15.0 | Optional static typing for Python +[mypy-extensions](https://pypi.org/project/mypy-extensions) | 1.0.0 | Type system extensions for programs checked with the mypy type checker. +[namex](https://pypi.org/project/namex) | 0.0.8 | A simple utility to separate the implementation of your Python package and its public API surface. +[narwhals](https://pypi.org/project/narwhals) | 1.36.0 | Extremely lightweight compatibility layer between dataframe libraries +[nbclient](https://pypi.org/project/nbclient) | 0.10.2 | A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor. +[nbconvert](https://pypi.org/project/nbconvert) | 7.16.6 | Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. +[nbformat](https://pypi.org/project/nbformat) | 5.10.4 | The Jupyter Notebook format +[nest-asyncio](https://pypi.org/project/nest-asyncio) | 1.6.0 | Patch asyncio to allow nested event loops +[networkx](https://pypi.org/project/networkx) | 3.4.2 | Python package for creating and manipulating graphs and networks +[nh3](https://pypi.org/project/nh3) | 0.2.18 | Python bindings to the ammonia HTML sanitization library. +[nltk](https://pypi.org/project/nltk) | 3.9.1 | Natural Language Toolkit +[notebook](https://pypi.org/project/notebook) | 7.4.2 | Jupyter Notebook - A web-based notebook environment for interactive computing +[notebook-shim](https://pypi.org/project/notebook-shim) | 0.2.4 | A shim layer for notebook traits and config +[numba](https://pypi.org/project/numba) | 0.61.2 | compiling Python code using LLVM +[numpy](https://pypi.org/project/numpy) | 2.2.6 | Fundamental package for array computing in Python +[numpydoc](https://pypi.org/project/numpydoc) | 1.8.0 | Sphinx extension to support docstrings in Numpy format +[openai](https://pypi.org/project/openai) | 1.82.0 | The official Python library for the openai API +[opencv-python](https://pypi.org/project/opencv-python) | 4.11.0.86 | Wrapper package for OpenCV python bindings. +[openpyxl](https://pypi.org/project/openpyxl) | 3.1.5 | A Python library to read/write Excel 2010 xlsx/xlsm files +[opentelemetry-api](https://pypi.org/project/opentelemetry-api) | 1.32.1 | OpenTelemetry Python API +[optree](https://pypi.org/project/optree) | 0.14.1 | Optimized PyTree Utilities. +[optuna](https://pypi.org/project/optuna) | 4.2.1 | A hyperparameter optimization framework +[orjson](https://pypi.org/project/orjson) | 3.10.16 | Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy +[osqp](https://pypi.org/project/osqp) | 0.6.7.post3 | OSQP: The Operator Splitting QP Solver +[outcome](https://pypi.org/project/outcome) | 1.3.0.post0 | Capture the outcome of Python function calls. +[overrides](https://pypi.org/project/overrides) | 7.7.0 | A decorator to automatically detect mismatch when overriding a method. +[packaging](https://pypi.org/project/packaging) | 24.2 | Core utilities for Python packages +[pandas](https://pypi.org/project/pandas) | 2.2.3 | Powerful data structures for data analysis, time series, and statistics +[pandocfilters](https://pypi.org/project/pandocfilters) | 1.5.1 | Utilities for writing pandoc filters in python +[papermill](https://pypi.org/project/papermill) | 2.6.0 | Parameterize and run Jupyter and nteract Notebooks +[parso](https://pypi.org/project/parso) | 0.8.4 | A Python Parser +[partd](https://pypi.org/project/partd) | 1.4.2 | Appendable key-value storage +[pathspec](https://pypi.org/project/pathspec) | 0.12.1 | Utility library for gitignore style pattern matching of file paths. +[patsy](https://pypi.org/project/patsy) | 1.0.1 | A Python package for describing statistical models and for building design matrices. +[pep8](https://pypi.org/project/pep8) | 1.7.1 | Python style guide checker +[pexpect](https://pypi.org/project/pexpect) | 4.9.0 | Pexpect allows easy control of interactive console applications. +[pg8000](https://pypi.org/project/pg8000) | 1.31.2 | PostgreSQL interface library +[pickleshare](https://pypi.org/project/pickleshare) | 0.7.5 | Tiny 'shelve'-like database with concurrency support +[pillow](https://pypi.org/project/pillow) | 11.1.0 | Python Imaging Library (Fork) +[pip](https://pypi.org/project/pip) | 25.1.1 | The PyPA recommended tool for installing Python packages. +[platformdirs](https://pypi.org/project/platformdirs) | 4.3.7 | A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`. +[plotly](https://pypi.org/project/plotly) | 6.0.1 | An open-source interactive data visualization library for Python +[plotnine](https://pypi.org/project/plotnine) | 0.13.6 | A Grammar of Graphics for Python +[plotpy](https://pypi.org/project/plotpy) | 2.7.4 | Curve and image plotting tools for Python/Qt applications +[pluggy](https://pypi.org/project/pluggy) | 1.5.0 | plugin and hook calling mechanisms for python +[ply](https://pypi.org/project/ply) | 3.11 | Python Lex & Yacc +[polars](https://pypi.org/project/polars) | 1.31.0 | Blazingly fast DataFrame library +[portalocker](https://pypi.org/project/portalocker) | 2.7.0 | Wraps the portalocker recipe for easy usage +[prettytable](https://pypi.org/project/prettytable) | 3.16.0 | A simple Python library for easily displaying tabular data in a visually appealing ASCII table format +[prince](https://pypi.org/project/prince) | 0.16.0 | Factor analysis in Python: PCA, CA, MCA, MFA, FAMD, GPA +[priority](https://pypi.org/project/priority) | 2.0.0 | A pure-Python implementation of the HTTP/2 priority tree +[prometheus-client](https://pypi.org/project/prometheus-client) | 0.21.1 | Python client for the Prometheus monitoring system. +[prompt-toolkit](https://pypi.org/project/prompt-toolkit) | 3.0.51 | Library for building powerful interactive command lines in Python +[propcache](https://pypi.org/project/propcache) | 0.3.1 | Accelerated property cache +[protobuf](https://pypi.org/project/protobuf) | 6.30.2 | +[psutil](https://pypi.org/project/psutil) | 7.0.0 | Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7. +[psygnal](https://pypi.org/project/psygnal) | 0.12.0 | Fast python callback/event system modeled after Qt Signals +[ptpython](https://pypi.org/project/ptpython) | 3.0.29 | Python REPL build on top of prompt_toolkit +[ptyprocess](https://pypi.org/project/ptyprocess) | 0.7.0 | Run a subprocess in a pseudo terminal +[pure-eval](https://pypi.org/project/pure-eval) | 0.2.3 | Safely evaluate AST nodes without side effects +[pyarrow](https://pypi.org/project/pyarrow) | 20.0.0 | Python library for Apache Arrow +[pyasn1](https://pypi.org/project/pyasn1) | 0.6.1 | Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208) +[pyasn1-modules](https://pypi.org/project/pyasn1-modules) | 0.4.1 | A collection of ASN.1-based protocols modules +[pybind11](https://pypi.org/project/pybind11) | 2.13.6 | Seamless operability between C++11 and Python +[pycodestyle](https://pypi.org/project/pycodestyle) | 2.12.0 | Python style guide checker +[pycparser](https://pypi.org/project/pycparser) | 2.22 | C parser in Python +[pydantic](https://pypi.org/project/pydantic) | 2.10.6 | Data validation using Python type hints +[pydantic-ai-slim](https://pypi.org/project/pydantic-ai-slim) | 0.2.9 | Agent Framework / shim to use Pydantic with LLMs, slim package +[pydantic-core](https://pypi.org/project/pydantic-core) | 2.27.2 | Core functionality for Pydantic validation and serialization +[pydantic-evals](https://pypi.org/project/pydantic-evals) | 0.2.9 | Framework for evaluating stochastic code execution, especially code making use of LLMs +[pydantic-graph](https://pypi.org/project/pydantic-graph) | 0.2.9 | Graph and state machine library +[pydantic-settings](https://pypi.org/project/pydantic-settings) | 2.8.1 | Settings management using Pydantic +[pydeck](https://pypi.org/project/pydeck) | 0.9.1 | Widget for deck.gl maps +[pydocstyle](https://pypi.org/project/pydocstyle) | 6.3.0 | Python docstring style checker +[pydub](https://pypi.org/project/pydub) | 0.25.1 | Manipulate audio with an simple and easy high level interface +[pyerfa](https://pypi.org/project/pyerfa) | 2.0.1.5 | Python bindings for ERFA +[pyflakes](https://pypi.org/project/pyflakes) | 3.2.0 | passive checker of Python programs +[pygithub](https://pypi.org/project/pygithub) | 2.6.1 | Use the full Github API v3 +[pygments](https://pypi.org/project/pygments) | 2.19.1 | Pygments is a syntax highlighting package written in Python. +[pyjwt](https://pypi.org/project/pyjwt) | 2.10.1 | JSON Web Token implementation in Python +[pylint](https://pypi.org/project/pylint) | 3.3.6 | python code static checker +[pylint-venv](https://pypi.org/project/pylint-venv) | 3.0.4 | pylint-venv provides a Pylint init-hook to use the same Pylint installation with different virtual environments. +[pyls-spyder](https://pypi.org/project/pyls-spyder) | 0.4.0 | Spyder extensions for the python-lsp-server +[pymongo](https://pypi.org/project/pymongo) | 4.10.1 | Python driver for MongoDB +[pympler](https://pypi.org/project/pympler) | 1.1 | A development tool to measure, monitor and analyze the memory behavior of Python objects. +[pynacl](https://pypi.org/project/pynacl) | 1.5.0 | Python binding to the Networking and Cryptography (NaCl) library +[pynndescent](https://pypi.org/project/pynndescent) | 0.5.13 | Nearest Neighbor Descent +[pyodbc](https://pypi.org/project/pyodbc) | 5.2.0 | DB API module for ODBC +[pyogrio](https://pypi.org/project/pyogrio) | 0.10.0 | Vectorized spatial vector file format I/O using GDAL/OGR +[pyomo](https://pypi.org/project/pyomo) | 6.9.2 | Pyomo: Python Optimization Modeling Objects +[pypandoc](https://pypi.org/project/pypandoc) | 1.15 | Thin wrapper for pandoc. +[pyparsing](https://pypi.org/project/pyparsing) | 3.2.3 | pyparsing module - Classes and methods to define and execute parsing grammars +[pypdf](https://pypi.org/project/pypdf) | 5.4.0 | A pure-python PDF library capable of splitting, merging, cropping, and transforming PDF files +[pyproj](https://pypi.org/project/pyproj) | 3.7.0 | Python interface to PROJ (cartographic projections and coordinate transformations library) +[pyproject-hooks](https://pypi.org/project/pyproject-hooks) | 1.2.0 | Wrappers to call pyproject.toml-based build backend hooks. +[pyqt5](https://pypi.org/project/pyqt5) | 5.15.11 | Python bindings for the Qt cross platform application toolkit +[pyqt5-qt5](https://pypi.org/project/pyqt5-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQt5. +[pyqt5-sip](https://pypi.org/project/pyqt5-sip) | 12.17.0 | The sip module support for PyQt5 +[pyqtgraph](https://pypi.org/project/pyqtgraph) | 0.13.7 | Scientific Graphics and GUI Library for Python +[pyqtwebengine](https://pypi.org/project/pyqtwebengine) | 5.15.7 | Python bindings for the Qt WebEngine framework +[pyqtwebengine-qt5](https://pypi.org/project/pyqtwebengine-qt5) | 5.15.2 | The subset of a Qt installation needed by PyQtWebEngine. +[pyserial](https://pypi.org/project/pyserial) | 3.5 | Python Serial Port Extension +[pysocks](https://pypi.org/project/pysocks) | 1.7.1 | A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information. +[pyspnego](https://pypi.org/project/pyspnego) | 0.11.2 | Windows Negotiate Authentication Client and Server +[pytest](https://pypi.org/project/pytest) | 8.3.5 | pytest: simple powerful testing with Python +[python-barcode](https://pypi.org/project/python-barcode) | 0.15.1 | Create standard barcodes with Python. No external modules needed. (optional Pillow support included). +[python-dateutil](https://pypi.org/project/python-dateutil) | 2.8.2 | Extensions to the standard Python datetime module +[python-dotenv](https://pypi.org/project/python-dotenv) | 1.1.0 | Read key-value pairs from a .env file and set them as environment variables +[python-json-logger](https://pypi.org/project/python-json-logger) | 3.3.0 | JSON Log Formatter for the Python Logging Package +[python-lsp-black](https://pypi.org/project/python-lsp-black) | 2.0.0 | Black plugin for the Python LSP Server +[python-lsp-jsonrpc](https://pypi.org/project/python-lsp-jsonrpc) | 1.1.2 | JSON RPC 2.0 server library +[python-lsp-server](https://pypi.org/project/python-lsp-server) | 1.12.2 | Python Language Server for the Language Server Protocol +[python-multipart](https://pypi.org/project/python-multipart) | 0.0.20 | A streaming multipart parser for Python +[python-slugify](https://pypi.org/project/python-slugify) | 8.0.4 | A Python slugify application that also handles Unicode +[pythonqwt](https://pypi.org/project/pythonqwt) | 0.14.5 | Qt plotting widgets for Python +[pytoolconfig](https://pypi.org/project/pytoolconfig) | 1.3.1 | Python tool configuration +[pytz](https://pypi.org/project/pytz) | 2025.2 | World timezone definitions, modern and historical +[pyuca](https://pypi.org/project/pyuca) | 1.2 | a Python implementation of the Unicode Collation Algorithm +[pyusb](https://pypi.org/project/pyusb) | 1.3.1 | Easy USB access for Python +[pywavelets](https://pypi.org/project/pywavelets) | 1.8.0 | PyWavelets, wavelet transform module +[pywin32](https://pypi.org/project/pywin32) | 310 | Python for Window Extensions +[pywin32-ctypes](https://pypi.org/project/pywin32-ctypes) | 0.2.3 | A (partial) reimplementation of pywin32 using ctypes/cffi +[pywinpty](https://pypi.org/project/pywinpty) | 2.0.15 | Pseudo terminal support for Windows from Python. +[pyyaml](https://pypi.org/project/pyyaml) | 6.0.2 | YAML parser and emitter for Python +[pyzmq](https://pypi.org/project/pyzmq) | 26.4.0 | Python bindings for 0MQ +[qdarkstyle](https://pypi.org/project/qdarkstyle) | 3.2.3 | The most complete dark/light style sheet for C++/Python and Qt applications +[qdldl](https://pypi.org/project/qdldl) | 0.1.7.post5 | QDLDL, a free LDL factorization routine. +[qrcode](https://pypi.org/project/qrcode) | 8.0 | QR Code image generator +[qstylizer](https://pypi.org/project/qstylizer) | 0.2.4 | Stylesheet Generator for PyQt{4-5}/PySide{1-2} +[qtawesome](https://pypi.org/project/qtawesome) | 1.4.0 | FontAwesome icons in PyQt and PySide applications +[qtconsole](https://pypi.org/project/qtconsole) | 5.6.1 | Jupyter Qt console +[qtpy](https://pypi.org/project/qtpy) | 2.4.3 | Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6). +[quantecon](https://pypi.org/project/quantecon) | 0.7.2 | Import the main names to top level. +[quart](https://pypi.org/project/quart) | 0.20.0 | A Python ASGI web framework with the same API as Flask +[rapidfuzz](https://pypi.org/project/rapidfuzz) | 3.13.0 | rapid fuzzy string matching +[readme-renderer](https://pypi.org/project/readme-renderer) | 44.0 | readme_renderer is a library for rendering readme descriptions for Warehouse +[redis](https://pypi.org/project/redis) | 5.2.1 | Python client for Redis database and key-value store +[referencing](https://pypi.org/project/referencing) | 0.36.2 | JSON Referencing + Python +[regex](https://pypi.org/project/regex) | 2024.11.6 | Alternative regular expression module, to replace re. +[reportlab](https://pypi.org/project/reportlab) | 4.3.1 | The Reportlab Toolkit +[requests](https://pypi.org/project/requests) | 2.32.3 | Python HTTP for Humans. +[requests-ntlm](https://pypi.org/project/requests-ntlm) | 1.3.0 | This package allows for HTTP NTLM authentication using the requests library. +[requests-toolbelt](https://pypi.org/project/requests-toolbelt) | 1.0.0 | A utility belt for advanced users of python-requests +[rfc3339-validator](https://pypi.org/project/rfc3339-validator) | 0.1.4 | A pure python RFC3339 validator +[rfc3986](https://pypi.org/project/rfc3986) | 2.0.0 | Validating URI References per RFC 3986 +[rfc3986-validator](https://pypi.org/project/rfc3986-validator) | 0.1.1 | Pure python rfc3986 validator +[rich](https://pypi.org/project/rich) | 14.0.0 | Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal +[rope](https://pypi.org/project/rope) | 1.13.0 | a python refactoring library... +[rpds-py](https://pypi.org/project/rpds-py) | 0.24.0 | Python bindings to Rust's persistent data structures (rpds) +[rsa](https://pypi.org/project/rsa) | 4.7.2 | Pure-Python RSA implementation +[rtree](https://pypi.org/project/rtree) | 1.4.0 | R-Tree spatial index for Python GIS +[rx](https://pypi.org/project/rx) | 3.2.0 | Reactive Extensions (Rx) for Python +[scikit-image](https://pypi.org/project/scikit-image) | 0.25.2 | Image processing in Python +[scikit-learn](https://pypi.org/project/scikit-learn) | 1.6.1 | A set of python modules for machine learning and data mining +[scipy](https://pypi.org/project/scipy) | 1.15.3 | Fundamental algorithms for scientific computing in Python +[scramp](https://pypi.org/project/scramp) | 1.4.5 | An implementation of the SCRAM protocol. +[scs](https://pypi.org/project/scs) | 3.2.7.post2 | Splitting conic solver +[seaborn](https://pypi.org/project/seaborn) | 0.13.2 | Statistical data visualization +[send2trash](https://pypi.org/project/send2trash) | 1.8.3 | Send file to trash natively under Mac OS X, Windows and Linux +[setuptools](https://pypi.org/project/setuptools) | 79.0.1 | Easily download, build, install, upgrade, and uninstall Python packages +[shapely](https://pypi.org/project/shapely) | 2.1.0 | Manipulation and analysis of geometric objects +[shellingham](https://pypi.org/project/shellingham) | 1.5.4 | Tool to Detect Surrounding Shell +[simplejson](https://pypi.org/project/simplejson) | 3.19.3 | Simple, fast, extensible JSON encoder/decoder for Python +[simpy](https://pypi.org/project/simpy) | 4.1.1 | Event discrete, process based simulation for Python. +[six](https://pypi.org/project/six) | 1.17.0 | Python 2 and 3 compatibility utilities +[sklearn-compat](https://pypi.org/project/sklearn-compat) | 0.1.3 | Ease support for compatible scikit-learn estimators across versions +[skrub](https://pypi.org/project/skrub) | 0.5.3 | Prepping tables for machine learning +[smmap](https://pypi.org/project/smmap) | 5.0.2 | A pure Python implementation of a sliding window memory map manager +[sniffio](https://pypi.org/project/sniffio) | 1.3.1 | Sniff out which async library your code is running under +[snowballstemmer](https://pypi.org/project/snowballstemmer) | 2.2.0 | This package provides 29 stemmers for 28 languages generated from Snowball algorithms. +[sortedcontainers](https://pypi.org/project/sortedcontainers) | 2.4.0 | Sorted Containers -- Sorted List, Sorted Dict, Sorted Set +[sounddevice](https://pypi.org/project/sounddevice) | 0.5.1 | Play and Record Sound with Python +[soupsieve](https://pypi.org/project/soupsieve) | 2.6 | A modern CSS selector implementation for Beautiful Soup. +[sphinx](https://pypi.org/project/sphinx) | 8.1.3 | Python documentation generator +[sphinx-rtd-theme](https://pypi.org/project/sphinx-rtd-theme) | 3.0.2 | Read the Docs theme for Sphinx +[sphinxcontrib-applehelp](https://pypi.org/project/sphinxcontrib-applehelp) | 2.0.0 | sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books +[sphinxcontrib-devhelp](https://pypi.org/project/sphinxcontrib-devhelp) | 2.0.0 | sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents +[sphinxcontrib-htmlhelp](https://pypi.org/project/sphinxcontrib-htmlhelp) | 2.1.0 | sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files +[sphinxcontrib-jquery](https://pypi.org/project/sphinxcontrib-jquery) | 4.1 | Extension to include jQuery on newer Sphinx releases +[sphinxcontrib-jsmath](https://pypi.org/project/sphinxcontrib-jsmath) | 1.0.1 | A sphinx extension which renders display math in HTML via JavaScript +[sphinxcontrib-qthelp](https://pypi.org/project/sphinxcontrib-qthelp) | 2.0.0 | sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents +[sphinxcontrib-serializinghtml](https://pypi.org/project/sphinxcontrib-serializinghtml) | 2.0.0 | sphinxcontrib-serializinghtml is a sphinx extension which outputs "serialized" HTML files (json and pickle) +[spyder](https://pypi.org/project/spyder) | 6.0.7 | The Scientific Python Development Environment +[spyder-kernels](https://pypi.org/project/spyder-kernels) | 3.0.5 | Jupyter kernels for Spyder's console +[sqlalchemy](https://pypi.org/project/sqlalchemy) | 2.0.40 | Database Abstraction Library +[sqlite-bro](https://pypi.org/project/sqlite-bro) | 0.13.1 | a graphic SQLite Client in 1 Python file +[sqlite-fts4](https://pypi.org/project/sqlite-fts4) | 1.0.3 | Python functions for working with SQLite FTS4 search +[sqlite-utils](https://pypi.org/project/sqlite-utils) | 3.38 | CLI tool and Python library for manipulating SQLite databases +[sqlparse](https://pypi.org/project/sqlparse) | 0.5.3 | A non-validating SQL parser. +[squarify](https://pypi.org/project/squarify) | 0.4.4 | Pure Python implementation of the squarify treemap layout algorithm +[sse-starlette](https://pypi.org/project/sse-starlette) | 2.2.1 | SSE plugin for Starlette +[sspilib](https://pypi.org/project/sspilib) | 0.2.0 | SSPI API bindings for Python +[stack-data](https://pypi.org/project/stack-data) | 0.6.3 | Extract data from python stack frames and tracebacks for informative displays +[starlette](https://pypi.org/project/starlette) | 0.46.2 | The little ASGI library that shines. +[statsmodels](https://pypi.org/project/statsmodels) | 0.14.4 | Statistical computations and models for Python +[streamlit](https://pypi.org/project/streamlit) | 1.46.0 | A faster way to build and share data apps +[superqt](https://pypi.org/project/superqt) | 0.7.3 | Missing widgets and components for PyQt/PySide +[sv-ttk](https://pypi.org/project/sv-ttk) | 2.6.0 | A gorgeous theme for Tkinter, based on Windows 11's UI +[sympy](https://pypi.org/project/sympy) | 1.14.0 | Computer algebra system (CAS) in Python +[tabulate](https://pypi.org/project/tabulate) | 0.9.0 | Pretty-print tabular data +[tblib](https://pypi.org/project/tblib) | 3.1.0 | Traceback serialization library. +[tenacity](https://pypi.org/project/tenacity) | 9.1.2 | Retry code until it succeeds +[termcolor](https://pypi.org/project/termcolor) | 3.1.0 | ANSI color formatting for output in terminal +[terminado](https://pypi.org/project/terminado) | 0.18.1 | Tornado websocket backend for the Xterm.js Javascript terminal emulator library. +[text-unidecode](https://pypi.org/project/text-unidecode) | 1.3 | The most basic Text::Unidecode port +[textdistance](https://pypi.org/project/textdistance) | 4.6.3 | Compute distance between the two texts. +[thefuzz](https://pypi.org/project/thefuzz) | 0.22.1 | Fuzzy string matching in python +[threadpoolctl](https://pypi.org/project/threadpoolctl) | 3.6.0 | threadpoolctl +[three-merge](https://pypi.org/project/three-merge) | 0.1.1 | Simple library for merging two strings with respect to a base one +[tifffile](https://pypi.org/project/tifffile) | 2025.3.30 | Read and write TIFF files +[tiktoken](https://pypi.org/project/tiktoken) | 0.9.0 | tiktoken is a fast BPE tokeniser for use with OpenAI's models +[tinycss2](https://pypi.org/project/tinycss2) | 1.4.0 | A tiny CSS parser +[tokenizers](https://pypi.org/project/tokenizers) | 0.21.1 | +[toml](https://pypi.org/project/toml) | 0.10.2 | Python Library for Tom's Obvious, Minimal Language +[tomli](https://pypi.org/project/tomli) | 2.2.1 | A lil' TOML parser +[tomli-w](https://pypi.org/project/tomli-w) | 1.2.0 | A lil' TOML writer +[tomlkit](https://pypi.org/project/tomlkit) | 0.13.2 | Style preserving TOML library +[toolz](https://pypi.org/project/toolz) | 1.0.0 | List processing tools and functional utilities +[tornado](https://pypi.org/project/tornado) | 6.5.1 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. +[tqdm](https://pypi.org/project/tqdm) | 4.67.1 | Fast, Extensible Progress Meter +[traitlets](https://pypi.org/project/traitlets) | 5.14.3 | Traitlets Python configuration system +[traittypes](https://pypi.org/project/traittypes) | 0.2.1 | Scipy trait types +[trio](https://pypi.org/project/trio) | 0.30.0 | A friendly Python library for async concurrency and I/O +[trove-classifiers](https://pypi.org/project/trove-classifiers) | 2025.5.9.12 | Canonical source for classifiers on PyPI (pypi.org). +[twine](https://pypi.org/project/twine) | 6.1.0 | Collection of utilities for publishing packages on PyPI +[typer](https://pypi.org/project/typer) | 0.15.2 | Typer, build great CLIs. Easy to code. Based on Python type hints. +[types-python-dateutil](https://pypi.org/project/types-python-dateutil) | 2.9.0.20240316 | Typing stubs for python-dateutil +[types-requests](https://pypi.org/project/types-requests) | 2.32.0.20250328 | Typing stubs for requests +[typing-extensions](https://pypi.org/project/typing-extensions) | 4.13.2 | Backported and Experimental Type Hints for Python 3.8+ +[typing-inspection](https://pypi.org/project/typing-inspection) | 0.4.0 | Runtime typing introspection tools +[tzdata](https://pypi.org/project/tzdata) | 2025.2 | Provider of IANA time zone data +[tzlocal](https://pypi.org/project/tzlocal) | 5.3.1 | tzinfo object for the local timezone +[ujson](https://pypi.org/project/ujson) | 5.10.0 | Ultra fast JSON encoder and decoder for Python +[umap-learn](https://pypi.org/project/umap-learn) | 0.5.7 | Uniform Manifold Approximation and Projection +[uncertainties](https://pypi.org/project/uncertainties) | 3.2.2 | calculations with values with uncertainties, error propagation +[uri-template](https://pypi.org/project/uri-template) | 1.3.0 | RFC 6570 URI Template Processor +[urllib3](https://pypi.org/project/urllib3) | 2.4.0 | HTTP library with thread-safe connection pooling, file post, and more. +[uvicorn](https://pypi.org/project/uvicorn) | 0.34.2 | The lightning-fast ASGI server. +[vega-datasets](https://pypi.org/project/vega-datasets) | 0.9.0 | A Python package for offline access to Vega datasets +[waitress](https://pypi.org/project/waitress) | 3.0.0 | Waitress WSGI server +[watchdog](https://pypi.org/project/watchdog) | 6.0.0 | Filesystem events monitoring +[wcwidth](https://pypi.org/project/wcwidth) | 0.2.13 | Measures the displayed width of unicode strings in a terminal +[webcolors](https://pypi.org/project/webcolors) | 24.11.1 | A library for working with the color formats defined by HTML and CSS. +[webencodings](https://pypi.org/project/webencodings) | 0.5.1 | Character encoding aliases for legacy web content +[websocket-client](https://pypi.org/project/websocket-client) | 1.8.0 | WebSocket client for Python with low level API options +[websockets](https://pypi.org/project/websockets) | 14.2 | An implementation of the WebSocket Protocol (RFC 6455 & 7692) +[werkzeug](https://pypi.org/project/werkzeug) | 3.1.3 | The comprehensive WSGI web application library. +[whatthepatch](https://pypi.org/project/whatthepatch) | 1.0.7 | A patch parsing and application library. +[wheel](https://pypi.org/project/wheel) | 0.45.1 | A built-package format for Python +[widgetsnbextension](https://pypi.org/project/widgetsnbextension) | 4.0.14 | Jupyter interactive widgets for Jupyter Notebook +[wordcloud](https://pypi.org/project/wordcloud) | 1.9.4 | A little word cloud generator +[wrapt](https://pypi.org/project/wrapt) | 1.16.0 | Module for decorators, wrappers and monkey patching. +[wsproto](https://pypi.org/project/wsproto) | 1.2.0 | WebSockets state-machine based protocol implementation +[xarray](https://pypi.org/project/xarray) | 2025.4.0 | N-D labeled arrays and datasets in Python +[xlsxwriter](https://pypi.org/project/xlsxwriter) | 3.2.3 | A Python module for creating Excel XLSX files. +[xyzservices](https://pypi.org/project/xyzservices) | 2023.10.1 | Source of XYZ tiles providers +[yapf](https://pypi.org/project/yapf) | 0.40.1 | A formatter for Python code. +[yarl](https://pypi.org/project/yarl) | 1.18.3 | Yet another URL library +[yt-dlp](https://pypi.org/project/yt-dlp) | 2025.2.19 | A feature-rich command-line audio/video downloader +[zict](https://pypi.org/project/zict) | 3.0.0 | Mutable mapping tools +[zipp](https://pypi.org/project/zipp) | 3.21.0 | Backport of pathlib-compatible object wrapper for zip files +[zstandard](https://pypi.org/project/zstandard) | 0.23.0 | Zstandard bindings for Python + + +
diff --git a/changelogs/WinPythonwhl-64bit-3.13.5.0_History.md b/changelogs/WinPythonwhl-64bit-3.13.5.0_History.md new file mode 100644 index 00000000..6c4b0699 --- /dev/null +++ b/changelogs/WinPythonwhl-64bit-3.13.5.0_History.md @@ -0,0 +1,26 @@ +## History of changes for WinPython-64bit 3.13.5.0whl + +The following changes were made to WinPython-64bit distribution since version 3.13.5.0whl. + + +
+ +### Tools + + +No differences found. + +### Python packages + + +No differences found. + +### WheelHouse packages + + +No differences found. + + +
+ +* * * diff --git a/changelogs/md5_sha1.txt b/changelogs/md5_sha1.txt index 2ab82bcb..6bc9f65a 100644 --- a/changelogs/md5_sha1.txt +++ b/changelogs/md5_sha1.txt @@ -1,3 +1,25 @@ +### WinPython 2025-03 release (June 28th, 2025) + +MD5 | SHA-1 | SHA-256 | Binary | Size | blake2b-256 +---------------------------------|------------------------------------------|------------------------------------------------------------------|-----------------------------------|----------------------|----------------------------------------------------------------- +6e986d2daa963800ad7deaa7b151c895 | ab9600442433d577f044d3c7604ba8193407bcd4 | 8ec81761447c1c9ff143f4faa7b86351787f8c0314ce249aac260a5972b9edf2 | Winpython64-3.12.10.1dot.exe | 23 422 054 Bytes | 58a57d858663de7ed45c5b53835e73102213c881784aab64635ecfb1fe03565d +97fba9cbd845601843fda825155caac1 | 9607229783d66c505894b4b2547af41891c4f669 | 7a1f004aec39615977b2b245423a50115530d16af3418df77977186a555d0a40 | Winpython64-3.12.10.1dot.zip | 38 519 826 Bytes | 543db8fd8cecba4bf6e72596f55d4cacbf2fe49fb9d397b26024088788cdbfba +b1df445794a2826a7355ae29cfc467d8 | 27a2807265bcd574f0338013311227a4c0b29001 | a320f799843712b0c3aa5bcb0fb472cd36dc74615a1436c976c4bf6e8a4ac29f | Winpython64-3.12.10.1slim.7z | 630 560 365 Bytes | 50a4da7c92586357f8730f3bc7174a409edd7ee4aebb9bc49440b2976d89bcca +0cc2ac82631562ec87d1c608eaab9ef1 | ba69116fc9bd2d728ff15a29f588275995fc94db | 62c935050f1bfe3165f2b0c60f8195bdcbee12e83d0a0f360e7a8f7dc60bf40a | Winpython64-3.12.10.1slim.exe | 630 775 751 Bytes | 62df47ca5c8e3d01ce620ff35d267cf118354380ce116f96d84674d189b01290 +2b97ec540e90243038319bbab4346885 | c2d7bb5d981ab38a621a97b95396bcc06f688f61 | 0c526a46fa72ed78cfa45b5332c491fa476bf41f11b2feab90fa7bd48e90724d | Winpython64-3.12.10.1whl.7z | 669 141 991 Bytes | a81cf5421045ba498e7f810c882d0bfd58f5885bc78a34623a2ed85d4529fe90 +12f60270841f87960ff6ce4e5f72d988 | b2f58a6def515cc63be9adf49071630da2edb1e6 | 9f9488eca6aba8fbe75cccde84457b6753cb100a66a4c6c9116107907c4df096 | Winpython64-3.13.5.0dot.exe | 25 108 248 Bytes | 9e649e6667b632bf4b9dd834d985fd1150aaa56e084f564e8d5fde7411b9b7b4 +7aa09c30d44f49abcb6df551fb604dad | 5cf05836d06c0146b7994003568e2b3187dc86c6 | 2727803b134290dcf8b06447b8c122a04ec4e0c592a481c1b6db1b9fa41a09fc | Winpython64-3.13.5.0dot.zip | 39 977 050 Bytes | 16debf3592081a2a7e03931278365b49b28134501d9faee0b252a0f7ebeee2e1 +cbb360471ca828b7753b0ee20e55a3ad | 8bd495def05b5187075e538be1eff957abcff24d | 12c22b0223fe59da9831ba42d44f042826bc8502e15801b9c26ecc3c77dac8aa | Winpython64-3.13.5.0slim.7z | 635 310 049 Bytes | 8e5dd9adf60dd0765743d98c1f13b0e579177a33975fb3df7e30c3290fe01373 +830ffba4935017c13fa2b36d169c08eb | fad23f5af5f5e5584ff21ba02b31c367762e4813 | 495364ef366806a08e649bcaaa32284252f2d317c0360380d467e4b9a01a5428 | Winpython64-3.13.5.0slim.exe | 635 525 645 Bytes | f410fae1fafe18ff07de184d697ed665dc55cf3ce6f073e26bada38110b1e1e1 +549c1e98f751d78e55b655ced2b37dfb | a17413cb2ebe292baa393a9c39b1445569fbac92 | 21422ba5ad05af2306e4fbea0cf95ed0df2df06ed301c6b6ffa6f8f289be61ff | Winpython64-3.13.5.0whl.7z | 670 983 739 Bytes | 5bfe915c4db5edfd7a5da3b34adb28df8eae2714ffb6835ca4349571bb95f7e9 +957f4ce2220f86f9a0dfd544c1059347 | ac6bff0f2a9d70761f51fccd541a3936a81f79ed | a54b5dc8a1d5dba697d52069349a5d3b4fdd1f78090c3bbd73c5a46ddbe4a536 | Winpython64-3.14.0.0freeb3.exe | 27 604 465 Bytes | 11179b50e8fe98fa5b515db33e66aa08ea84dc4ad05f164f010df11784af7e05 +aa72d902262d409f0d0dd66d1b22a1b5 | 6cf322bf92b8093e95bf64955b8caec7fddd9430 | 23230dad12ebac1dd58043782d8a534143711bbada51e6f0d1f827ba08eb987a | Winpython64-3.14.0.0freeb3.zip | 46 626 549 Bytes | a788f5daee00a97832087a90ac2baea1852f7640fa57f46f250552d09d874886 +49a26ef054a744792de6e50586feeb5f | 2c99b9b9ceafa8c634624a1d0fed3f52e716d770 | db37ea4a33b9dfe618d788776547f0657408fb6b75b5429433990d43be4ac712 | pylock.64-3_12_10_1slim.toml | 190 459 Bytes | da71bf8b4465fd4f2f138606cc9a7e2c5003ef2a0b53b2c1cf1cca3ec4863578 +6c9b240066e3aab4e0489cf60e76653e | 1669cfe258a50ac8bdd34776a2a38ef4489e44e1 | 543fb039c8e01f1d8e38473b0624ce75949d68d92b1fbf738aff18341f8a67d1 | pylock.64-3_13_5_0slim.toml | 190 441 Bytes | 26aac2e1c0a87b392aa203a7d51d6879612738f66b3b06b259fef45fff2f1521 +aa96bb795c6908f28692972f8a64ca13 | 40981f9fb851ac0f46cd39fbbbb1eac07d5154ff | 1b22a3b8e157cac0b8958dd46858130ab7d416b5f01d0664f53ca649c5f5f148 | requir.64-3_12_10_1slim.txt | 52 262 Bytes | 40fd3a79f147a9b3cf5ea65b5e0d8a314bc14bde3b242eadf04a447399c8556b +22dc7e0e65f98bcf03b5ce04f6ac8ebd | a2278e6a4289191eab32b9a94ba96311633a81eb | 8e297bc7c44a717be162877e57f41763ed414b2aa8e76c87077141158786705c | requir.64-3_13_5_0slim.txt | 52 262 Bytes | 986685832cb240e3728af2770c25b0dc07666f21c627453ada41cb201b56d8f4 + + ### WinPython 2025-02 release (May 4th, 2025) MD5 | SHA-1 | SHA-256 | Binary | Size | blake2b-256 diff --git a/changelogs/pylock.64-3_12_10_1slim.toml b/changelogs/pylock.64-3_12_10_1slim.toml new file mode 100644 index 00000000..83f31af9 --- /dev/null +++ b/changelogs/pylock.64-3_12_10_1slim.toml @@ -0,0 +1,5491 @@ +lock-version = "1.0" +created-by = "pip" + +[[packages]] +name = "absl-py" +version = "2.2.2" + +[[packages.wheels]] +name = "absl_py-2.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f6/d4/349f7f4bd5ea92dab34f5bb0fe31775ef6c311427a14d5a5b31ecb442341/absl_py-2.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092" + +[[packages]] +name = "adbc-driver-manager" +version = "1.3.0" + +[[packages.wheels]] +name = "adbc_driver_manager-1.3.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/65/ef/c628399e3c386215e2f26c7bb0beafb7ee5a6866b3b3e26008d376decc3a/adbc_driver_manager-1.3.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "0646996a7bbd31b321a16810f7110e9155b08607c0a83fed97414ad1bd2cac9e" + +[[packages]] +name = "aiofiles" +version = "23.2.1" + +[[packages.wheels]] +name = "aiofiles-23.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c5/19/5af6804c4cc0fed83f47bff6e413a98a36618e7d40185cd36e69737f3b0e/aiofiles-23.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107" + +[[packages]] +name = "aiohappyeyeballs" +version = "2.6.1" + +[[packages.wheels]] +name = "aiohappyeyeballs-2.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8" + +[[packages]] +name = "aiohttp" +version = "3.11.18" + +[[packages.wheels]] +name = "aiohttp-3.11.18-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/33/9a/e34e65506e06427b111e19218a99abf627638a9703f4b8bcc3e3021277ed/aiohttp-3.11.18-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8" + +[[packages]] +name = "aiosignal" +version = "1.3.2" + +[[packages.wheels]] +name = "aiosignal-1.3.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5" + +[[packages]] +name = "aiosqlite" +version = "0.20.0" + +[[packages.wheels]] +name = "aiosqlite-0.20.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/00/c4/c93eb22025a2de6b83263dfe3d7df2e19138e345bca6f18dba7394120930/aiosqlite-0.20.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "36a1deaca0cac40ebe32aac9977a6e2bbc7f5189f23f4a54d5908986729e5bd6" + +[[packages]] +name = "alabaster" +version = "0.7.16" + +[[packages.wheels]] +name = "alabaster-0.7.16-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92" + +[[packages]] +name = "alembic" +version = "1.15.2" + +[[packages.wheels]] +name = "alembic-1.15.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/41/18/d89a443ed1ab9bcda16264716f809c663866d4ca8de218aa78fd50b38ead/alembic-1.15.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2e76bd916d547f6900ec4bb5a90aeac1485d2c92536923d0b138c02b126edc53" + +[[packages]] +name = "altair" +version = "5.5.0" + +[[packages.wheels]] +name = "altair-5.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/aa/f3/0b6ced594e51cc95d8c1fc1640d3623770d01e4969d29c0bd09945fafefa/altair-5.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c" + +[[packages]] +name = "annotated-types" +version = "0.7.0" + +[[packages.wheels]] +name = "annotated_types-0.7.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53" + +[[packages]] +name = "ansicolors" +version = "1.1.8" + +[[packages.wheels]] +name = "ansicolors-1.1.8-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/53/18/a56e2fe47b259bb52201093a3a9d4a32014f9d85071ad07e9d60600890ca/ansicolors-1.1.8-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "00d2dde5a675579325902536738dd27e4fac1fd68f773fe36c21044eb559e187" + +[[packages]] +name = "anthropic" +version = "0.51.0" + +[[packages.wheels]] +name = "anthropic-0.51.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8c/6e/9637122c5f007103bd5a259f4250bd8f1533dd2473227670fd10a1457b62/anthropic-0.51.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b8b47d482c9aa1f81b923555cebb687c2730309a20d01be554730c8302e0f62a" + +[[packages]] +name = "anyio" +version = "4.9.0" + +[[packages.wheels]] +name = "anyio-4.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c" + +[[packages]] +name = "anywidget" +version = "0.9.18" + +[[packages.wheels]] +name = "anywidget-0.9.18-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2b/f0/09a30ca0551af20c7cefa7464b7ccb6f5407a550b83c4dcb15c410814849/anywidget-0.9.18-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "944b82ef1dd17b8ff0fb6d1f199f613caf9111338e6e2857da478f6e73770cb8" + +[[packages]] +name = "appdirs" +version = "1.4.4" + +[[packages.wheels]] +name = "appdirs-1.4.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" + +[[packages]] +name = "argcomplete" +version = "3.6.2" + +[[packages.wheels]] +name = "argcomplete-3.6.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/31/da/e42d7a9d8dd33fa775f467e4028a47936da2f01e4b0e561f9ba0d74cb0ca/argcomplete-3.6.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591" + +[[packages]] +name = "argon2-cffi" +version = "23.1.0" + +[[packages.wheels]] +name = "argon2_cffi-23.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea" + +[[packages]] +name = "argon2-cffi-bindings" +version = "21.2.0" + +[[packages.wheels]] +name = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f" + +[[packages]] +name = "array-api-compat" +version = "1.12.0" + +[[packages.wheels]] +name = "array_api_compat-1.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e0/b1/0542e0cab6f49f151a2d7a42400f84f706fc0b64e85dc1f56708b2e9fd37/array_api_compat-1.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0b4795b6944a9507fde54679f9350e2ad2b1e2acf4a2408a098cdc27f890a8b" + +[[packages]] +name = "arrow" +version = "1.3.0" + +[[packages.wheels]] +name = "arrow-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80" + +[[packages]] +name = "asgi-csrf" +version = "0.11" + +[[packages.wheels]] +name = "asgi_csrf-0.11-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/1c/5d954baaf144852a4762368b37c06202b277378ea412acc5565f69acc9e9/asgi_csrf-0.11-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "03ac140115f39d4295288a9adf74fdc6ae607f6ef44abee8466520458207242b" + +[[packages]] +name = "asgiref" +version = "3.8.1" + +[[packages.wheels]] +name = "asgiref-3.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47" + +[[packages]] +name = "asn1crypto" +version = "1.5.1" + +[[packages.wheels]] +name = "asn1crypto-1.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c9/7f/09065fd9e27da0eda08b4d6897f1c13535066174cc023af248fc2a8d5e5a/asn1crypto-1.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67" + +[[packages]] +name = "asteval" +version = "1.0.5" + +[[packages.wheels]] +name = "asteval-1.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0a/0d/2c6aaab67ac566d76322e87827d707214c5f6ffb5a4fcd456a8633da1788/asteval-1.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "082b95312578affc8a6d982f7d92b7ac5de05634985c87e7eedd3188d31149fa" + +[[packages]] +name = "astroid" +version = "3.3.9" + +[[packages.wheels]] +name = "astroid-3.3.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/de/80/c749efbd8eef5ea77c7d6f1956e8fbfb51963b7f93ef79647afd4d9886e3/astroid-3.3.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248" + +[[packages]] +name = "astropy" +version = "6.1.6" + +[[packages.wheels]] +name = "astropy-6.1.6-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/06/25/a1c6245c15b8f74e97ee058632739023050a475f979f65056401441f00fd/astropy-6.1.6-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "344c6433b66c770917cb55f9f3754427774d7066bfa7ccf1ca638f45c7c00738" + +[[packages]] +name = "astropy-iers-data" +version = "0.2024.12.23.0.33.24" + +[[packages.wheels]] +name = "astropy_iers_data-0.2024.12.23.0.33.24-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e8/4d/565740d9ac54640c09d2fdd22ef3583103438fb97305a9cfb66595a4b259/astropy_iers_data-0.2024.12.23.0.33.24-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "40d3c6b6a5cf4dc6ad91b92b7e0f949e5366234e3c4440302247429fc8294302" + +[[packages]] +name = "asttokens" +version = "3.0.0" + +[[packages.wheels]] +name = "asttokens-3.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2" + +[[packages]] +name = "async-lru" +version = "2.0.5" + +[[packages.wheels]] +name = "async_lru-2.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943" + +[[packages]] +name = "asyncssh" +version = "2.20.0" + +[[packages.wheels]] +name = "asyncssh-2.20.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f2/c5/7a9d42c065f272f74792663194966a68810e851a34c0dd080246bd7308f5/asyncssh-2.20.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "af6888d937c07a4bf31293335a6166b4d87608cdb5957b49547da6ad87ecf174" + +[[packages]] +name = "atomicwrites" +version = "1.4.0" + +[[packages.wheels]] +name = "atomicwrites-1.4.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/a0/da5f49008ec6e9a658dbf5d7310a4debd397bce0b4db03cf8a410066bb87/atomicwrites-1.4.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197" + +[[packages]] +name = "attrs" +version = "25.3.0" + +[[packages.wheels]] +name = "attrs-25.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3" + +[[packages]] +name = "autopep8" +version = "2.0.4" + +[[packages.wheels]] +name = "autopep8-2.0.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d8/f2/e63c9f9c485cd90df8e4e7ae90fa3be2469c9641888558c7b45fa98a76f8/autopep8-2.0.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb" + +[[packages]] +name = "azure-core" +version = "1.32.0" + +[[packages.wheels]] +name = "azure_core-1.32.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/39/83/325bf5e02504dbd8b4faa98197a44cdf8a325ef259b48326a2b6f17f8383/azure_core-1.32.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "eac191a0efb23bfa83fddf321b27b122b4ec847befa3091fa736a5c32c50d7b4" + +[[packages]] +name = "azure-cosmos" +version = "4.9.0" + +[[packages.wheels]] +name = "azure_cosmos-4.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/dc/380f843744535497acd0b85aacb59565c84fc28bf938c8d6e897a858cd95/azure_cosmos-4.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3b60eaa01a16a857d0faf0cec304bac6fa8620a81bc268ce760339032ef617fe" + +[[packages]] +name = "azure-identity" +version = "1.21.0" + +[[packages.wheels]] +name = "azure_identity-1.21.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3d/9f/1f9f3ef4f49729ee207a712a5971a9ca747f2ca47d9cbf13cf6953e3478a/azure_identity-1.21.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "258ea6325537352440f71b35c3dffe9d240eae4a5126c1b7ce5efd5766bd9fd9" + +[[packages]] +name = "babel" +version = "2.17.0" + +[[packages.wheels]] +name = "babel-2.17.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2" + +[[packages]] +name = "baresql" +version = "1.0.0" + +[[packages.wheels]] +name = "baresql-1.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d6/d2/fe24bcd99d97bddbbccdf191edf4e84c0fdfe894dfff9f54b05f36096ebb/baresql-1.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a24d17f46beb47c221f328f7e06710e3896c6203a8e1909788d7128f27b86f01" + +[[packages]] +name = "bcrypt" +version = "4.3.0" + +[[packages.wheels]] +name = "bcrypt-4.3.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a9/cf/45fb5261ece3e6b9817d3d82b2f343a505fd58674a92577923bc500bd1aa/bcrypt-4.3.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "e53e074b120f2877a35cc6c736b8eb161377caae8925c17688bd46ba56daaa5b" + +[[packages]] +name = "beautifulsoup4" +version = "4.13.3" + +[[packages.wheels]] +name = "beautifulsoup4-4.13.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16" + +[[packages]] +name = "binaryornot" +version = "0.4.4" + +[[packages.wheels]] +name = "binaryornot-0.4.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4" + +[[packages]] +name = "black" +version = "25.1.0" + +[[packages.wheels]] +name = "black-25.1.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/18/7e/a27c3ad3822b6f2e0e00d63d58ff6299a99a5b3aee69fa77cd4b0076b261/black-25.1.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba" + +[[packages]] +name = "bleach" +version = "6.2.0" + +[[packages.wheels]] +name = "bleach-6.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e" + +[[packages]] +name = "blinker" +version = "1.9.0" + +[[packages.wheels]] +name = "blinker-1.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" + +[[packages]] +name = "bokeh" +version = "3.7.3" + +[[packages.wheels]] +name = "bokeh-3.7.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/91/48/08b2382e739236aa3360b7976360ba3e0c043b6234e25951c18c1eb6fa06/bokeh-3.7.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b0e79dd737f088865212e4fdcb0f3b95d087f0f088bf8ca186a300ab1641e2c7" + +[[packages]] +name = "branca" +version = "0.8.1" + +[[packages.wheels]] +name = "branca-0.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f8/9d/91cddd38bd00170aad1a4b198c47b4ed716be45c234e09b835af41f4e717/branca-0.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d29c5fab31f7c21a92e34bf3f854234e29fecdcf5d2df306b616f20d816be425" + +[[packages]] +name = "brotli" +version = "1.1.0" + +[[packages.wheels]] +name = "Brotli-1.1.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/3d/d5/942051b45a9e883b5b6e98c041698b1eb2012d25e5948c58d6bf85b1bb43/Brotli-1.1.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951" + +[[packages]] +name = "build" +version = "1.2.2.post1" + +[[packages.wheels]] +name = "build-1.2.2.post1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/84/c2/80633736cd183ee4a62107413def345f7e6e3c01563dbca1417363cf957e/build-1.2.2.post1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5" + +[[packages]] +name = "cachetools" +version = "5.5.2" + +[[packages.wheels]] +name = "cachetools-5.5.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a" + +[[packages]] +name = "certifi" +version = "2025.1.31" + +[[packages.wheels]] +name = "certifi-2025.1.31-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + +[[packages]] +name = "cffi" +version = "1.17.1" + +[[packages.wheels]] +name = "cffi-1.17.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903" + +[[packages]] +name = "chardet" +version = "5.2.0" + +[[packages.wheels]] +name = "chardet-5.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" + +[[packages]] +name = "charset-normalizer" +version = "3.4.2" + +[[packages.wheels]] +name = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e" + +[[packages]] +name = "clarabel" +version = "0.10.0" + +[[packages.wheels]] +name = "clarabel-0.10.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e6/ba/67a0defb70ed910877049e915e6738fc0432edd5e46b97743ce78a1e5b95/clarabel-0.10.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7871b6f499ad66f71d4e7fb40754c4d986d4316f242beb62ff4f63a69785a50c" + +[[packages]] +name = "click" +version = "8.1.8" + +[[packages.wheels]] +name = "click-8.1.8-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2" + +[[packages]] +name = "click-default-group" +version = "1.2.4" + +[[packages.wheels]] +name = "click_default_group-1.2.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9b60486923720e7fc61731bdb32b617039aba820e22e1c88766b1125592eaa5f" + +[[packages]] +name = "cloudpickle" +version = "3.1.1" + +[[packages.wheels]] +name = "cloudpickle-3.1.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7e/e8/64c37fadfc2816a7701fa8a6ed8d87327c7d54eacfbfb6edab14a2f2be75/cloudpickle-3.1.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e" + +[[packages]] +name = "cohere" +version = "5.15.0" + +[[packages.wheels]] +name = "cohere-5.15.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c7/87/94694db7fe6df979fbc03286eaabdfa98f1c8fa532960e5afdf965e10960/cohere-5.15.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "22ff867c2a6f2fc2b585360c6072f584f11f275ef6d9242bac24e0fa2df1dfb5" + +[[packages]] +name = "colorama" +version = "0.4.6" + +[[packages.wheels]] +name = "colorama-0.4.6-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + +[[packages]] +name = "colorcet" +version = "3.1.0" + +[[packages.wheels]] +name = "colorcet-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/c6/9963d588cc3d75d766c819e0377a168ef83cf3316a92769971527a1ad1de/colorcet-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2a7d59cc8d0f7938eeedd08aad3152b5319b4ba3bcb7a612398cc17a384cb296" + +[[packages]] +name = "colorlog" +version = "6.9.0" + +[[packages.wheels]] +name = "colorlog-6.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e3/51/9b208e85196941db2f0654ad0357ca6388ab3ed67efdbfc799f35d1f83aa/colorlog-6.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff" + +[[packages]] +name = "comm" +version = "0.2.2" + +[[packages.wheels]] +name = "comm-0.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" + +[[packages]] +name = "contourpy" +version = "1.3.2" + +[[packages.wheels]] +name = "contourpy-1.3.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73" + +[[packages]] +name = "cookiecutter" +version = "2.6.0" + +[[packages.wheels]] +name = "cookiecutter-2.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b6/d9/0137658a353168ffa9d0fc14b812d3834772040858ddd1cb6eeaf09f7a44/cookiecutter-2.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a54a8e37995e4ed963b3e82831072d1ad4b005af736bb17b99c2cbd9d41b6e2d" + +[[packages]] +name = "cryptography" +version = "44.0.0" + +[[packages.wheels]] +name = "cryptography-44.0.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/97/9b/443270b9210f13f6ef240eff73fd32e02d381e7103969dc66ce8e89ee901/cryptography-44.0.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede" + +[[packages]] +name = "cvxopt" +version = "1.3.2" + +[[packages.wheels]] +name = "cvxopt-1.3.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/9f/ad/edce467c24529c536fc9de787546a1c8eca293009383a872b6f638d22eae/cvxopt-1.3.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "a92ebfc5df77fea57544f8ad2102bfc45af0e77ac4dfe98ed1b9628e8bba77c3" + +[[packages]] +name = "cvxpy" +version = "1.6.4" + +[[packages.wheels]] +name = "cvxpy-1.6.4-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/4e/1d/2c4070e13763c627f40be341a6760818e1e3a62c497c02e8fa09f21585f0/cvxpy-1.6.4-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "052a09716cfb630a48e911e7c9512015ae651100f64530d8eb973a195e105fa3" + +[[packages]] +name = "cycler" +version = "0.12.1" + +[[packages.wheels]] +name = "cycler-0.12.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30" + +[[packages]] +name = "cython" +version = "3.1.1" + +[[packages.wheels]] +name = "cython-3.1.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/45/0e/e1370ed3216e4e164232d1891c2a2932a3874d1a8681f8c3565cafd98579/cython-3.1.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "307f216ed319ea07644f2ef9974406c830f01bc8e677e2147e9bfcdf9e3ca8ad" + +[[packages]] +name = "cytoolz" +version = "1.0.1" + +[[packages.wheels]] +name = "cytoolz-1.0.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/62/1a/f3903197956055032f8cb297342e2dff07e50f83991aebfe5b4c4fcb55e4/cytoolz-1.0.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8f89c48d8e5aec55ffd566a8ec858706d70ed0c6a50228eca30986bfa5b4da8b" + +[[packages]] +name = "dask" +version = "2025.4.1" + +[[packages.wheels]] +name = "dask-2025.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b4/12/f9effea5fe2bebfdd8b0d9c857f798382afacd57dc1cd0e9ce21e66c1bc2/dask-2025.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "aacbb0a9667856fe58385015efd64aca22f0c0b2c5e1b5e633531060303bb4be" + +[[packages]] +name = "datasette" +version = "0.65.1" + +[[packages.wheels]] +name = "datasette-0.65.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/08/f7/fc15b9ddc7a2cafe546f0e2696d71940d7604a128e2f903e98238c3435f7/datasette-0.65.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ba7adf717ddcc24a2a8ac57890fffd384a2ebb909b342e4f731ba09eba764305" + +[[packages]] +name = "datasette-graphql" +version = "2.2" + +[[packages.wheels]] +name = "datasette_graphql-2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f1/12/e8fb59d77c59ec47a2aa53a6d4ac57ad55fce2b48c8397c2866c3f2c66cd/datasette_graphql-2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cd9f61afdcaab1ce4ff6775296e6ece99305bf05cbfae4c1c938a6c9e60cd485" + +[[packages]] +name = "datashader" +version = "0.17.0" + +[[packages.wheels]] +name = "datashader-0.17.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/dc/52/755bbab06c4d10f693abb724e82271ccf8adc98e9305a5c559867ee40c98/datashader-0.17.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "39421ff999294913e63d41954af955a5dece5d0c55d8fce1426043d70b22d07a" + +[[packages]] +name = "deap" +version = "1.4.2" + +[[packages.wheels]] +name = "deap-1.4.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/61/c0/f1a383cbb852e4d486e3213cd6d4292f4f789ec32631da15646d3eb13165/deap-1.4.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "02b8b664cfa0b6c18ff3e36d0b982fb66f38fb98c5b4292515a305527d57294e" + +[[packages]] +name = "debugpy" +version = "1.8.13" + +[[packages.wheels]] +name = "debugpy-1.8.13-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/c9/f7/0df18a4f530ed3cc06f0060f548efe9e3316102101e311739d906f5650be/debugpy-1.8.13-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "63ca7670563c320503fea26ac688988d9d6b9c6a12abc8a8cf2e7dd8e5f6b6ea" + +[[packages]] +name = "decorator" +version = "5.2.1" + +[[packages.wheels]] +name = "decorator-5.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a" + +[[packages]] +name = "defusedxml" +version = "0.7.1" + +[[packages.wheels]] +name = "defusedxml-0.7.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61" + +[[packages]] +name = "deprecated" +version = "1.2.14" + +[[packages.wheels]] +name = "Deprecated-1.2.14-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/20/8d/778b7d51b981a96554f29136cd59ca7880bf58094338085bcf2a979a0e6a/Deprecated-1.2.14-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c" + +[[packages]] +name = "diff-match-patch" +version = "20241021" + +[[packages.wheels]] +name = "diff_match_patch-20241021-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f7/bb/2aa9b46a01197398b901e458974c20ed107935c26e44e37ad5b0e5511e44/diff_match_patch-20241021-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "93cea333fb8b2bc0d181b0de5e16df50dd344ce64828226bda07728818936782" + +[[packages]] +name = "dill" +version = "0.4.0" + +[[packages.wheels]] +name = "dill-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049" + +[[packages]] +name = "distributed" +version = "2025.4.1" + +[[packages.wheels]] +name = "distributed-2025.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/df/33/b956f0dc74b292ea3d206a45467fde838f005b64123a729898a6390a291a/distributed-2025.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3a7834451b04ef059928045eab6ff6d88ad7bcfd48adc99403127d9a6818b5fa" + +[[packages]] +name = "distro" +version = "1.9.0" + +[[packages.wheels]] +name = "distro-1.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2" + +[[packages]] +name = "django" +version = "5.2" + +[[packages.wheels]] +name = "Django-5.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/63/e0/6a5b5ea350c5bd63fe94b05e4c146c18facb51229d9dee42aa39f9fc2214/Django-5.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "91ceed4e3a6db5aedced65e3c8f963118ea9ba753fc620831c77074e620e7d83" + +[[packages]] +name = "dnspython" +version = "2.7.0" + +[[packages.wheels]] +name = "dnspython-2.7.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86" + +[[packages]] +name = "docstring-to-markdown" +version = "0.17" + +[[packages.wheels]] +name = "docstring_to_markdown-0.17-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/56/7b/af3d0da15bed3a8665419bb3a630585756920f4ad67abfdfef26240ebcc0/docstring_to_markdown-0.17-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fd7d5094aa83943bf5f9e1a13701866b7c452eac19765380dead666e36d3711c" + +[[packages]] +name = "docutils" +version = "0.21.2" + +[[packages.wheels]] +name = "docutils-0.21.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2" + +[[packages]] +name = "duckdb" +version = "1.3.0" + +[[packages.wheels]] +name = "duckdb-1.3.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/36/4f/f7ab120ecd827fdff59f14e1de9771335aa7656a29c3259fa7949de1f276/duckdb-1.3.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8754c40dac0f26d9fb0363bbb5df02f7a61ce6a6728d5efc02c3bc925d7c89c3" + +[[packages]] +name = "entrypoints" +version = "0.4" + +[[packages.wheels]] +name = "entrypoints-0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/35/a8/365059bbcd4572cbc41de17fd5b682be5868b218c3c5479071865cab9078/entrypoints-0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f" + +[[packages]] +name = "et-xmlfile" +version = "1.1.0" + +[[packages.wheels]] +name = "et_xmlfile-1.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/96/c2/3dd434b0108730014f1b96fd286040dc3bcb70066346f7e01ec2ac95865f/et_xmlfile-1.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada" + +[[packages]] +name = "eval-type-backport" +version = "0.2.2" + +[[packages.wheels]] +name = "eval_type_backport-0.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ce/31/55cd413eaccd39125368be33c46de24a1f639f2e12349b0361b4678f3915/eval_type_backport-0.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a" + +[[packages]] +name = "executing" +version = "2.2.0" + +[[packages.wheels]] +name = "executing-2.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa" + +[[packages]] +name = "faker" +version = "37.1.0" + +[[packages.wheels]] +name = "faker-37.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d7/a1/8936bc8e79af80ca38288dd93ed44ed1f9d63beb25447a4c59e746e01f8d/faker-37.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c" + +[[packages]] +name = "fasta2a" +version = "0.2.9" + +[[packages.wheels]] +name = "fasta2a-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7a/df/dd967535662ecc9e101a7d6c0c643a055aabc3de47411c31c1dd624356c8/fasta2a-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8b855b36f29fde6dcb79ad55be337a8165381b679bec829913009c55581e284e" + +[[packages]] +name = "fastapi" +version = "0.115.12" + +[[packages.wheels]] +name = "fastapi-0.115.12-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d" + +[[packages]] +name = "fastavro" +version = "1.10.0" + +[[packages.wheels]] +name = "fastavro-1.10.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/0c/ce/cfd16546c04ebbca1be80873b533c788cec76f7bfac231bfac6786047572/fastavro-1.10.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "567ff515f2a5d26d9674b31c95477f3e6022ec206124c62169bc2ffaf0889089" + +[[packages]] +name = "fastjsonschema" +version = "2.21.1" + +[[packages.wheels]] +name = "fastjsonschema-2.21.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667" + +[[packages]] +name = "filelock" +version = "3.18.0" + +[[packages.wheels]] +name = "filelock-3.18.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de" + +[[packages]] +name = "flake8" +version = "7.1.1" + +[[packages.wheels]] +name = "flake8-7.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d9/42/65004373ac4617464f35ed15931b30d764f53cdd30cc78d5aea349c8c050/flake8-7.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213" + +[[packages]] +name = "flask" +version = "3.1.0" + +[[packages.wheels]] +name = "flask-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/af/47/93213ee66ef8fae3b93b3e29206f6b251e65c97bd91d8e1c5596ef15af0a/flask-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136" + +[[packages]] +name = "flexcache" +version = "0.3" + +[[packages.wheels]] +name = "flexcache-0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32" + +[[packages]] +name = "flexparser" +version = "0.4" + +[[packages.wheels]] +name = "flexparser-0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846" + +[[packages]] +name = "flit" +version = "3.12.0" + +[[packages.wheels]] +name = "flit-3.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f5/82/ce1d3bb380b227e26e517655d1de7b32a72aad61fa21ff9bd91a2e2db6ee/flit-3.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2b4e7171dc22881fa6adc2dbf083e5ecc72520be3cd7587d2a803da94d6ef431" + +[[packages]] +name = "flit-core" +version = "3.12.0" + +[[packages.wheels]] +name = "flit_core-3.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f2/65/b6ba90634c984a4fcc02c7e3afe523fef500c4980fec67cc27536ee50acf/flit_core-3.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e7a0304069ea895172e3c7bb703292e992c5d1555dd1233ab7b5621b5b69e62c" + +[[packages]] +name = "folium" +version = "0.19.5" + +[[packages.wheels]] +name = "folium-0.19.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/81/4d/bcbee0676dc06f0b014a030cb928e158c96daafb872a01ddee7e60a8c998/folium-0.19.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4333fb3e6f3e9eedb231615d22c6d7df20aea5829554bd6908675865a37803b3" + +[[packages]] +name = "fonttools" +version = "4.57.0" + +[[packages.wheels]] +name = "fonttools-4.57.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/06/5d/1be5424bb305880e1113631f49a55ea7c7da3a5fe02608ca7c16a03a21da/fonttools-4.57.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "57e30241524879ea10cdf79c737037221f77cc126a8cdc8ff2c94d4a522504b9" + +[[packages]] +name = "fqdn" +version = "1.5.1" + +[[packages.wheels]] +name = "fqdn-1.5.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014" + +[[packages]] +name = "frozenlist" +version = "1.5.0" + +[[packages.wheels]] +name = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b1/56/4e45136ffc6bdbfa68c29ca56ef53783ef4c2fd395f7cbf99a2624aa9aaa/frozenlist-1.5.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f" + +[[packages]] +name = "fsspec" +version = "2025.3.2" + +[[packages.wheels]] +name = "fsspec-2025.3.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/44/4b/e0cfc1a6f17e990f3e64b7d941ddc4acdc7b19d6edd51abf495f32b1a9e4/fsspec-2025.3.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711" + +[[packages]] +name = "fuzzywuzzy" +version = "0.18.0" + +[[packages.wheels]] +name = "fuzzywuzzy-0.18.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/43/ff/74f23998ad2f93b945c0309f825be92e04e0348e062026998b5eefef4c33/fuzzywuzzy-0.18.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993" + +[[packages]] +name = "geographiclib" +version = "2.0" + +[[packages.wheels]] +name = "geographiclib-2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9f/5a/a26132406f1f40cf51ea349a5f11b0a46cec02a2031ff82e391c2537247a/geographiclib-2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734" + +[[packages]] +name = "geopandas" +version = "1.0.1" + +[[packages.wheels]] +name = "geopandas-1.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c4/64/7d344cfcef5efddf9cf32f59af7f855828e9d74b5f862eddf5bfd9f25323/geopandas-1.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "01e147d9420cc374d26f51fc23716ac307f32b49406e4bd8462c07e82ed1d3d6" + +[[packages]] +name = "geopy" +version = "2.4.1" + +[[packages.wheels]] +name = "geopy-2.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e5/15/cf2a69ade4b194aa524ac75112d5caac37414b20a3a03e6865dfe0bd1539/geopy-2.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7" + +[[packages]] +name = "gitdb" +version = "4.0.12" + +[[packages.wheels]] +name = "gitdb-4.0.12-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf" + +[[packages]] +name = "gitpython" +version = "3.1.44" + +[[packages.wheels]] +name = "GitPython-3.1.44-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110" + +[[packages]] +name = "google-auth" +version = "2.38.0" + +[[packages.wheels]] +name = "google_auth-2.38.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9d/47/603554949a37bca5b7f894d51896a9c534b9eab808e2520a748e081669d0/google_auth-2.38.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a" + +[[packages]] +name = "google-genai" +version = "1.16.1" + +[[packages.wheels]] +name = "google_genai-1.16.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/bc/31/30caa8d4ae987e47c5250fb6680588733863fd5b39cacb03ba1977c29bde/google_genai-1.16.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6ae5d24282244f577ca4f0d95c09f75ab29e556602c9d3531b70161e34cd2a39" + +[[packages]] +name = "graphene" +version = "3.4.3" + +[[packages.wheels]] +name = "graphene-3.4.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/66/e0/61d8e98007182e6b2aca7cf65904721fb2e4bce0192272ab9cb6f69d8812/graphene-3.4.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "820db6289754c181007a150db1f7fff544b94142b556d12e3ebc777a7bf36c71" + +[[packages]] +name = "graphql-core" +version = "3.2.6" + +[[packages.wheels]] +name = "graphql_core-3.2.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ae/4f/7297663840621022bc73c22d7d9d80dbc78b4db6297f764b545cd5dd462d/graphql_core-3.2.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f" + +[[packages]] +name = "graphql-relay" +version = "3.2.0" + +[[packages.wheels]] +name = "graphql_relay-3.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/74/16/a4cf06adbc711bd364a73ce043b0b08d8fa5aae3df11b6ee4248bcdad2e0/graphql_relay-3.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5" + +[[packages]] +name = "greenlet" +version = "3.1.1" + +[[packages.wheels]] +name = "greenlet-3.1.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/43/21/a5d9df1d21514883333fc86584c07c2b49ba7c602e670b174bd73cfc9c7f/greenlet-3.1.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01" + +[[packages]] +name = "griffe" +version = "1.7.2" + +[[packages.wheels]] +name = "griffe-1.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b1/5e/38b408f41064c9fcdbb0ea27c1bd13a1c8657c4846e04dab9f5ea770602c/griffe-1.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1ed9c2e338a75741fc82083fe5a1bc89cb6142efe126194cc313e34ee6af5423" + +[[packages]] +name = "groq" +version = "0.25.0" + +[[packages.wheels]] +name = "groq-0.25.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/11/1019a6cfdb2e520cb461cf70d859216be8ca122ddf5ad301fc3b0ee45fd4/groq-0.25.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "aadc78b40b1809cdb196b1aa8c7f7293108767df1508cafa3e0d5045d9328e7a" + +[[packages]] +name = "guidata" +version = "3.9.0" + +[[packages.wheels]] +name = "guidata-3.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5b/03/44afe4b4d634ea77ea7979be78bba4256607f92a6570241925e5b129966d/guidata-3.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "96a19dc92850bdb3e463fa06e8c22793e090db42d1e72c6dae9bda1a98b61210" + +[[packages]] +name = "h11" +version = "0.14.0" + +[[packages.wheels]] +name = "h11-0.14.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" + +[[packages]] +name = "h2" +version = "4.2.0" + +[[packages.wheels]] +name = "h2-4.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d0/9e/984486f2d0a0bd2b024bf4bc1c62688fcafa9e61991f041fb0e2def4a982/h2-4.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "479a53ad425bb29af087f3458a61d30780bc818e4ebcf01f0b536ba916462ed0" + +[[packages]] +name = "h5py" +version = "3.12.1" + +[[packages.wheels]] +name = "h5py-3.12.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/86/f7/bb465dcb92ca3521a15cbe1031f6d18234dbf1fb52a6796a00bfaa846ebf/h5py-3.12.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "e4d51919110a030913201422fb07987db4338eba5ec8c5a15d6fab8e03d443fc" + +[[packages]] +name = "hatchling" +version = "1.27.0" + +[[packages.wheels]] +name = "hatchling-1.27.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/08/e7/ae38d7a6dfba0533684e0b2136817d667588ae3ec984c1a4e5df5eb88482/hatchling-1.27.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d3a2f3567c4f926ea39849cdf924c7e99e6686c9c8e288ae1037c8fa2a5d937b" + +[[packages]] +name = "holoviews" +version = "1.20.2" + +[[packages.wheels]] +name = "holoviews-1.20.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/df/67/066a1d984fa259ad7300084a70789579e104afd75fc58a1d44cda9c365d5/holoviews-1.20.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1f892c04bc23e8a3a9cde082b606b9463c9ff78c3d0c00e2ddcc41fe6e738458" + +[[packages]] +name = "hpack" +version = "4.1.0" + +[[packages.wheels]] +name = "hpack-4.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496" + +[[packages]] +name = "html5lib" +version = "1.1" + +[[packages.wheels]] +name = "html5lib-1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d" + +[[packages]] +name = "httpcore" +version = "1.0.7" + +[[packages.wheels]] +name = "httpcore-1.0.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd" + +[[packages]] +name = "httpie" +version = "3.2.4" + +[[packages.wheels]] +name = "httpie-3.2.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/03/b6/39bcf01e1185882f34bc9fb77d1fb4a27911a55f60ab407de34abc8a2347/httpie-3.2.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4bd0435cc4b9bca59501bc65089de96f3e93b393803f32a81951db62050ebf0b" + +[[packages]] +name = "httpx" +version = "0.28.1" + +[[packages.wheels]] +name = "httpx-0.28.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" + +[[packages]] +name = "httpx-sse" +version = "0.4.0" + +[[packages.wheels]] +name = "httpx_sse-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f" + +[[packages]] +name = "huggingface-hub" +version = "0.33.0" + +[[packages.wheels]] +name = "huggingface_hub-0.33.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/33/fb/53587a89fbc00799e4179796f51b3ad713c5de6bb680b2becb6d37c94649/huggingface_hub-0.33.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e8668875b40c68f9929150d99727d39e5ebb8a05a98e4191b908dc7ded9074b3" + +[[packages]] +name = "hupper" +version = "1.12.1" + +[[packages.wheels]] +name = "hupper-1.12.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/86/7d/3888833e4f5ea56af4a9935066ec09a83228e533d7b8877f65889d706ee4/hupper-1.12.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e872b959f09d90be5fb615bd2e62de89a0b57efc037bdf9637fb09cdf8552b19" + +[[packages]] +name = "hvplot" +version = "0.11.2" + +[[packages.wheels]] +name = "hvplot-0.11.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ed/d9/466e22e60dd6b1eb09680d7155c47b58da17eda51bbaf4aad8392a45fe12/hvplot-0.11.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9d576a0c2df0f1cf5041545f2a2eddcf962510162876991cae4d1779fad74556" + +[[packages]] +name = "hypercorn" +version = "0.17.3" + +[[packages.wheels]] +name = "hypercorn-0.17.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0e/3b/dfa13a8d96aa24e40ea74a975a9906cfdc2ab2f4e3b498862a57052f04eb/hypercorn-0.17.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "059215dec34537f9d40a69258d323f56344805efb462959e727152b0aa504547" + +[[packages]] +name = "hyperframe" +version = "6.1.0" + +[[packages.wheels]] +name = "hyperframe-6.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5" + +[[packages]] +name = "hypothesis" +version = "6.130.4" + +[[packages.wheels]] +name = "hypothesis-6.130.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5c/d4/5a0c46cc8d266626cdc8082f07f836fa4a96e8715002de69be46ed406d1d/hypothesis-6.130.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cda4a57115d10ecbefe0a9cc8d69d20a13eb56ecbfe7c24eaee5d368c2b7c477" + +[[packages]] +name = "id" +version = "1.5.0" + +[[packages.wheels]] +name = "id-1.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9f/cb/18326d2d89ad3b0dd143da971e77afd1e6ca6674f1b1c3df4b6bec6279fc/id-1.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658" + +[[packages]] +name = "idna" +version = "3.10" + +[[packages.wheels]] +name = "idna-3.10-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" + +[[packages]] +name = "imageio" +version = "2.37.0" + +[[packages.wheels]] +name = "imageio-2.37.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/bd/b394387b598ed84d8d0fa90611a90bee0adc2021820ad5729f7ced74a8e2/imageio-2.37.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed" + +[[packages]] +name = "imagesize" +version = "1.4.1" + +[[packages.wheels]] +name = "imagesize-1.4.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b" + +[[packages]] +name = "imbalanced-learn" +version = "0.13.0" + +[[packages.wheels]] +name = "imbalanced_learn-0.13.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9d/41/721fec82606242a2072ee909086ff918dfad7d0199a9dfd4928df9c72494/imbalanced_learn-0.13.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7eb5859f7827cb3babfa5789978c22fe36e56527d9c9768df2d864d98d9b40fe" + +[[packages]] +name = "importlib-metadata" +version = "8.6.1" + +[[packages.wheels]] +name = "importlib_metadata-8.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/79/9d/0fb148dc4d6fa4a7dd1d8378168d9b4cd8d4560a6fbf6f0121c5fc34eb68/importlib_metadata-8.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e" + +[[packages]] +name = "inflection" +version = "0.5.1" + +[[packages.wheels]] +name = "inflection-0.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2" + +[[packages]] +name = "iniconfig" +version = "2.1.0" + +[[packages.wheels]] +name = "iniconfig-2.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" + +[[packages]] +name = "intervaltree" +version = "3.1.0" + +[packages.sdist] +name = "intervaltree-3.1.0.tar.gz" +url = "https://files.pythonhosted.org/packages/50/fb/396d568039d21344639db96d940d40eb62befe704ef849b27949ded5c3bb/intervaltree-3.1.0.tar.gz" + +[packages.sdist.hashes] +sha256 = "902b1b88936918f9b2a19e0e5eb7ccb430ae45cde4f39ea4b36932920d33952d" + +[[packages]] +name = "ipycanvas" +version = "0.13.3" + +[[packages.wheels]] +name = "ipycanvas-0.13.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/fc/e3867e413adbfede3a9c372ec015416ccb0a6493659db5812eeec447a73b/ipycanvas-0.13.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d37adb2f45d2fef1c3d33c69a0518055694d87827b2f577f3c426d7712f75daa" + +[[packages]] +name = "ipykernel" +version = "6.29.5" + +[[packages.wheels]] +name = "ipykernel-6.29.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5" + +[[packages]] +name = "ipyleaflet" +version = "0.19.2" + +[[packages.wheels]] +name = "ipyleaflet-0.19.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/56/6f/00d60e93a316a178ae04457ceea5bcbb4e2d7e7e469882ac59ec4cccfb8c/ipyleaflet-0.19.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7cc9157848baca2e1793b96e79f8bdb1aa7340521d2b7d8a62aa8bc30eab5278" + +[[packages]] +name = "ipympl" +version = "0.9.7" + +[[packages.wheels]] +name = "ipympl-0.9.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/86/6b/21c62f1b2b5e18c6553f7364487dfdf7eb7952b1000a1b7863c1f97819e9/ipympl-0.9.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3698ee7eaa0b047a7603517d7aa1b71b32118a5f51754cab45ec5d994f67208f" + +[[packages]] +name = "ipython" +version = "8.36.0" + +[[packages.wheels]] +name = "ipython-8.36.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d6/d7/c1c9f371790b3a181e343c4815a361e5a0cc7d90ef6642d64ba5d05de289/ipython-8.36.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "12b913914d010dcffa2711505ec8be4bf0180742d97f1e5175e51f22086428c1" + +[[packages]] +name = "ipython-genutils" +version = "0.2.0" + +[[packages.wheels]] +name = "ipython_genutils-0.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fa/bc/9bd3b5c2b4774d5f33b2d544f1460be9df7df2fe42f352135381c347c69a/ipython_genutils-0.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8" + +[[packages]] +name = "ipython-sql" +version = "0.5.0" + +[[packages.wheels]] +name = "ipython_sql-0.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/30/8f/9e50fa53ffc371483f9d1b90c1175b706d28a2e978e90a8894035af01905/ipython_sql-0.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "61b46ecffb956f62dbc17b5744cf70c649104c8db9afd821aa39b31f7cbb5d5b" + +[[packages]] +name = "ipywidgets" +version = "8.1.6" + +[[packages.wheels]] +name = "ipywidgets-8.1.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/53/b8/62952729573d983d9433faacf62a52ee2e8cf46504418061ad1739967abe/ipywidgets-8.1.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "446e7630a1d025bdc7635e1169fcc06f2ce33b5bd41c2003edeb4a47c8d4bbb1" + +[[packages]] +name = "isoduration" +version = "20.11.0" + +[[packages.wheels]] +name = "isoduration-20.11.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042" + +[[packages]] +name = "isort" +version = "5.13.2" + +[[packages.wheels]] +name = "isort-5.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/b3/8def84f539e7d2289a02f0524b944b15d7c75dab7628bedf1c4f0992029c/isort-5.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6" + +[[packages]] +name = "itsdangerous" +version = "2.2.0" + +[[packages.wheels]] +name = "itsdangerous-2.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef" + +[[packages]] +name = "janus" +version = "2.0.0" + +[[packages.wheels]] +name = "janus-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/68/34/65604740edcb20e1bda6a890348ed7d282e7dd23aa00401cbe36fd0edbd9/janus-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7e6449d34eab04cd016befbd7d8c0d8acaaaab67cb59e076a69149f9031745f9" + +[[packages]] +name = "jaraco-classes" +version = "3.4.0" + +[[packages.wheels]] +name = "jaraco.classes-3.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790" + +[[packages]] +name = "jaraco-context" +version = "6.0.1" + +[[packages.wheels]] +name = "jaraco.context-6.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4" + +[[packages]] +name = "jaraco-functools" +version = "4.1.0" + +[[packages.wheels]] +name = "jaraco.functools-4.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649" + +[[packages]] +name = "jedi" +version = "0.19.2" + +[[packages.wheels]] +name = "jedi-0.19.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9" + +[[packages]] +name = "jellyfish" +version = "1.1.3" + +[[packages.wheels]] +name = "jellyfish-1.1.3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/ce/3c/5f007820356627332a6cf957ec1233a4845cb9ce9e9026fd62bbd037ceb0/jellyfish-1.1.3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "c8c70b1cc92ee15031db16db0d2ca7d5841744f5f626a35c29c3dd7b4ea7002b" + +[[packages]] +name = "jinja2" +version = "3.1.6" + +[[packages.wheels]] +name = "jinja2-3.1.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" + +[[packages]] +name = "jiter" +version = "0.9.0" + +[[packages.wheels]] +name = "jiter-0.9.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/cd/9d/742b289016d155f49028fe1bfbeb935c9bf0ffeefdf77daf4a63a42bb72b/jiter-0.9.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0" + +[[packages]] +name = "joblib" +version = "1.4.2" + +[[packages.wheels]] +name = "joblib-1.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6" + +[[packages]] +name = "json5" +version = "0.10.0" + +[[packages.wheels]] +name = "json5-0.10.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/aa/42/797895b952b682c3dafe23b1834507ee7f02f4d6299b65aaa61425763278/json5-0.10.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa" + +[[packages]] +name = "jsonpatch" +version = "1.33" + +[[packages.wheels]] +name = "jsonpatch-1.33-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade" + +[[packages]] +name = "jsonpointer" +version = "3.0.0" + +[[packages.wheels]] +name = "jsonpointer-3.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942" + +[[packages]] +name = "jsonschema" +version = "4.23.0" + +[[packages.wheels]] +name = "jsonschema-4.23.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566" + +[[packages]] +name = "jsonschema-specifications" +version = "2024.10.1" + +[[packages.wheels]] +name = "jsonschema_specifications-2024.10.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf" + +[[packages]] +name = "julia" +version = "0.6.2" + +[[packages.wheels]] +name = "julia-0.6.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/af/2e9a1a996f32b34249582392bb419cf8983b627a1d31412acbe9d6dea5b0/julia-0.6.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "90752f71376fdb9919439d20496c2dab24486dfa4fe8a831d6dd14a1bcbc04d1" + +[[packages]] +name = "jupyter" +version = "1.1.1" + +[[packages.wheels]] +name = "jupyter-1.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83" + +[[packages]] +name = "jupyter-bokeh" +version = "4.0.5" + +[[packages.wheels]] +name = "jupyter_bokeh-4.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/47/78/33b2294aad62e5f95b89a89379c5995c2bd978018387ef8bec79f6dc272c/jupyter_bokeh-4.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1110076c14c779071cf492646a1a871aefa8a477261e4721327a666e65df1a2c" + +[[packages]] +name = "jupyter-client" +version = "8.6.3" + +[[packages.wheels]] +name = "jupyter_client-8.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f" + +[[packages]] +name = "jupyter-console" +version = "6.6.3" + +[[packages.wheels]] +name = "jupyter_console-6.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485" + +[[packages]] +name = "jupyter-core" +version = "5.7.2" + +[[packages.wheels]] +name = "jupyter_core-5.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409" + +[[packages]] +name = "jupyter-events" +version = "0.12.0" + +[[packages.wheels]] +name = "jupyter_events-0.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb" + +[[packages]] +name = "jupyter-leaflet" +version = "0.19.2" + +[[packages.wheels]] +name = "jupyter_leaflet-0.19.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/81/7c/3ade59500a358b9018a996d00c26eaede79f76ed362b7051bc5038d4a0d4/jupyter_leaflet-0.19.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d57e15e80c08a4360f0cde0b4c490beddc5d422bb0e9bc1c0b4479d3fb725a6" + +[[packages]] +name = "jupyter-lsp" +version = "2.2.5" + +[[packages.wheels]] +name = "jupyter_lsp-2.2.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/e0/7bd7cff65594fd9936e2f9385701e44574fc7d721331ff676ce440b14100/jupyter_lsp-2.2.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da" + +[[packages]] +name = "jupyter-server" +version = "2.15.0" + +[[packages.wheels]] +name = "jupyter_server-2.15.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3" + +[[packages]] +name = "jupyter-server-terminals" +version = "0.5.3" + +[[packages.wheels]] +name = "jupyter_server_terminals-0.5.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa" + +[[packages]] +name = "jupyterlab" +version = "4.4.2" + +[[packages.wheels]] +name = "jupyterlab-4.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f6/ae/fbb93f4990b7648849b19112d8b3e7427bbfc9c5cc8fdc6bf14c0e86d104/jupyterlab-4.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "857111a50bed68542bf55dca784522fe728f9f88b4fe69e8c585db5c50900419" + +[[packages]] +name = "jupyterlab-pygments" +version = "0.3.0" + +[[packages.wheels]] +name = "jupyterlab_pygments-0.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780" + +[[packages]] +name = "jupyterlab-server" +version = "2.27.3" + +[[packages.wheels]] +name = "jupyterlab_server-2.27.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4" + +[[packages]] +name = "jupyterlab-widgets" +version = "3.0.14" + +[[packages.wheels]] +name = "jupyterlab_widgets-3.0.14-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/64/7a/f2479ba401e02f7fcbd3fc6af201eac888eaa188574b8e9df19452ab4972/jupyterlab_widgets-3.0.14-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "54c33e3306b7fca139d165d6190dc6c0627aafa5d14adfc974a4e9a3d26cb703" + +[[packages]] +name = "keras" +version = "3.10.0" + +[[packages.wheels]] +name = "keras-3.10.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/95/e6/4179c461a5fc43e3736880f64dbdc9b1a5349649f0ae32ded927c0e3a227/keras-3.10.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c095a6bf90cd50defadf73d4859ff794fad76b775357ef7bd1dbf96388dae7d3" + +[[packages]] +name = "keyring" +version = "25.6.0" + +[[packages.wheels]] +name = "keyring-25.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d3/32/da7f44bcb1105d3e88a0b74ebdca50c59121d2ddf71c9e34ba47df7f3a56/keyring-25.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd" + +[[packages]] +name = "kiwisolver" +version = "1.4.8" + +[[packages.wheels]] +name = "kiwisolver-1.4.8-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50" + +[[packages]] +name = "langchain" +version = "0.3.25" + +[[packages.wheels]] +name = "langchain-0.3.25-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ed/5c/5c0be747261e1f8129b875fa3bfea736bc5fe17652f9d5e15ca118571b6f/langchain-0.3.25-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "931f7d2d1eaf182f9f41c5e3272859cfe7f94fc1f7cef6b3e5a46024b4884c21" + +[[packages]] +name = "langchain-core" +version = "0.3.59" + +[[packages.wheels]] +name = "langchain_core-0.3.59-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/30/40/aa440a7cd05f1dab5d7c91a1284eb776c3cf3eb59fa18ed39927650cfa38/langchain_core-0.3.59-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9686baaff43f2c8175535da13faf40e6866769015e93130c3c1e4243e7244d70" + +[[packages]] +name = "langchain-text-splitters" +version = "0.3.8" + +[[packages.wheels]] +name = "langchain_text_splitters-0.3.8-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8b/a3/3696ff2444658053c01b6b7443e761f28bb71217d82bb89137a978c5f66f/langchain_text_splitters-0.3.8-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e75cc0f4ae58dcf07d9f18776400cf8ade27fadd4ff6d264df6278bb302f6f02" + +[[packages]] +name = "langsmith" +version = "0.3.42" + +[[packages.wheels]] +name = "langsmith-0.3.42-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/89/8e/e8a58e0abaae3f3ac4702e9ca35d1fc6159711556b64ffd0e247771a3f12/langsmith-0.3.42-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "18114327f3364385dae4026ebfd57d1c1cb46d8f80931098f0f10abe533475ff" + +[[packages]] +name = "lazy-loader" +version = "0.4" + +[[packages.wheels]] +name = "lazy_loader-0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc" + +[[packages]] +name = "linkify-it-py" +version = "2.0.3" + +[[packages.wheels]] +name = "linkify_it_py-2.0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/04/1e/b832de447dee8b582cac175871d2f6c3d5077cc56d5575cadba1fd1cccfa/linkify_it_py-2.0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79" + +[[packages]] +name = "llvmlite" +version = "0.44.0" + +[[packages.wheels]] +name = "llvmlite-0.44.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e2/3b/a9a17366af80127bd09decbe2a54d8974b6d8b274b39bf47fbaedeec6307/llvmlite-0.44.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "eae7e2d4ca8f88f89d315b48c6b741dcb925d6a1042da694aa16ab3dd4cbd3a1" + +[[packages]] +name = "lmfit" +version = "1.3.3" + +[[packages.wheels]] +name = "lmfit-1.3.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6a/e1/d5aeb89530550c7e797d3528225fa31012490e79c9df5cf72a0f07cc66d3/lmfit-1.3.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a9e9ec7d0d0ec962cc6c078ad1ec6c8311d3ac0e5f0947a00a91f5509dacc2b2" + +[[packages]] +name = "locket" +version = "1.0.0" + +[[packages.wheels]] +name = "locket-1.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3" + +[[packages]] +name = "logfire-api" +version = "3.12.0" + +[[packages.wheels]] +name = "logfire_api-3.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/97/c6/210bb1da7119af155276046c18ceff29867dfe9ea4bcb7d03397b28bd1cd/logfire_api-3.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fc092c2dcb24c8462ba776f3b0c2183f82e1cd55f86e29b38cf21a048e66a17d" + +[[packages]] +name = "lxml" +version = "5.3.0" + +[[packages.wheels]] +name = "lxml-5.3.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/fc/82/ace5a5676051e60355bd8fb945df7b1ba4f4fb8447f2010fb816bfd57724/lxml-5.3.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f" + +[[packages]] +name = "mako" +version = "1.3.9" + +[[packages.wheels]] +name = "Mako-1.3.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cd/83/de0a49e7de540513f53ab5d2e105321dedeb08a8f5850f0208decf4390ec/Mako-1.3.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "95920acccb578427a9aa38e37a186b1e43156c87260d7ba18ca63aa4c7cbd3a1" + +[[packages]] +name = "markdown" +version = "3.7" + +[[packages.wheels]] +name = "Markdown-3.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3f/08/83871f3c50fc983b88547c196d11cf8c3340e37c32d2e9d6152abe2c61f7/Markdown-3.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803" + +[[packages]] +name = "markdown-it-py" +version = "3.0.0" + +[[packages.wheels]] +name = "markdown_it_py-3.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1" + +[[packages]] +name = "markupsafe" +version = "3.0.2" + +[[packages.wheels]] +name = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87" + +[[packages]] +name = "matplotlib" +version = "3.10.3" + +[[packages.wheels]] +name = "matplotlib-3.10.3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b1/79/0d1c165eac44405a86478082e225fce87874f7198300bbebc55faaf6d28d/matplotlib-3.10.3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "cf37d8c6ef1a48829443e8ba5227b44236d7fcaf7647caa3178a4ff9f7a5be05" + +[[packages]] +name = "matplotlib-inline" +version = "0.1.7" + +[[packages.wheels]] +name = "matplotlib_inline-0.1.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" + +[[packages]] +name = "maturin" +version = "1.8.3" + +[[packages.wheels]] +name = "maturin-1.8.3-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/d5/62/f92a130a370dd7aca13c316844b82853647f048cfe1594a81f628ab7101f/maturin-1.8.3-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "85f2b882d8235c1c1cb0a38d382ccd5b3ba0674d99cb548d49df9342cc688e36" + +[[packages]] +name = "mccabe" +version = "0.7.0" + +[[packages.wheels]] +name = "mccabe-0.7.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + +[[packages]] +name = "mcp" +version = "1.9.3" + +[[packages.wheels]] +name = "mcp-1.9.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/79/45/823ad05504bea55cb0feb7470387f151252127ad5c72f8882e8fe6cf5c0e/mcp-1.9.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "69b0136d1ac9927402ed4cf221d4b8ff875e7132b0b06edd446448766f34f9b9" + +[[packages]] +name = "mdit-py-plugins" +version = "0.4.2" + +[[packages.wheels]] +name = "mdit_py_plugins-0.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636" + +[[packages]] +name = "mdurl" +version = "0.1.2" + +[[packages.wheels]] +name = "mdurl-0.1.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8" + +[[packages]] +name = "mercantile" +version = "1.2.1" + +[[packages.wheels]] +name = "mercantile-1.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b2/d6/de0cc74f8d36976aeca0dd2e9cbf711882ff8e177495115fd82459afdc4d/mercantile-1.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "30f457a73ee88261aab787b7069d85961a5703bb09dc57a170190bc042cd023f" + +[[packages]] +name = "mergedeep" +version = "1.3.4" + +[[packages.wheels]] +name = "mergedeep-1.3.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307" + +[[packages]] +name = "missingno" +version = "0.5.2" + +[[packages.wheels]] +name = "missingno-0.5.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/87/22/cd5cf999af21c2f97486622c551ac3d07361ced8125121e907f588ff5f24/missingno-0.5.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "55782621ce09ba0f0a1d08e5bd6d6fe1946469fb03951fadf7d209911ca5b072" + +[[packages]] +name = "mistralai" +version = "1.8.1" + +[[packages.wheels]] +name = "mistralai-1.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b0/14/e9ef675928768f508dfcedbb0e0ed601784a6911620a2bc25c9065921420/mistralai-1.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "badfc7e6832d894b3e9071d92ad621212b7cccd7df622c6cacdb525162ae338f" + +[[packages]] +name = "mistune" +version = "3.1.3" + +[[packages.wheels]] +name = "mistune-3.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/01/4d/23c4e4f09da849e127e9f123241946c23c1e30f45a88366879e064211815/mistune-3.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9" + +[[packages]] +name = "mizani" +version = "0.11.4" + +[[packages.wheels]] +name = "mizani-0.11.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/11/f3777ad46c5d92e3ead121c22ea45fafb6c3b2c1edca0c0c6494969c125c/mizani-0.11.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5b6271dc3da2c88694dca2e0e0a7e1879f0e2fb046c789776f54d090a5243735" + +[[packages]] +name = "ml-dtypes" +version = "0.5.1" + +[[packages.wheels]] +name = "ml_dtypes-0.5.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/38/bc/c4260e4a6c6bf684d0313308de1c860467275221d5e7daf69b3fcddfdd0b/ml_dtypes-0.5.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "9626d0bca1fb387d5791ca36bacbba298c5ef554747b7ebeafefb4564fc83566" + +[[packages]] +name = "mlxtend" +version = "0.23.3" + +[[packages.wheels]] +name = "mlxtend-0.23.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/92/5c322336a0991949a1e91f6acd7e04f7e05b0fb6252a3f00fcdc0cb5e97d/mlxtend-0.23.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f9fec721c4121be87dac00e513456dde5bf56b7427750719c0a291cd58b6538e" + +[[packages]] +name = "more-itertools" +version = "10.6.0" + +[[packages.wheels]] +name = "more_itertools-10.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/23/62/0fe302c6d1be1c777cab0616e6302478251dfbf9055ad426f5d0def75c89/more_itertools-10.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89" + +[[packages]] +name = "mpld3" +version = "0.5.10" + +[[packages.wheels]] +name = "mpld3-0.5.10-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/95/6a/e3691bcc47485f38b09853207c928130571821d187cf174eed5418d45e82/mpld3-0.5.10-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "80877acce87ea447380fad7374668737505c8c0684aab05238e7c5dc1fab38c1" + +[[packages]] +name = "mpmath" +version = "1.3.0" + +[[packages.wheels]] +name = "mpmath-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c" + +[[packages]] +name = "msal" +version = "1.30.0" + +[[packages.wheels]] +name = "msal-1.30.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ab/82/8f19334da43b7ef72d995587991a446f140346d76edb96a2c1a2689588e9/msal-1.30.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "423872177410cb61683566dc3932db7a76f661a5d2f6f52f02a047f101e1c1de" + +[[packages]] +name = "msal-extensions" +version = "1.2.0" + +[[packages.wheels]] +name = "msal_extensions-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/69/314d887a01599669fb330da14e5c6ff5f138609e322812a942a74ef9b765/msal_extensions-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cf5ba83a2113fa6dc011a254a72f1c223c88d7dfad74cc30617c4679a417704d" + +[[packages]] +name = "msgpack" +version = "1.1.0" + +[[packages.wheels]] +name = "msgpack-1.1.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/73/80/2708a4641f7d553a63bc934a3eb7214806b5b39d200133ca7f7afb0a53e8/msgpack-1.1.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f" + +[[packages]] +name = "multidict" +version = "6.4.3" + +[[packages.wheels]] +name = "multidict-6.4.3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db" + +[[packages]] +name = "multipledispatch" +version = "1.0.0" + +[[packages.wheels]] +name = "multipledispatch-1.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/51/c0/00c9809d8b9346eb238a6bbd5f83e846a4ce4503da94a4c08cb7284c325b/multipledispatch-1.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0c53cd8b077546da4e48869f49b13164bebafd0c2a5afceb6bb6a316e7fb46e4" + +[[packages]] +name = "mypy" +version = "1.15.0" + +[[packages.wheels]] +name = "mypy-1.15.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22" + +[[packages]] +name = "mypy-extensions" +version = "1.0.0" + +[[packages.wheels]] +name = "mypy_extensions-1.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d" + +[[packages]] +name = "mysql-connector-python" +version = "9.2.0" + +[[packages.wheels]] +name = "mysql_connector_python-9.2.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/5c/48/aa1d3e1dd2fa0fece0581d49c6d10717e18fc86dde493114f3894a3371bd/mysql_connector_python-9.2.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b7d149bcc455cf606a4aa604d45267fba16c8abf36056b804f8d16e8f5e753c1" + +[[packages]] +name = "namex" +version = "0.0.8" + +[[packages.wheels]] +name = "namex-0.0.8-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/73/59/7854fbfb59f8ae35483ce93493708be5942ebb6328cd85b3a609df629736/namex-0.0.8-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7ddb6c2bb0e753a311b7590f84f6da659dd0c05e65cb89d519d54c0a250c0487" + +[[packages]] +name = "narwhals" +version = "1.36.0" + +[[packages.wheels]] +name = "narwhals-1.36.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/42/bf/fbcbd9f8676e06ed43d644a4ddbf31478a44056487578ce67f191da430cb/narwhals-1.36.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e3c50dd1d769bc145f57ae17c1f0f0da6c3d397d62cdd0bb167e9b618e95c9d6" + +[[packages]] +name = "nbclient" +version = "0.10.2" + +[[packages.wheels]] +name = "nbclient-0.10.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d" + +[[packages]] +name = "nbconvert" +version = "7.16.6" + +[[packages.wheels]] +name = "nbconvert-7.16.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b" + +[[packages]] +name = "nbformat" +version = "5.10.4" + +[[packages.wheels]] +name = "nbformat-5.10.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b" + +[[packages]] +name = "nest-asyncio" +version = "1.6.0" + +[[packages.wheels]] +name = "nest_asyncio-1.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" + +[[packages]] +name = "networkx" +version = "3.4.2" + +[[packages.wheels]] +name = "networkx-3.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f" + +[[packages]] +name = "nh3" +version = "0.2.18" + +[[packages.wheels]] +name = "nh3-0.2.18-cp37-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/26/8d/53c5b19c4999bdc6ba95f246f4ef35ca83d7d7423e5e38be43ad66544e5d/nh3-0.2.18-cp37-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844" + +[[packages]] +name = "nltk" +version = "3.9.1" + +[[packages.wheels]] +name = "nltk-3.9.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/66/7d9e26593edda06e8cb531874633f7c2372279c3b0f46235539fe546df8b/nltk-3.9.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1" + +[[packages]] +name = "notebook" +version = "7.4.2" + +[[packages.wheels]] +name = "notebook-7.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/1e/16/d3c36a0b1f6dfcf218add8eaf803bf0473ff50681ac4d51acb7ba02bce34/notebook-7.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9ccef602721aaa5530852e3064710b8ae5415c4e2ce26f8896d0433222755259" + +[[packages]] +name = "notebook-shim" +version = "0.2.4" + +[[packages.wheels]] +name = "notebook_shim-0.2.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef" + +[[packages]] +name = "numba" +version = "0.61.2" + +[[packages.wheels]] +name = "numba-0.61.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/68/1d/ddb3e704c5a8fb90142bf9dc195c27db02a08a99f037395503bfbc1d14b3/numba-0.61.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18" + +[[packages]] +name = "numpy" +version = "2.2.6" + +[[packages.wheels]] +name = "numpy-2.2.6-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2" + +[[packages]] +name = "numpydoc" +version = "1.8.0" + +[[packages.wheels]] +name = "numpydoc-1.8.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6c/45/56d99ba9366476cd8548527667f01869279cedb9e66b28eb4dfb27701679/numpydoc-1.8.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541" + +[[packages]] +name = "openai" +version = "1.82.0" + +[[packages.wheels]] +name = "openai-1.82.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/51/4b/a59464ee5f77822a81ee069b4021163a0174940a92685efc3cf8b4c443a3/openai-1.82.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8c40647fea1816516cb3de5189775b30b5f4812777e40b8768f361f232b61b30" + +[[packages]] +name = "opencv-python" +version = "4.11.0.86" + +[[packages.wheels]] +name = "opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a4/7d/f1c30a92854540bf789e9cd5dde7ef49bbe63f855b85a2e6b3db8135c591/opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec" + +[[packages]] +name = "openpyxl" +version = "3.1.5" + +[[packages.wheels]] +name = "openpyxl-3.1.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2" + +[[packages]] +name = "opentelemetry-api" +version = "1.32.1" + +[[packages.wheels]] +name = "opentelemetry_api-1.32.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/12/f2/89ea3361a305466bc6460a532188830351220b5f0851a5fa133155c16eca/opentelemetry_api-1.32.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "bbd19f14ab9f15f0e85e43e6a958aa4cb1f36870ee62b7fd205783a112012724" + +[[packages]] +name = "optree" +version = "0.14.1" + +[[packages.wheels]] +name = "optree-0.14.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/5d/fa/c1dc4f40a83f5df6c16cc3ff89890712dd95caf320641f635ddbe5a11102/optree-0.14.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "98f858daa588ccb70bb554087e87d4192852a11416e5b14f3ee70ae1861b92b0" + +[[packages]] +name = "optuna" +version = "4.2.1" + +[[packages.wheels]] +name = "optuna-4.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/28/09/c4d329f7969443cdd4d482048ca406b6f61cda3c8e99ace71feaec7c8734/optuna-4.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6d38199013441d3f70fac27136e05c0188c5f4ec3848db708ac311cbdeb30dbf" + +[[packages]] +name = "orjson" +version = "3.10.16" + +[[packages.wheels]] +name = "orjson-3.10.16-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/35/ce/81a27e7b439b807bd393585271364cdddf50dc281fc57c4feef7ccb186a6/orjson-3.10.16-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "86d127efdd3f9bf5f04809b70faca1e6836556ea3cc46e662b44dab3fe71f3d6" + +[[packages]] +name = "osqp" +version = "0.6.7.post3" + +[[packages.wheels]] +name = "osqp-0.6.7.post3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/57/b5/958d4188cb9347e420d3de2d19d8cb1113f691b7a093cdef67f86b598f30/osqp-0.6.7.post3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "468588cfb690becba4d1f460c2a53e75530584e3efcf2caed59f5219032e6888" + +[[packages]] +name = "outcome" +version = "1.3.0.post0" + +[[packages.wheels]] +name = "outcome-1.3.0.post0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b" + +[[packages]] +name = "overrides" +version = "7.7.0" + +[[packages.wheels]] +name = "overrides-7.7.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49" + +[[packages]] +name = "packaging" +version = "24.2" + +[[packages.wheels]] +name = "packaging-24.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759" + +[[packages]] +name = "pandas" +version = "2.2.3" + +[[packages.wheels]] +name = "pandas-2.2.3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13" + +[[packages]] +name = "pandocfilters" +version = "1.5.1" + +[[packages.wheels]] +name = "pandocfilters-1.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc" + +[[packages]] +name = "panel" +version = "1.6.3" + +[[packages.wheels]] +name = "panel-1.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7a/fe/d01b6eae59933d56c345e57cdde5ffe379b7b1f56d192782ab8071249f73/panel-1.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ccd2a0587ab382bd55b8ea099706f31b64aadac697b8a41923d3b18b9ed618d6" + +[[packages]] +name = "papermill" +version = "2.6.0" + +[[packages.wheels]] +name = "papermill-2.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/55/83ce641bc61a70cc0721af6f50154ecaaccedfbdbc27366c1755a2a34972/papermill-2.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0f09da6ef709f3f14dde77cb1af052d05b14019189869affff374c9e612f2dd5" + +[[packages]] +name = "param" +version = "2.2.0" + +[[packages.wheels]] +name = "param-2.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/99/56/370a6636e072a037b52499edd8928942df7f887974fc54444ece5152d26a/param-2.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "777f8c7b66ab820b70ea5ad09faaa6818308220caae89da3b5c5f359faa72a5e" + +[[packages]] +name = "parso" +version = "0.8.4" + +[[packages.wheels]] +name = "parso-0.8.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18" + +[[packages]] +name = "partd" +version = "1.4.2" + +[[packages.wheels]] +name = "partd-1.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f" + +[[packages]] +name = "pathspec" +version = "0.12.1" + +[[packages.wheels]] +name = "pathspec-0.12.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08" + +[[packages]] +name = "patsy" +version = "1.0.1" + +[[packages.wheels]] +name = "patsy-1.0.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/87/2b/b50d3d08ea0fc419c183a84210571eba005328efa62b6b98bc28e9ead32a/patsy-1.0.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c" + +[[packages]] +name = "pep8" +version = "1.7.1" + +[[packages.wheels]] +name = "pep8-1.7.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/42/3f/669429ce58de2c22d8d2c542752e137ec4b9885fff398d3eceb1a7f5acb4/pep8-1.7.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b22cfae5db09833bb9bd7c8463b53e1a9c9b39f12e304a8d0bba729c501827ee" + +[[packages]] +name = "pexpect" +version = "4.9.0" + +[[packages.wheels]] +name = "pexpect-4.9.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523" + +[[packages]] +name = "pg8000" +version = "1.31.2" + +[[packages.wheels]] +name = "pg8000-1.31.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/09/a0/2b30d52017c4ced8fc107386666ea7573954eb708bf66121f0229df05d41/pg8000-1.31.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "436c771ede71af4d4c22ba867a30add0bc5c942d7ab27fadbb6934a487ecc8f6" + +[[packages]] +name = "pickleshare" +version = "0.7.5" + +[[packages.wheels]] +name = "pickleshare-0.7.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9a/41/220f49aaea88bc6fa6cba8d05ecf24676326156c23b991e80b3f2fc24c77/pickleshare-0.7.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" + +[[packages]] +name = "pillow" +version = "11.1.0" + +[[packages.wheels]] +name = "pillow-11.1.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/08/5c/2104299949b9d504baf3f4d35f73dbd14ef31bbd1ddc2c1b66a5b7dfda44/pillow-11.1.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf" + +[[packages]] +name = "platformdirs" +version = "4.3.7" + +[[packages.wheels]] +name = "platformdirs-4.3.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94" + +[[packages]] +name = "plotly" +version = "6.0.1" + +[[packages.wheels]] +name = "plotly-6.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/02/65/ad2bc85f7377f5cfba5d4466d5474423a3fb7f6a97fd807c06f92dd3e721/plotly-6.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4714db20fea57a435692c548a4eb4fae454f7daddf15f8d8ba7e1045681d7768" + +[[packages]] +name = "plotnine" +version = "0.13.6" + +[[packages.wheels]] +name = "plotnine-0.13.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/93/b1/e1c84e68cf24e83c4d251122e04c48840be203dafb4727e738381cdefa74/plotnine-0.13.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4acc1af29fa4e91e726b67d49277e8368f62e1c817f01bf14ecd8ca5e83bfaea" + +[[packages]] +name = "plotpy" +version = "2.7.4" + +[[packages.wheels]] +name = "plotpy-2.7.4-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a1/26/514cf02030400972fd95d42381e76690640eb3d3ceb14d86c22ebbb302ef/plotpy-2.7.4-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "716fee6b2c2a2156fd267e3941bcef28b3b169e6f95d2ab7f1417ef8c76f8a14" + +[[packages]] +name = "pluggy" +version = "1.5.0" + +[[packages.wheels]] +name = "pluggy-1.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" + +[[packages]] +name = "ply" +version = "3.11" + +[[packages.wheels]] +name = "ply-3.11-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce" + +[[packages]] +name = "polars" +version = "1.31.0" + +[[packages.wheels]] +name = "polars-1.31.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/6e/f6/9d9ad9dc4480d66502497e90ce29efc063373e1598f4bd9b6a38af3e08e7/polars-1.31.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "3fd874d3432fc932863e8cceff2cff8a12a51976b053f2eb6326a0672134a632" + +[[packages]] +name = "portalocker" +version = "2.7.0" + +[[packages.wheels]] +name = "portalocker-2.7.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8c/df/d4f711d168524f5aebd7fb30969eaa31e3048cf8979688cde3b08f6e5eb8/portalocker-2.7.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a07c5b4f3985c3cf4798369631fb7011adb498e2a46d8440efc75a8f29a0f983" + +[[packages]] +name = "prettytable" +version = "3.16.0" + +[[packages.wheels]] +name = "prettytable-3.16.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/02/c7/5613524e606ea1688b3bdbf48aa64bafb6d0a4ac3750274c43b6158a390f/prettytable-3.16.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b5eccfabb82222f5aa46b798ff02a8452cf530a352c31bddfa29be41242863aa" + +[[packages]] +name = "prince" +version = "0.16.0" + +[[packages.wheels]] +name = "prince-0.16.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/18/d5/b4480a0f381cbbcfad31f4d118732ab717216857508a730938ee615669a1/prince-0.16.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7e21a78d4dd06ca3ec526ee714a50b349f26de3fca6b79664150a951b31688f3" + +[[packages]] +name = "priority" +version = "2.0.0" + +[[packages.wheels]] +name = "priority-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5e/5f/82c8074f7e84978129347c2c6ec8b6c59f3584ff1a20bc3c940a3e061790/priority-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa" + +[[packages]] +name = "prometheus-client" +version = "0.21.1" + +[[packages.wheels]] +name = "prometheus_client-0.21.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301" + +[[packages]] +name = "prompt-toolkit" +version = "3.0.51" + +[[packages.wheels]] +name = "prompt_toolkit-3.0.51-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07" + +[[packages]] +name = "propcache" +version = "0.3.1" + +[[packages.wheels]] +name = "propcache-0.3.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3" + +[[packages]] +name = "protobuf" +version = "6.30.2" + +[[packages.wheels]] +name = "protobuf-6.30.2-cp310-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/97/e9/7b9f1b259d509aef2b833c29a1f3c39185e2bf21c9c1be1cd11c22cb2149/protobuf-6.30.2-cp310-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7653c99774f73fe6b9301b87da52af0e69783a2e371e8b599b3e9cb4da4b12b9" + +[[packages]] +name = "psutil" +version = "7.0.0" + +[[packages.wheels]] +name = "psutil-7.0.0-cp37-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553" + +[[packages]] +name = "psygnal" +version = "0.12.0" + +[[packages.wheels]] +name = "psygnal-0.12.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/84/09/f00841834b7ae543bd232c22e557914d63d0d0430d32980883421d5981bb/psygnal-0.12.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "25a9f2db710a6cd2566b3e0e03cf6e04d56276f36ac86b42fa22d81f9a4ac0f2" + +[[packages]] +name = "ptpython" +version = "3.0.29" + +[[packages.wheels]] +name = "ptpython-3.0.29-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/39/c6fd4dd531e067b6a01624126cff0b3ddc6569e22f83e48d8418ffa9e3be/ptpython-3.0.29-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "65d75c4871859e4305a020c9b9e204366dceb4d08e0e2bd7b7511bd5e917a402" + +[[packages]] +name = "ptyprocess" +version = "0.7.0" + +[[packages.wheels]] +name = "ptyprocess-0.7.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35" + +[[packages]] +name = "pure-eval" +version = "0.2.3" + +[[packages.wheels]] +name = "pure_eval-0.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0" + +[[packages]] +name = "pyarrow" +version = "20.0.0" + +[[packages.wheels]] +name = "pyarrow-20.0.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a0/8e/9adee63dfa3911be2382fb4d92e4b2e7d82610f9d9f668493bebaa2af50f/pyarrow-20.0.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b" + +[[packages]] +name = "pyasn1" +version = "0.6.1" + +[[packages.wheels]] +name = "pyasn1-0.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629" + +[[packages]] +name = "pyasn1-modules" +version = "0.4.1" + +[[packages.wheels]] +name = "pyasn1_modules-0.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd" + +[[packages]] +name = "pybind11" +version = "2.13.6" + +[[packages.wheels]] +name = "pybind11-2.13.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/13/2f/0f24b288e2ce56f51c920137620b4434a38fd80583dbbe24fc2a1656c388/pybind11-2.13.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "237c41e29157b962835d356b370ededd57594a26d5894a795960f0047cb5caf5" + +[[packages]] +name = "pycodestyle" +version = "2.12.0" + +[[packages.wheels]] +name = "pycodestyle-2.12.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/55/c4/bf8ede2d1641e0a2e027c6d0c7060e00332851ea772cc5cee42a4a207707/pycodestyle-2.12.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4" + +[[packages]] +name = "pycparser" +version = "2.22" + +[[packages.wheels]] +name = "pycparser-2.22-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" + +[[packages]] +name = "pyct" +version = "0.5.0" + +[[packages.wheels]] +name = "pyct-0.5.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/75/e7/c7c1e9e1b6b23ca1db7af3c6826d57d8da883021f751edcc9c82143b127a/pyct-0.5.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a4038a8885059ab8cac6f946ea30e0b5e6bdbe0b92b6723f06737035f9d65e8c" + +[[packages]] +name = "pydantic" +version = "2.10.6" + +[[packages.wheels]] +name = "pydantic-2.10.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584" + +[[packages]] +name = "pydantic-ai-slim" +version = "0.2.9" + +[[packages.wheels]] +name = "pydantic_ai_slim-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d8/23/b4d52d83c302859e1e251a8c8a360b993cf8b4818c8b633adaa98b043556/pydantic_ai_slim-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d954ff84cb250d7150a7ed694e4f1f92f820205d036ee006d02fce3e62a3bc4e" + +[[packages]] +name = "pydantic-core" +version = "2.27.2" + +[[packages.wheels]] +name = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9" + +[[packages]] +name = "pydantic-evals" +version = "0.2.9" + +[[packages.wheels]] +name = "pydantic_evals-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b6/6e/8d88e00f624a8348b286b219a292fe3e077ee973660dcff6b4ddd5a04e85/pydantic_evals-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "62035ae3a5321e4d892c7372ef91af0f46b675863e827f011d5cb8550dede400" + +[[packages]] +name = "pydantic-graph" +version = "0.2.9" + +[[packages.wheels]] +name = "pydantic_graph-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/cc/e609261763a76f4d23a545afb462847592bc6b4d8eb412990b9b913c073e/pydantic_graph-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "38ad929a0ec205bd7d5875b0b408d4f13448276aa89b6ce2a1143a7552b070ce" + +[[packages]] +name = "pydantic-settings" +version = "2.8.1" + +[[packages.wheels]] +name = "pydantic_settings-2.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c" + +[[packages]] +name = "pydeck" +version = "0.9.1" + +[[packages.wheels]] +name = "pydeck-0.9.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038" + +[[packages]] +name = "pydocstyle" +version = "6.3.0" + +[[packages.wheels]] +name = "pydocstyle-6.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/36/ea/99ddefac41971acad68f14114f38261c1f27dac0b3ec529824ebc739bdaa/pydocstyle-6.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019" + +[[packages]] +name = "pydub" +version = "0.25.1" + +[[packages.wheels]] +name = "pydub-0.25.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6" + +[[packages]] +name = "pyerfa" +version = "2.0.1.5" + +[[packages.wheels]] +name = "pyerfa-2.0.1.5-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b4/11/97233cf23ad5411ac6f13b1d6ee3888f90ace4f974d9bf9db887aa428912/pyerfa-2.0.1.5-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "66292d437dcf75925b694977aa06eb697126e7b86553e620371ed3e48b5e0ad0" + +[[packages]] +name = "pyflakes" +version = "3.2.0" + +[[packages.wheels]] +name = "pyflakes-3.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d4/d7/f1b7db88d8e4417c5d47adad627a93547f44bdc9028372dbd2313f34a855/pyflakes-3.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + +[[packages]] +name = "pygithub" +version = "2.6.1" + +[[packages.wheels]] +name = "PyGithub-2.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ac/fc/a444cd19ccc8c4946a512f3827ed0b3565c88488719d800d54a75d541c0b/PyGithub-2.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6f2fa6d076ccae475f9fc392cc6cdbd54db985d4f69b8833a28397de75ed6ca3" + +[[packages]] +name = "pygments" +version = "2.19.1" + +[[packages.wheels]] +name = "pygments-2.19.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c" + +[[packages]] +name = "pyjwt" +version = "2.10.1" + +[[packages.wheels]] +name = "PyJWT-2.10.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb" + +[[packages]] +name = "pylint" +version = "3.3.6" + +[[packages.wheels]] +name = "pylint-3.3.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/31/21/9537fc94aee9ec7316a230a49895266cf02d78aa29b0a2efbc39566e0935/pylint-3.3.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8b7c2d3e86ae3f94fb27703d521dd0b9b6b378775991f504d7c3a6275aa0a6a6" + +[[packages]] +name = "pylint-venv" +version = "3.0.4" + +[[packages.wheels]] +name = "pylint_venv-3.0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a6/10/040e1928236e3d34b26639e3427df88c7249a85aadc621cea2158589b4f8/pylint_venv-3.0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "31006a3df398f58f962c9e5620e756b284e8b2bc490594ce5ee5da41920cb32c" + +[[packages]] +name = "pyls-spyder" +version = "0.4.0" + +[[packages.wheels]] +name = "pyls_spyder-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d0/26/d0975972af1f18c3bb02ec5889191cc09ebb982bcbe45438d90ca763f4ec/pyls_spyder-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1505d975f866a343d0554b6dab41b53717f4b4bc6df450dfd7d48f889fe450b9" + +[[packages]] +name = "pymongo" +version = "4.10.1" + +[[packages.wheels]] +name = "pymongo-4.10.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/76/8b/5afce891d78159912c43726fab32641e3f9718f14be40f978c148ea8db48/pymongo-4.10.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "dcc07b1277e8b4bf4d7382ca133850e323b7ab048b8353af496d050671c7ac52" + +[[packages]] +name = "pympler" +version = "1.1" + +[[packages.wheels]] +name = "Pympler-1.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/79/4f/a6a2e2b202d7fd97eadfe90979845b8706676b41cbd3b42ba75adf329d1f/Pympler-1.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5b223d6027d0619584116a0cbc28e8d2e378f7a79c1e5e024f9ff3b673c58506" + +[[packages]] +name = "pynacl" +version = "1.5.0" + +[[packages.wheels]] +name = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93" + +[[packages]] +name = "pynndescent" +version = "0.5.13" + +[[packages.wheels]] +name = "pynndescent-0.5.13-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d2/53/d23a97e0a2c690d40b165d1062e2c4ccc796be458a1ce59f6ba030434663/pynndescent-0.5.13-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "69aabb8f394bc631b6ac475a1c7f3994c54adf3f51cd63b2730fefba5771b949" + +[[packages]] +name = "pyodbc" +version = "5.2.0" + +[[packages.wheels]] +name = "pyodbc-5.2.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/21/7f/3a47e022a97b017ffb73351a1061e4401bcb5aa4fc0162d04f4e5452e4fc/pyodbc-5.2.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b1f5686b142759c5b2bdbeaa0692622c2ebb1f10780eb3c174b85f5607fbcf55" + +[[packages]] +name = "pyogrio" +version = "0.10.0" + +[[packages.wheels]] +name = "pyogrio-0.10.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/43/97/34605480f06b0ad9611bf58a174eccc6f3673275f3d519cf763391892881/pyogrio-0.10.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "2a3e09839590d71ff832aa95c4f23fa00a2c63c3de82c1fbd4fb8d265792acfc" + +[[packages]] +name = "pyomo" +version = "6.9.2" + +[[packages.wheels]] +name = "pyomo-6.9.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7f/88/0a07233e39357d3d620186485b927074d6d0ae0f64ad72cc5222ae05844e/pyomo-6.9.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "13ebb2f974f97afa626c2712d4f27e09a1c3d18ca11755676b743504a76e5161" + +[[packages]] +name = "pypandoc" +version = "1.15" + +[[packages.wheels]] +name = "pypandoc-1.15-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/06/0763e0ccc81754d3eadb21b2cb86cf21bdedc9b52698c2ad6785db7f0a4e/pypandoc-1.15-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4ededcc76c8770f27aaca6dff47724578428eca84212a31479403a9731fc2b16" + +[[packages]] +name = "pyparsing" +version = "3.2.3" + +[[packages.wheels]] +name = "pyparsing-3.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf" + +[[packages]] +name = "pypdf" +version = "5.4.0" + +[[packages.wheels]] +name = "pypdf-5.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0b/27/d83f8f2a03ca5408dc2cc84b49c0bf3fbf059398a6a2ea7c10acfe28859f/pypdf-5.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "db994ab47cadc81057ea1591b90e5b543e2b7ef2d0e31ef41a9bfe763c119dab" + +[[packages]] +name = "pyproj" +version = "3.7.0" + +[[packages.wheels]] +name = "pyproj-3.7.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a1/8b/96bc8c8f3eca4eb7fa3758fde0b755d1df30a19f494376e3ee8de1ef4e79/pyproj-3.7.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "0692f806224e8ed82fe4acfa57268ff444fdaf9f330689f24c0d96e59480cce1" + +[[packages]] +name = "pyproject-hooks" +version = "1.2.0" + +[[packages.wheels]] +name = "pyproject_hooks-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913" + +[[packages]] +name = "pyqt5" +version = "5.15.11" + +[[packages.wheels]] +name = "PyQt5-5.15.11-cp38-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/56/d5/68eb9f3d19ce65df01b6c7b7a577ad3bbc9ab3a5dd3491a4756e71838ec9/PyQt5-5.15.11-cp38-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517" + +[[packages]] +name = "pyqt5-qt5" +version = "5.15.2" + +[[packages.wheels]] +name = "PyQt5_Qt5-5.15.2-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/37/97/5d3b222b924fa2ed4c2488925155cd0b03fd5d09ee1cfcf7c553c11c9f66/PyQt5_Qt5-5.15.2-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "750b78e4dba6bdf1607febedc08738e318ea09e9b10aea9ff0d73073f11f6962" + +[[packages]] +name = "pyqt5-sip" +version = "12.17.0" + +[[packages.wheels]] +name = "PyQt5_sip-12.17.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/fe/c5/1174988d52c732d07033cf9a5067142b01d76be7731c6394a64d5c3ef65c/PyQt5_sip-12.17.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "54c31de7706d8a9a8c0fc3ea2c70468aba54b027d4974803f8eace9c22aad41c" + +[[packages]] +name = "pyqtgraph" +version = "0.13.7" + +[[packages.wheels]] +name = "pyqtgraph-0.13.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/34/5702b3b7cafe99be1d94b42f100e8cc5e6957b761fcb1cf5f72d492851da/pyqtgraph-0.13.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7754edbefb6c367fa0dfb176e2d0610da3ada20aa7a5318516c74af5fb72bf7a" + +[[packages]] +name = "pyqtwebengine" +version = "5.15.7" + +[[packages.wheels]] +name = "PyQtWebEngine-5.15.7-cp38-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/39/67/0dead50889d905fc99f40e61e5ab7f73746605ce8f74c4fa7fb3fc1d6c5e/PyQtWebEngine-5.15.7-cp38-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bd5e8c426d6f6b352cd15800d64a89b2a4a11e098460b818c7bdcf5e5612e44f" + +[[packages]] +name = "pyqtwebengine-qt5" +version = "5.15.2" + +[[packages.wheels]] +name = "PyQtWebEngine_Qt5-5.15.2-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e0/db/0f29bd882aee8b5754f3e1ab104d2d09cdd9138a889558b43badcd81ce11/PyQtWebEngine_Qt5-5.15.2-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "24231f19e1595018779977de6722b5c69f3d03f34a5f7574ff21cd1e764ef76d" + +[[packages]] +name = "pyserial" +version = "3.5" + +[[packages.wheels]] +name = "pyserial-3.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/bc/587a445451b253b285629263eb51c2d8e9bcea4fc97826266d186f96f558/pyserial-3.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0" + +[[packages]] +name = "pysocks" +version = "1.7.1" + +[[packages.wheels]] +name = "PySocks-1.7.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5" + +[[packages]] +name = "pyspnego" +version = "0.11.2" + +[[packages.wheels]] +name = "pyspnego-0.11.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/57/ea/b3c1438839d8724beff7b31ec42b9d041265dc9ca27ccb54477d442bfbcf/pyspnego-0.11.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "74abc1fb51e59360eb5c5c9086e5962174f1072c7a50cf6da0bda9a4bcfdfbd4" + +[[packages]] +name = "pytest" +version = "8.3.5" + +[[packages.wheels]] +name = "pytest-8.3.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820" + +[[packages]] +name = "python-barcode" +version = "0.15.1" + +[[packages.wheels]] +name = "python_barcode-0.15.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/10/27/9b5c5bb1938d4e6b12f4c95f40ea905c11df3cd58e128e9305397b9a2697/python_barcode-0.15.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "057636fba37369c22852410c8535b36adfbeb965ddfd4e5b6924455d692e0886" + +[[packages]] +name = "python-dateutil" +version = "2.8.2" + +[[packages.wheels]] +name = "python_dateutil-2.8.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + +[[packages]] +name = "python-dotenv" +version = "1.1.0" + +[[packages.wheels]] +name = "python_dotenv-1.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d" + +[[packages]] +name = "python-json-logger" +version = "3.3.0" + +[[packages.wheels]] +name = "python_json_logger-3.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/08/20/0f2523b9e50a8052bc6a8b732dfc8568abbdc42010aef03a2d750bdab3b2/python_json_logger-3.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7" + +[[packages]] +name = "python-lsp-black" +version = "2.0.0" + +[[packages.wheels]] +name = "python_lsp_black-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/78/44/fef9b4d027b3d6321e6f30b6b5946bef18cd84a96e1d81012ac0f69ea53c/python_lsp_black-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d5efdee45f5fa9e5241f5d4d396cd46127f45c85817916b1fd92c2986652bf7e" + +[[packages]] +name = "python-lsp-jsonrpc" +version = "1.1.2" + +[[packages.wheels]] +name = "python_lsp_jsonrpc-1.1.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/d9/656659d5b5d5f402b2b174cd0ba9bc827e07ce3c0bf88da65424baf64af8/python_lsp_jsonrpc-1.1.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7339c2e9630ae98903fdaea1ace8c47fba0484983794d6aafd0bd8989be2b03c" + +[[packages]] +name = "python-lsp-server" +version = "1.12.2" + +[[packages.wheels]] +name = "python_lsp_server-1.12.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/e7/28010a326ef591e1409daf9d57a47de94156c147ad1befe74d8196d82729/python_lsp_server-1.12.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "750116459449184ba20811167cdf96f91296ae12f1f65ebd975c5c159388111b" + +[[packages]] +name = "python-multipart" +version = "0.0.20" + +[[packages.wheels]] +name = "python_multipart-0.0.20-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104" + +[[packages]] +name = "python-slugify" +version = "8.0.4" + +[[packages.wheels]] +name = "python_slugify-8.0.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8" + +[[packages]] +name = "pythonqwt" +version = "0.14.5" + +[[packages.wheels]] +name = "pythonqwt-0.14.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/28/e9/1e6e93e1aaaec57d6ef427291e8fb3d9f18ebd91147c24f2b241b01e2def/pythonqwt-0.14.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "be5a9d2e1ba22aaa02eb397c5b3b5e4e1d9ed2c08f45554d8b920d8fc3be6dc7" + +[[packages]] +name = "pytoolconfig" +version = "1.3.1" + +[[packages.wheels]] +name = "pytoolconfig-1.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/92/44/da239917f5711ca7105f7d7f9e2765716dd883b241529beafc0f28504725/pytoolconfig-1.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5d8cea8ae1996938ec3eaf44567bbc5ef1bc900742190c439a44a704d6e1b62b" + +[[packages]] +name = "pytz" +version = "2025.2" + +[[packages.wheels]] +name = "pytz-2025.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00" + +[[packages]] +name = "pyuca" +version = "1.2" + +[[packages.wheels]] +name = "pyuca-1.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/98/88/aeeee34d88f841aca712a8c18fbd62a33eaad8f2dbe535e87f3c829b02f9/pyuca-1.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "abaa12e1bd2c7c68ca8396ff8383bc0654a739cef3ae68fd7af58bf29af0a91e" + +[[packages]] +name = "pyusb" +version = "1.3.1" + +[[packages.wheels]] +name = "pyusb-1.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/28/b8/27e6312e86408a44fe16bd28ee12dd98608b39f7e7e57884a24e8f29b573/pyusb-1.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430" + +[[packages]] +name = "pyviz-comms" +version = "3.0.4" + +[[packages.wheels]] +name = "pyviz_comms-3.0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/98/cc/ba051cfaef2525054e3367f2d5ff4df38f8f775125b3eebb82af4060026b/pyviz_comms-3.0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a40d17db26ec13cf975809633804e712bd24b473e77388c193c44043f85d0b25" + +[[packages]] +name = "pywavelets" +version = "1.8.0" + +[[packages.wheels]] +name = "pywavelets-1.8.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/1c/88/9e2aa9d5fde08bfc0fb18ffb1b5307c1ed49c24930b4147e5f48571a7251/pywavelets-1.8.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "810a23a631da596fef7196ddec49b345b1aab13525bb58547eeebe1769edbbc1" + +[[packages]] +name = "pywin32" +version = "310" + +[[packages.wheels]] +name = "pywin32-310-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e3/e5/b0627f8bb84e06991bea89ad8153a9e50ace40b2e1195d68e9dff6b03d0f/pywin32-310-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060" + +[[packages]] +name = "pywin32-ctypes" +version = "0.2.3" + +[[packages.wheels]] +name = "pywin32_ctypes-0.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8" + +[[packages]] +name = "pywinpty" +version = "2.0.15" + +[[packages.wheels]] +name = "pywinpty-2.0.15-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/88/e5/9714def18c3a411809771a3fbcec70bffa764b9675afb00048a620fca604/pywinpty-2.0.15-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "83a8f20b430bbc5d8957249f875341a60219a4e971580f2ba694fbfb54a45ebc" + +[[packages]] +name = "pyyaml" +version = "6.0.2" + +[[packages.wheels]] +name = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8" + +[[packages]] +name = "pyzmq" +version = "26.4.0" + +[[packages.wheels]] +name = "pyzmq-26.4.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/30/0f/55f8c02c182856743b82dde46b2dc3e314edda7f1098c12a8227eeda0833/pyzmq-26.4.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "056a97aab4064f526ecb32f4343917a4022a5d9efb6b9df990ff72e1879e40be" + +[[packages]] +name = "qdarkstyle" +version = "3.2.3" + +[[packages.wheels]] +name = "QDarkStyle-3.2.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/93/7d/c3c10498430dadcea4def5faddf71cd199e577d20a125e7ef1e9d7bdbbfa/QDarkStyle-3.2.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ea980ee426d594909cf1058306832af71ff6cbad6f69237b036d1550635aefbc" + +[[packages]] +name = "qdldl" +version = "0.1.7.post5" + +[[packages.wheels]] +name = "qdldl-0.1.7.post5-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/c1/82/730d0d2c6093c4dc574947eea94e0cddeea836f43823a80fc8b064a82ddf/qdldl-0.1.7.post5-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "13dfc0b225a5c180512488fa51f1771e8fa3c06d7fce9fd3c1d018bc03ba0eec" + +[[packages]] +name = "qrcode" +version = "8.0" + +[[packages.wheels]] +name = "qrcode-8.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/74/ab/df8d889fd01139db68ae9e5cb5c8f0ea016823559a6ecb427582d52b07dc/qrcode-8.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9fc05f03305ad27a709eb742cf3097fa19e6f6f93bb9e2f039c0979190f6f1b1" + +[[packages]] +name = "qstylizer" +version = "0.2.4" + +[[packages.wheels]] +name = "qstylizer-0.2.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2d/ba/2a4e51861942c2bc3be60400c69f6713359c3e307aee4696f2ea47f35811/qstylizer-0.2.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8f384dfe86f9edb0bb596b93663a51f124f0794b94fd54057cc7cf9cea59fb6f" + +[[packages]] +name = "qtawesome" +version = "1.4.0" + +[[packages.wheels]] +name = "qtawesome-1.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a5/ee/6e6c6715129c929af2d95ddb2e9decf54c1beffe58f336911197aacc0448/qtawesome-1.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a4d689fa071c595aa6184171ce1f0f847677cb8d2db45382c43129f1d72a3d93" + +[[packages]] +name = "qtconsole" +version = "5.6.1" + +[[packages.wheels]] +name = "qtconsole-5.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/8a/635610fb6131bc702229e2780d7b042416866ab78f8ed1ff24c4b23a2f4c/qtconsole-5.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3d22490d9589bace566ad4f3455b61fa2209156f40e87e19e2c3cb64e9264950" + +[[packages]] +name = "qtpy" +version = "2.4.3" + +[[packages.wheels]] +name = "QtPy-2.4.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/69/76/37c0ccd5ab968a6a438f9c623aeecc84c202ab2fabc6a8fd927580c15b5a/QtPy-2.4.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1" + +[[packages]] +name = "quantecon" +version = "0.7.2" + +[[packages.wheels]] +name = "quantecon-0.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/77/1b/75e44bd482abe2e87dcbead8cfd99b8fa6582fdc0906967c34f64abfdf13/quantecon-0.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d1333ca7bc3046efe3655d9eeeefb299051b00870b8608cb5bc0b88e3bdb8b67" + +[[packages]] +name = "quart" +version = "0.20.0" + +[[packages.wheels]] +name = "quart-0.20.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7e/e9/cc28f21f52913adf333f653b9e0a3bf9cb223f5083a26422968ba73edd8d/quart-0.20.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "003c08f551746710acb757de49d9b768986fd431517d0eb127380b656b98b8f1" + +[[packages]] +name = "rapidfuzz" +version = "3.13.0" + +[[packages.wheels]] +name = "rapidfuzz-3.13.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/03/25/5ee7ab6841ca668567d0897905eebc79c76f6297b73bf05957be887e9c74/rapidfuzz-3.13.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e" + +[[packages]] +name = "readme-renderer" +version = "44.0" + +[[packages.wheels]] +name = "readme_renderer-44.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151" + +[[packages]] +name = "redis" +version = "5.2.1" + +[[packages.wheels]] +name = "redis-5.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3c/5f/fa26b9b2672cbe30e07d9a5bdf39cf16e3b80b42916757c5f92bca88e4ba/redis-5.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4" + +[[packages]] +name = "referencing" +version = "0.36.2" + +[[packages.wheels]] +name = "referencing-0.36.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0" + +[[packages]] +name = "regex" +version = "2024.11.6" + +[[packages.wheels]] +name = "regex-2024.11.6-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b" + +[[packages]] +name = "reportlab" +version = "4.3.1" + +[[packages.wheels]] +name = "reportlab-4.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ce/6b/42805895ed08a314a01be6110584b5d059328386988ddbc4f8f10014d30e/reportlab-4.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0f37dd16652db3ef84363cf744632a28c38bd480d5bf94683466852d7bb678dd" + +[[packages]] +name = "requests" +version = "2.32.3" + +[[packages.wheels]] +name = "requests-2.32.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" + +[[packages]] +name = "requests-ntlm" +version = "1.3.0" + +[[packages.wheels]] +name = "requests_ntlm-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/5d/836b97537a390cf811b0488490c389c5a614f0a93acb23f347bd37a2d914/requests_ntlm-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4c7534a7d0e482bb0928531d621be4b2c74ace437e88c5a357ceb7452d25a510" + +[[packages]] +name = "requests-toolbelt" +version = "1.0.0" + +[[packages.wheels]] +name = "requests_toolbelt-1.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06" + +[[packages]] +name = "rfc3339-validator" +version = "0.1.4" + +[[packages.wheels]] +name = "rfc3339_validator-0.1.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa" + +[[packages]] +name = "rfc3986" +version = "2.0.0" + +[[packages.wheels]] +name = "rfc3986-2.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd" + +[[packages]] +name = "rfc3986-validator" +version = "0.1.1" + +[[packages.wheels]] +name = "rfc3986_validator-0.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9" + +[[packages]] +name = "rich" +version = "14.0.0" + +[[packages.wheels]] +name = "rich-14.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0" + +[[packages]] +name = "rope" +version = "1.13.0" + +[[packages.wheels]] +name = "rope-1.13.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a0/d0/e213e5adfa162e437dff3669131dc476043fc3a22fe99ef891516100610d/rope-1.13.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b435a0c0971244fdcd8741676a9fae697ae614c20cc36003678a7782f25c0d6c" + +[[packages]] +name = "rpds-py" +version = "0.24.0" + +[[packages.wheels]] +name = "rpds_py-0.24.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/bb/46/b8b5424d1d21f2f2f3f2d468660085318d4f74a8df8289e3dd6ad224d488/rpds_py-0.24.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034" + +[[packages]] +name = "rsa" +version = "4.7.2" + +[[packages.wheels]] +name = "rsa-4.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e9/93/0c0f002031f18b53af7a6166103c02b9c0667be528944137cc954ec921b3/rsa-4.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2" + +[[packages]] +name = "rtree" +version = "1.4.0" + +[[packages.wheels]] +name = "rtree-1.4.0-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/ce/c2/362f2cc36a7a57b47380061c23fc109c7222c1a544ffd24cda289ba19673/rtree-1.4.0-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "ba83efc7b7563905b1bfdfc14490c4bfb59e92e5e6156bdeb6ec5df5117252f4" + +[[packages]] +name = "rx" +version = "3.2.0" + +[[packages.wheels]] +name = "Rx-3.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/a9/efeaeca4928a9a56d04d609b5730994d610c82cf4d9dd7aa173e6ef4233e/Rx-3.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "922c5f4edb3aa1beaa47bf61d65d5380011ff6adcd527f26377d05cb73ed8ec8" + +[[packages]] +name = "scikit-image" +version = "0.25.2" + +[[packages.wheels]] +name = "scikit_image-0.25.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/34/e3/49beb08ebccda3c21e871b607c1cb2f258c3fa0d2f609fed0a5ba741b92d/scikit_image-0.25.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bdd2b8c1de0849964dbc54037f36b4e9420157e67e45a8709a80d727f52c7da2" + +[[packages]] +name = "scikit-learn" +version = "1.6.1" + +[[packages.wheels]] +name = "scikit_learn-1.6.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/62/27/585859e72e117fe861c2079bcba35591a84f801e21bc1ab85bce6ce60305/scikit_learn-1.6.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52" + +[[packages]] +name = "scipy" +version = "1.15.3" + +[[packages.wheels]] +name = "scipy-1.15.3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed" + +[[packages]] +name = "scramp" +version = "1.4.5" + +[[packages.wheels]] +name = "scramp-1.4.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d9/9f/8b2f2749ccfbe4fcef08650896ac47ed919ff25b7ac57b7a1ae7da16c8c3/scramp-1.4.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "50e37c464fc67f37994e35bee4151e3d8f9320e9c204fca83a5d313c121bbbe7" + +[[packages]] +name = "scs" +version = "3.2.7.post2" + +[[packages.wheels]] +name = "scs-3.2.7.post2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/30/49/1645fa1219493ac94475ab8f48a2520d2fc27f486327f2b0f167440a8188/scs-3.2.7.post2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "2995d4099943c3fd754b3e39fe178a9c03dcb9c7d84b40f64ac5eb26d8d6085a" + +[[packages]] +name = "seaborn" +version = "0.13.2" + +[[packages.wheels]] +name = "seaborn-0.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987" + +[[packages]] +name = "send2trash" +version = "1.8.3" + +[[packages.wheels]] +name = "Send2Trash-1.8.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9" + +[[packages]] +name = "setuptools" +version = "79.0.1" + +[[packages.wheels]] +name = "setuptools-79.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0d/6d/b4752b044bf94cb802d88a888dc7d288baaf77d7910b7dedda74b5ceea0c/setuptools-79.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e147c0549f27767ba362f9da434eab9c5dc0045d5304feb602a0af001089fc51" + +[[packages]] +name = "shapely" +version = "2.1.0" + +[[packages.wheels]] +name = "shapely-2.1.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b8/bd/9249bd6dda948441e25e4fb14cbbb5205146b0fff12c66b19331f1ff2141/shapely-2.1.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "f4f47e631aa4f9ec5576eac546eb3f38802e2f82aeb0552f9612cb9a14ece1db" + +[[packages]] +name = "shellingham" +version = "1.5.4" + +[[packages.wheels]] +name = "shellingham-1.5.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686" + +[[packages]] +name = "simplejson" +version = "3.19.3" + +[[packages.wheels]] +name = "simplejson-3.19.3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/fe/68/9f0e5df0651cb79ef83cba1378765a00ee8038e6201cc82b8e7178a7778e/simplejson-3.19.3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "1e662336db50ad665777e6548b5076329a94a0c3d4a0472971c588b3ef27de3a" + +[[packages]] +name = "simpy" +version = "4.1.1" + +[[packages.wheels]] +name = "simpy-4.1.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/48/72/920ed1224c94a8a5a69e6c1275ac7fe4eb911ba8feffddf469f1629d47f3/simpy-4.1.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7c5ae380240fd2238671160e4830956f8055830a8317edf5c05e495b3823cd88" + +[[packages]] +name = "six" +version = "1.17.0" + +[[packages.wheels]] +name = "six-1.17.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274" + +[[packages]] +name = "sklearn-compat" +version = "0.1.3" + +[[packages.wheels]] +name = "sklearn_compat-0.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f0/a8/ad69cf130fbd017660cdd64abbef3f28135d9e2e15fe3002e03c5be0ca38/sklearn_compat-0.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a8aaf8ef711988cbd63f187c5560b5f16b25df663aaa1d2d0e1291341d339f80" + +[[packages]] +name = "skrub" +version = "0.5.3" + +[[packages.wheels]] +name = "skrub-0.5.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/80/cf/5a1e0dabfa3cad1ab9b09e690fede4aa8fdc0c04d9d7ec8aa9338d56e1e4/skrub-0.5.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b6ba417fa83d1f7e9a69656e0860b061381b9bd19808692a2b5bef8588c72775" + +[[packages]] +name = "smmap" +version = "5.0.2" + +[[packages.wheels]] +name = "smmap-5.0.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e" + +[[packages]] +name = "sniffio" +version = "1.3.1" + +[[packages.wheels]] +name = "sniffio-1.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" + +[[packages]] +name = "snowballstemmer" +version = "2.2.0" + +[[packages.wheels]] +name = "snowballstemmer-2.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" + +[[packages]] +name = "sortedcontainers" +version = "2.4.0" + +[[packages.wheels]] +name = "sortedcontainers-2.4.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0" + +[[packages]] +name = "sounddevice" +version = "0.5.1" + +[[packages.wheels]] +name = "sounddevice-0.5.1-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/af/9b/15217b04f3b36d30de55fef542389d722de63f1ad81f9c72d8afc98cb6ab/sounddevice-0.5.1-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "4313b63f2076552b23ac3e0abd3bcfc0c1c6a696fc356759a13bd113c9df90f1" + +[[packages]] +name = "soupsieve" +version = "2.6" + +[[packages.wheels]] +name = "soupsieve-2.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9" + +[[packages]] +name = "sphinx" +version = "8.1.3" + +[[packages.wheels]] +name = "sphinx-8.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2" + +[[packages]] +name = "sphinx-rtd-theme" +version = "3.0.2" + +[[packages.wheels]] +name = "sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/85/77/46e3bac77b82b4df5bb5b61f2de98637724f246b4966cfc34bc5895d852a/sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13" + +[[packages]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5" + +[[packages]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2" + +[[packages]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" + +[[packages.wheels]] +name = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8" + +[[packages]] +name = "sphinxcontrib-jquery" +version = "4.1" + +[[packages.wheels]] +name = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" + +[[packages]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" + +[[packages.wheels]] +name = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178" + +[[packages]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb" + +[[packages]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331" + +[[packages]] +name = "spyder" +version = "6.0.7" + +[[packages.wheels]] +name = "spyder-6.0.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ee/c8/1568fa96351ddad878d42e7487d9637604c7f34030171acf810f47914d9d/spyder-6.0.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b725569bb8ddc7b0aab73d747d85312dc0456978370cc0f9b1a101c0fe4f076b" + +[[packages]] +name = "spyder-kernels" +version = "3.0.5" + +[[packages.wheels]] +name = "spyder_kernels-3.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/10/2d/b1c88e914ebdec2a9cf066b2c283ee234f4052c31922017407fa8adb89f3/spyder_kernels-3.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9cc808e0ec4426b9ba911128e221fa2234e6c8d6e08526132e90112ff9c2bb7c" + +[[packages]] +name = "sqlalchemy" +version = "2.0.40" + +[[packages.wheels]] +name = "sqlalchemy-2.0.40-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/2a/9f/14c511cda174aa1ad9b0e42b64ff5a71db35d08b0d80dc044dae958921e5/sqlalchemy-2.0.40-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0" + +[[packages]] +name = "sqlite-bro" +version = "0.13.1" + +[[packages.wheels]] +name = "sqlite_bro-0.13.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/b3/81b91f5b26fff329c59dbf826a87637bd51d1903120427912322f86e7d33/sqlite_bro-0.13.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c26033b0af133049ca578b5fd30b2372f002e7ff934b39774aa4d2da7638c23d" + +[[packages]] +name = "sqlite-fts4" +version = "1.0.3" + +[[packages.wheels]] +name = "sqlite_fts4-1.0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/51/29/0096e8b1811aaa78cfb296996f621f41120c21c2f5cd448ae1d54979d9fc/sqlite_fts4-1.0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0359edd8dea6fd73c848989e1e2b1f31a50fe5f9d7272299ff0e8dbaa62d035f" + +[[packages]] +name = "sqlite-utils" +version = "3.38" + +[[packages.wheels]] +name = "sqlite_utils-3.38-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/eb/f8e8e827805f810838efff3311cccd2601238c5fa3fc35c1f878709e161b/sqlite_utils-3.38-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8a27441015c3b2ef475f555861f7a2592f73bc60d247af9803a11b65fc605bf9" + +[[packages]] +name = "sqlparse" +version = "0.5.3" + +[[packages.wheels]] +name = "sqlparse-0.5.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a9/5c/bfd6bd0bf979426d405cc6e71eceb8701b148b16c21d2dc3c261efc61c7b/sqlparse-0.5.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca" + +[[packages]] +name = "squarify" +version = "0.4.4" + +[[packages.wheels]] +name = "squarify-0.4.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/3c/eedbe9fb07cc20fd9a8423da14b03bc270d0570b3ba9174a4497156a2152/squarify-0.4.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d7597724e29d48aa14fd2f551060d6b09e1f0a67e4cd3ea329fe03b4c9a56f11" + +[[packages]] +name = "sse-starlette" +version = "2.2.1" + +[[packages.wheels]] +name = "sse_starlette-2.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99" + +[[packages]] +name = "sspilib" +version = "0.2.0" + +[[packages.wheels]] +name = "sspilib-0.2.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/38/54/949a9e9c07cd6efead79a7f78cc951cb5fa4f9f1fcb25b8520fd2adcdbe0/sspilib-0.2.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "40a97ca83e503a175d1dc9461836994e47e8b9bcf56cab81a2c22e27f1993079" + +[[packages]] +name = "stack-data" +version = "0.6.3" + +[[packages.wheels]] +name = "stack_data-0.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" + +[[packages]] +name = "starlette" +version = "0.46.2" + +[[packages.wheels]] +name = "starlette-0.46.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35" + +[[packages]] +name = "statsmodels" +version = "0.14.4" + +[[packages.wheels]] +name = "statsmodels-0.14.4-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/59/9a/e466a1b887a1441141e52dbcc98152f013d85076576da6eed2357f2016ae/statsmodels-0.14.4-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7f7917a51766b4e074da283c507a25048ad29a18e527207883d73535e0dc6184" + +[[packages]] +name = "streamlit" +version = "1.46.0" + +[[packages.wheels]] +name = "streamlit-1.46.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/be/26/79bbb77bec3d605f7de7a4b45c806b44d112e8c9bce77fb620e03d9f2b88/streamlit-1.46.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f8624acabafcf18611a0fac2635cf181a7ba922b45bd131ae15fc8f80e1a5482" + +[[packages]] +name = "superqt" +version = "0.7.3" + +[[packages.wheels]] +name = "superqt-0.7.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4f/53/ce8e705a0fca9ff08406d0232409c6dacd09a04cdc5124e33aa3ad97c117/superqt-0.7.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8f7d141665b31baa484747f324fc9fc2d14223f2fefc92ffed6ea35c92221304" + +[[packages]] +name = "sv-ttk" +version = "2.6.0" + +[[packages.wheels]] +name = "sv_ttk-2.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/3d/be0abc3202e90f282ad465f4e7c6e41bc8dce810ce5d1611566a1e7dfba8/sv_ttk-2.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4319c52edf2e14732fe84bdc9788e26f9e9a1ad79451ec0f89f0120ffc8105d9" + +[[packages]] +name = "sympy" +version = "1.14.0" + +[[packages.wheels]] +name = "sympy-1.14.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5" + +[[packages]] +name = "tabulate" +version = "0.9.0" + +[[packages.wheels]] +name = "tabulate-0.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f" + +[[packages]] +name = "tblib" +version = "3.1.0" + +[[packages.wheels]] +name = "tblib-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/44/aa5c8b10b2cce7a053018e0d132bd58e27527a0243c4985383d5b6fd93e9/tblib-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e" + +[[packages]] +name = "tenacity" +version = "9.1.2" + +[[packages.wheels]] +name = "tenacity-9.1.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138" + +[[packages]] +name = "termcolor" +version = "3.1.0" + +[[packages.wheels]] +name = "termcolor-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa" + +[[packages]] +name = "terminado" +version = "0.18.1" + +[[packages.wheels]] +name = "terminado-0.18.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0" + +[[packages]] +name = "text-unidecode" +version = "1.3" + +[[packages.wheels]] +name = "text_unidecode-1.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8" + +[[packages]] +name = "textdistance" +version = "4.6.3" + +[[packages.wheels]] +name = "textdistance-4.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/c2/c62601c858010b0513a6434b9be19bd740533a6e861eddfd30b7258d92a0/textdistance-4.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0cb1b2cc8e3339ddc3e0f8c870e49fb49de6ecc42a718917308b3c971f34aa56" + +[[packages]] +name = "thefuzz" +version = "0.22.1" + +[[packages.wheels]] +name = "thefuzz-0.22.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/4f/1695e70ceb3604f19eda9908e289c687ea81c4fecef4d90a9d1d0f2f7ae9/thefuzz-0.22.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "59729b33556850b90e1093c4cf9e618af6f2e4c985df193fdf3c5b5cf02ca481" + +[[packages]] +name = "threadpoolctl" +version = "3.6.0" + +[[packages.wheels]] +name = "threadpoolctl-3.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb" + +[[packages]] +name = "three-merge" +version = "0.1.1" + +[[packages.wheels]] +name = "three_merge-0.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/23/be/a52588102605ec52b4e88340d65a290b6465c1dbcd2d943ab149b012908b/three_merge-0.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dd219f4696aa0bbec6099ac3528b4de0450ff9bde862dd8f6d6f52e745f83464" + +[[packages]] +name = "tifffile" +version = "2025.3.30" + +[[packages.wheels]] +name = "tifffile-2025.3.30-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6e/be/10d23cfd4078fbec6aba768a357eff9e70c0b6d2a07398425985c524ad2a/tifffile-2025.3.30-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c" + +[[packages]] +name = "tiktoken" +version = "0.9.0" + +[[packages.wheels]] +name = "tiktoken-0.9.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/5b/64/b16003419a1d7728d0d8c0d56a4c24325e7b10a21a9dd1fc0f7115c02f0a/tiktoken-0.9.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "5a62d7a25225bafed786a524c1b9f0910a1128f4232615bf3f8257a73aaa3b16" + +[[packages]] +name = "tinycss2" +version = "1.4.0" + +[[packages.wheels]] +name = "tinycss2-1.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289" + +[[packages]] +name = "tokenizers" +version = "0.21.1" + +[[packages.wheels]] +name = "tokenizers-0.21.1-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e6/b6/072a8e053ae600dcc2ac0da81a23548e3b523301a442a6ca900e92ac35be/tokenizers-0.21.1-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382" + +[[packages]] +name = "toml" +version = "0.10.2" + +[[packages.wheels]] +name = "toml-0.10.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b" + +[[packages]] +name = "tomli" +version = "2.2.1" + +[[packages.wheels]] +name = "tomli-2.2.1-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4" + +[[packages]] +name = "tomli-w" +version = "1.2.0" + +[[packages.wheels]] +name = "tomli_w-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90" + +[[packages]] +name = "tomlkit" +version = "0.13.2" + +[[packages.wheels]] +name = "tomlkit-0.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde" + +[[packages]] +name = "toolz" +version = "1.0.0" + +[[packages.wheels]] +name = "toolz-1.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236" + +[[packages]] +name = "tornado" +version = "6.5.1" + +[[packages.wheels]] +name = "tornado-6.5.1-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b" + +[[packages]] +name = "tqdm" +version = "4.67.1" + +[[packages.wheels]] +name = "tqdm-4.67.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2" + +[[packages]] +name = "traitlets" +version = "5.14.3" + +[[packages.wheels]] +name = "traitlets-5.14.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" + +[[packages]] +name = "traittypes" +version = "0.2.1" + +[[packages.wheels]] +name = "traittypes-0.2.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9c/d1/8d5bd662703cc1764d986f6908a608777305946fa634d34c470cd4a1e729/traittypes-0.2.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1340af133810b6eee1a2eb2e988f862b0d12b6c2d16f282aaf3207b782134c2e" + +[[packages]] +name = "trio" +version = "0.30.0" + +[[packages.wheels]] +name = "trio-0.30.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/69/8e/3f6dfda475ecd940e786defe6df6c500734e686c9cd0a0f8ef6821e9b2f2/trio-0.30.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3bf4f06b8decf8d3cf00af85f40a89824669e2d033bb32469d34840edcfc22a5" + +[[packages]] +name = "trove-classifiers" +version = "2025.5.9.12" + +[[packages.wheels]] +name = "trove_classifiers-2025.5.9.12-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/92/ef/c6deb083748be3bcad6f471b6ae983950c161890bf5ae1b2af80cc56c530/trove_classifiers-2025.5.9.12-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e381c05537adac78881c8fa345fd0e9970159f4e4a04fcc42cfd3129cca640ce" + +[[packages]] +name = "twine" +version = "6.1.0" + +[[packages.wheels]] +name = "twine-6.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7c/b6/74e927715a285743351233f33ea3c684528a0d374d2e43ff9ce9585b73fe/twine-6.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384" + +[[packages]] +name = "typer" +version = "0.15.2" + +[[packages.wheels]] +name = "typer-0.15.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc" + +[[packages]] +name = "types-python-dateutil" +version = "2.9.0.20240316" + +[[packages.wheels]] +name = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c7/1b/af4f4c4f3f7339a4b7eb3c0ab13416db98f8ac09de3399129ee5fdfa282b/types_python_dateutil-2.9.0.20240316-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b" + +[[packages]] +name = "types-requests" +version = "2.32.0.20250328" + +[[packages.wheels]] +name = "types_requests-2.32.0.20250328-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cc/15/3700282a9d4ea3b37044264d3e4d1b1f0095a4ebf860a99914fd544e3be3/types_requests-2.32.0.20250328-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2" + +[[packages]] +name = "typing-extensions" +version = "4.13.2" + +[[packages.wheels]] +name = "typing_extensions-4.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c" + +[[packages]] +name = "typing-inspection" +version = "0.4.0" + +[[packages.wheels]] +name = "typing_inspection-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f" + +[[packages]] +name = "tzdata" +version = "2025.2" + +[[packages.wheels]] +name = "tzdata-2025.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8" + +[[packages]] +name = "tzlocal" +version = "5.3.1" + +[[packages.wheels]] +name = "tzlocal-5.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d" + +[[packages]] +name = "uc-micro-py" +version = "1.0.3" + +[[packages.wheels]] +name = "uc_micro_py-1.0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/37/87/1f677586e8ac487e29672e4b17455758fce261de06a0d086167bb760361a/uc_micro_py-1.0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5" + +[[packages]] +name = "ujson" +version = "5.10.0" + +[[packages.wheels]] +name = "ujson-5.10.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/59/2d/691f741ffd72b6c84438a93749ac57bf1a3f217ac4b0ea4fd0e96119e118/ujson-5.10.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc" + +[[packages]] +name = "umap-learn" +version = "0.5.7" + +[[packages.wheels]] +name = "umap_learn-0.5.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3c/8f/671c0e1f2572ba625cbcc1faeba9435e00330c3d6962858711445cf1e817/umap_learn-0.5.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6a7e0be2facfa365a5ed6588447102bdbef32a0ef449535c25c97ea7e680073c" + +[[packages]] +name = "uncertainties" +version = "3.2.2" + +[[packages.wheels]] +name = "uncertainties-3.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fa/fc/97711d2a502881d871e3cf2d2645e21e7f8e4d4fd9a56937557790cade6a/uncertainties-3.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fd8543355952f4052786ed4150acaf12e23117bd0f5bd03ea07de466bce646e7" + +[[packages]] +name = "uri-template" +version = "1.3.0" + +[[packages.wheels]] +name = "uri_template-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363" + +[[packages]] +name = "urllib3" +version = "2.4.0" + +[[packages.wheels]] +name = "urllib3-2.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813" + +[[packages]] +name = "uvicorn" +version = "0.34.2" + +[[packages.wheels]] +name = "uvicorn-0.34.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403" + +[[packages]] +name = "vega-datasets" +version = "0.9.0" + +[[packages.wheels]] +name = "vega_datasets-0.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e6/9f/ca52771fe972e0dcc5167fedb609940e01516066938ff2ee28b273ae4f29/vega_datasets-0.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3d7c63917be6ca9b154b565f4779a31fedce57b01b5b9d99d8a34a7608062a1d" + +[[packages]] +name = "waitress" +version = "3.0.0" + +[[packages.wheels]] +name = "waitress-3.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5b/a9/485c953a1ac4cb98c28e41fd2c7184072df36bbf99734a51d44d04176878/waitress-3.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2a06f242f4ba0cc563444ca3d1998959447477363a2d7e9b8b4d75d35cfd1669" + +[[packages]] +name = "watchdog" +version = "6.0.0" + +[[packages.wheels]] +name = "watchdog-6.0.0-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680" + +[[packages]] +name = "wcwidth" +version = "0.2.13" + +[[packages.wheels]] +name = "wcwidth-0.2.13-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859" + +[[packages]] +name = "webcolors" +version = "24.11.1" + +[[packages.wheels]] +name = "webcolors-24.11.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9" + +[[packages]] +name = "webencodings" +version = "0.5.1" + +[[packages.wheels]] +name = "webencodings-0.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78" + +[[packages]] +name = "websocket-client" +version = "1.8.0" + +[[packages.wheels]] +name = "websocket_client-1.8.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526" + +[[packages]] +name = "websockets" +version = "14.2" + +[[packages.wheels]] +name = "websockets-14.2-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b3/7d/32cdb77990b3bdc34a306e0a0f73a1275221e9a66d869f6ff833c95b56ef/websockets-14.2-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "44bba1a956c2c9d268bdcdf234d5e5ff4c9b6dc3e300545cbe99af59dda9dcce" + +[[packages]] +name = "werkzeug" +version = "3.1.3" + +[[packages.wheels]] +name = "werkzeug-3.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e" + +[[packages]] +name = "whatthepatch" +version = "1.0.7" + +[[packages.wheels]] +name = "whatthepatch-1.0.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8e/93/af1d6ccb69ab6b5a00e03fa0cefa563f9862412667776ea15dd4eece3a90/whatthepatch-1.0.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1b6f655fd31091c001c209529dfaabbabdbad438f5de14e3951266ea0fc6e7ed" + +[[packages]] +name = "wheel" +version = "0.45.1" + +[[packages.wheels]] +name = "wheel-0.45.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248" + +[[packages]] +name = "widgetsnbextension" +version = "4.0.14" + +[[packages.wheels]] +name = "widgetsnbextension-4.0.14-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ca/51/5447876806d1088a0f8f71e16542bf350918128d0a69437df26047c8e46f/widgetsnbextension-4.0.14-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575" + +[[packages]] +name = "wordcloud" +version = "1.9.4" + +[[packages.wheels]] +name = "wordcloud-1.9.4-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b9/74/6a15f68f59bc90032bfcf62eca796a5675be95e1aaf84f7861e1bfcfa8e5/wordcloud-1.9.4-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "360977705d0808a1795fcbe98afb5dc4833cb4bb8e421cbb10e93ef0bce816ff" + +[[packages]] +name = "wrapt" +version = "1.16.0" + +[[packages.wheels]] +name = "wrapt-1.16.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/5c/cc/8297f9658506b224aa4bd71906447dea6bb0ba629861a758c28f67428b91/wrapt-1.16.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8" + +[[packages]] +name = "wsproto" +version = "1.2.0" + +[[packages.wheels]] +name = "wsproto-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736" + +[[packages]] +name = "xarray" +version = "2025.4.0" + +[[packages.wheels]] +name = "xarray-2025.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/1e/96fd96419fec1a37da998a1ca3d558f2cae2f6f3cd5015170371b05a2b6b/xarray-2025.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b27defd082c5cb85d32c695708de6bb05c2838fb7caaf3f952982e602a35b9b8" + +[[packages]] +name = "xlsxwriter" +version = "3.2.3" + +[[packages.wheels]] +name = "XlsxWriter-3.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/37/b1/a252d499f2760b314fcf264d2b36fcc4343a1ecdb25492b210cb0db70a68/XlsxWriter-3.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "593f8296e8a91790c6d0378ab08b064f34a642b3feb787cf6738236bd0a4860d" + +[[packages]] +name = "xyzservices" +version = "2023.10.1" + +[[packages.wheels]] +name = "xyzservices-2023.10.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/c3/e06dfa46464cce3eda4b86df8847cab99d9bc545c76807ee689545187a4c/xyzservices-2023.10.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6a4c38d3a9f89d3e77153eff9414b36a8ee0850c9e8b85796fd1b2a85b8dfd68" + +[[packages]] +name = "yapf" +version = "0.40.1" + +[[packages.wheels]] +name = "yapf-0.40.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/23/75/c374517c09e31bf22d3b3f156d73e0f38d08e29b2afdd607cef5f1e10aa9/yapf-0.40.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b8bfc1f280949153e795181768ca14ef43d7312629a06c43e7abd279323af313" + +[[packages]] +name = "yarl" +version = "1.18.3" + +[[packages.wheels]] +name = "yarl-1.18.3-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/34/45/0e055320daaabfc169b21ff6174567b2c910c45617b0d79c68d7ab349b02/yarl-1.18.3-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477" + +[[packages]] +name = "yt-dlp" +version = "2025.2.19" + +[[packages.wheels]] +name = "yt_dlp-2025.2.19-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/45/6d1b759e68f5363b919828fb0e0c167a1cd5003b5b7c74cc0f0c2096be4f/yt_dlp-2025.2.19-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3ed218eaeece55e9d715afd41abc450dc406ee63bf79355169dfde312d38fdb8" + +[[packages]] +name = "zict" +version = "3.0.0" + +[[packages.wheels]] +name = "zict-3.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/80/ab/11a76c1e2126084fde2639514f24e6111b789b0bfa4fc6264a8975c7e1f1/zict-3.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae" + +[[packages]] +name = "zipp" +version = "3.21.0" + +[[packages.wheels]] +name = "zipp-3.21.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931" + +[[packages]] +name = "zstandard" +version = "0.23.0" + +[[packages.wheels]] +name = "zstandard-0.23.0-cp312-cp312-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/75/37/872d74bd7739639c4553bf94c84af7d54d8211b626b352bc57f0fd8d1e3f/zstandard-0.23.0-cp312-cp312-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b" diff --git a/changelogs/pylock.64-3_13_5_0slim.toml b/changelogs/pylock.64-3_13_5_0slim.toml new file mode 100644 index 00000000..c8739b74 --- /dev/null +++ b/changelogs/pylock.64-3_13_5_0slim.toml @@ -0,0 +1,5491 @@ +lock-version = "1.0" +created-by = "pip" + +[[packages]] +name = "absl-py" +version = "2.2.2" + +[[packages.wheels]] +name = "absl_py-2.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f6/d4/349f7f4bd5ea92dab34f5bb0fe31775ef6c311427a14d5a5b31ecb442341/absl_py-2.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092" + +[[packages]] +name = "adbc-driver-manager" +version = "1.3.0" + +[[packages.wheels]] +name = "adbc_driver_manager-1.3.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/2a/a7/a97c778466e0fca5ebb8566794f07334689a086f3564d1250608bb943494/adbc_driver_manager-1.3.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "0d327006f5993385b3625e3524a851ea7050aa3b1716bddd52c8892ac9c42145" + +[[packages]] +name = "aiofiles" +version = "23.2.1" + +[[packages.wheels]] +name = "aiofiles-23.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c5/19/5af6804c4cc0fed83f47bff6e413a98a36618e7d40185cd36e69737f3b0e/aiofiles-23.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107" + +[[packages]] +name = "aiohappyeyeballs" +version = "2.6.1" + +[[packages.wheels]] +name = "aiohappyeyeballs-2.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8" + +[[packages]] +name = "aiohttp" +version = "3.11.18" + +[[packages.wheels]] +name = "aiohttp-3.11.18-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/1e/3c/143831b32cd23b5263a995b2a1794e10aa42f8a895aae5074c20fda36c07/aiohttp-3.11.18-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01" + +[[packages]] +name = "aiosignal" +version = "1.3.2" + +[[packages.wheels]] +name = "aiosignal-1.3.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5" + +[[packages]] +name = "aiosqlite" +version = "0.20.0" + +[[packages.wheels]] +name = "aiosqlite-0.20.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/00/c4/c93eb22025a2de6b83263dfe3d7df2e19138e345bca6f18dba7394120930/aiosqlite-0.20.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "36a1deaca0cac40ebe32aac9977a6e2bbc7f5189f23f4a54d5908986729e5bd6" + +[[packages]] +name = "alabaster" +version = "0.7.16" + +[[packages.wheels]] +name = "alabaster-0.7.16-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92" + +[[packages]] +name = "alembic" +version = "1.15.2" + +[[packages.wheels]] +name = "alembic-1.15.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/41/18/d89a443ed1ab9bcda16264716f809c663866d4ca8de218aa78fd50b38ead/alembic-1.15.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2e76bd916d547f6900ec4bb5a90aeac1485d2c92536923d0b138c02b126edc53" + +[[packages]] +name = "altair" +version = "5.5.0" + +[[packages.wheels]] +name = "altair-5.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/aa/f3/0b6ced594e51cc95d8c1fc1640d3623770d01e4969d29c0bd09945fafefa/altair-5.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c" + +[[packages]] +name = "annotated-types" +version = "0.7.0" + +[[packages.wheels]] +name = "annotated_types-0.7.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53" + +[[packages]] +name = "ansicolors" +version = "1.1.8" + +[[packages.wheels]] +name = "ansicolors-1.1.8-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/53/18/a56e2fe47b259bb52201093a3a9d4a32014f9d85071ad07e9d60600890ca/ansicolors-1.1.8-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "00d2dde5a675579325902536738dd27e4fac1fd68f773fe36c21044eb559e187" + +[[packages]] +name = "anthropic" +version = "0.51.0" + +[[packages.wheels]] +name = "anthropic-0.51.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8c/6e/9637122c5f007103bd5a259f4250bd8f1533dd2473227670fd10a1457b62/anthropic-0.51.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b8b47d482c9aa1f81b923555cebb687c2730309a20d01be554730c8302e0f62a" + +[[packages]] +name = "anyio" +version = "4.9.0" + +[[packages.wheels]] +name = "anyio-4.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c" + +[[packages]] +name = "anywidget" +version = "0.9.18" + +[[packages.wheels]] +name = "anywidget-0.9.18-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2b/f0/09a30ca0551af20c7cefa7464b7ccb6f5407a550b83c4dcb15c410814849/anywidget-0.9.18-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "944b82ef1dd17b8ff0fb6d1f199f613caf9111338e6e2857da478f6e73770cb8" + +[[packages]] +name = "appdirs" +version = "1.4.4" + +[[packages.wheels]] +name = "appdirs-1.4.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" + +[[packages]] +name = "argcomplete" +version = "3.6.2" + +[[packages.wheels]] +name = "argcomplete-3.6.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/31/da/e42d7a9d8dd33fa775f467e4028a47936da2f01e4b0e561f9ba0d74cb0ca/argcomplete-3.6.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591" + +[[packages]] +name = "argon2-cffi" +version = "23.1.0" + +[[packages.wheels]] +name = "argon2_cffi-23.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea" + +[[packages]] +name = "argon2-cffi-bindings" +version = "21.2.0" + +[[packages.wheels]] +name = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f" + +[[packages]] +name = "array-api-compat" +version = "1.12.0" + +[[packages.wheels]] +name = "array_api_compat-1.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e0/b1/0542e0cab6f49f151a2d7a42400f84f706fc0b64e85dc1f56708b2e9fd37/array_api_compat-1.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0b4795b6944a9507fde54679f9350e2ad2b1e2acf4a2408a098cdc27f890a8b" + +[[packages]] +name = "arrow" +version = "1.3.0" + +[[packages.wheels]] +name = "arrow-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80" + +[[packages]] +name = "asgi-csrf" +version = "0.11" + +[[packages.wheels]] +name = "asgi_csrf-0.11-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/1c/5d954baaf144852a4762368b37c06202b277378ea412acc5565f69acc9e9/asgi_csrf-0.11-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "03ac140115f39d4295288a9adf74fdc6ae607f6ef44abee8466520458207242b" + +[[packages]] +name = "asgiref" +version = "3.8.1" + +[[packages.wheels]] +name = "asgiref-3.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47" + +[[packages]] +name = "asn1crypto" +version = "1.5.1" + +[[packages.wheels]] +name = "asn1crypto-1.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c9/7f/09065fd9e27da0eda08b4d6897f1c13535066174cc023af248fc2a8d5e5a/asn1crypto-1.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67" + +[[packages]] +name = "asteval" +version = "1.0.5" + +[[packages.wheels]] +name = "asteval-1.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0a/0d/2c6aaab67ac566d76322e87827d707214c5f6ffb5a4fcd456a8633da1788/asteval-1.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "082b95312578affc8a6d982f7d92b7ac5de05634985c87e7eedd3188d31149fa" + +[[packages]] +name = "astroid" +version = "3.3.9" + +[[packages.wheels]] +name = "astroid-3.3.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/de/80/c749efbd8eef5ea77c7d6f1956e8fbfb51963b7f93ef79647afd4d9886e3/astroid-3.3.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248" + +[[packages]] +name = "astropy" +version = "6.1.6" + +[[packages.wheels]] +name = "astropy-6.1.6-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/cc/6b/3a25746d94111c8523ac02b810451987128ab61ac05847e24dd1b2093e18/astropy-6.1.6-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "fafc65f47dedcc4a8112bce8b67f215a8076af214be34a2c34abc96d078f2b37" + +[[packages]] +name = "astropy-iers-data" +version = "0.2024.12.23.0.33.24" + +[[packages.wheels]] +name = "astropy_iers_data-0.2024.12.23.0.33.24-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e8/4d/565740d9ac54640c09d2fdd22ef3583103438fb97305a9cfb66595a4b259/astropy_iers_data-0.2024.12.23.0.33.24-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "40d3c6b6a5cf4dc6ad91b92b7e0f949e5366234e3c4440302247429fc8294302" + +[[packages]] +name = "asttokens" +version = "3.0.0" + +[[packages.wheels]] +name = "asttokens-3.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2" + +[[packages]] +name = "async-lru" +version = "2.0.5" + +[[packages.wheels]] +name = "async_lru-2.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943" + +[[packages]] +name = "asyncssh" +version = "2.20.0" + +[[packages.wheels]] +name = "asyncssh-2.20.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f2/c5/7a9d42c065f272f74792663194966a68810e851a34c0dd080246bd7308f5/asyncssh-2.20.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "af6888d937c07a4bf31293335a6166b4d87608cdb5957b49547da6ad87ecf174" + +[[packages]] +name = "atomicwrites" +version = "1.4.0" + +[[packages.wheels]] +name = "atomicwrites-1.4.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/a0/da5f49008ec6e9a658dbf5d7310a4debd397bce0b4db03cf8a410066bb87/atomicwrites-1.4.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197" + +[[packages]] +name = "attrs" +version = "25.3.0" + +[[packages.wheels]] +name = "attrs-25.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3" + +[[packages]] +name = "autopep8" +version = "2.0.4" + +[[packages.wheels]] +name = "autopep8-2.0.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d8/f2/e63c9f9c485cd90df8e4e7ae90fa3be2469c9641888558c7b45fa98a76f8/autopep8-2.0.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb" + +[[packages]] +name = "azure-core" +version = "1.32.0" + +[[packages.wheels]] +name = "azure_core-1.32.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/39/83/325bf5e02504dbd8b4faa98197a44cdf8a325ef259b48326a2b6f17f8383/azure_core-1.32.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "eac191a0efb23bfa83fddf321b27b122b4ec847befa3091fa736a5c32c50d7b4" + +[[packages]] +name = "azure-cosmos" +version = "4.9.0" + +[[packages.wheels]] +name = "azure_cosmos-4.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/dc/380f843744535497acd0b85aacb59565c84fc28bf938c8d6e897a858cd95/azure_cosmos-4.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3b60eaa01a16a857d0faf0cec304bac6fa8620a81bc268ce760339032ef617fe" + +[[packages]] +name = "azure-identity" +version = "1.21.0" + +[[packages.wheels]] +name = "azure_identity-1.21.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3d/9f/1f9f3ef4f49729ee207a712a5971a9ca747f2ca47d9cbf13cf6953e3478a/azure_identity-1.21.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "258ea6325537352440f71b35c3dffe9d240eae4a5126c1b7ce5efd5766bd9fd9" + +[[packages]] +name = "babel" +version = "2.17.0" + +[[packages.wheels]] +name = "babel-2.17.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2" + +[[packages]] +name = "baresql" +version = "1.0.0" + +[[packages.wheels]] +name = "baresql-1.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d6/d2/fe24bcd99d97bddbbccdf191edf4e84c0fdfe894dfff9f54b05f36096ebb/baresql-1.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a24d17f46beb47c221f328f7e06710e3896c6203a8e1909788d7128f27b86f01" + +[[packages]] +name = "bcrypt" +version = "4.3.0" + +[[packages.wheels]] +name = "bcrypt-4.3.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a9/cf/45fb5261ece3e6b9817d3d82b2f343a505fd58674a92577923bc500bd1aa/bcrypt-4.3.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "e53e074b120f2877a35cc6c736b8eb161377caae8925c17688bd46ba56daaa5b" + +[[packages]] +name = "beautifulsoup4" +version = "4.13.3" + +[[packages.wheels]] +name = "beautifulsoup4-4.13.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16" + +[[packages]] +name = "binaryornot" +version = "0.4.4" + +[[packages.wheels]] +name = "binaryornot-0.4.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/24/7e/f7b6f453e6481d1e233540262ccbfcf89adcd43606f44a028d7f5fae5eb2/binaryornot-0.4.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4" + +[[packages]] +name = "black" +version = "25.1.0" + +[[packages.wheels]] +name = "black-25.1.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/cc/64/94eb5f45dcb997d2082f097a3944cfc7fe87e071907f677e80788a2d7b7a/black-25.1.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18" + +[[packages]] +name = "bleach" +version = "6.2.0" + +[[packages.wheels]] +name = "bleach-6.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e" + +[[packages]] +name = "blinker" +version = "1.9.0" + +[[packages.wheels]] +name = "blinker-1.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" + +[[packages]] +name = "bokeh" +version = "3.7.3" + +[[packages.wheels]] +name = "bokeh-3.7.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/91/48/08b2382e739236aa3360b7976360ba3e0c043b6234e25951c18c1eb6fa06/bokeh-3.7.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b0e79dd737f088865212e4fdcb0f3b95d087f0f088bf8ca186a300ab1641e2c7" + +[[packages]] +name = "branca" +version = "0.8.1" + +[[packages.wheels]] +name = "branca-0.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f8/9d/91cddd38bd00170aad1a4b198c47b4ed716be45c234e09b835af41f4e717/branca-0.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d29c5fab31f7c21a92e34bf3f854234e29fecdcf5d2df306b616f20d816be425" + +[[packages]] +name = "brotli" +version = "1.1.0" + +[[packages.wheels]] +name = "Brotli-1.1.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/7e/c1/ec214e9c94000d1c1974ec67ced1c970c148aa6b8d8373066123fc3dbf06/Brotli-1.1.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b" + +[[packages]] +name = "build" +version = "1.2.2.post1" + +[[packages.wheels]] +name = "build-1.2.2.post1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/84/c2/80633736cd183ee4a62107413def345f7e6e3c01563dbca1417363cf957e/build-1.2.2.post1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5" + +[[packages]] +name = "cachetools" +version = "5.5.2" + +[[packages.wheels]] +name = "cachetools-5.5.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a" + +[[packages]] +name = "certifi" +version = "2025.1.31" + +[[packages.wheels]] +name = "certifi-2025.1.31-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + +[[packages]] +name = "cffi" +version = "1.17.1" + +[[packages.wheels]] +name = "cffi-1.17.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a" + +[[packages]] +name = "chardet" +version = "5.2.0" + +[[packages.wheels]] +name = "chardet-5.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/38/6f/f5fbc992a329ee4e0f288c1fe0e2ad9485ed064cac731ed2fe47dcc38cbf/chardet-5.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" + +[[packages]] +name = "charset-normalizer" +version = "3.4.2" + +[[packages.wheels]] +name = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980" + +[[packages]] +name = "clarabel" +version = "0.10.0" + +[[packages.wheels]] +name = "clarabel-0.10.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e6/ba/67a0defb70ed910877049e915e6738fc0432edd5e46b97743ce78a1e5b95/clarabel-0.10.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7871b6f499ad66f71d4e7fb40754c4d986d4316f242beb62ff4f63a69785a50c" + +[[packages]] +name = "click" +version = "8.1.8" + +[[packages.wheels]] +name = "click-8.1.8-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2" + +[[packages]] +name = "click-default-group" +version = "1.2.4" + +[[packages.wheels]] +name = "click_default_group-1.2.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/1a/aff8bb287a4b1400f69e09a53bd65de96aa5cee5691925b38731c67fc695/click_default_group-1.2.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9b60486923720e7fc61731bdb32b617039aba820e22e1c88766b1125592eaa5f" + +[[packages]] +name = "cloudpickle" +version = "3.1.1" + +[[packages.wheels]] +name = "cloudpickle-3.1.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7e/e8/64c37fadfc2816a7701fa8a6ed8d87327c7d54eacfbfb6edab14a2f2be75/cloudpickle-3.1.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e" + +[[packages]] +name = "cohere" +version = "5.15.0" + +[[packages.wheels]] +name = "cohere-5.15.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c7/87/94694db7fe6df979fbc03286eaabdfa98f1c8fa532960e5afdf965e10960/cohere-5.15.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "22ff867c2a6f2fc2b585360c6072f584f11f275ef6d9242bac24e0fa2df1dfb5" + +[[packages]] +name = "colorama" +version = "0.4.6" + +[[packages.wheels]] +name = "colorama-0.4.6-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" + +[[packages]] +name = "colorcet" +version = "3.1.0" + +[[packages.wheels]] +name = "colorcet-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/c6/9963d588cc3d75d766c819e0377a168ef83cf3316a92769971527a1ad1de/colorcet-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2a7d59cc8d0f7938eeedd08aad3152b5319b4ba3bcb7a612398cc17a384cb296" + +[[packages]] +name = "colorlog" +version = "6.9.0" + +[[packages.wheels]] +name = "colorlog-6.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e3/51/9b208e85196941db2f0654ad0357ca6388ab3ed67efdbfc799f35d1f83aa/colorlog-6.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff" + +[[packages]] +name = "comm" +version = "0.2.2" + +[[packages.wheels]] +name = "comm-0.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" + +[[packages]] +name = "contourpy" +version = "1.3.2" + +[[packages.wheels]] +name = "contourpy-1.3.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9" + +[[packages]] +name = "cookiecutter" +version = "2.6.0" + +[[packages.wheels]] +name = "cookiecutter-2.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b6/d9/0137658a353168ffa9d0fc14b812d3834772040858ddd1cb6eeaf09f7a44/cookiecutter-2.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a54a8e37995e4ed963b3e82831072d1ad4b005af736bb17b99c2cbd9d41b6e2d" + +[[packages]] +name = "cryptography" +version = "44.0.0" + +[[packages.wheels]] +name = "cryptography-44.0.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/97/9b/443270b9210f13f6ef240eff73fd32e02d381e7103969dc66ce8e89ee901/cryptography-44.0.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede" + +[[packages]] +name = "cvxopt" +version = "1.3.2" + +[[packages.wheels]] +name = "cvxopt-1.3.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b9/55/90b40b489a235a9f35a532eb77cec81782e466779d9a531ffda6b2f99410/cvxopt-1.3.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "0a0987966009ad383de0918e61255d34ed9ebc783565bcb15470d4155010b6bf" + +[[packages]] +name = "cvxpy" +version = "1.6.4" + +[[packages.wheels]] +name = "cvxpy-1.6.4-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/56/a2/625f99661e43bd3fac3926b64cd6e8ab60d75ddd2451d9c6aba17a908c22/cvxpy-1.6.4-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "1eed0ac8d8c0141abc73535d652f7b133acfbab2149f5d9d6fa348353c90b442" + +[[packages]] +name = "cycler" +version = "0.12.1" + +[[packages.wheels]] +name = "cycler-0.12.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30" + +[[packages]] +name = "cython" +version = "3.1.1" + +[[packages.wheels]] +name = "cython-3.1.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/79/5e/c469f7b42e145a06af79a3f7b599454c028a823c6a83adc867ddfd02f941/cython-3.1.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "e000f0533eedf3d6dfbe30bb3c58a054c58f0a7778390342fa577a0dc47adab3" + +[[packages]] +name = "cytoolz" +version = "1.0.1" + +[[packages.wheels]] +name = "cytoolz-1.0.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/40/eb/dde173cf2357084ca9423950be1f2f11ab11d65d8bd30165bfb8fd4213e9/cytoolz-1.0.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297" + +[[packages]] +name = "dask" +version = "2025.4.1" + +[[packages.wheels]] +name = "dask-2025.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b4/12/f9effea5fe2bebfdd8b0d9c857f798382afacd57dc1cd0e9ce21e66c1bc2/dask-2025.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "aacbb0a9667856fe58385015efd64aca22f0c0b2c5e1b5e633531060303bb4be" + +[[packages]] +name = "datasette" +version = "0.65.1" + +[[packages.wheels]] +name = "datasette-0.65.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/08/f7/fc15b9ddc7a2cafe546f0e2696d71940d7604a128e2f903e98238c3435f7/datasette-0.65.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ba7adf717ddcc24a2a8ac57890fffd384a2ebb909b342e4f731ba09eba764305" + +[[packages]] +name = "datasette-graphql" +version = "2.2" + +[[packages.wheels]] +name = "datasette_graphql-2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f1/12/e8fb59d77c59ec47a2aa53a6d4ac57ad55fce2b48c8397c2866c3f2c66cd/datasette_graphql-2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cd9f61afdcaab1ce4ff6775296e6ece99305bf05cbfae4c1c938a6c9e60cd485" + +[[packages]] +name = "datashader" +version = "0.17.0" + +[[packages.wheels]] +name = "datashader-0.17.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/dc/52/755bbab06c4d10f693abb724e82271ccf8adc98e9305a5c559867ee40c98/datashader-0.17.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "39421ff999294913e63d41954af955a5dece5d0c55d8fce1426043d70b22d07a" + +[[packages]] +name = "deap" +version = "1.4.2" + +[[packages.wheels]] +name = "deap-1.4.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/6e/22/614264336b00b1a01447e31c941fd4576478b5d32184dbb552db27b1c2a1/deap-1.4.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "1abab976c75b0f18c36e81f968fcc77fac69fc9bedbab8be3323ca376f6fcfa4" + +[[packages]] +name = "debugpy" +version = "1.8.13" + +[[packages.wheels]] +name = "debugpy-1.8.13-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/15/63/aa92fb341a78ec40f1c414ec7a7885c2ee17032eee00d12cee0cdc502af4/debugpy-1.8.13-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "79ce4ed40966c4c1631d0131606b055a5a2f8e430e3f7bf8fd3744b09943e8e8" + +[[packages]] +name = "decorator" +version = "5.2.1" + +[[packages.wheels]] +name = "decorator-5.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a" + +[[packages]] +name = "defusedxml" +version = "0.7.1" + +[[packages.wheels]] +name = "defusedxml-0.7.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61" + +[[packages]] +name = "deprecated" +version = "1.2.14" + +[[packages.wheels]] +name = "Deprecated-1.2.14-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/20/8d/778b7d51b981a96554f29136cd59ca7880bf58094338085bcf2a979a0e6a/Deprecated-1.2.14-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c" + +[[packages]] +name = "diff-match-patch" +version = "20241021" + +[[packages.wheels]] +name = "diff_match_patch-20241021-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f7/bb/2aa9b46a01197398b901e458974c20ed107935c26e44e37ad5b0e5511e44/diff_match_patch-20241021-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "93cea333fb8b2bc0d181b0de5e16df50dd344ce64828226bda07728818936782" + +[[packages]] +name = "dill" +version = "0.4.0" + +[[packages.wheels]] +name = "dill-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049" + +[[packages]] +name = "distributed" +version = "2025.4.1" + +[[packages.wheels]] +name = "distributed-2025.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/df/33/b956f0dc74b292ea3d206a45467fde838f005b64123a729898a6390a291a/distributed-2025.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3a7834451b04ef059928045eab6ff6d88ad7bcfd48adc99403127d9a6818b5fa" + +[[packages]] +name = "distro" +version = "1.9.0" + +[[packages.wheels]] +name = "distro-1.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2" + +[[packages]] +name = "django" +version = "5.2" + +[[packages.wheels]] +name = "Django-5.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/63/e0/6a5b5ea350c5bd63fe94b05e4c146c18facb51229d9dee42aa39f9fc2214/Django-5.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "91ceed4e3a6db5aedced65e3c8f963118ea9ba753fc620831c77074e620e7d83" + +[[packages]] +name = "dnspython" +version = "2.7.0" + +[[packages.wheels]] +name = "dnspython-2.7.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/68/1b/e0a87d256e40e8c888847551b20a017a6b98139178505dc7ffb96f04e954/dnspython-2.7.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86" + +[[packages]] +name = "docstring-to-markdown" +version = "0.17" + +[[packages.wheels]] +name = "docstring_to_markdown-0.17-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/56/7b/af3d0da15bed3a8665419bb3a630585756920f4ad67abfdfef26240ebcc0/docstring_to_markdown-0.17-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fd7d5094aa83943bf5f9e1a13701866b7c452eac19765380dead666e36d3711c" + +[[packages]] +name = "docutils" +version = "0.21.2" + +[[packages.wheels]] +name = "docutils-0.21.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2" + +[[packages]] +name = "duckdb" +version = "1.3.0" + +[[packages.wheels]] +name = "duckdb-1.3.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/ab/e9/f83285b0cb3729f24321a038f272490dfb76ca531b7cef832037b7bd077c/duckdb-1.3.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "fbdfc1c0b83b90f780ae74038187ee696bb56ab727a289752372d7ec42dda65b" + +[[packages]] +name = "entrypoints" +version = "0.4" + +[[packages.wheels]] +name = "entrypoints-0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/35/a8/365059bbcd4572cbc41de17fd5b682be5868b218c3c5479071865cab9078/entrypoints-0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f" + +[[packages]] +name = "et-xmlfile" +version = "1.1.0" + +[[packages.wheels]] +name = "et_xmlfile-1.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/96/c2/3dd434b0108730014f1b96fd286040dc3bcb70066346f7e01ec2ac95865f/et_xmlfile-1.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada" + +[[packages]] +name = "eval-type-backport" +version = "0.2.2" + +[[packages.wheels]] +name = "eval_type_backport-0.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ce/31/55cd413eaccd39125368be33c46de24a1f639f2e12349b0361b4678f3915/eval_type_backport-0.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a" + +[[packages]] +name = "executing" +version = "2.2.0" + +[[packages.wheels]] +name = "executing-2.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa" + +[[packages]] +name = "faker" +version = "37.1.0" + +[[packages.wheels]] +name = "faker-37.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d7/a1/8936bc8e79af80ca38288dd93ed44ed1f9d63beb25447a4c59e746e01f8d/faker-37.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c" + +[[packages]] +name = "fasta2a" +version = "0.2.9" + +[[packages.wheels]] +name = "fasta2a-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7a/df/dd967535662ecc9e101a7d6c0c643a055aabc3de47411c31c1dd624356c8/fasta2a-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8b855b36f29fde6dcb79ad55be337a8165381b679bec829913009c55581e284e" + +[[packages]] +name = "fastapi" +version = "0.115.12" + +[[packages.wheels]] +name = "fastapi-0.115.12-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d" + +[[packages]] +name = "fastavro" +version = "1.10.0" + +[[packages.wheels]] +name = "fastavro-1.10.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/1f/2c/43927e22a2d57587b3aa09765098a6d833246b672d34c10c5f135414745a/fastavro-1.10.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "86baf8c9740ab570d0d4d18517da71626fe9be4d1142bea684db52bd5adb078f" + +[[packages]] +name = "fastjsonschema" +version = "2.21.1" + +[[packages.wheels]] +name = "fastjsonschema-2.21.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667" + +[[packages]] +name = "filelock" +version = "3.18.0" + +[[packages.wheels]] +name = "filelock-3.18.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de" + +[[packages]] +name = "flake8" +version = "7.1.1" + +[[packages.wheels]] +name = "flake8-7.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d9/42/65004373ac4617464f35ed15931b30d764f53cdd30cc78d5aea349c8c050/flake8-7.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213" + +[[packages]] +name = "flask" +version = "3.1.0" + +[[packages.wheels]] +name = "flask-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/af/47/93213ee66ef8fae3b93b3e29206f6b251e65c97bd91d8e1c5596ef15af0a/flask-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136" + +[[packages]] +name = "flexcache" +version = "0.3" + +[[packages.wheels]] +name = "flexcache-0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32" + +[[packages]] +name = "flexparser" +version = "0.4" + +[[packages.wheels]] +name = "flexparser-0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846" + +[[packages]] +name = "flit" +version = "3.12.0" + +[[packages.wheels]] +name = "flit-3.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f5/82/ce1d3bb380b227e26e517655d1de7b32a72aad61fa21ff9bd91a2e2db6ee/flit-3.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2b4e7171dc22881fa6adc2dbf083e5ecc72520be3cd7587d2a803da94d6ef431" + +[[packages]] +name = "flit-core" +version = "3.12.0" + +[[packages.wheels]] +name = "flit_core-3.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f2/65/b6ba90634c984a4fcc02c7e3afe523fef500c4980fec67cc27536ee50acf/flit_core-3.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e7a0304069ea895172e3c7bb703292e992c5d1555dd1233ab7b5621b5b69e62c" + +[[packages]] +name = "folium" +version = "0.19.5" + +[[packages.wheels]] +name = "folium-0.19.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/81/4d/bcbee0676dc06f0b014a030cb928e158c96daafb872a01ddee7e60a8c998/folium-0.19.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4333fb3e6f3e9eedb231615d22c6d7df20aea5829554bd6908675865a37803b3" + +[[packages]] +name = "fonttools" +version = "4.57.0" + +[[packages.wheels]] +name = "fonttools-4.57.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/c4/0d/2177b7fdd23d017bcfb702fd41e47d4573766b9114da2fddbac20dcc4957/fonttools-4.57.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "f1d6bc9c23356908db712d282acb3eebd4ae5ec6d8b696aa40342b1d84f8e9e3" + +[[packages]] +name = "fqdn" +version = "1.5.1" + +[[packages.wheels]] +name = "fqdn-1.5.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014" + +[[packages]] +name = "frozenlist" +version = "1.5.0" + +[[packages.wheels]] +name = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28" + +[[packages]] +name = "fsspec" +version = "2025.3.2" + +[[packages.wheels]] +name = "fsspec-2025.3.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/44/4b/e0cfc1a6f17e990f3e64b7d941ddc4acdc7b19d6edd51abf495f32b1a9e4/fsspec-2025.3.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711" + +[[packages]] +name = "fuzzywuzzy" +version = "0.18.0" + +[[packages.wheels]] +name = "fuzzywuzzy-0.18.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/43/ff/74f23998ad2f93b945c0309f825be92e04e0348e062026998b5eefef4c33/fuzzywuzzy-0.18.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993" + +[[packages]] +name = "geographiclib" +version = "2.0" + +[[packages.wheels]] +name = "geographiclib-2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9f/5a/a26132406f1f40cf51ea349a5f11b0a46cec02a2031ff82e391c2537247a/geographiclib-2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734" + +[[packages]] +name = "geopandas" +version = "1.0.1" + +[[packages.wheels]] +name = "geopandas-1.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c4/64/7d344cfcef5efddf9cf32f59af7f855828e9d74b5f862eddf5bfd9f25323/geopandas-1.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "01e147d9420cc374d26f51fc23716ac307f32b49406e4bd8462c07e82ed1d3d6" + +[[packages]] +name = "geopy" +version = "2.4.1" + +[[packages.wheels]] +name = "geopy-2.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e5/15/cf2a69ade4b194aa524ac75112d5caac37414b20a3a03e6865dfe0bd1539/geopy-2.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7" + +[[packages]] +name = "gitdb" +version = "4.0.12" + +[[packages.wheels]] +name = "gitdb-4.0.12-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf" + +[[packages]] +name = "gitpython" +version = "3.1.44" + +[[packages.wheels]] +name = "GitPython-3.1.44-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/1d/9a/4114a9057db2f1462d5c8f8390ab7383925fe1ac012eaa42402ad65c2963/GitPython-3.1.44-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110" + +[[packages]] +name = "google-auth" +version = "2.38.0" + +[[packages.wheels]] +name = "google_auth-2.38.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9d/47/603554949a37bca5b7f894d51896a9c534b9eab808e2520a748e081669d0/google_auth-2.38.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a" + +[[packages]] +name = "google-genai" +version = "1.16.1" + +[[packages.wheels]] +name = "google_genai-1.16.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/bc/31/30caa8d4ae987e47c5250fb6680588733863fd5b39cacb03ba1977c29bde/google_genai-1.16.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6ae5d24282244f577ca4f0d95c09f75ab29e556602c9d3531b70161e34cd2a39" + +[[packages]] +name = "graphene" +version = "3.4.3" + +[[packages.wheels]] +name = "graphene-3.4.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/66/e0/61d8e98007182e6b2aca7cf65904721fb2e4bce0192272ab9cb6f69d8812/graphene-3.4.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "820db6289754c181007a150db1f7fff544b94142b556d12e3ebc777a7bf36c71" + +[[packages]] +name = "graphql-core" +version = "3.2.6" + +[[packages.wheels]] +name = "graphql_core-3.2.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ae/4f/7297663840621022bc73c22d7d9d80dbc78b4db6297f764b545cd5dd462d/graphql_core-3.2.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f" + +[[packages]] +name = "graphql-relay" +version = "3.2.0" + +[[packages.wheels]] +name = "graphql_relay-3.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/74/16/a4cf06adbc711bd364a73ce043b0b08d8fa5aae3df11b6ee4248bcdad2e0/graphql_relay-3.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5" + +[[packages]] +name = "greenlet" +version = "3.1.1" + +[[packages.wheels]] +name = "greenlet-3.1.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/1f/1b/54336d876186920e185066d8c3024ad55f21d7cc3683c856127ddb7b13ce/greenlet-3.1.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761" + +[[packages]] +name = "griffe" +version = "1.7.2" + +[[packages.wheels]] +name = "griffe-1.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b1/5e/38b408f41064c9fcdbb0ea27c1bd13a1c8657c4846e04dab9f5ea770602c/griffe-1.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1ed9c2e338a75741fc82083fe5a1bc89cb6142efe126194cc313e34ee6af5423" + +[[packages]] +name = "groq" +version = "0.25.0" + +[[packages.wheels]] +name = "groq-0.25.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/11/1019a6cfdb2e520cb461cf70d859216be8ca122ddf5ad301fc3b0ee45fd4/groq-0.25.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "aadc78b40b1809cdb196b1aa8c7f7293108767df1508cafa3e0d5045d9328e7a" + +[[packages]] +name = "guidata" +version = "3.9.0" + +[[packages.wheels]] +name = "guidata-3.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5b/03/44afe4b4d634ea77ea7979be78bba4256607f92a6570241925e5b129966d/guidata-3.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "96a19dc92850bdb3e463fa06e8c22793e090db42d1e72c6dae9bda1a98b61210" + +[[packages]] +name = "h11" +version = "0.14.0" + +[[packages.wheels]] +name = "h11-0.14.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" + +[[packages]] +name = "h2" +version = "4.2.0" + +[[packages.wheels]] +name = "h2-4.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d0/9e/984486f2d0a0bd2b024bf4bc1c62688fcafa9e61991f041fb0e2def4a982/h2-4.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "479a53ad425bb29af087f3458a61d30780bc818e4ebcf01f0b536ba916462ed0" + +[[packages]] +name = "h5py" +version = "3.12.1" + +[[packages.wheels]] +name = "h5py-3.12.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/50/51/0bbf3663062b2eeee78aa51da71e065f8a0a6e3cb950cc7020b4444999e6/h5py-3.12.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "52ab036c6c97055b85b2a242cb540ff9590bacfda0c03dd0cf0661b311f522f8" + +[[packages]] +name = "hatchling" +version = "1.27.0" + +[[packages.wheels]] +name = "hatchling-1.27.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/08/e7/ae38d7a6dfba0533684e0b2136817d667588ae3ec984c1a4e5df5eb88482/hatchling-1.27.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d3a2f3567c4f926ea39849cdf924c7e99e6686c9c8e288ae1037c8fa2a5d937b" + +[[packages]] +name = "holoviews" +version = "1.20.2" + +[[packages.wheels]] +name = "holoviews-1.20.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/df/67/066a1d984fa259ad7300084a70789579e104afd75fc58a1d44cda9c365d5/holoviews-1.20.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1f892c04bc23e8a3a9cde082b606b9463c9ff78c3d0c00e2ddcc41fe6e738458" + +[[packages]] +name = "hpack" +version = "4.1.0" + +[[packages.wheels]] +name = "hpack-4.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496" + +[[packages]] +name = "html5lib" +version = "1.1" + +[[packages.wheels]] +name = "html5lib-1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6c/dd/a834df6482147d48e225a49515aabc28974ad5a4ca3215c18a882565b028/html5lib-1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d" + +[[packages]] +name = "httpcore" +version = "1.0.7" + +[[packages.wheels]] +name = "httpcore-1.0.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd" + +[[packages]] +name = "httpie" +version = "3.2.4" + +[[packages.wheels]] +name = "httpie-3.2.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/03/b6/39bcf01e1185882f34bc9fb77d1fb4a27911a55f60ab407de34abc8a2347/httpie-3.2.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4bd0435cc4b9bca59501bc65089de96f3e93b393803f32a81951db62050ebf0b" + +[[packages]] +name = "httpx" +version = "0.28.1" + +[[packages.wheels]] +name = "httpx-0.28.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" + +[[packages]] +name = "httpx-sse" +version = "0.4.0" + +[[packages.wheels]] +name = "httpx_sse-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f" + +[[packages]] +name = "huggingface-hub" +version = "0.33.0" + +[[packages.wheels]] +name = "huggingface_hub-0.33.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/33/fb/53587a89fbc00799e4179796f51b3ad713c5de6bb680b2becb6d37c94649/huggingface_hub-0.33.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e8668875b40c68f9929150d99727d39e5ebb8a05a98e4191b908dc7ded9074b3" + +[[packages]] +name = "hupper" +version = "1.12.1" + +[[packages.wheels]] +name = "hupper-1.12.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/86/7d/3888833e4f5ea56af4a9935066ec09a83228e533d7b8877f65889d706ee4/hupper-1.12.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e872b959f09d90be5fb615bd2e62de89a0b57efc037bdf9637fb09cdf8552b19" + +[[packages]] +name = "hvplot" +version = "0.11.2" + +[[packages.wheels]] +name = "hvplot-0.11.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ed/d9/466e22e60dd6b1eb09680d7155c47b58da17eda51bbaf4aad8392a45fe12/hvplot-0.11.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9d576a0c2df0f1cf5041545f2a2eddcf962510162876991cae4d1779fad74556" + +[[packages]] +name = "hypercorn" +version = "0.17.3" + +[[packages.wheels]] +name = "hypercorn-0.17.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0e/3b/dfa13a8d96aa24e40ea74a975a9906cfdc2ab2f4e3b498862a57052f04eb/hypercorn-0.17.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "059215dec34537f9d40a69258d323f56344805efb462959e727152b0aa504547" + +[[packages]] +name = "hyperframe" +version = "6.1.0" + +[[packages.wheels]] +name = "hyperframe-6.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5" + +[[packages]] +name = "hypothesis" +version = "6.130.4" + +[[packages.wheels]] +name = "hypothesis-6.130.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5c/d4/5a0c46cc8d266626cdc8082f07f836fa4a96e8715002de69be46ed406d1d/hypothesis-6.130.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cda4a57115d10ecbefe0a9cc8d69d20a13eb56ecbfe7c24eaee5d368c2b7c477" + +[[packages]] +name = "id" +version = "1.5.0" + +[[packages.wheels]] +name = "id-1.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9f/cb/18326d2d89ad3b0dd143da971e77afd1e6ca6674f1b1c3df4b6bec6279fc/id-1.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658" + +[[packages]] +name = "idna" +version = "3.10" + +[[packages.wheels]] +name = "idna-3.10-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" + +[[packages]] +name = "imageio" +version = "2.37.0" + +[[packages.wheels]] +name = "imageio-2.37.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/bd/b394387b598ed84d8d0fa90611a90bee0adc2021820ad5729f7ced74a8e2/imageio-2.37.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed" + +[[packages]] +name = "imagesize" +version = "1.4.1" + +[[packages.wheels]] +name = "imagesize-1.4.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b" + +[[packages]] +name = "imbalanced-learn" +version = "0.13.0" + +[[packages.wheels]] +name = "imbalanced_learn-0.13.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9d/41/721fec82606242a2072ee909086ff918dfad7d0199a9dfd4928df9c72494/imbalanced_learn-0.13.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7eb5859f7827cb3babfa5789978c22fe36e56527d9c9768df2d864d98d9b40fe" + +[[packages]] +name = "importlib-metadata" +version = "8.6.1" + +[[packages.wheels]] +name = "importlib_metadata-8.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/79/9d/0fb148dc4d6fa4a7dd1d8378168d9b4cd8d4560a6fbf6f0121c5fc34eb68/importlib_metadata-8.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e" + +[[packages]] +name = "inflection" +version = "0.5.1" + +[[packages.wheels]] +name = "inflection-0.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2" + +[[packages]] +name = "iniconfig" +version = "2.1.0" + +[[packages.wheels]] +name = "iniconfig-2.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" + +[[packages]] +name = "intervaltree" +version = "3.1.0" + +[packages.sdist] +name = "intervaltree-3.1.0.tar.gz" +url = "https://files.pythonhosted.org/packages/50/fb/396d568039d21344639db96d940d40eb62befe704ef849b27949ded5c3bb/intervaltree-3.1.0.tar.gz" + +[packages.sdist.hashes] +sha256 = "902b1b88936918f9b2a19e0e5eb7ccb430ae45cde4f39ea4b36932920d33952d" + +[[packages]] +name = "ipycanvas" +version = "0.13.3" + +[[packages.wheels]] +name = "ipycanvas-0.13.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/fc/e3867e413adbfede3a9c372ec015416ccb0a6493659db5812eeec447a73b/ipycanvas-0.13.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d37adb2f45d2fef1c3d33c69a0518055694d87827b2f577f3c426d7712f75daa" + +[[packages]] +name = "ipykernel" +version = "6.29.5" + +[[packages.wheels]] +name = "ipykernel-6.29.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5" + +[[packages]] +name = "ipyleaflet" +version = "0.19.2" + +[[packages.wheels]] +name = "ipyleaflet-0.19.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/56/6f/00d60e93a316a178ae04457ceea5bcbb4e2d7e7e469882ac59ec4cccfb8c/ipyleaflet-0.19.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7cc9157848baca2e1793b96e79f8bdb1aa7340521d2b7d8a62aa8bc30eab5278" + +[[packages]] +name = "ipympl" +version = "0.9.7" + +[[packages.wheels]] +name = "ipympl-0.9.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/86/6b/21c62f1b2b5e18c6553f7364487dfdf7eb7952b1000a1b7863c1f97819e9/ipympl-0.9.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3698ee7eaa0b047a7603517d7aa1b71b32118a5f51754cab45ec5d994f67208f" + +[[packages]] +name = "ipython" +version = "8.36.0" + +[[packages.wheels]] +name = "ipython-8.36.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d6/d7/c1c9f371790b3a181e343c4815a361e5a0cc7d90ef6642d64ba5d05de289/ipython-8.36.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "12b913914d010dcffa2711505ec8be4bf0180742d97f1e5175e51f22086428c1" + +[[packages]] +name = "ipython-genutils" +version = "0.2.0" + +[[packages.wheels]] +name = "ipython_genutils-0.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fa/bc/9bd3b5c2b4774d5f33b2d544f1460be9df7df2fe42f352135381c347c69a/ipython_genutils-0.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8" + +[[packages]] +name = "ipython-sql" +version = "0.5.0" + +[[packages.wheels]] +name = "ipython_sql-0.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/30/8f/9e50fa53ffc371483f9d1b90c1175b706d28a2e978e90a8894035af01905/ipython_sql-0.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "61b46ecffb956f62dbc17b5744cf70c649104c8db9afd821aa39b31f7cbb5d5b" + +[[packages]] +name = "ipywidgets" +version = "8.1.6" + +[[packages.wheels]] +name = "ipywidgets-8.1.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/53/b8/62952729573d983d9433faacf62a52ee2e8cf46504418061ad1739967abe/ipywidgets-8.1.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "446e7630a1d025bdc7635e1169fcc06f2ce33b5bd41c2003edeb4a47c8d4bbb1" + +[[packages]] +name = "isoduration" +version = "20.11.0" + +[[packages.wheels]] +name = "isoduration-20.11.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042" + +[[packages]] +name = "isort" +version = "5.13.2" + +[[packages.wheels]] +name = "isort-5.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/b3/8def84f539e7d2289a02f0524b944b15d7c75dab7628bedf1c4f0992029c/isort-5.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6" + +[[packages]] +name = "itsdangerous" +version = "2.2.0" + +[[packages.wheels]] +name = "itsdangerous-2.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef" + +[[packages]] +name = "janus" +version = "2.0.0" + +[[packages.wheels]] +name = "janus-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/68/34/65604740edcb20e1bda6a890348ed7d282e7dd23aa00401cbe36fd0edbd9/janus-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7e6449d34eab04cd016befbd7d8c0d8acaaaab67cb59e076a69149f9031745f9" + +[[packages]] +name = "jaraco-classes" +version = "3.4.0" + +[[packages.wheels]] +name = "jaraco.classes-3.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790" + +[[packages]] +name = "jaraco-context" +version = "6.0.1" + +[[packages.wheels]] +name = "jaraco.context-6.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4" + +[[packages]] +name = "jaraco-functools" +version = "4.1.0" + +[[packages.wheels]] +name = "jaraco.functools-4.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9f/4f/24b319316142c44283d7540e76c7b5a6dbd5db623abd86bb7b3491c21018/jaraco.functools-4.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649" + +[[packages]] +name = "jedi" +version = "0.19.2" + +[[packages.wheels]] +name = "jedi-0.19.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9" + +[[packages]] +name = "jellyfish" +version = "1.1.3" + +[[packages.wheels]] +name = "jellyfish-1.1.3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/0c/c2/73b67a1a9444c5804ed4e2e4d55df3e94035efc279fe7426d2dbd2bca5c5/jellyfish-1.1.3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "2113195a48ce8cb99d2bb2c6d9b119f58025dde1d727101518e7150c093a66da" + +[[packages]] +name = "jinja2" +version = "3.1.6" + +[[packages.wheels]] +name = "jinja2-3.1.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" + +[[packages]] +name = "jiter" +version = "0.9.0" + +[[packages.wheels]] +name = "jiter-0.9.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7" + +[[packages]] +name = "joblib" +version = "1.4.2" + +[[packages.wheels]] +name = "joblib-1.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6" + +[[packages]] +name = "json5" +version = "0.10.0" + +[[packages.wheels]] +name = "json5-0.10.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/aa/42/797895b952b682c3dafe23b1834507ee7f02f4d6299b65aaa61425763278/json5-0.10.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa" + +[[packages]] +name = "jsonpatch" +version = "1.33" + +[[packages.wheels]] +name = "jsonpatch-1.33-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade" + +[[packages]] +name = "jsonpointer" +version = "3.0.0" + +[[packages.wheels]] +name = "jsonpointer-3.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942" + +[[packages]] +name = "jsonschema" +version = "4.23.0" + +[[packages.wheels]] +name = "jsonschema-4.23.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566" + +[[packages]] +name = "jsonschema-specifications" +version = "2024.10.1" + +[[packages.wheels]] +name = "jsonschema_specifications-2024.10.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf" + +[[packages]] +name = "julia" +version = "0.6.2" + +[[packages.wheels]] +name = "julia-0.6.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/af/2e9a1a996f32b34249582392bb419cf8983b627a1d31412acbe9d6dea5b0/julia-0.6.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "90752f71376fdb9919439d20496c2dab24486dfa4fe8a831d6dd14a1bcbc04d1" + +[[packages]] +name = "jupyter" +version = "1.1.1" + +[[packages.wheels]] +name = "jupyter-1.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83" + +[[packages]] +name = "jupyter-bokeh" +version = "4.0.5" + +[[packages.wheels]] +name = "jupyter_bokeh-4.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/47/78/33b2294aad62e5f95b89a89379c5995c2bd978018387ef8bec79f6dc272c/jupyter_bokeh-4.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1110076c14c779071cf492646a1a871aefa8a477261e4721327a666e65df1a2c" + +[[packages]] +name = "jupyter-client" +version = "8.6.3" + +[[packages.wheels]] +name = "jupyter_client-8.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f" + +[[packages]] +name = "jupyter-console" +version = "6.6.3" + +[[packages.wheels]] +name = "jupyter_console-6.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485" + +[[packages]] +name = "jupyter-core" +version = "5.7.2" + +[[packages.wheels]] +name = "jupyter_core-5.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409" + +[[packages]] +name = "jupyter-events" +version = "0.12.0" + +[[packages.wheels]] +name = "jupyter_events-0.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb" + +[[packages]] +name = "jupyter-leaflet" +version = "0.19.2" + +[[packages.wheels]] +name = "jupyter_leaflet-0.19.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/81/7c/3ade59500a358b9018a996d00c26eaede79f76ed362b7051bc5038d4a0d4/jupyter_leaflet-0.19.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d57e15e80c08a4360f0cde0b4c490beddc5d422bb0e9bc1c0b4479d3fb725a6" + +[[packages]] +name = "jupyter-lsp" +version = "2.2.5" + +[[packages.wheels]] +name = "jupyter_lsp-2.2.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/e0/7bd7cff65594fd9936e2f9385701e44574fc7d721331ff676ce440b14100/jupyter_lsp-2.2.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da" + +[[packages]] +name = "jupyter-server" +version = "2.15.0" + +[[packages.wheels]] +name = "jupyter_server-2.15.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3" + +[[packages]] +name = "jupyter-server-terminals" +version = "0.5.3" + +[[packages.wheels]] +name = "jupyter_server_terminals-0.5.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa" + +[[packages]] +name = "jupyterlab" +version = "4.4.2" + +[[packages.wheels]] +name = "jupyterlab-4.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f6/ae/fbb93f4990b7648849b19112d8b3e7427bbfc9c5cc8fdc6bf14c0e86d104/jupyterlab-4.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "857111a50bed68542bf55dca784522fe728f9f88b4fe69e8c585db5c50900419" + +[[packages]] +name = "jupyterlab-pygments" +version = "0.3.0" + +[[packages.wheels]] +name = "jupyterlab_pygments-0.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780" + +[[packages]] +name = "jupyterlab-server" +version = "2.27.3" + +[[packages.wheels]] +name = "jupyterlab_server-2.27.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4" + +[[packages]] +name = "jupyterlab-widgets" +version = "3.0.14" + +[[packages.wheels]] +name = "jupyterlab_widgets-3.0.14-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/64/7a/f2479ba401e02f7fcbd3fc6af201eac888eaa188574b8e9df19452ab4972/jupyterlab_widgets-3.0.14-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "54c33e3306b7fca139d165d6190dc6c0627aafa5d14adfc974a4e9a3d26cb703" + +[[packages]] +name = "keras" +version = "3.10.0" + +[[packages.wheels]] +name = "keras-3.10.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/95/e6/4179c461a5fc43e3736880f64dbdc9b1a5349649f0ae32ded927c0e3a227/keras-3.10.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c095a6bf90cd50defadf73d4859ff794fad76b775357ef7bd1dbf96388dae7d3" + +[[packages]] +name = "keyring" +version = "25.6.0" + +[[packages.wheels]] +name = "keyring-25.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d3/32/da7f44bcb1105d3e88a0b74ebdca50c59121d2ddf71c9e34ba47df7f3a56/keyring-25.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd" + +[[packages]] +name = "kiwisolver" +version = "1.4.8" + +[[packages.wheels]] +name = "kiwisolver-1.4.8-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2" + +[[packages]] +name = "langchain" +version = "0.3.25" + +[[packages.wheels]] +name = "langchain-0.3.25-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ed/5c/5c0be747261e1f8129b875fa3bfea736bc5fe17652f9d5e15ca118571b6f/langchain-0.3.25-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "931f7d2d1eaf182f9f41c5e3272859cfe7f94fc1f7cef6b3e5a46024b4884c21" + +[[packages]] +name = "langchain-core" +version = "0.3.59" + +[[packages.wheels]] +name = "langchain_core-0.3.59-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/30/40/aa440a7cd05f1dab5d7c91a1284eb776c3cf3eb59fa18ed39927650cfa38/langchain_core-0.3.59-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9686baaff43f2c8175535da13faf40e6866769015e93130c3c1e4243e7244d70" + +[[packages]] +name = "langchain-text-splitters" +version = "0.3.8" + +[[packages.wheels]] +name = "langchain_text_splitters-0.3.8-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8b/a3/3696ff2444658053c01b6b7443e761f28bb71217d82bb89137a978c5f66f/langchain_text_splitters-0.3.8-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e75cc0f4ae58dcf07d9f18776400cf8ade27fadd4ff6d264df6278bb302f6f02" + +[[packages]] +name = "langsmith" +version = "0.3.42" + +[[packages.wheels]] +name = "langsmith-0.3.42-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/89/8e/e8a58e0abaae3f3ac4702e9ca35d1fc6159711556b64ffd0e247771a3f12/langsmith-0.3.42-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "18114327f3364385dae4026ebfd57d1c1cb46d8f80931098f0f10abe533475ff" + +[[packages]] +name = "lazy-loader" +version = "0.4" + +[[packages.wheels]] +name = "lazy_loader-0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/83/60/d497a310bde3f01cb805196ac61b7ad6dc5dcf8dce66634dc34364b20b4f/lazy_loader-0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc" + +[[packages]] +name = "linkify-it-py" +version = "2.0.3" + +[[packages.wheels]] +name = "linkify_it_py-2.0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/04/1e/b832de447dee8b582cac175871d2f6c3d5077cc56d5575cadba1fd1cccfa/linkify_it_py-2.0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79" + +[[packages]] +name = "llvmlite" +version = "0.44.0" + +[[packages.wheels]] +name = "llvmlite-0.44.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/d0/81/e66fc86539293282fd9cb7c9417438e897f369e79ffb62e1ae5e5154d4dd/llvmlite-0.44.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "2fb7c4f2fb86cbae6dca3db9ab203eeea0e22d73b99bc2341cdf9de93612e930" + +[[packages]] +name = "lmfit" +version = "1.3.3" + +[[packages.wheels]] +name = "lmfit-1.3.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6a/e1/d5aeb89530550c7e797d3528225fa31012490e79c9df5cf72a0f07cc66d3/lmfit-1.3.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a9e9ec7d0d0ec962cc6c078ad1ec6c8311d3ac0e5f0947a00a91f5509dacc2b2" + +[[packages]] +name = "locket" +version = "1.0.0" + +[[packages.wheels]] +name = "locket-1.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3" + +[[packages]] +name = "logfire-api" +version = "3.12.0" + +[[packages.wheels]] +name = "logfire_api-3.12.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/97/c6/210bb1da7119af155276046c18ceff29867dfe9ea4bcb7d03397b28bd1cd/logfire_api-3.12.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fc092c2dcb24c8462ba776f3b0c2183f82e1cd55f86e29b38cf21a048e66a17d" + +[[packages]] +name = "lxml" +version = "5.3.0" + +[[packages.wheels]] +name = "lxml-5.3.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/7d/db/214290d58ad68c587bd5d6af3d34e56830438733d0d0856c0275fde43652/lxml-5.3.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d" + +[[packages]] +name = "mako" +version = "1.3.9" + +[[packages.wheels]] +name = "Mako-1.3.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cd/83/de0a49e7de540513f53ab5d2e105321dedeb08a8f5850f0208decf4390ec/Mako-1.3.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "95920acccb578427a9aa38e37a186b1e43156c87260d7ba18ca63aa4c7cbd3a1" + +[[packages]] +name = "markdown" +version = "3.7" + +[[packages.wheels]] +name = "Markdown-3.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3f/08/83871f3c50fc983b88547c196d11cf8c3340e37c32d2e9d6152abe2c61f7/Markdown-3.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803" + +[[packages]] +name = "markdown-it-py" +version = "3.0.0" + +[[packages.wheels]] +name = "markdown_it_py-3.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1" + +[[packages]] +name = "markupsafe" +version = "3.0.2" + +[[packages.wheels]] +name = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f" + +[[packages]] +name = "matplotlib" +version = "3.10.3" + +[[packages.wheels]] +name = "matplotlib-3.10.3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b1/0f/eed564407bd4d935ffabf561ed31099ed609e19287409a27b6d336848653/matplotlib-3.10.3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "151d89cb8d33cb23345cd12490c76fd5d18a56581a16d950b48c6ff19bb2ab93" + +[[packages]] +name = "matplotlib-inline" +version = "0.1.7" + +[[packages.wheels]] +name = "matplotlib_inline-0.1.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" + +[[packages]] +name = "maturin" +version = "1.8.3" + +[[packages.wheels]] +name = "maturin-1.8.3-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/d5/62/f92a130a370dd7aca13c316844b82853647f048cfe1594a81f628ab7101f/maturin-1.8.3-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "85f2b882d8235c1c1cb0a38d382ccd5b3ba0674d99cb548d49df9342cc688e36" + +[[packages]] +name = "mccabe" +version = "0.7.0" + +[[packages.wheels]] +name = "mccabe-0.7.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + +[[packages]] +name = "mcp" +version = "1.9.3" + +[[packages.wheels]] +name = "mcp-1.9.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/79/45/823ad05504bea55cb0feb7470387f151252127ad5c72f8882e8fe6cf5c0e/mcp-1.9.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "69b0136d1ac9927402ed4cf221d4b8ff875e7132b0b06edd446448766f34f9b9" + +[[packages]] +name = "mdit-py-plugins" +version = "0.4.2" + +[[packages.wheels]] +name = "mdit_py_plugins-0.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636" + +[[packages]] +name = "mdurl" +version = "0.1.2" + +[[packages.wheels]] +name = "mdurl-0.1.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8" + +[[packages]] +name = "mercantile" +version = "1.2.1" + +[[packages.wheels]] +name = "mercantile-1.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b2/d6/de0cc74f8d36976aeca0dd2e9cbf711882ff8e177495115fd82459afdc4d/mercantile-1.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "30f457a73ee88261aab787b7069d85961a5703bb09dc57a170190bc042cd023f" + +[[packages]] +name = "mergedeep" +version = "1.3.4" + +[[packages.wheels]] +name = "mergedeep-1.3.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307" + +[[packages]] +name = "missingno" +version = "0.5.2" + +[[packages.wheels]] +name = "missingno-0.5.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/87/22/cd5cf999af21c2f97486622c551ac3d07361ced8125121e907f588ff5f24/missingno-0.5.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "55782621ce09ba0f0a1d08e5bd6d6fe1946469fb03951fadf7d209911ca5b072" + +[[packages]] +name = "mistralai" +version = "1.8.1" + +[[packages.wheels]] +name = "mistralai-1.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b0/14/e9ef675928768f508dfcedbb0e0ed601784a6911620a2bc25c9065921420/mistralai-1.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "badfc7e6832d894b3e9071d92ad621212b7cccd7df622c6cacdb525162ae338f" + +[[packages]] +name = "mistune" +version = "3.1.3" + +[[packages.wheels]] +name = "mistune-3.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/01/4d/23c4e4f09da849e127e9f123241946c23c1e30f45a88366879e064211815/mistune-3.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9" + +[[packages]] +name = "mizani" +version = "0.11.4" + +[[packages.wheels]] +name = "mizani-0.11.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/11/f3777ad46c5d92e3ead121c22ea45fafb6c3b2c1edca0c0c6494969c125c/mizani-0.11.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5b6271dc3da2c88694dca2e0e0a7e1879f0e2fb046c789776f54d090a5243735" + +[[packages]] +name = "ml-dtypes" +version = "0.5.1" + +[[packages.wheels]] +name = "ml_dtypes-0.5.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/da/8a/a2b9375c94077e5a488a624a195621407846f504068ce22ccf805c674156/ml_dtypes-0.5.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "fd918d4e6a4e0c110e2e05be7a7814d10dc1b95872accbf6512b80a109b71ae1" + +[[packages]] +name = "mlxtend" +version = "0.23.3" + +[[packages.wheels]] +name = "mlxtend-0.23.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/92/5c322336a0991949a1e91f6acd7e04f7e05b0fb6252a3f00fcdc0cb5e97d/mlxtend-0.23.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f9fec721c4121be87dac00e513456dde5bf56b7427750719c0a291cd58b6538e" + +[[packages]] +name = "more-itertools" +version = "10.6.0" + +[[packages.wheels]] +name = "more_itertools-10.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/23/62/0fe302c6d1be1c777cab0616e6302478251dfbf9055ad426f5d0def75c89/more_itertools-10.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89" + +[[packages]] +name = "mpld3" +version = "0.5.10" + +[[packages.wheels]] +name = "mpld3-0.5.10-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/95/6a/e3691bcc47485f38b09853207c928130571821d187cf174eed5418d45e82/mpld3-0.5.10-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "80877acce87ea447380fad7374668737505c8c0684aab05238e7c5dc1fab38c1" + +[[packages]] +name = "mpmath" +version = "1.3.0" + +[[packages.wheels]] +name = "mpmath-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c" + +[[packages]] +name = "msal" +version = "1.30.0" + +[[packages.wheels]] +name = "msal-1.30.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ab/82/8f19334da43b7ef72d995587991a446f140346d76edb96a2c1a2689588e9/msal-1.30.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "423872177410cb61683566dc3932db7a76f661a5d2f6f52f02a047f101e1c1de" + +[[packages]] +name = "msal-extensions" +version = "1.2.0" + +[[packages.wheels]] +name = "msal_extensions-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/69/314d887a01599669fb330da14e5c6ff5f138609e322812a942a74ef9b765/msal_extensions-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cf5ba83a2113fa6dc011a254a72f1c223c88d7dfad74cc30617c4679a417704d" + +[[packages]] +name = "msgpack" +version = "1.1.0" + +[[packages.wheels]] +name = "msgpack-1.1.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b6/bc/8bd826dd03e022153bfa1766dcdec4976d6c818865ed54223d71f07862b3/msgpack-1.1.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f" + +[[packages]] +name = "multidict" +version = "6.4.3" + +[[packages.wheels]] +name = "multidict-6.4.3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5" + +[[packages]] +name = "multipledispatch" +version = "1.0.0" + +[[packages.wheels]] +name = "multipledispatch-1.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/51/c0/00c9809d8b9346eb238a6bbd5f83e846a4ce4503da94a4c08cb7284c325b/multipledispatch-1.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0c53cd8b077546da4e48869f49b13164bebafd0c2a5afceb6bb6a316e7fb46e4" + +[[packages]] +name = "mypy" +version = "1.15.0" + +[[packages.wheels]] +name = "mypy-1.15.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf" + +[[packages]] +name = "mypy-extensions" +version = "1.0.0" + +[[packages.wheels]] +name = "mypy_extensions-1.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d" + +[[packages]] +name = "mysql-connector-python" +version = "9.2.0" + +[[packages.wheels]] +name = "mysql_connector_python-9.2.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/22/4b/4f5462a81d046bb54bbb62ffbcea654e78f3ae2a64eb24a14c2872c4d75e/mysql_connector_python-9.2.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "6557942f6c6be3b41d2965456b53a244a7ce3e6fb81cb195c243549be72a6a24" + +[[packages]] +name = "namex" +version = "0.0.8" + +[[packages.wheels]] +name = "namex-0.0.8-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/73/59/7854fbfb59f8ae35483ce93493708be5942ebb6328cd85b3a609df629736/namex-0.0.8-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7ddb6c2bb0e753a311b7590f84f6da659dd0c05e65cb89d519d54c0a250c0487" + +[[packages]] +name = "narwhals" +version = "1.36.0" + +[[packages.wheels]] +name = "narwhals-1.36.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/42/bf/fbcbd9f8676e06ed43d644a4ddbf31478a44056487578ce67f191da430cb/narwhals-1.36.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e3c50dd1d769bc145f57ae17c1f0f0da6c3d397d62cdd0bb167e9b618e95c9d6" + +[[packages]] +name = "nbclient" +version = "0.10.2" + +[[packages.wheels]] +name = "nbclient-0.10.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d" + +[[packages]] +name = "nbconvert" +version = "7.16.6" + +[[packages.wheels]] +name = "nbconvert-7.16.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b" + +[[packages]] +name = "nbformat" +version = "5.10.4" + +[[packages.wheels]] +name = "nbformat-5.10.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b" + +[[packages]] +name = "nest-asyncio" +version = "1.6.0" + +[[packages.wheels]] +name = "nest_asyncio-1.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" + +[[packages]] +name = "networkx" +version = "3.4.2" + +[[packages.wheels]] +name = "networkx-3.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f" + +[[packages]] +name = "nh3" +version = "0.2.18" + +[[packages.wheels]] +name = "nh3-0.2.18-cp37-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/26/8d/53c5b19c4999bdc6ba95f246f4ef35ca83d7d7423e5e38be43ad66544e5d/nh3-0.2.18-cp37-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844" + +[[packages]] +name = "nltk" +version = "3.9.1" + +[[packages.wheels]] +name = "nltk-3.9.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/66/7d9e26593edda06e8cb531874633f7c2372279c3b0f46235539fe546df8b/nltk-3.9.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1" + +[[packages]] +name = "notebook" +version = "7.4.2" + +[[packages.wheels]] +name = "notebook-7.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/1e/16/d3c36a0b1f6dfcf218add8eaf803bf0473ff50681ac4d51acb7ba02bce34/notebook-7.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9ccef602721aaa5530852e3064710b8ae5415c4e2ce26f8896d0433222755259" + +[[packages]] +name = "notebook-shim" +version = "0.2.4" + +[[packages.wheels]] +name = "notebook_shim-0.2.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef" + +[[packages]] +name = "numba" +version = "0.61.2" + +[[packages.wheels]] +name = "numba-0.61.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/af/a4/6d3a0f2d3989e62a18749e1e9913d5fa4910bbb3e3311a035baea6caf26d/numba-0.61.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7" + +[[packages]] +name = "numpy" +version = "2.2.6" + +[[packages.wheels]] +name = "numpy-2.2.6-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c" + +[[packages]] +name = "numpydoc" +version = "1.8.0" + +[[packages.wheels]] +name = "numpydoc-1.8.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6c/45/56d99ba9366476cd8548527667f01869279cedb9e66b28eb4dfb27701679/numpydoc-1.8.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541" + +[[packages]] +name = "openai" +version = "1.82.0" + +[[packages.wheels]] +name = "openai-1.82.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/51/4b/a59464ee5f77822a81ee069b4021163a0174940a92685efc3cf8b4c443a3/openai-1.82.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8c40647fea1816516cb3de5189775b30b5f4812777e40b8768f361f232b61b30" + +[[packages]] +name = "opencv-python" +version = "4.11.0.86" + +[[packages.wheels]] +name = "opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a4/7d/f1c30a92854540bf789e9cd5dde7ef49bbe63f855b85a2e6b3db8135c591/opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec" + +[[packages]] +name = "openpyxl" +version = "3.1.5" + +[[packages.wheels]] +name = "openpyxl-3.1.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2" + +[[packages]] +name = "opentelemetry-api" +version = "1.32.1" + +[[packages.wheels]] +name = "opentelemetry_api-1.32.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/12/f2/89ea3361a305466bc6460a532188830351220b5f0851a5fa133155c16eca/opentelemetry_api-1.32.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "bbd19f14ab9f15f0e85e43e6a958aa4cb1f36870ee62b7fd205783a112012724" + +[[packages]] +name = "optree" +version = "0.14.1" + +[[packages.wheels]] +name = "optree-0.14.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/90/43/93aa65f56b857b8364e76d76eb188a4a6912ed305374b90f9ba30dcf0de9/optree-0.14.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "25ea23fc6d6c0fa7dcf85afcfe10b43ed4fdf0e9d958a3677cd27fcdf0ca17d6" + +[[packages]] +name = "optuna" +version = "4.2.1" + +[[packages.wheels]] +name = "optuna-4.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/28/09/c4d329f7969443cdd4d482048ca406b6f61cda3c8e99ace71feaec7c8734/optuna-4.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6d38199013441d3f70fac27136e05c0188c5f4ec3848db708ac311cbdeb30dbf" + +[[packages]] +name = "orjson" +version = "3.10.16" + +[[packages.wheels]] +name = "orjson-3.10.16-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/81/9c/b66ce9245ff319df2c3278acd351a3f6145ef34b4a2d7f4b0f739368370f/orjson-3.10.16-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "fe0a145e96d51971407cb8ba947e63ead2aa915db59d6631a355f5f2150b56b7" + +[[packages]] +name = "osqp" +version = "0.6.7.post3" + +[[packages.wheels]] +name = "osqp-0.6.7.post3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/4b/0a/acd48ad432ccf2538972805095108801a3b29a2433b48bd3a34e640df1e4/osqp-0.6.7.post3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "acb219e941f5248da5de3ee9b70e6a5aaddf5f3989dffd1d4c03b0f7b1dfa17b" + +[[packages]] +name = "outcome" +version = "1.3.0.post0" + +[[packages.wheels]] +name = "outcome-1.3.0.post0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b" + +[[packages]] +name = "overrides" +version = "7.7.0" + +[[packages.wheels]] +name = "overrides-7.7.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49" + +[[packages]] +name = "packaging" +version = "24.2" + +[[packages.wheels]] +name = "packaging-24.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759" + +[[packages]] +name = "pandas" +version = "2.2.3" + +[[packages.wheels]] +name = "pandas-2.2.3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d" + +[[packages]] +name = "pandocfilters" +version = "1.5.1" + +[[packages.wheels]] +name = "pandocfilters-1.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc" + +[[packages]] +name = "panel" +version = "1.6.3" + +[[packages.wheels]] +name = "panel-1.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7a/fe/d01b6eae59933d56c345e57cdde5ffe379b7b1f56d192782ab8071249f73/panel-1.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ccd2a0587ab382bd55b8ea099706f31b64aadac697b8a41923d3b18b9ed618d6" + +[[packages]] +name = "papermill" +version = "2.6.0" + +[[packages.wheels]] +name = "papermill-2.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/55/83ce641bc61a70cc0721af6f50154ecaaccedfbdbc27366c1755a2a34972/papermill-2.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0f09da6ef709f3f14dde77cb1af052d05b14019189869affff374c9e612f2dd5" + +[[packages]] +name = "param" +version = "2.2.0" + +[[packages.wheels]] +name = "param-2.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/99/56/370a6636e072a037b52499edd8928942df7f887974fc54444ece5152d26a/param-2.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "777f8c7b66ab820b70ea5ad09faaa6818308220caae89da3b5c5f359faa72a5e" + +[[packages]] +name = "parso" +version = "0.8.4" + +[[packages.wheels]] +name = "parso-0.8.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18" + +[[packages]] +name = "partd" +version = "1.4.2" + +[[packages.wheels]] +name = "partd-1.4.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f" + +[[packages]] +name = "pathspec" +version = "0.12.1" + +[[packages.wheels]] +name = "pathspec-0.12.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08" + +[[packages]] +name = "patsy" +version = "1.0.1" + +[[packages.wheels]] +name = "patsy-1.0.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/87/2b/b50d3d08ea0fc419c183a84210571eba005328efa62b6b98bc28e9ead32a/patsy-1.0.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c" + +[[packages]] +name = "pep8" +version = "1.7.1" + +[[packages.wheels]] +name = "pep8-1.7.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/42/3f/669429ce58de2c22d8d2c542752e137ec4b9885fff398d3eceb1a7f5acb4/pep8-1.7.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b22cfae5db09833bb9bd7c8463b53e1a9c9b39f12e304a8d0bba729c501827ee" + +[[packages]] +name = "pexpect" +version = "4.9.0" + +[[packages.wheels]] +name = "pexpect-4.9.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523" + +[[packages]] +name = "pg8000" +version = "1.31.2" + +[[packages.wheels]] +name = "pg8000-1.31.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/09/a0/2b30d52017c4ced8fc107386666ea7573954eb708bf66121f0229df05d41/pg8000-1.31.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "436c771ede71af4d4c22ba867a30add0bc5c942d7ab27fadbb6934a487ecc8f6" + +[[packages]] +name = "pickleshare" +version = "0.7.5" + +[[packages.wheels]] +name = "pickleshare-0.7.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9a/41/220f49aaea88bc6fa6cba8d05ecf24676326156c23b991e80b3f2fc24c77/pickleshare-0.7.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" + +[[packages]] +name = "pillow" +version = "11.1.0" + +[[packages.wheels]] +name = "pillow-11.1.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/3b/ad/285c556747d34c399f332ba7c1a595ba245796ef3e22eae190f5364bb62b/pillow-11.1.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c" + +[[packages]] +name = "platformdirs" +version = "4.3.7" + +[[packages.wheels]] +name = "platformdirs-4.3.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94" + +[[packages]] +name = "plotly" +version = "6.0.1" + +[[packages.wheels]] +name = "plotly-6.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/02/65/ad2bc85f7377f5cfba5d4466d5474423a3fb7f6a97fd807c06f92dd3e721/plotly-6.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4714db20fea57a435692c548a4eb4fae454f7daddf15f8d8ba7e1045681d7768" + +[[packages]] +name = "plotnine" +version = "0.13.6" + +[[packages.wheels]] +name = "plotnine-0.13.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/93/b1/e1c84e68cf24e83c4d251122e04c48840be203dafb4727e738381cdefa74/plotnine-0.13.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4acc1af29fa4e91e726b67d49277e8368f62e1c817f01bf14ecd8ca5e83bfaea" + +[[packages]] +name = "plotpy" +version = "2.7.4" + +[[packages.wheels]] +name = "plotpy-2.7.4-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/61/98/9bc8f5a00dd45b53c37292c08ebcf9f94e895838ab2ad295d1c0eec88332/plotpy-2.7.4-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8dff5fd388048a8d3b4251329a9fe4027920386e0ebcc3c3642f59c432118c29" + +[[packages]] +name = "pluggy" +version = "1.5.0" + +[[packages.wheels]] +name = "pluggy-1.5.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" + +[[packages]] +name = "ply" +version = "3.11" + +[[packages.wheels]] +name = "ply-3.11-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a3/58/35da89ee790598a0700ea49b2a66594140f44dec458c07e8e3d4979137fc/ply-3.11-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce" + +[[packages]] +name = "polars" +version = "1.31.0" + +[[packages.wheels]] +name = "polars-1.31.0-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/6e/f6/9d9ad9dc4480d66502497e90ce29efc063373e1598f4bd9b6a38af3e08e7/polars-1.31.0-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "3fd874d3432fc932863e8cceff2cff8a12a51976b053f2eb6326a0672134a632" + +[[packages]] +name = "portalocker" +version = "2.7.0" + +[[packages.wheels]] +name = "portalocker-2.7.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8c/df/d4f711d168524f5aebd7fb30969eaa31e3048cf8979688cde3b08f6e5eb8/portalocker-2.7.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a07c5b4f3985c3cf4798369631fb7011adb498e2a46d8440efc75a8f29a0f983" + +[[packages]] +name = "prettytable" +version = "3.16.0" + +[[packages.wheels]] +name = "prettytable-3.16.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/02/c7/5613524e606ea1688b3bdbf48aa64bafb6d0a4ac3750274c43b6158a390f/prettytable-3.16.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b5eccfabb82222f5aa46b798ff02a8452cf530a352c31bddfa29be41242863aa" + +[[packages]] +name = "prince" +version = "0.16.0" + +[[packages.wheels]] +name = "prince-0.16.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/18/d5/b4480a0f381cbbcfad31f4d118732ab717216857508a730938ee615669a1/prince-0.16.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7e21a78d4dd06ca3ec526ee714a50b349f26de3fca6b79664150a951b31688f3" + +[[packages]] +name = "priority" +version = "2.0.0" + +[[packages.wheels]] +name = "priority-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5e/5f/82c8074f7e84978129347c2c6ec8b6c59f3584ff1a20bc3c940a3e061790/priority-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa" + +[[packages]] +name = "prometheus-client" +version = "0.21.1" + +[[packages.wheels]] +name = "prometheus_client-0.21.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301" + +[[packages]] +name = "prompt-toolkit" +version = "3.0.51" + +[[packages.wheels]] +name = "prompt_toolkit-3.0.51-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07" + +[[packages]] +name = "propcache" +version = "0.3.1" + +[[packages.wheels]] +name = "propcache-0.3.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037" + +[[packages]] +name = "protobuf" +version = "6.30.2" + +[[packages.wheels]] +name = "protobuf-6.30.2-cp310-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/97/e9/7b9f1b259d509aef2b833c29a1f3c39185e2bf21c9c1be1cd11c22cb2149/protobuf-6.30.2-cp310-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7653c99774f73fe6b9301b87da52af0e69783a2e371e8b599b3e9cb4da4b12b9" + +[[packages]] +name = "psutil" +version = "7.0.0" + +[[packages.wheels]] +name = "psutil-7.0.0-cp37-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553" + +[[packages]] +name = "psygnal" +version = "0.12.0" + +[[packages.wheels]] +name = "psygnal-0.12.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/5e/ae/a3d6815db583b6d05878b3647ea0e2aa21ce6941d03c9d2c6caad1afbcf6/psygnal-0.12.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "d779f20c6977ec9d5b9fece23b4b28bbcf0a7773539a4a176b5527aea5da27c7" + +[[packages]] +name = "ptpython" +version = "3.0.29" + +[[packages.wheels]] +name = "ptpython-3.0.29-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/39/c6fd4dd531e067b6a01624126cff0b3ddc6569e22f83e48d8418ffa9e3be/ptpython-3.0.29-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "65d75c4871859e4305a020c9b9e204366dceb4d08e0e2bd7b7511bd5e917a402" + +[[packages]] +name = "ptyprocess" +version = "0.7.0" + +[[packages.wheels]] +name = "ptyprocess-0.7.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35" + +[[packages]] +name = "pure-eval" +version = "0.2.3" + +[[packages.wheels]] +name = "pure_eval-0.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0" + +[[packages]] +name = "pyarrow" +version = "20.0.0" + +[[packages.wheels]] +name = "pyarrow-20.0.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/9d/07/290f4abf9ca702c5df7b47739c1b2c83588641ddfa2cc75e34a301d42e55/pyarrow-20.0.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031" + +[[packages]] +name = "pyasn1" +version = "0.6.1" + +[[packages.wheels]] +name = "pyasn1-0.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629" + +[[packages]] +name = "pyasn1-modules" +version = "0.4.1" + +[[packages.wheels]] +name = "pyasn1_modules-0.4.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/77/89/bc88a6711935ba795a679ea6ebee07e128050d6382eaa35a0a47c8032bdc/pyasn1_modules-0.4.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd" + +[[packages]] +name = "pybind11" +version = "2.13.6" + +[[packages.wheels]] +name = "pybind11-2.13.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/13/2f/0f24b288e2ce56f51c920137620b4434a38fd80583dbbe24fc2a1656c388/pybind11-2.13.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "237c41e29157b962835d356b370ededd57594a26d5894a795960f0047cb5caf5" + +[[packages]] +name = "pycodestyle" +version = "2.12.0" + +[[packages.wheels]] +name = "pycodestyle-2.12.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/55/c4/bf8ede2d1641e0a2e027c6d0c7060e00332851ea772cc5cee42a4a207707/pycodestyle-2.12.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4" + +[[packages]] +name = "pycparser" +version = "2.22" + +[[packages.wheels]] +name = "pycparser-2.22-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" + +[[packages]] +name = "pyct" +version = "0.5.0" + +[[packages.wheels]] +name = "pyct-0.5.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/75/e7/c7c1e9e1b6b23ca1db7af3c6826d57d8da883021f751edcc9c82143b127a/pyct-0.5.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a4038a8885059ab8cac6f946ea30e0b5e6bdbe0b92b6723f06737035f9d65e8c" + +[[packages]] +name = "pydantic" +version = "2.10.6" + +[[packages.wheels]] +name = "pydantic-2.10.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584" + +[[packages]] +name = "pydantic-ai-slim" +version = "0.2.9" + +[[packages.wheels]] +name = "pydantic_ai_slim-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d8/23/b4d52d83c302859e1e251a8c8a360b993cf8b4818c8b633adaa98b043556/pydantic_ai_slim-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d954ff84cb250d7150a7ed694e4f1f92f820205d036ee006d02fce3e62a3bc4e" + +[[packages]] +name = "pydantic-core" +version = "2.27.2" + +[[packages.wheels]] +name = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee" + +[[packages]] +name = "pydantic-evals" +version = "0.2.9" + +[[packages.wheels]] +name = "pydantic_evals-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b6/6e/8d88e00f624a8348b286b219a292fe3e077ee973660dcff6b4ddd5a04e85/pydantic_evals-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "62035ae3a5321e4d892c7372ef91af0f46b675863e827f011d5cb8550dede400" + +[[packages]] +name = "pydantic-graph" +version = "0.2.9" + +[[packages.wheels]] +name = "pydantic_graph-0.2.9-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/cc/e609261763a76f4d23a545afb462847592bc6b4d8eb412990b9b913c073e/pydantic_graph-0.2.9-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "38ad929a0ec205bd7d5875b0b408d4f13448276aa89b6ce2a1143a7552b070ce" + +[[packages]] +name = "pydantic-settings" +version = "2.8.1" + +[[packages.wheels]] +name = "pydantic_settings-2.8.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c" + +[[packages]] +name = "pydeck" +version = "0.9.1" + +[[packages.wheels]] +name = "pydeck-0.9.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038" + +[[packages]] +name = "pydocstyle" +version = "6.3.0" + +[[packages.wheels]] +name = "pydocstyle-6.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/36/ea/99ddefac41971acad68f14114f38261c1f27dac0b3ec529824ebc739bdaa/pydocstyle-6.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019" + +[[packages]] +name = "pydub" +version = "0.25.1" + +[[packages.wheels]] +name = "pydub-0.25.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6" + +[[packages]] +name = "pyerfa" +version = "2.0.1.5" + +[[packages.wheels]] +name = "pyerfa-2.0.1.5-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/b4/11/97233cf23ad5411ac6f13b1d6ee3888f90ace4f974d9bf9db887aa428912/pyerfa-2.0.1.5-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "66292d437dcf75925b694977aa06eb697126e7b86553e620371ed3e48b5e0ad0" + +[[packages]] +name = "pyflakes" +version = "3.2.0" + +[[packages.wheels]] +name = "pyflakes-3.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d4/d7/f1b7db88d8e4417c5d47adad627a93547f44bdc9028372dbd2313f34a855/pyflakes-3.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + +[[packages]] +name = "pygithub" +version = "2.6.1" + +[[packages.wheels]] +name = "PyGithub-2.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ac/fc/a444cd19ccc8c4946a512f3827ed0b3565c88488719d800d54a75d541c0b/PyGithub-2.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6f2fa6d076ccae475f9fc392cc6cdbd54db985d4f69b8833a28397de75ed6ca3" + +[[packages]] +name = "pygments" +version = "2.19.1" + +[[packages.wheels]] +name = "pygments-2.19.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c" + +[[packages]] +name = "pyjwt" +version = "2.10.1" + +[[packages.wheels]] +name = "PyJWT-2.10.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb" + +[[packages]] +name = "pylint" +version = "3.3.6" + +[[packages.wheels]] +name = "pylint-3.3.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/31/21/9537fc94aee9ec7316a230a49895266cf02d78aa29b0a2efbc39566e0935/pylint-3.3.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8b7c2d3e86ae3f94fb27703d521dd0b9b6b378775991f504d7c3a6275aa0a6a6" + +[[packages]] +name = "pylint-venv" +version = "3.0.4" + +[[packages.wheels]] +name = "pylint_venv-3.0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a6/10/040e1928236e3d34b26639e3427df88c7249a85aadc621cea2158589b4f8/pylint_venv-3.0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "31006a3df398f58f962c9e5620e756b284e8b2bc490594ce5ee5da41920cb32c" + +[[packages]] +name = "pyls-spyder" +version = "0.4.0" + +[[packages.wheels]] +name = "pyls_spyder-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d0/26/d0975972af1f18c3bb02ec5889191cc09ebb982bcbe45438d90ca763f4ec/pyls_spyder-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1505d975f866a343d0554b6dab41b53717f4b4bc6df450dfd7d48f889fe450b9" + +[[packages]] +name = "pymongo" +version = "4.10.1" + +[[packages.wheels]] +name = "pymongo-4.10.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/0d/2a/7c24a6144eaa06d18ed52822ea2b0f119fd9267cd1abbb75dae4d89a3803/pymongo-4.10.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "45ee87a4e12337353242bc758accc7fb47a2f2d9ecc0382a61e64c8f01e86708" + +[[packages]] +name = "pympler" +version = "1.1" + +[[packages.wheels]] +name = "Pympler-1.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/79/4f/a6a2e2b202d7fd97eadfe90979845b8706676b41cbd3b42ba75adf329d1f/Pympler-1.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5b223d6027d0619584116a0cbc28e8d2e378f7a79c1e5e024f9ff3b673c58506" + +[[packages]] +name = "pynacl" +version = "1.5.0" + +[[packages.wheels]] +name = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/5e/22/d3db169895faaf3e2eda892f005f433a62db2decbcfbc2f61e6517adfa87/PyNaCl-1.5.0-cp36-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93" + +[[packages]] +name = "pynndescent" +version = "0.5.13" + +[[packages.wheels]] +name = "pynndescent-0.5.13-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d2/53/d23a97e0a2c690d40b165d1062e2c4ccc796be458a1ce59f6ba030434663/pynndescent-0.5.13-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "69aabb8f394bc631b6ac475a1c7f3994c54adf3f51cd63b2730fefba5771b949" + +[[packages]] +name = "pyodbc" +version = "5.2.0" + +[[packages.wheels]] +name = "pyodbc-5.2.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/73/2a/3219c8b7fa3788fc9f27b5fc2244017223cf070e5ab370f71c519adf9120/pyodbc-5.2.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "96d3127f28c0dacf18da7ae009cd48eac532d3dcc718a334b86a3c65f6a5ef5c" + +[[packages]] +name = "pyogrio" +version = "0.10.0" + +[[packages.wheels]] +name = "pyogrio-0.10.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/27/5d/0deb16d228362a097ee3258d0a887c9c0add4b9678bb4847b08a241e124d/pyogrio-0.10.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "02e54bcfb305af75f829044b0045f74de31b77c2d6546f7aaf96822066147848" + +[[packages]] +name = "pyomo" +version = "6.9.2" + +[[packages.wheels]] +name = "pyomo-6.9.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7f/88/0a07233e39357d3d620186485b927074d6d0ae0f64ad72cc5222ae05844e/pyomo-6.9.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "13ebb2f974f97afa626c2712d4f27e09a1c3d18ca11755676b743504a76e5161" + +[[packages]] +name = "pypandoc" +version = "1.15" + +[[packages.wheels]] +name = "pypandoc-1.15-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/61/06/0763e0ccc81754d3eadb21b2cb86cf21bdedc9b52698c2ad6785db7f0a4e/pypandoc-1.15-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4ededcc76c8770f27aaca6dff47724578428eca84212a31479403a9731fc2b16" + +[[packages]] +name = "pyparsing" +version = "3.2.3" + +[[packages.wheels]] +name = "pyparsing-3.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf" + +[[packages]] +name = "pypdf" +version = "5.4.0" + +[[packages.wheels]] +name = "pypdf-5.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0b/27/d83f8f2a03ca5408dc2cc84b49c0bf3fbf059398a6a2ea7c10acfe28859f/pypdf-5.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "db994ab47cadc81057ea1591b90e5b543e2b7ef2d0e31ef41a9bfe763c119dab" + +[[packages]] +name = "pyproj" +version = "3.7.0" + +[[packages.wheels]] +name = "pyproj-3.7.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/f8/33/3c8c6302717096b54aa14ccbb271045ba04629e21cbf348f2f2dc94f69b4/pyproj-3.7.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "10a8dc6ec61af97c89ff032647d743f8dc023645773da42ef43f7ae1125b3509" + +[[packages]] +name = "pyproject-hooks" +version = "1.2.0" + +[[packages.wheels]] +name = "pyproject_hooks-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913" + +[[packages]] +name = "pyqt5" +version = "5.15.11" + +[[packages.wheels]] +name = "PyQt5-5.15.11-cp38-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/56/d5/68eb9f3d19ce65df01b6c7b7a577ad3bbc9ab3a5dd3491a4756e71838ec9/PyQt5-5.15.11-cp38-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517" + +[[packages]] +name = "pyqt5-qt5" +version = "5.15.2" + +[[packages.wheels]] +name = "PyQt5_Qt5-5.15.2-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/37/97/5d3b222b924fa2ed4c2488925155cd0b03fd5d09ee1cfcf7c553c11c9f66/PyQt5_Qt5-5.15.2-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "750b78e4dba6bdf1607febedc08738e318ea09e9b10aea9ff0d73073f11f6962" + +[[packages]] +name = "pyqt5-sip" +version = "12.17.0" + +[[packages.wheels]] +name = "PyQt5_sip-12.17.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/15/ed/ff94d6b2910e7627380cb1fc9a518ff966e6d78285c8e54c9422b68305db/PyQt5_sip-12.17.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "672c209d05661fab8e17607c193bf43991d268a1eefbc2c4551fbf30fd8bb2ca" + +[[packages]] +name = "pyqtgraph" +version = "0.13.7" + +[[packages.wheels]] +name = "pyqtgraph-0.13.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/34/5702b3b7cafe99be1d94b42f100e8cc5e6957b761fcb1cf5f72d492851da/pyqtgraph-0.13.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7754edbefb6c367fa0dfb176e2d0610da3ada20aa7a5318516c74af5fb72bf7a" + +[[packages]] +name = "pyqtwebengine" +version = "5.15.7" + +[[packages.wheels]] +name = "PyQtWebEngine-5.15.7-cp38-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/39/67/0dead50889d905fc99f40e61e5ab7f73746605ce8f74c4fa7fb3fc1d6c5e/PyQtWebEngine-5.15.7-cp38-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "bd5e8c426d6f6b352cd15800d64a89b2a4a11e098460b818c7bdcf5e5612e44f" + +[[packages]] +name = "pyqtwebengine-qt5" +version = "5.15.2" + +[[packages.wheels]] +name = "PyQtWebEngine_Qt5-5.15.2-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e0/db/0f29bd882aee8b5754f3e1ab104d2d09cdd9138a889558b43badcd81ce11/PyQtWebEngine_Qt5-5.15.2-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "24231f19e1595018779977de6722b5c69f3d03f34a5f7574ff21cd1e764ef76d" + +[[packages]] +name = "pyserial" +version = "3.5" + +[[packages.wheels]] +name = "pyserial-3.5-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/07/bc/587a445451b253b285629263eb51c2d8e9bcea4fc97826266d186f96f558/pyserial-3.5-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0" + +[[packages]] +name = "pysocks" +version = "1.7.1" + +[[packages.wheels]] +name = "PySocks-1.7.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8d/59/b4572118e098ac8e46e399a1dd0f2d85403ce8bbaad9ec79373ed6badaf9/PySocks-1.7.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5" + +[[packages]] +name = "pyspnego" +version = "0.11.2" + +[[packages.wheels]] +name = "pyspnego-0.11.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/57/ea/b3c1438839d8724beff7b31ec42b9d041265dc9ca27ccb54477d442bfbcf/pyspnego-0.11.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "74abc1fb51e59360eb5c5c9086e5962174f1072c7a50cf6da0bda9a4bcfdfbd4" + +[[packages]] +name = "pytest" +version = "8.3.5" + +[[packages.wheels]] +name = "pytest-8.3.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820" + +[[packages]] +name = "python-barcode" +version = "0.15.1" + +[[packages.wheels]] +name = "python_barcode-0.15.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/10/27/9b5c5bb1938d4e6b12f4c95f40ea905c11df3cd58e128e9305397b9a2697/python_barcode-0.15.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "057636fba37369c22852410c8535b36adfbeb965ddfd4e5b6924455d692e0886" + +[[packages]] +name = "python-dateutil" +version = "2.8.2" + +[[packages.wheels]] +name = "python_dateutil-2.8.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/36/7a/87837f39d0296e723bb9b62bbb257d0355c7f6128853c78955f57342a56d/python_dateutil-2.8.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + +[[packages]] +name = "python-dotenv" +version = "1.1.0" + +[[packages.wheels]] +name = "python_dotenv-1.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d" + +[[packages]] +name = "python-json-logger" +version = "3.3.0" + +[[packages.wheels]] +name = "python_json_logger-3.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/08/20/0f2523b9e50a8052bc6a8b732dfc8568abbdc42010aef03a2d750bdab3b2/python_json_logger-3.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7" + +[[packages]] +name = "python-lsp-black" +version = "2.0.0" + +[[packages.wheels]] +name = "python_lsp_black-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/78/44/fef9b4d027b3d6321e6f30b6b5946bef18cd84a96e1d81012ac0f69ea53c/python_lsp_black-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d5efdee45f5fa9e5241f5d4d396cd46127f45c85817916b1fd92c2986652bf7e" + +[[packages]] +name = "python-lsp-jsonrpc" +version = "1.1.2" + +[[packages.wheels]] +name = "python_lsp_jsonrpc-1.1.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/d9/656659d5b5d5f402b2b174cd0ba9bc827e07ce3c0bf88da65424baf64af8/python_lsp_jsonrpc-1.1.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7339c2e9630ae98903fdaea1ace8c47fba0484983794d6aafd0bd8989be2b03c" + +[[packages]] +name = "python-lsp-server" +version = "1.12.2" + +[[packages.wheels]] +name = "python_lsp_server-1.12.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cb/e7/28010a326ef591e1409daf9d57a47de94156c147ad1befe74d8196d82729/python_lsp_server-1.12.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "750116459449184ba20811167cdf96f91296ae12f1f65ebd975c5c159388111b" + +[[packages]] +name = "python-multipart" +version = "0.0.20" + +[[packages.wheels]] +name = "python_multipart-0.0.20-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/45/58/38b5afbc1a800eeea951b9285d3912613f2603bdf897a4ab0f4bd7f405fc/python_multipart-0.0.20-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104" + +[[packages]] +name = "python-slugify" +version = "8.0.4" + +[[packages.wheels]] +name = "python_slugify-8.0.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/62/02da182e544a51a5c3ccf4b03ab79df279f9c60c5e82d5e8bec7ca26ac11/python_slugify-8.0.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8" + +[[packages]] +name = "pythonqwt" +version = "0.14.5" + +[[packages.wheels]] +name = "pythonqwt-0.14.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/28/e9/1e6e93e1aaaec57d6ef427291e8fb3d9f18ebd91147c24f2b241b01e2def/pythonqwt-0.14.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "be5a9d2e1ba22aaa02eb397c5b3b5e4e1d9ed2c08f45554d8b920d8fc3be6dc7" + +[[packages]] +name = "pytoolconfig" +version = "1.3.1" + +[[packages.wheels]] +name = "pytoolconfig-1.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/92/44/da239917f5711ca7105f7d7f9e2765716dd883b241529beafc0f28504725/pytoolconfig-1.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5d8cea8ae1996938ec3eaf44567bbc5ef1bc900742190c439a44a704d6e1b62b" + +[[packages]] +name = "pytz" +version = "2025.2" + +[[packages.wheels]] +name = "pytz-2025.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00" + +[[packages]] +name = "pyuca" +version = "1.2" + +[[packages.wheels]] +name = "pyuca-1.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/98/88/aeeee34d88f841aca712a8c18fbd62a33eaad8f2dbe535e87f3c829b02f9/pyuca-1.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "abaa12e1bd2c7c68ca8396ff8383bc0654a739cef3ae68fd7af58bf29af0a91e" + +[[packages]] +name = "pyusb" +version = "1.3.1" + +[[packages.wheels]] +name = "pyusb-1.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/28/b8/27e6312e86408a44fe16bd28ee12dd98608b39f7e7e57884a24e8f29b573/pyusb-1.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430" + +[[packages]] +name = "pyviz-comms" +version = "3.0.4" + +[[packages.wheels]] +name = "pyviz_comms-3.0.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/98/cc/ba051cfaef2525054e3367f2d5ff4df38f8f775125b3eebb82af4060026b/pyviz_comms-3.0.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a40d17db26ec13cf975809633804e712bd24b473e77388c193c44043f85d0b25" + +[[packages]] +name = "pywavelets" +version = "1.8.0" + +[[packages.wheels]] +name = "pywavelets-1.8.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/c9/4f/0a709a5732e6cf9297fc87bf545cb879997cde204115f8c0cbc296c5bdd3/pywavelets-1.8.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "4dbebcfd55ea8a85b7fc8802d411e75337170422abf6e96019d7e46c394e80e5" + +[[packages]] +name = "pywin32" +version = "310" + +[[packages.wheels]] +name = "pywin32-310-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/45/3c/b4640f740ffebadd5d34df35fecba0e1cfef8fde9f3e594df91c28ad9b50/pywin32-310-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e" + +[[packages]] +name = "pywin32-ctypes" +version = "0.2.3" + +[[packages.wheels]] +name = "pywin32_ctypes-0.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8" + +[[packages]] +name = "pywinpty" +version = "2.0.15" + +[[packages.wheels]] +name = "pywinpty-2.0.15-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/fb/16/2ab7b3b7f55f3c6929e5f629e1a68362981e4e5fed592a2ed1cb4b4914a5/pywinpty-2.0.15-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "ab5920877dd632c124b4ed17bc6dd6ef3b9f86cd492b963ffdb1a67b85b0f408" + +[[packages]] +name = "pyyaml" +version = "6.0.2" + +[[packages.wheels]] +name = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563" + +[[packages]] +name = "pyzmq" +version = "26.4.0" + +[[packages.wheels]] +name = "pyzmq-26.4.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/c6/6c/f289c1789d7bb6e5a3b3bef7b2a55089b8561d17132be7d960d3ff33b14e/pyzmq-26.4.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b" + +[[packages]] +name = "qdarkstyle" +version = "3.2.3" + +[[packages.wheels]] +name = "QDarkStyle-3.2.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/93/7d/c3c10498430dadcea4def5faddf71cd199e577d20a125e7ef1e9d7bdbbfa/QDarkStyle-3.2.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ea980ee426d594909cf1058306832af71ff6cbad6f69237b036d1550635aefbc" + +[[packages]] +name = "qdldl" +version = "0.1.7.post5" + +[[packages.wheels]] +name = "qdldl-0.1.7.post5-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/08/f7/abac03a09f6848cee6d5dd7a7a8bd1dfed68766ee77f9cbf3e9de596ad68/qdldl-0.1.7.post5-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "cc9be378e7bec67d4c62b7fa27cafb4f77d3e5e059d753c3dce0a5ae1ef5fea0" + +[[packages]] +name = "qrcode" +version = "8.0" + +[[packages.wheels]] +name = "qrcode-8.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/74/ab/df8d889fd01139db68ae9e5cb5c8f0ea016823559a6ecb427582d52b07dc/qrcode-8.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9fc05f03305ad27a709eb742cf3097fa19e6f6f93bb9e2f039c0979190f6f1b1" + +[[packages]] +name = "qstylizer" +version = "0.2.4" + +[[packages.wheels]] +name = "qstylizer-0.2.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2d/ba/2a4e51861942c2bc3be60400c69f6713359c3e307aee4696f2ea47f35811/qstylizer-0.2.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8f384dfe86f9edb0bb596b93663a51f124f0794b94fd54057cc7cf9cea59fb6f" + +[[packages]] +name = "qtawesome" +version = "1.4.0" + +[[packages.wheels]] +name = "qtawesome-1.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a5/ee/6e6c6715129c929af2d95ddb2e9decf54c1beffe58f336911197aacc0448/qtawesome-1.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a4d689fa071c595aa6184171ce1f0f847677cb8d2db45382c43129f1d72a3d93" + +[[packages]] +name = "qtconsole" +version = "5.6.1" + +[[packages.wheels]] +name = "qtconsole-5.6.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/8a/635610fb6131bc702229e2780d7b042416866ab78f8ed1ff24c4b23a2f4c/qtconsole-5.6.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3d22490d9589bace566ad4f3455b61fa2209156f40e87e19e2c3cb64e9264950" + +[[packages]] +name = "qtpy" +version = "2.4.3" + +[[packages.wheels]] +name = "QtPy-2.4.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/69/76/37c0ccd5ab968a6a438f9c623aeecc84c202ab2fabc6a8fd927580c15b5a/QtPy-2.4.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1" + +[[packages]] +name = "quantecon" +version = "0.7.2" + +[[packages.wheels]] +name = "quantecon-0.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/77/1b/75e44bd482abe2e87dcbead8cfd99b8fa6582fdc0906967c34f64abfdf13/quantecon-0.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d1333ca7bc3046efe3655d9eeeefb299051b00870b8608cb5bc0b88e3bdb8b67" + +[[packages]] +name = "quart" +version = "0.20.0" + +[[packages.wheels]] +name = "quart-0.20.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7e/e9/cc28f21f52913adf333f653b9e0a3bf9cb223f5083a26422968ba73edd8d/quart-0.20.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "003c08f551746710acb757de49d9b768986fd431517d0eb127380b656b98b8f1" + +[[packages]] +name = "rapidfuzz" +version = "3.13.0" + +[[packages.wheels]] +name = "rapidfuzz-3.13.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/96/e3/a98c25c4f74051df4dcf2f393176b8663bfd93c7afc6692c84e96de147a2/rapidfuzz-3.13.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264" + +[[packages]] +name = "readme-renderer" +version = "44.0" + +[[packages.wheels]] +name = "readme_renderer-44.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151" + +[[packages]] +name = "redis" +version = "5.2.1" + +[[packages.wheels]] +name = "redis-5.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3c/5f/fa26b9b2672cbe30e07d9a5bdf39cf16e3b80b42916757c5f92bca88e4ba/redis-5.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4" + +[[packages]] +name = "referencing" +version = "0.36.2" + +[[packages.wheels]] +name = "referencing-0.36.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0" + +[[packages]] +name = "regex" +version = "2024.11.6" + +[[packages.wheels]] +name = "regex-2024.11.6-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a" + +[[packages]] +name = "reportlab" +version = "4.3.1" + +[[packages.wheels]] +name = "reportlab-4.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ce/6b/42805895ed08a314a01be6110584b5d059328386988ddbc4f8f10014d30e/reportlab-4.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0f37dd16652db3ef84363cf744632a28c38bd480d5bf94683466852d7bb678dd" + +[[packages]] +name = "requests" +version = "2.32.3" + +[[packages.wheels]] +name = "requests-2.32.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" + +[[packages]] +name = "requests-ntlm" +version = "1.3.0" + +[[packages.wheels]] +name = "requests_ntlm-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/5d/836b97537a390cf811b0488490c389c5a614f0a93acb23f347bd37a2d914/requests_ntlm-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4c7534a7d0e482bb0928531d621be4b2c74ace437e88c5a357ceb7452d25a510" + +[[packages]] +name = "requests-toolbelt" +version = "1.0.0" + +[[packages.wheels]] +name = "requests_toolbelt-1.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06" + +[[packages]] +name = "rfc3339-validator" +version = "0.1.4" + +[[packages.wheels]] +name = "rfc3339_validator-0.1.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa" + +[[packages]] +name = "rfc3986" +version = "2.0.0" + +[[packages.wheels]] +name = "rfc3986-2.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd" + +[[packages]] +name = "rfc3986-validator" +version = "0.1.1" + +[[packages.wheels]] +name = "rfc3986_validator-0.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9" + +[[packages]] +name = "rich" +version = "14.0.0" + +[[packages.wheels]] +name = "rich-14.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0" + +[[packages]] +name = "rope" +version = "1.13.0" + +[[packages.wheels]] +name = "rope-1.13.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a0/d0/e213e5adfa162e437dff3669131dc476043fc3a22fe99ef891516100610d/rope-1.13.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b435a0c0971244fdcd8741676a9fae697ae614c20cc36003678a7782f25c0d6c" + +[[packages]] +name = "rpds-py" +version = "0.24.0" + +[[packages.wheels]] +name = "rpds_py-0.24.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/f9/12/09e048d1814195e01f354155fb772fb0854bd3450b5f5a82224b3a319f0e/rpds_py-0.24.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a" + +[[packages]] +name = "rsa" +version = "4.7.2" + +[[packages.wheels]] +name = "rsa-4.7.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e9/93/0c0f002031f18b53af7a6166103c02b9c0667be528944137cc954ec921b3/rsa-4.7.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2" + +[[packages]] +name = "rtree" +version = "1.4.0" + +[[packages.wheels]] +name = "rtree-1.4.0-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/ce/c2/362f2cc36a7a57b47380061c23fc109c7222c1a544ffd24cda289ba19673/rtree-1.4.0-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "ba83efc7b7563905b1bfdfc14490c4bfb59e92e5e6156bdeb6ec5df5117252f4" + +[[packages]] +name = "rx" +version = "3.2.0" + +[[packages.wheels]] +name = "Rx-3.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e2/a9/efeaeca4928a9a56d04d609b5730994d610c82cf4d9dd7aa173e6ef4233e/Rx-3.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "922c5f4edb3aa1beaa47bf61d65d5380011ff6adcd527f26377d05cb73ed8ec8" + +[[packages]] +name = "scikit-image" +version = "0.25.2" + +[[packages.wheels]] +name = "scikit_image-0.25.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/8a/97/5fcf332e1753831abb99a2525180d3fb0d70918d461ebda9873f66dcc12f/scikit_image-0.25.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "64785a8acefee460ec49a354706db0b09d1f325674107d7fa3eadb663fb56d6f" + +[[packages]] +name = "scikit-learn" +version = "1.6.1" + +[[packages.wheels]] +name = "scikit_learn-1.6.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/34/b0/ca92b90859070a1487827dbc672f998da95ce83edce1270fc23f96f1f61a/scikit_learn-1.6.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb" + +[[packages]] +name = "scipy" +version = "1.15.3" + +[[packages.wheels]] +name = "scipy-1.15.3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163" + +[[packages]] +name = "scramp" +version = "1.4.5" + +[[packages.wheels]] +name = "scramp-1.4.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d9/9f/8b2f2749ccfbe4fcef08650896ac47ed919ff25b7ac57b7a1ae7da16c8c3/scramp-1.4.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "50e37c464fc67f37994e35bee4151e3d8f9320e9c204fca83a5d313c121bbbe7" + +[[packages]] +name = "scs" +version = "3.2.7.post2" + +[[packages.wheels]] +name = "scs-3.2.7.post2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/9d/f9/840ef19a298ef7099f4a692772001f2f552b0917a3fb230f872a1c40ba11/scs-3.2.7.post2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "a2c48cd19e39bf87dae0b20a289fff44930458fc2ca2afa0f899058dc41e5545" + +[[packages]] +name = "seaborn" +version = "0.13.2" + +[[packages.wheels]] +name = "seaborn-0.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987" + +[[packages]] +name = "send2trash" +version = "1.8.3" + +[[packages.wheels]] +name = "Send2Trash-1.8.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9" + +[[packages]] +name = "setuptools" +version = "79.0.1" + +[[packages.wheels]] +name = "setuptools-79.0.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0d/6d/b4752b044bf94cb802d88a888dc7d288baaf77d7910b7dedda74b5ceea0c/setuptools-79.0.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e147c0549f27767ba362f9da434eab9c5dc0045d5304feb602a0af001089fc51" + +[[packages]] +name = "shapely" +version = "2.1.0" + +[[packages.wheels]] +name = "shapely-2.1.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e3/f0/9f8cdf2258d7aed742459cea51c70d184de92f5d2d6f5f7f1ded90a18c31/shapely-2.1.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "1dc8d4364483a14aba4c844b7bd16a6fa3728887e2c33dfa1afa34a3cf4d08a5" + +[[packages]] +name = "shellingham" +version = "1.5.4" + +[[packages.wheels]] +name = "shellingham-1.5.4-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686" + +[[packages]] +name = "simplejson" +version = "3.19.3" + +[[packages.wheels]] +name = "simplejson-3.19.3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e2/58/b06226e6b0612f2b1fa13d5273551da259f894566b1eef32249ddfdcce44/simplejson-3.19.3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "3bbcdc438dc1683b35f7a8dc100960c721f922f9ede8127f63bed7dfded4c64c" + +[[packages]] +name = "simpy" +version = "4.1.1" + +[[packages.wheels]] +name = "simpy-4.1.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/48/72/920ed1224c94a8a5a69e6c1275ac7fe4eb911ba8feffddf469f1629d47f3/simpy-4.1.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7c5ae380240fd2238671160e4830956f8055830a8317edf5c05e495b3823cd88" + +[[packages]] +name = "six" +version = "1.17.0" + +[[packages.wheels]] +name = "six-1.17.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274" + +[[packages]] +name = "sklearn-compat" +version = "0.1.3" + +[[packages.wheels]] +name = "sklearn_compat-0.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f0/a8/ad69cf130fbd017660cdd64abbef3f28135d9e2e15fe3002e03c5be0ca38/sklearn_compat-0.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a8aaf8ef711988cbd63f187c5560b5f16b25df663aaa1d2d0e1291341d339f80" + +[[packages]] +name = "skrub" +version = "0.5.3" + +[[packages.wheels]] +name = "skrub-0.5.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/80/cf/5a1e0dabfa3cad1ab9b09e690fede4aa8fdc0c04d9d7ec8aa9338d56e1e4/skrub-0.5.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b6ba417fa83d1f7e9a69656e0860b061381b9bd19808692a2b5bef8588c72775" + +[[packages]] +name = "smmap" +version = "5.0.2" + +[[packages.wheels]] +name = "smmap-5.0.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e" + +[[packages]] +name = "sniffio" +version = "1.3.1" + +[[packages.wheels]] +name = "sniffio-1.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" + +[[packages]] +name = "snowballstemmer" +version = "2.2.0" + +[[packages.wheels]] +name = "snowballstemmer-2.2.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" + +[[packages]] +name = "sortedcontainers" +version = "2.4.0" + +[[packages.wheels]] +name = "sortedcontainers-2.4.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0" + +[[packages]] +name = "sounddevice" +version = "0.5.1" + +[[packages.wheels]] +name = "sounddevice-0.5.1-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/af/9b/15217b04f3b36d30de55fef542389d722de63f1ad81f9c72d8afc98cb6ab/sounddevice-0.5.1-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "4313b63f2076552b23ac3e0abd3bcfc0c1c6a696fc356759a13bd113c9df90f1" + +[[packages]] +name = "soupsieve" +version = "2.6" + +[[packages.wheels]] +name = "soupsieve-2.6-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9" + +[[packages]] +name = "sphinx" +version = "8.1.3" + +[[packages.wheels]] +name = "sphinx-8.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2" + +[[packages]] +name = "sphinx-rtd-theme" +version = "3.0.2" + +[[packages.wheels]] +name = "sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/85/77/46e3bac77b82b4df5bb5b61f2de98637724f246b4966cfc34bc5895d852a/sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13" + +[[packages]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5" + +[[packages]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2" + +[[packages]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" + +[[packages.wheels]] +name = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8" + +[[packages]] +name = "sphinxcontrib-jquery" +version = "4.1" + +[[packages.wheels]] +name = "sphinxcontrib_jquery-4.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/76/85/749bd22d1a68db7291c89e2ebca53f4306c3f205853cf31e9de279034c3c/sphinxcontrib_jquery-4.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" + +[[packages]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" + +[[packages.wheels]] +name = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178" + +[[packages]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb" + +[[packages]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" + +[[packages.wheels]] +name = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331" + +[[packages]] +name = "spyder" +version = "6.0.7" + +[[packages.wheels]] +name = "spyder-6.0.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ee/c8/1568fa96351ddad878d42e7487d9637604c7f34030171acf810f47914d9d/spyder-6.0.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b725569bb8ddc7b0aab73d747d85312dc0456978370cc0f9b1a101c0fe4f076b" + +[[packages]] +name = "spyder-kernels" +version = "3.0.5" + +[[packages.wheels]] +name = "spyder_kernels-3.0.5-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/10/2d/b1c88e914ebdec2a9cf066b2c283ee234f4052c31922017407fa8adb89f3/spyder_kernels-3.0.5-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "9cc808e0ec4426b9ba911128e221fa2234e6c8d6e08526132e90112ff9c2bb7c" + +[[packages]] +name = "sqlalchemy" +version = "2.0.40" + +[[packages.wheels]] +name = "sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/1c/cb/f38c61f7f2fd4d10494c1c135ff6a6ddb63508d0b47bccccd93670637309/sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad" + +[[packages]] +name = "sqlite-bro" +version = "0.13.1" + +[[packages.wheels]] +name = "sqlite_bro-0.13.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/2a/b3/81b91f5b26fff329c59dbf826a87637bd51d1903120427912322f86e7d33/sqlite_bro-0.13.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "c26033b0af133049ca578b5fd30b2372f002e7ff934b39774aa4d2da7638c23d" + +[[packages]] +name = "sqlite-fts4" +version = "1.0.3" + +[[packages.wheels]] +name = "sqlite_fts4-1.0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/51/29/0096e8b1811aaa78cfb296996f621f41120c21c2f5cd448ae1d54979d9fc/sqlite_fts4-1.0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0359edd8dea6fd73c848989e1e2b1f31a50fe5f9d7272299ff0e8dbaa62d035f" + +[[packages]] +name = "sqlite-utils" +version = "3.38" + +[[packages.wheels]] +name = "sqlite_utils-3.38-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4d/eb/f8e8e827805f810838efff3311cccd2601238c5fa3fc35c1f878709e161b/sqlite_utils-3.38-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8a27441015c3b2ef475f555861f7a2592f73bc60d247af9803a11b65fc605bf9" + +[[packages]] +name = "sqlparse" +version = "0.5.3" + +[[packages.wheels]] +name = "sqlparse-0.5.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a9/5c/bfd6bd0bf979426d405cc6e71eceb8701b148b16c21d2dc3c261efc61c7b/sqlparse-0.5.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca" + +[[packages]] +name = "squarify" +version = "0.4.4" + +[[packages.wheels]] +name = "squarify-0.4.4-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/3c/eedbe9fb07cc20fd9a8423da14b03bc270d0570b3ba9174a4497156a2152/squarify-0.4.4-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d7597724e29d48aa14fd2f551060d6b09e1f0a67e4cd3ea329fe03b4c9a56f11" + +[[packages]] +name = "sse-starlette" +version = "2.2.1" + +[[packages.wheels]] +name = "sse_starlette-2.2.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99" + +[[packages]] +name = "sspilib" +version = "0.2.0" + +[[packages.wheels]] +name = "sspilib-0.2.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/49/ad/40f898075c913c75060c17c9cc6d6b86e8f83b6f5e1e017627b07ff53fcd/sspilib-0.2.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "c39a698491f43618efca8776a40fb7201d08c415c507f899f0df5ada15abefaa" + +[[packages]] +name = "stack-data" +version = "0.6.3" + +[[packages.wheels]] +name = "stack_data-0.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" + +[[packages]] +name = "starlette" +version = "0.46.2" + +[[packages.wheels]] +name = "starlette-0.46.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35" + +[[packages]] +name = "statsmodels" +version = "0.14.4" + +[[packages.wheels]] +name = "statsmodels-0.14.4-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/1d/eb/cb8b01f5edf8f135eb3d0553d159db113a35b2948d0e51eeb735e7ae09ea/statsmodels-0.14.4-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "81030108d27aecc7995cac05aa280cf8c6025f6a6119894eef648997936c2dd0" + +[[packages]] +name = "streamlit" +version = "1.46.0" + +[[packages.wheels]] +name = "streamlit-1.46.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/be/26/79bbb77bec3d605f7de7a4b45c806b44d112e8c9bce77fb620e03d9f2b88/streamlit-1.46.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f8624acabafcf18611a0fac2635cf181a7ba922b45bd131ae15fc8f80e1a5482" + +[[packages]] +name = "superqt" +version = "0.7.3" + +[[packages.wheels]] +name = "superqt-0.7.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4f/53/ce8e705a0fca9ff08406d0232409c6dacd09a04cdc5124e33aa3ad97c117/superqt-0.7.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "8f7d141665b31baa484747f324fc9fc2d14223f2fefc92ffed6ea35c92221304" + +[[packages]] +name = "sv-ttk" +version = "2.6.0" + +[[packages.wheels]] +name = "sv_ttk-2.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0f/3d/be0abc3202e90f282ad465f4e7c6e41bc8dce810ce5d1611566a1e7dfba8/sv_ttk-2.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4319c52edf2e14732fe84bdc9788e26f9e9a1ad79451ec0f89f0120ffc8105d9" + +[[packages]] +name = "sympy" +version = "1.14.0" + +[[packages.wheels]] +name = "sympy-1.14.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5" + +[[packages]] +name = "tabulate" +version = "0.9.0" + +[[packages.wheels]] +name = "tabulate-0.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f" + +[[packages]] +name = "tblib" +version = "3.1.0" + +[[packages.wheels]] +name = "tblib-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/27/44/aa5c8b10b2cce7a053018e0d132bd58e27527a0243c4985383d5b6fd93e9/tblib-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e" + +[[packages]] +name = "tenacity" +version = "9.1.2" + +[[packages.wheels]] +name = "tenacity-9.1.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138" + +[[packages]] +name = "termcolor" +version = "3.1.0" + +[[packages.wheels]] +name = "termcolor-3.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa" + +[[packages]] +name = "terminado" +version = "0.18.1" + +[[packages.wheels]] +name = "terminado-0.18.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0" + +[[packages]] +name = "text-unidecode" +version = "1.3" + +[[packages.wheels]] +name = "text_unidecode-1.3-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a6/a5/c0b6468d3824fe3fde30dbb5e1f687b291608f9473681bbf7dabbf5a87d7/text_unidecode-1.3-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8" + +[[packages]] +name = "textdistance" +version = "4.6.3" + +[[packages.wheels]] +name = "textdistance-4.6.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c6/c2/c62601c858010b0513a6434b9be19bd740533a6e861eddfd30b7258d92a0/textdistance-4.6.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0cb1b2cc8e3339ddc3e0f8c870e49fb49de6ecc42a718917308b3c971f34aa56" + +[[packages]] +name = "thefuzz" +version = "0.22.1" + +[[packages.wheels]] +name = "thefuzz-0.22.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/4f/1695e70ceb3604f19eda9908e289c687ea81c4fecef4d90a9d1d0f2f7ae9/thefuzz-0.22.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "59729b33556850b90e1093c4cf9e618af6f2e4c985df193fdf3c5b5cf02ca481" + +[[packages]] +name = "threadpoolctl" +version = "3.6.0" + +[[packages.wheels]] +name = "threadpoolctl-3.6.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb" + +[[packages]] +name = "three-merge" +version = "0.1.1" + +[[packages.wheels]] +name = "three_merge-0.1.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/23/be/a52588102605ec52b4e88340d65a290b6465c1dbcd2d943ab149b012908b/three_merge-0.1.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "dd219f4696aa0bbec6099ac3528b4de0450ff9bde862dd8f6d6f52e745f83464" + +[[packages]] +name = "tifffile" +version = "2025.3.30" + +[[packages.wheels]] +name = "tifffile-2025.3.30-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6e/be/10d23cfd4078fbec6aba768a357eff9e70c0b6d2a07398425985c524ad2a/tifffile-2025.3.30-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c" + +[[packages]] +name = "tiktoken" +version = "0.9.0" + +[[packages.wheels]] +name = "tiktoken-0.9.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/de/a8/8f499c179ec900783ffe133e9aab10044481679bb9aad78436d239eee716/tiktoken-0.9.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "5ea0edb6f83dc56d794723286215918c1cde03712cbbafa0348b33448faf5b95" + +[[packages]] +name = "tinycss2" +version = "1.4.0" + +[[packages.wheels]] +name = "tinycss2-1.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289" + +[[packages]] +name = "tokenizers" +version = "0.21.1" + +[[packages.wheels]] +name = "tokenizers-0.21.1-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/e6/b6/072a8e053ae600dcc2ac0da81a23548e3b523301a442a6ca900e92ac35be/tokenizers-0.21.1-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382" + +[[packages]] +name = "toml" +version = "0.10.2" + +[[packages.wheels]] +name = "toml-0.10.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b" + +[[packages]] +name = "tomli" +version = "2.2.1" + +[[packages.wheels]] +name = "tomli-2.2.1-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69" + +[[packages]] +name = "tomli-w" +version = "1.2.0" + +[[packages.wheels]] +name = "tomli_w-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90" + +[[packages]] +name = "tomlkit" +version = "0.13.2" + +[[packages.wheels]] +name = "tomlkit-0.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde" + +[[packages]] +name = "toolz" +version = "1.0.0" + +[[packages.wheels]] +name = "toolz-1.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236" + +[[packages]] +name = "tornado" +version = "6.5.1" + +[[packages.wheels]] +name = "tornado-6.5.1-cp39-abi3-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b" + +[[packages]] +name = "tqdm" +version = "4.67.1" + +[[packages.wheels]] +name = "tqdm-4.67.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2" + +[[packages]] +name = "traitlets" +version = "5.14.3" + +[[packages.wheels]] +name = "traitlets-5.14.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" + +[[packages]] +name = "traittypes" +version = "0.2.1" + +[[packages.wheels]] +name = "traittypes-0.2.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9c/d1/8d5bd662703cc1764d986f6908a608777305946fa634d34c470cd4a1e729/traittypes-0.2.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1340af133810b6eee1a2eb2e988f862b0d12b6c2d16f282aaf3207b782134c2e" + +[[packages]] +name = "trio" +version = "0.30.0" + +[[packages.wheels]] +name = "trio-0.30.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/69/8e/3f6dfda475ecd940e786defe6df6c500734e686c9cd0a0f8ef6821e9b2f2/trio-0.30.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3bf4f06b8decf8d3cf00af85f40a89824669e2d033bb32469d34840edcfc22a5" + +[[packages]] +name = "trove-classifiers" +version = "2025.5.9.12" + +[[packages.wheels]] +name = "trove_classifiers-2025.5.9.12-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/92/ef/c6deb083748be3bcad6f471b6ae983950c161890bf5ae1b2af80cc56c530/trove_classifiers-2025.5.9.12-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "e381c05537adac78881c8fa345fd0e9970159f4e4a04fcc42cfd3129cca640ce" + +[[packages]] +name = "twine" +version = "6.1.0" + +[[packages.wheels]] +name = "twine-6.1.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7c/b6/74e927715a285743351233f33ea3c684528a0d374d2e43ff9ce9585b73fe/twine-6.1.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384" + +[[packages]] +name = "typer" +version = "0.15.2" + +[[packages.wheels]] +name = "typer-0.15.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/7f/fc/5b29fea8cee020515ca82cc68e3b8e1e34bb19a3535ad854cac9257b414c/typer-0.15.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc" + +[[packages]] +name = "types-python-dateutil" +version = "2.9.0.20240316" + +[[packages.wheels]] +name = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c7/1b/af4f4c4f3f7339a4b7eb3c0ab13416db98f8ac09de3399129ee5fdfa282b/types_python_dateutil-2.9.0.20240316-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b" + +[[packages]] +name = "types-requests" +version = "2.32.0.20250328" + +[[packages.wheels]] +name = "types_requests-2.32.0.20250328-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/cc/15/3700282a9d4ea3b37044264d3e4d1b1f0095a4ebf860a99914fd544e3be3/types_requests-2.32.0.20250328-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2" + +[[packages]] +name = "typing-extensions" +version = "4.13.2" + +[[packages.wheels]] +name = "typing_extensions-4.13.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c" + +[[packages]] +name = "typing-inspection" +version = "0.4.0" + +[[packages.wheels]] +name = "typing_inspection-0.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f" + +[[packages]] +name = "tzdata" +version = "2025.2" + +[[packages.wheels]] +name = "tzdata-2025.2-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8" + +[[packages]] +name = "tzlocal" +version = "5.3.1" + +[[packages.wheels]] +name = "tzlocal-5.3.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d" + +[[packages]] +name = "uc-micro-py" +version = "1.0.3" + +[[packages.wheels]] +name = "uc_micro_py-1.0.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/37/87/1f677586e8ac487e29672e4b17455758fce261de06a0d086167bb760361a/uc_micro_py-1.0.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5" + +[[packages]] +name = "ujson" +version = "5.10.0" + +[[packages.wheels]] +name = "ujson-5.10.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/d7/72/6cb6728e2738c05bbe9bd522d6fc79f86b9a28402f38663e85a28fddd4a0/ujson-5.10.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539" + +[[packages]] +name = "umap-learn" +version = "0.5.7" + +[[packages.wheels]] +name = "umap_learn-0.5.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/3c/8f/671c0e1f2572ba625cbcc1faeba9435e00330c3d6962858711445cf1e817/umap_learn-0.5.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6a7e0be2facfa365a5ed6588447102bdbef32a0ef449535c25c97ea7e680073c" + +[[packages]] +name = "uncertainties" +version = "3.2.2" + +[[packages.wheels]] +name = "uncertainties-3.2.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fa/fc/97711d2a502881d871e3cf2d2645e21e7f8e4d4fd9a56937557790cade6a/uncertainties-3.2.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "fd8543355952f4052786ed4150acaf12e23117bd0f5bd03ea07de466bce646e7" + +[[packages]] +name = "uri-template" +version = "1.3.0" + +[[packages.wheels]] +name = "uri_template-1.3.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363" + +[[packages]] +name = "urllib3" +version = "2.4.0" + +[[packages.wheels]] +name = "urllib3-2.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813" + +[[packages]] +name = "uvicorn" +version = "0.34.2" + +[[packages.wheels]] +name = "uvicorn-0.34.2-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403" + +[[packages]] +name = "vega-datasets" +version = "0.9.0" + +[[packages.wheels]] +name = "vega_datasets-0.9.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/e6/9f/ca52771fe972e0dcc5167fedb609940e01516066938ff2ee28b273ae4f29/vega_datasets-0.9.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3d7c63917be6ca9b154b565f4779a31fedce57b01b5b9d99d8a34a7608062a1d" + +[[packages]] +name = "waitress" +version = "3.0.0" + +[[packages.wheels]] +name = "waitress-3.0.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5b/a9/485c953a1ac4cb98c28e41fd2c7184072df36bbf99734a51d44d04176878/waitress-3.0.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "2a06f242f4ba0cc563444ca3d1998959447477363a2d7e9b8b4d75d35cfd1669" + +[[packages]] +name = "watchdog" +version = "6.0.0" + +[[packages.wheels]] +name = "watchdog-6.0.0-py3-none-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680" + +[[packages]] +name = "wcwidth" +version = "0.2.13" + +[[packages.wheels]] +name = "wcwidth-0.2.13-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859" + +[[packages]] +name = "webcolors" +version = "24.11.1" + +[[packages.wheels]] +name = "webcolors-24.11.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9" + +[[packages]] +name = "webencodings" +version = "0.5.1" + +[[packages.wheels]] +name = "webencodings-0.5.1-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78" + +[[packages]] +name = "websocket-client" +version = "1.8.0" + +[[packages.wheels]] +name = "websocket_client-1.8.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526" + +[[packages]] +name = "websockets" +version = "14.2" + +[[packages.wheels]] +name = "websockets-14.2-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/14/13/8b7fc4cb551b9cfd9890f0fd66e53c18a06240319915533b033a56a3d520/websockets-14.2-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "b439ea828c4ba99bb3176dc8d9b933392a2413c0f6b149fdcba48393f573377f" + +[[packages]] +name = "werkzeug" +version = "3.1.3" + +[[packages.wheels]] +name = "werkzeug-3.1.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/52/24/ab44c871b0f07f491e5d2ad12c9bd7358e527510618cb1b803a88e986db1/werkzeug-3.1.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e" + +[[packages]] +name = "whatthepatch" +version = "1.0.7" + +[[packages.wheels]] +name = "whatthepatch-1.0.7-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/8e/93/af1d6ccb69ab6b5a00e03fa0cefa563f9862412667776ea15dd4eece3a90/whatthepatch-1.0.7-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "1b6f655fd31091c001c209529dfaabbabdbad438f5de14e3951266ea0fc6e7ed" + +[[packages]] +name = "wheel" +version = "0.45.1" + +[[packages.wheels]] +name = "wheel-0.45.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248" + +[[packages]] +name = "widgetsnbextension" +version = "4.0.14" + +[[packages.wheels]] +name = "widgetsnbextension-4.0.14-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ca/51/5447876806d1088a0f8f71e16542bf350918128d0a69437df26047c8e46f/widgetsnbextension-4.0.14-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575" + +[[packages]] +name = "wordcloud" +version = "1.9.4" + +[[packages.wheels]] +name = "wordcloud-1.9.4-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/84/47/d482f7d2decc6e59e69e105b12c53d6d2967f0d703e664484c5f2f87fca8/wordcloud-1.9.4-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "8c9a5af2fbcf029a19e827adbee58e86efe7536dca7a42380a8601113a86069b" + +[[packages]] +name = "wrapt" +version = "1.16.0" + +[[packages.wheels]] +name = "wrapt-1.16.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/ff/21/abdedb4cdf6ff41ebf01a74087740a709e2edb146490e4d9beea054b0b7a/wrapt-1.16.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1" + +[[packages]] +name = "wsproto" +version = "1.2.0" + +[[packages.wheels]] +name = "wsproto-1.2.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/78/58/e860788190eba3bcce367f74d29c4675466ce8dddfba85f7827588416f01/wsproto-1.2.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736" + +[[packages]] +name = "xarray" +version = "2025.4.0" + +[[packages.wheels]] +name = "xarray-2025.4.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/a4/1e/96fd96419fec1a37da998a1ca3d558f2cae2f6f3cd5015170371b05a2b6b/xarray-2025.4.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b27defd082c5cb85d32c695708de6bb05c2838fb7caaf3f952982e602a35b9b8" + +[[packages]] +name = "xlsxwriter" +version = "3.2.3" + +[[packages.wheels]] +name = "XlsxWriter-3.2.3-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/37/b1/a252d499f2760b314fcf264d2b36fcc4343a1ecdb25492b210cb0db70a68/XlsxWriter-3.2.3-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "593f8296e8a91790c6d0378ab08b064f34a642b3feb787cf6738236bd0a4860d" + +[[packages]] +name = "xyzservices" +version = "2023.10.1" + +[[packages.wheels]] +name = "xyzservices-2023.10.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/82/c3/e06dfa46464cce3eda4b86df8847cab99d9bc545c76807ee689545187a4c/xyzservices-2023.10.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "6a4c38d3a9f89d3e77153eff9414b36a8ee0850c9e8b85796fd1b2a85b8dfd68" + +[[packages]] +name = "yapf" +version = "0.40.1" + +[[packages.wheels]] +name = "yapf-0.40.1-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/23/75/c374517c09e31bf22d3b3f156d73e0f38d08e29b2afdd607cef5f1e10aa9/yapf-0.40.1-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "b8bfc1f280949153e795181768ca14ef43d7312629a06c43e7abd279323af313" + +[[packages]] +name = "yarl" +version = "1.18.3" + +[[packages.wheels]] +name = "yarl-1.18.3-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/f5/d5/688db678e987c3e0fb17867970700b92603cadf36c56e5fb08f23e822a0c/yarl-1.18.3-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c" + +[[packages]] +name = "yt-dlp" +version = "2025.2.19" + +[[packages.wheels]] +name = "yt_dlp-2025.2.19-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/9e/45/6d1b759e68f5363b919828fb0e0c167a1cd5003b5b7c74cc0f0c2096be4f/yt_dlp-2025.2.19-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "3ed218eaeece55e9d715afd41abc450dc406ee63bf79355169dfde312d38fdb8" + +[[packages]] +name = "zict" +version = "3.0.0" + +[[packages.wheels]] +name = "zict-3.0.0-py2.py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/80/ab/11a76c1e2126084fde2639514f24e6111b789b0bfa4fc6264a8975c7e1f1/zict-3.0.0-py2.py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae" + +[[packages]] +name = "zipp" +version = "3.21.0" + +[[packages.wheels]] +name = "zipp-3.21.0-py3-none-any.whl" +url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl" + +[packages.wheels.hashes] +sha256 = "ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931" + +[[packages]] +name = "zstandard" +version = "0.23.0" + +[[packages.wheels]] +name = "zstandard-0.23.0-cp313-cp313-win_amd64.whl" +url = "https://files.pythonhosted.org/packages/a2/bf/c6aaba098e2d04781e8f4f7c0ba3c7aa73d00e4c436bcc0cf059a66691d1/zstandard-0.23.0-cp313-cp313-win_amd64.whl" + +[packages.wheels.hashes] +sha256 = "f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b" diff --git a/changelogs/requir.64-3_12_10_1slim.txt b/changelogs/requir.64-3_12_10_1slim.txt new file mode 100644 index 00000000..40ca03cb --- /dev/null +++ b/changelogs/requir.64-3_12_10_1slim.txt @@ -0,0 +1,998 @@ +absl-py==2.2.2 \ + --hash=sha256:e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092 +adbc-driver-manager==1.3.0 \ + --hash=sha256:0646996a7bbd31b321a16810f7110e9155b08607c0a83fed97414ad1bd2cac9e +aiofiles==23.2.1 \ + --hash=sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107 +aiohappyeyeballs==2.6.1 \ + --hash=sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8 +aiohttp==3.11.18 \ + --hash=sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8 +aiosignal==1.3.2 \ + --hash=sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5 +aiosqlite==0.20.0 \ + --hash=sha256:36a1deaca0cac40ebe32aac9977a6e2bbc7f5189f23f4a54d5908986729e5bd6 +alabaster==0.7.16 \ + --hash=sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 +alembic==1.15.2 \ + --hash=sha256:2e76bd916d547f6900ec4bb5a90aeac1485d2c92536923d0b138c02b126edc53 +altair==5.5.0 \ + --hash=sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c +annotated-types==0.7.0 \ + --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 +ansicolors==1.1.8 \ + --hash=sha256:00d2dde5a675579325902536738dd27e4fac1fd68f773fe36c21044eb559e187 +anthropic==0.51.0 \ + --hash=sha256:b8b47d482c9aa1f81b923555cebb687c2730309a20d01be554730c8302e0f62a +anyio==4.9.0 \ + --hash=sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c +anywidget==0.9.18 \ + --hash=sha256:944b82ef1dd17b8ff0fb6d1f199f613caf9111338e6e2857da478f6e73770cb8 +appdirs==1.4.4 \ + --hash=sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128 +argcomplete==3.6.2 \ + --hash=sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591 +argon2-cffi==23.1.0 \ + --hash=sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea +argon2-cffi-bindings==21.2.0 \ + --hash=sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f +array-api-compat==1.12.0 \ + --hash=sha256:a0b4795b6944a9507fde54679f9350e2ad2b1e2acf4a2408a098cdc27f890a8b +arrow==1.3.0 \ + --hash=sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80 +asgi-csrf==0.11 \ + --hash=sha256:03ac140115f39d4295288a9adf74fdc6ae607f6ef44abee8466520458207242b +asgiref==3.8.1 \ + --hash=sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47 +asn1crypto==1.5.1 \ + --hash=sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67 +asteval==1.0.5 \ + --hash=sha256:082b95312578affc8a6d982f7d92b7ac5de05634985c87e7eedd3188d31149fa +astroid==3.3.9 \ + --hash=sha256:d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248 +astropy==6.1.6 \ + --hash=sha256:344c6433b66c770917cb55f9f3754427774d7066bfa7ccf1ca638f45c7c00738 +astropy-iers-data==0.2024.12.23.0.33.24 \ + --hash=sha256:40d3c6b6a5cf4dc6ad91b92b7e0f949e5366234e3c4440302247429fc8294302 +asttokens==3.0.0 \ + --hash=sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2 +async-lru==2.0.5 \ + --hash=sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943 +asyncssh==2.20.0 \ + --hash=sha256:af6888d937c07a4bf31293335a6166b4d87608cdb5957b49547da6ad87ecf174 +atomicwrites==1.4.0 \ + --hash=sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197 +attrs==25.3.0 \ + --hash=sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3 +autopep8==2.0.4 \ + --hash=sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb +azure-core==1.32.0 \ + --hash=sha256:eac191a0efb23bfa83fddf321b27b122b4ec847befa3091fa736a5c32c50d7b4 +azure-cosmos==4.9.0 \ + --hash=sha256:3b60eaa01a16a857d0faf0cec304bac6fa8620a81bc268ce760339032ef617fe +azure-identity==1.21.0 \ + --hash=sha256:258ea6325537352440f71b35c3dffe9d240eae4a5126c1b7ce5efd5766bd9fd9 +babel==2.17.0 \ + --hash=sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 +baresql==1.0.0 \ + --hash=sha256:a24d17f46beb47c221f328f7e06710e3896c6203a8e1909788d7128f27b86f01 +bcrypt==4.3.0 \ + --hash=sha256:e53e074b120f2877a35cc6c736b8eb161377caae8925c17688bd46ba56daaa5b +beautifulsoup4==4.13.3 \ + --hash=sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16 +binaryornot==0.4.4 \ + --hash=sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4 +black==25.1.0 \ + --hash=sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba +bleach==6.2.0 \ + --hash=sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e +blinker==1.9.0 \ + --hash=sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc +bokeh==3.7.3 \ + --hash=sha256:b0e79dd737f088865212e4fdcb0f3b95d087f0f088bf8ca186a300ab1641e2c7 +branca==0.8.1 \ + --hash=sha256:d29c5fab31f7c21a92e34bf3f854234e29fecdcf5d2df306b616f20d816be425 +brotli==1.1.0 \ + --hash=sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951 +build==1.2.2.post1 \ + --hash=sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5 +cachetools==5.5.2 \ + --hash=sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a +certifi==2025.1.31 \ + --hash=sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe +cffi==1.17.1 \ + --hash=sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903 +chardet==5.2.0 \ + --hash=sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970 +charset-normalizer==3.4.2 \ + --hash=sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e +clarabel==0.10.0 \ + --hash=sha256:7871b6f499ad66f71d4e7fb40754c4d986d4316f242beb62ff4f63a69785a50c +click==8.1.8 \ + --hash=sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2 +click-default-group==1.2.4 \ + --hash=sha256:9b60486923720e7fc61731bdb32b617039aba820e22e1c88766b1125592eaa5f +cloudpickle==3.1.1 \ + --hash=sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e +cohere==5.15.0 \ + --hash=sha256:22ff867c2a6f2fc2b585360c6072f584f11f275ef6d9242bac24e0fa2df1dfb5 +colorama==0.4.6 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 +colorcet==3.1.0 \ + --hash=sha256:2a7d59cc8d0f7938eeedd08aad3152b5319b4ba3bcb7a612398cc17a384cb296 +colorlog==6.9.0 \ + --hash=sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff +comm==0.2.2 \ + --hash=sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3 +contourpy==1.3.2 \ + --hash=sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73 +cookiecutter==2.6.0 \ + --hash=sha256:a54a8e37995e4ed963b3e82831072d1ad4b005af736bb17b99c2cbd9d41b6e2d +cryptography==44.0.0 \ + --hash=sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede +cvxopt==1.3.2 \ + --hash=sha256:a92ebfc5df77fea57544f8ad2102bfc45af0e77ac4dfe98ed1b9628e8bba77c3 +cvxpy==1.6.4 \ + --hash=sha256:052a09716cfb630a48e911e7c9512015ae651100f64530d8eb973a195e105fa3 +cycler==0.12.1 \ + --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 +cython==3.1.1 \ + --hash=sha256:307f216ed319ea07644f2ef9974406c830f01bc8e677e2147e9bfcdf9e3ca8ad +cytoolz==1.0.1 \ + --hash=sha256:8f89c48d8e5aec55ffd566a8ec858706d70ed0c6a50228eca30986bfa5b4da8b +dask==2025.4.1 \ + --hash=sha256:aacbb0a9667856fe58385015efd64aca22f0c0b2c5e1b5e633531060303bb4be +datasette==0.65.1 \ + --hash=sha256:ba7adf717ddcc24a2a8ac57890fffd384a2ebb909b342e4f731ba09eba764305 +datasette-graphql==2.2 \ + --hash=sha256:cd9f61afdcaab1ce4ff6775296e6ece99305bf05cbfae4c1c938a6c9e60cd485 +datashader==0.17.0 \ + --hash=sha256:39421ff999294913e63d41954af955a5dece5d0c55d8fce1426043d70b22d07a +deap==1.4.2 \ + --hash=sha256:02b8b664cfa0b6c18ff3e36d0b982fb66f38fb98c5b4292515a305527d57294e +debugpy==1.8.13 \ + --hash=sha256:63ca7670563c320503fea26ac688988d9d6b9c6a12abc8a8cf2e7dd8e5f6b6ea +decorator==5.2.1 \ + --hash=sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a +defusedxml==0.7.1 \ + --hash=sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 +deprecated==1.2.14 \ + --hash=sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c +diff-match-patch==20241021 \ + --hash=sha256:93cea333fb8b2bc0d181b0de5e16df50dd344ce64828226bda07728818936782 +dill==0.4.0 \ + --hash=sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049 +distributed==2025.4.1 \ + --hash=sha256:3a7834451b04ef059928045eab6ff6d88ad7bcfd48adc99403127d9a6818b5fa +distro==1.9.0 \ + --hash=sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2 +django==5.2 \ + --hash=sha256:91ceed4e3a6db5aedced65e3c8f963118ea9ba753fc620831c77074e620e7d83 +dnspython==2.7.0 \ + --hash=sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86 +docstring-to-markdown==0.17 \ + --hash=sha256:fd7d5094aa83943bf5f9e1a13701866b7c452eac19765380dead666e36d3711c +docutils==0.21.2 \ + --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 +duckdb==1.3.0 \ + --hash=sha256:8754c40dac0f26d9fb0363bbb5df02f7a61ce6a6728d5efc02c3bc925d7c89c3 +entrypoints==0.4 \ + --hash=sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f +et-xmlfile==1.1.0 \ + --hash=sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada +eval-type-backport==0.2.2 \ + --hash=sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a +executing==2.2.0 \ + --hash=sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa +faker==37.1.0 \ + --hash=sha256:dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c +fasta2a==0.2.9 \ + --hash=sha256:8b855b36f29fde6dcb79ad55be337a8165381b679bec829913009c55581e284e +fastapi==0.115.12 \ + --hash=sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d +fastavro==1.10.0 \ + --hash=sha256:567ff515f2a5d26d9674b31c95477f3e6022ec206124c62169bc2ffaf0889089 +fastjsonschema==2.21.1 \ + --hash=sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667 +filelock==3.18.0 \ + --hash=sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de +flake8==7.1.1 \ + --hash=sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213 +flask==3.1.0 \ + --hash=sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136 +flexcache==0.3 \ + --hash=sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32 +flexparser==0.4 \ + --hash=sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846 +flit==3.12.0 \ + --hash=sha256:2b4e7171dc22881fa6adc2dbf083e5ecc72520be3cd7587d2a803da94d6ef431 +flit-core==3.12.0 \ + --hash=sha256:e7a0304069ea895172e3c7bb703292e992c5d1555dd1233ab7b5621b5b69e62c +folium==0.19.5 \ + --hash=sha256:4333fb3e6f3e9eedb231615d22c6d7df20aea5829554bd6908675865a37803b3 +fonttools==4.57.0 \ + --hash=sha256:57e30241524879ea10cdf79c737037221f77cc126a8cdc8ff2c94d4a522504b9 +fqdn==1.5.1 \ + --hash=sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014 +frozenlist==1.5.0 \ + --hash=sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f +fsspec==2025.3.2 \ + --hash=sha256:2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711 +fuzzywuzzy==0.18.0 \ + --hash=sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993 +geographiclib==2.0 \ + --hash=sha256:6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734 +geopandas==1.0.1 \ + --hash=sha256:01e147d9420cc374d26f51fc23716ac307f32b49406e4bd8462c07e82ed1d3d6 +geopy==2.4.1 \ + --hash=sha256:ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7 +gitdb==4.0.12 \ + --hash=sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf +gitpython==3.1.44 \ + --hash=sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110 +google-auth==2.38.0 \ + --hash=sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a +google-genai==1.16.1 \ + --hash=sha256:6ae5d24282244f577ca4f0d95c09f75ab29e556602c9d3531b70161e34cd2a39 +graphene==3.4.3 \ + --hash=sha256:820db6289754c181007a150db1f7fff544b94142b556d12e3ebc777a7bf36c71 +graphql-core==3.2.6 \ + --hash=sha256:78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f +graphql-relay==3.2.0 \ + --hash=sha256:c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5 +greenlet==3.1.1 \ + --hash=sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01 +griffe==1.7.2 \ + --hash=sha256:1ed9c2e338a75741fc82083fe5a1bc89cb6142efe126194cc313e34ee6af5423 +groq==0.25.0 \ + --hash=sha256:aadc78b40b1809cdb196b1aa8c7f7293108767df1508cafa3e0d5045d9328e7a +guidata==3.9.0 \ + --hash=sha256:96a19dc92850bdb3e463fa06e8c22793e090db42d1e72c6dae9bda1a98b61210 +h11==0.14.0 \ + --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 +h2==4.2.0 \ + --hash=sha256:479a53ad425bb29af087f3458a61d30780bc818e4ebcf01f0b536ba916462ed0 +h5py==3.12.1 \ + --hash=sha256:e4d51919110a030913201422fb07987db4338eba5ec8c5a15d6fab8e03d443fc +hatchling==1.27.0 \ + --hash=sha256:d3a2f3567c4f926ea39849cdf924c7e99e6686c9c8e288ae1037c8fa2a5d937b +holoviews==1.20.2 \ + --hash=sha256:1f892c04bc23e8a3a9cde082b606b9463c9ff78c3d0c00e2ddcc41fe6e738458 +hpack==4.1.0 \ + --hash=sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496 +html5lib==1.1 \ + --hash=sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d +httpcore==1.0.7 \ + --hash=sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd +httpie==3.2.4 \ + --hash=sha256:4bd0435cc4b9bca59501bc65089de96f3e93b393803f32a81951db62050ebf0b +httpx==0.28.1 \ + --hash=sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad +httpx-sse==0.4.0 \ + --hash=sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f +huggingface-hub==0.33.0 \ + --hash=sha256:e8668875b40c68f9929150d99727d39e5ebb8a05a98e4191b908dc7ded9074b3 +hupper==1.12.1 \ + --hash=sha256:e872b959f09d90be5fb615bd2e62de89a0b57efc037bdf9637fb09cdf8552b19 +hvplot==0.11.2 \ + --hash=sha256:9d576a0c2df0f1cf5041545f2a2eddcf962510162876991cae4d1779fad74556 +hypercorn==0.17.3 \ + --hash=sha256:059215dec34537f9d40a69258d323f56344805efb462959e727152b0aa504547 +hyperframe==6.1.0 \ + --hash=sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5 +hypothesis==6.130.4 \ + --hash=sha256:cda4a57115d10ecbefe0a9cc8d69d20a13eb56ecbfe7c24eaee5d368c2b7c477 +id==1.5.0 \ + --hash=sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658 +idna==3.10 \ + --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 +imageio==2.37.0 \ + --hash=sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed +imagesize==1.4.1 \ + --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b +imbalanced-learn==0.13.0 \ + --hash=sha256:7eb5859f7827cb3babfa5789978c22fe36e56527d9c9768df2d864d98d9b40fe +importlib-metadata==8.6.1 \ + --hash=sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e +inflection==0.5.1 \ + --hash=sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2 +iniconfig==2.1.0 \ + --hash=sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 +intervaltree==3.1.0 \ + --hash=sha256:902b1b88936918f9b2a19e0e5eb7ccb430ae45cde4f39ea4b36932920d33952d +ipycanvas==0.13.3 \ + --hash=sha256:d37adb2f45d2fef1c3d33c69a0518055694d87827b2f577f3c426d7712f75daa +ipykernel==6.29.5 \ + --hash=sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5 +ipyleaflet==0.19.2 \ + --hash=sha256:7cc9157848baca2e1793b96e79f8bdb1aa7340521d2b7d8a62aa8bc30eab5278 +ipympl==0.9.7 \ + --hash=sha256:3698ee7eaa0b047a7603517d7aa1b71b32118a5f51754cab45ec5d994f67208f +ipython==8.36.0 \ + --hash=sha256:12b913914d010dcffa2711505ec8be4bf0180742d97f1e5175e51f22086428c1 +ipython-genutils==0.2.0 \ + --hash=sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8 +ipython-sql==0.5.0 \ + --hash=sha256:61b46ecffb956f62dbc17b5744cf70c649104c8db9afd821aa39b31f7cbb5d5b +ipywidgets==8.1.6 \ + --hash=sha256:446e7630a1d025bdc7635e1169fcc06f2ce33b5bd41c2003edeb4a47c8d4bbb1 +isoduration==20.11.0 \ + --hash=sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042 +isort==5.13.2 \ + --hash=sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6 +itsdangerous==2.2.0 \ + --hash=sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef +janus==2.0.0 \ + --hash=sha256:7e6449d34eab04cd016befbd7d8c0d8acaaaab67cb59e076a69149f9031745f9 +jaraco-classes==3.4.0 \ + --hash=sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790 +jaraco-context==6.0.1 \ + --hash=sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4 +jaraco-functools==4.1.0 \ + --hash=sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649 +jedi==0.19.2 \ + --hash=sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9 +jellyfish==1.1.3 \ + --hash=sha256:c8c70b1cc92ee15031db16db0d2ca7d5841744f5f626a35c29c3dd7b4ea7002b +jinja2==3.1.6 \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 +jiter==0.9.0 \ + --hash=sha256:099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0 +joblib==1.4.2 \ + --hash=sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6 +json5==0.10.0 \ + --hash=sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa +jsonpatch==1.33 \ + --hash=sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade +jsonpointer==3.0.0 \ + --hash=sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942 +jsonschema==4.23.0 \ + --hash=sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 +jsonschema-specifications==2024.10.1 \ + --hash=sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf +julia==0.6.2 \ + --hash=sha256:90752f71376fdb9919439d20496c2dab24486dfa4fe8a831d6dd14a1bcbc04d1 +jupyter==1.1.1 \ + --hash=sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83 +jupyter-bokeh==4.0.5 \ + --hash=sha256:1110076c14c779071cf492646a1a871aefa8a477261e4721327a666e65df1a2c +jupyter-client==8.6.3 \ + --hash=sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f +jupyter-console==6.6.3 \ + --hash=sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485 +jupyter-core==5.7.2 \ + --hash=sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409 +jupyter-events==0.12.0 \ + --hash=sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb +jupyter-leaflet==0.19.2 \ + --hash=sha256:0d57e15e80c08a4360f0cde0b4c490beddc5d422bb0e9bc1c0b4479d3fb725a6 +jupyter-lsp==2.2.5 \ + --hash=sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da +jupyter-server==2.15.0 \ + --hash=sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3 +jupyter-server-terminals==0.5.3 \ + --hash=sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa +jupyterlab==4.4.2 \ + --hash=sha256:857111a50bed68542bf55dca784522fe728f9f88b4fe69e8c585db5c50900419 +jupyterlab-pygments==0.3.0 \ + --hash=sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780 +jupyterlab-server==2.27.3 \ + --hash=sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4 +jupyterlab-widgets==3.0.14 \ + --hash=sha256:54c33e3306b7fca139d165d6190dc6c0627aafa5d14adfc974a4e9a3d26cb703 +keras==3.10.0 \ + --hash=sha256:c095a6bf90cd50defadf73d4859ff794fad76b775357ef7bd1dbf96388dae7d3 +keyring==25.6.0 \ + --hash=sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd +kiwisolver==1.4.8 \ + --hash=sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50 +langchain==0.3.25 \ + --hash=sha256:931f7d2d1eaf182f9f41c5e3272859cfe7f94fc1f7cef6b3e5a46024b4884c21 +langchain-core==0.3.59 \ + --hash=sha256:9686baaff43f2c8175535da13faf40e6866769015e93130c3c1e4243e7244d70 +langchain-text-splitters==0.3.8 \ + --hash=sha256:e75cc0f4ae58dcf07d9f18776400cf8ade27fadd4ff6d264df6278bb302f6f02 +langsmith==0.3.42 \ + --hash=sha256:18114327f3364385dae4026ebfd57d1c1cb46d8f80931098f0f10abe533475ff +lazy-loader==0.4 \ + --hash=sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc +linkify-it-py==2.0.3 \ + --hash=sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79 +llvmlite==0.44.0 \ + --hash=sha256:eae7e2d4ca8f88f89d315b48c6b741dcb925d6a1042da694aa16ab3dd4cbd3a1 +lmfit==1.3.3 \ + --hash=sha256:a9e9ec7d0d0ec962cc6c078ad1ec6c8311d3ac0e5f0947a00a91f5509dacc2b2 +locket==1.0.0 \ + --hash=sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3 +logfire-api==3.12.0 \ + --hash=sha256:fc092c2dcb24c8462ba776f3b0c2183f82e1cd55f86e29b38cf21a048e66a17d +lxml==5.3.0 \ + --hash=sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f +mako==1.3.9 \ + --hash=sha256:95920acccb578427a9aa38e37a186b1e43156c87260d7ba18ca63aa4c7cbd3a1 +markdown==3.7 \ + --hash=sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803 +markdown-it-py==3.0.0 \ + --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 +markupsafe==3.0.2 \ + --hash=sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87 +matplotlib==3.10.3 \ + --hash=sha256:cf37d8c6ef1a48829443e8ba5227b44236d7fcaf7647caa3178a4ff9f7a5be05 +matplotlib-inline==0.1.7 \ + --hash=sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca +maturin==1.8.3 \ + --hash=sha256:85f2b882d8235c1c1cb0a38d382ccd5b3ba0674d99cb548d49df9342cc688e36 +mccabe==0.7.0 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e +mcp==1.9.3 \ + --hash=sha256:69b0136d1ac9927402ed4cf221d4b8ff875e7132b0b06edd446448766f34f9b9 +mdit-py-plugins==0.4.2 \ + --hash=sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636 +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 +mercantile==1.2.1 \ + --hash=sha256:30f457a73ee88261aab787b7069d85961a5703bb09dc57a170190bc042cd023f +mergedeep==1.3.4 \ + --hash=sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307 +missingno==0.5.2 \ + --hash=sha256:55782621ce09ba0f0a1d08e5bd6d6fe1946469fb03951fadf7d209911ca5b072 +mistralai==1.8.1 \ + --hash=sha256:badfc7e6832d894b3e9071d92ad621212b7cccd7df622c6cacdb525162ae338f +mistune==3.1.3 \ + --hash=sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9 +mizani==0.11.4 \ + --hash=sha256:5b6271dc3da2c88694dca2e0e0a7e1879f0e2fb046c789776f54d090a5243735 +ml-dtypes==0.5.1 \ + --hash=sha256:9626d0bca1fb387d5791ca36bacbba298c5ef554747b7ebeafefb4564fc83566 +mlxtend==0.23.3 \ + --hash=sha256:f9fec721c4121be87dac00e513456dde5bf56b7427750719c0a291cd58b6538e +more-itertools==10.6.0 \ + --hash=sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89 +mpld3==0.5.10 \ + --hash=sha256:80877acce87ea447380fad7374668737505c8c0684aab05238e7c5dc1fab38c1 +mpmath==1.3.0 \ + --hash=sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c +msal==1.30.0 \ + --hash=sha256:423872177410cb61683566dc3932db7a76f661a5d2f6f52f02a047f101e1c1de +msal-extensions==1.2.0 \ + --hash=sha256:cf5ba83a2113fa6dc011a254a72f1c223c88d7dfad74cc30617c4679a417704d +msgpack==1.1.0 \ + --hash=sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f +multidict==6.4.3 \ + --hash=sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db +multipledispatch==1.0.0 \ + --hash=sha256:0c53cd8b077546da4e48869f49b13164bebafd0c2a5afceb6bb6a316e7fb46e4 +mypy==1.15.0 \ + --hash=sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22 +mypy-extensions==1.0.0 \ + --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d +mysql-connector-python==9.2.0 \ + --hash=sha256:b7d149bcc455cf606a4aa604d45267fba16c8abf36056b804f8d16e8f5e753c1 +namex==0.0.8 \ + --hash=sha256:7ddb6c2bb0e753a311b7590f84f6da659dd0c05e65cb89d519d54c0a250c0487 +narwhals==1.36.0 \ + --hash=sha256:e3c50dd1d769bc145f57ae17c1f0f0da6c3d397d62cdd0bb167e9b618e95c9d6 +nbclient==0.10.2 \ + --hash=sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d +nbconvert==7.16.6 \ + --hash=sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b +nbformat==5.10.4 \ + --hash=sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b +nest-asyncio==1.6.0 \ + --hash=sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c +networkx==3.4.2 \ + --hash=sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f +nh3==0.2.18 \ + --hash=sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844 +nltk==3.9.1 \ + --hash=sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1 +notebook==7.4.2 \ + --hash=sha256:9ccef602721aaa5530852e3064710b8ae5415c4e2ce26f8896d0433222755259 +notebook-shim==0.2.4 \ + --hash=sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef +numba==0.61.2 \ + --hash=sha256:97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18 +numpy==2.2.6 \ + --hash=sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2 +numpydoc==1.8.0 \ + --hash=sha256:72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541 +openai==1.82.0 \ + --hash=sha256:8c40647fea1816516cb3de5189775b30b5f4812777e40b8768f361f232b61b30 +opencv-python==4.11.0.86 \ + --hash=sha256:085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec +openpyxl==3.1.5 \ + --hash=sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2 +opentelemetry-api==1.32.1 \ + --hash=sha256:bbd19f14ab9f15f0e85e43e6a958aa4cb1f36870ee62b7fd205783a112012724 +optree==0.14.1 \ + --hash=sha256:98f858daa588ccb70bb554087e87d4192852a11416e5b14f3ee70ae1861b92b0 +optuna==4.2.1 \ + --hash=sha256:6d38199013441d3f70fac27136e05c0188c5f4ec3848db708ac311cbdeb30dbf +orjson==3.10.16 \ + --hash=sha256:86d127efdd3f9bf5f04809b70faca1e6836556ea3cc46e662b44dab3fe71f3d6 +osqp==0.6.7.post3 \ + --hash=sha256:468588cfb690becba4d1f460c2a53e75530584e3efcf2caed59f5219032e6888 +outcome==1.3.0.post0 \ + --hash=sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b +overrides==7.7.0 \ + --hash=sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49 +packaging==24.2 \ + --hash=sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 +pandas==2.2.3 \ + --hash=sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13 +pandocfilters==1.5.1 \ + --hash=sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc +panel==1.6.3 \ + --hash=sha256:ccd2a0587ab382bd55b8ea099706f31b64aadac697b8a41923d3b18b9ed618d6 +papermill==2.6.0 \ + --hash=sha256:0f09da6ef709f3f14dde77cb1af052d05b14019189869affff374c9e612f2dd5 +param==2.2.0 \ + --hash=sha256:777f8c7b66ab820b70ea5ad09faaa6818308220caae89da3b5c5f359faa72a5e +parso==0.8.4 \ + --hash=sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18 +partd==1.4.2 \ + --hash=sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f +pathspec==0.12.1 \ + --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 +patsy==1.0.1 \ + --hash=sha256:751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c +pep8==1.7.1 \ + --hash=sha256:b22cfae5db09833bb9bd7c8463b53e1a9c9b39f12e304a8d0bba729c501827ee +pexpect==4.9.0 \ + --hash=sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 +pg8000==1.31.2 \ + --hash=sha256:436c771ede71af4d4c22ba867a30add0bc5c942d7ab27fadbb6934a487ecc8f6 +pickleshare==0.7.5 \ + --hash=sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56 +pillow==11.1.0 \ + --hash=sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf +platformdirs==4.3.7 \ + --hash=sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94 +plotly==6.0.1 \ + --hash=sha256:4714db20fea57a435692c548a4eb4fae454f7daddf15f8d8ba7e1045681d7768 +plotnine==0.13.6 \ + --hash=sha256:4acc1af29fa4e91e726b67d49277e8368f62e1c817f01bf14ecd8ca5e83bfaea +plotpy==2.7.4 \ + --hash=sha256:716fee6b2c2a2156fd267e3941bcef28b3b169e6f95d2ab7f1417ef8c76f8a14 +pluggy==1.5.0 \ + --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 +ply==3.11 \ + --hash=sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce +polars==1.31.0 \ + --hash=sha256:3fd874d3432fc932863e8cceff2cff8a12a51976b053f2eb6326a0672134a632 +portalocker==2.7.0 \ + --hash=sha256:a07c5b4f3985c3cf4798369631fb7011adb498e2a46d8440efc75a8f29a0f983 +prettytable==3.16.0 \ + --hash=sha256:b5eccfabb82222f5aa46b798ff02a8452cf530a352c31bddfa29be41242863aa +prince==0.16.0 \ + --hash=sha256:7e21a78d4dd06ca3ec526ee714a50b349f26de3fca6b79664150a951b31688f3 +priority==2.0.0 \ + --hash=sha256:6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa +prometheus-client==0.21.1 \ + --hash=sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301 +prompt-toolkit==3.0.51 \ + --hash=sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07 +propcache==0.3.1 \ + --hash=sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3 +protobuf==6.30.2 \ + --hash=sha256:7653c99774f73fe6b9301b87da52af0e69783a2e371e8b599b3e9cb4da4b12b9 +psutil==7.0.0 \ + --hash=sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553 +psygnal==0.12.0 \ + --hash=sha256:25a9f2db710a6cd2566b3e0e03cf6e04d56276f36ac86b42fa22d81f9a4ac0f2 +ptpython==3.0.29 \ + --hash=sha256:65d75c4871859e4305a020c9b9e204366dceb4d08e0e2bd7b7511bd5e917a402 +ptyprocess==0.7.0 \ + --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 +pure-eval==0.2.3 \ + --hash=sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0 +pyarrow==20.0.0 \ + --hash=sha256:96d6a0a37d9c98be08f5ed6a10831d88d52cac7b13f5287f1e0f625a0de8062b +pyasn1==0.6.1 \ + --hash=sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629 +pyasn1-modules==0.4.1 \ + --hash=sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd +pybind11==2.13.6 \ + --hash=sha256:237c41e29157b962835d356b370ededd57594a26d5894a795960f0047cb5caf5 +pycodestyle==2.12.0 \ + --hash=sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4 +pycparser==2.22 \ + --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc +pyct==0.5.0 \ + --hash=sha256:a4038a8885059ab8cac6f946ea30e0b5e6bdbe0b92b6723f06737035f9d65e8c +pydantic==2.10.6 \ + --hash=sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584 +pydantic-ai-slim==0.2.9 \ + --hash=sha256:d954ff84cb250d7150a7ed694e4f1f92f820205d036ee006d02fce3e62a3bc4e +pydantic-core==2.27.2 \ + --hash=sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9 +pydantic-evals==0.2.9 \ + --hash=sha256:62035ae3a5321e4d892c7372ef91af0f46b675863e827f011d5cb8550dede400 +pydantic-graph==0.2.9 \ + --hash=sha256:38ad929a0ec205bd7d5875b0b408d4f13448276aa89b6ce2a1143a7552b070ce +pydantic-settings==2.8.1 \ + --hash=sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c +pydeck==0.9.1 \ + --hash=sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038 +pydocstyle==6.3.0 \ + --hash=sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019 +pydub==0.25.1 \ + --hash=sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6 +pyerfa==2.0.1.5 \ + --hash=sha256:66292d437dcf75925b694977aa06eb697126e7b86553e620371ed3e48b5e0ad0 +pyflakes==3.2.0 \ + --hash=sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a +pygithub==2.6.1 \ + --hash=sha256:6f2fa6d076ccae475f9fc392cc6cdbd54db985d4f69b8833a28397de75ed6ca3 +pygments==2.19.1 \ + --hash=sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c +pyjwt==2.10.1 \ + --hash=sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb +pylint==3.3.6 \ + --hash=sha256:8b7c2d3e86ae3f94fb27703d521dd0b9b6b378775991f504d7c3a6275aa0a6a6 +pylint-venv==3.0.4 \ + --hash=sha256:31006a3df398f58f962c9e5620e756b284e8b2bc490594ce5ee5da41920cb32c +pyls-spyder==0.4.0 \ + --hash=sha256:1505d975f866a343d0554b6dab41b53717f4b4bc6df450dfd7d48f889fe450b9 +pymongo==4.10.1 \ + --hash=sha256:dcc07b1277e8b4bf4d7382ca133850e323b7ab048b8353af496d050671c7ac52 +pympler==1.1 \ + --hash=sha256:5b223d6027d0619584116a0cbc28e8d2e378f7a79c1e5e024f9ff3b673c58506 +pynacl==1.5.0 \ + --hash=sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93 +pynndescent==0.5.13 \ + --hash=sha256:69aabb8f394bc631b6ac475a1c7f3994c54adf3f51cd63b2730fefba5771b949 +pyodbc==5.2.0 \ + --hash=sha256:b1f5686b142759c5b2bdbeaa0692622c2ebb1f10780eb3c174b85f5607fbcf55 +pyogrio==0.10.0 \ + --hash=sha256:2a3e09839590d71ff832aa95c4f23fa00a2c63c3de82c1fbd4fb8d265792acfc +pyomo==6.9.2 \ + --hash=sha256:13ebb2f974f97afa626c2712d4f27e09a1c3d18ca11755676b743504a76e5161 +pypandoc==1.15 \ + --hash=sha256:4ededcc76c8770f27aaca6dff47724578428eca84212a31479403a9731fc2b16 +pyparsing==3.2.3 \ + --hash=sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf +pypdf==5.4.0 \ + --hash=sha256:db994ab47cadc81057ea1591b90e5b543e2b7ef2d0e31ef41a9bfe763c119dab +pyproj==3.7.0 \ + --hash=sha256:0692f806224e8ed82fe4acfa57268ff444fdaf9f330689f24c0d96e59480cce1 +pyproject-hooks==1.2.0 \ + --hash=sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913 +pyqt5==5.15.11 \ + --hash=sha256:bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517 +pyqt5-qt5==5.15.2 \ + --hash=sha256:750b78e4dba6bdf1607febedc08738e318ea09e9b10aea9ff0d73073f11f6962 +pyqt5-sip==12.17.0 \ + --hash=sha256:54c31de7706d8a9a8c0fc3ea2c70468aba54b027d4974803f8eace9c22aad41c +pyqtgraph==0.13.7 \ + --hash=sha256:7754edbefb6c367fa0dfb176e2d0610da3ada20aa7a5318516c74af5fb72bf7a +pyqtwebengine==5.15.7 \ + --hash=sha256:bd5e8c426d6f6b352cd15800d64a89b2a4a11e098460b818c7bdcf5e5612e44f +pyqtwebengine-qt5==5.15.2 \ + --hash=sha256:24231f19e1595018779977de6722b5c69f3d03f34a5f7574ff21cd1e764ef76d +pyserial==3.5 \ + --hash=sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0 +pysocks==1.7.1 \ + --hash=sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5 +pyspnego==0.11.2 \ + --hash=sha256:74abc1fb51e59360eb5c5c9086e5962174f1072c7a50cf6da0bda9a4bcfdfbd4 +pytest==8.3.5 \ + --hash=sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820 +python-barcode==0.15.1 \ + --hash=sha256:057636fba37369c22852410c8535b36adfbeb965ddfd4e5b6924455d692e0886 +python-dateutil==2.8.2 \ + --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 +python-dotenv==1.1.0 \ + --hash=sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d +python-json-logger==3.3.0 \ + --hash=sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7 +python-lsp-black==2.0.0 \ + --hash=sha256:d5efdee45f5fa9e5241f5d4d396cd46127f45c85817916b1fd92c2986652bf7e +python-lsp-jsonrpc==1.1.2 \ + --hash=sha256:7339c2e9630ae98903fdaea1ace8c47fba0484983794d6aafd0bd8989be2b03c +python-lsp-server==1.12.2 \ + --hash=sha256:750116459449184ba20811167cdf96f91296ae12f1f65ebd975c5c159388111b +python-multipart==0.0.20 \ + --hash=sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104 +python-slugify==8.0.4 \ + --hash=sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8 +pythonqwt==0.14.5 \ + --hash=sha256:be5a9d2e1ba22aaa02eb397c5b3b5e4e1d9ed2c08f45554d8b920d8fc3be6dc7 +pytoolconfig==1.3.1 \ + --hash=sha256:5d8cea8ae1996938ec3eaf44567bbc5ef1bc900742190c439a44a704d6e1b62b +pytz==2025.2 \ + --hash=sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00 +pyuca==1.2 \ + --hash=sha256:abaa12e1bd2c7c68ca8396ff8383bc0654a739cef3ae68fd7af58bf29af0a91e +pyusb==1.3.1 \ + --hash=sha256:bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430 +pyviz-comms==3.0.4 \ + --hash=sha256:a40d17db26ec13cf975809633804e712bd24b473e77388c193c44043f85d0b25 +pywavelets==1.8.0 \ + --hash=sha256:810a23a631da596fef7196ddec49b345b1aab13525bb58547eeebe1769edbbc1 +pywin32==310 \ + --hash=sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060 +pywin32-ctypes==0.2.3 \ + --hash=sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8 +pywinpty==2.0.15 \ + --hash=sha256:83a8f20b430bbc5d8957249f875341a60219a4e971580f2ba694fbfb54a45ebc +pyyaml==6.0.2 \ + --hash=sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8 +pyzmq==26.4.0 \ + --hash=sha256:056a97aab4064f526ecb32f4343917a4022a5d9efb6b9df990ff72e1879e40be +qdarkstyle==3.2.3 \ + --hash=sha256:ea980ee426d594909cf1058306832af71ff6cbad6f69237b036d1550635aefbc +qdldl==0.1.7.post5 \ + --hash=sha256:13dfc0b225a5c180512488fa51f1771e8fa3c06d7fce9fd3c1d018bc03ba0eec +qrcode==8.0 \ + --hash=sha256:9fc05f03305ad27a709eb742cf3097fa19e6f6f93bb9e2f039c0979190f6f1b1 +qstylizer==0.2.4 \ + --hash=sha256:8f384dfe86f9edb0bb596b93663a51f124f0794b94fd54057cc7cf9cea59fb6f +qtawesome==1.4.0 \ + --hash=sha256:a4d689fa071c595aa6184171ce1f0f847677cb8d2db45382c43129f1d72a3d93 +qtconsole==5.6.1 \ + --hash=sha256:3d22490d9589bace566ad4f3455b61fa2209156f40e87e19e2c3cb64e9264950 +qtpy==2.4.3 \ + --hash=sha256:72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1 +quantecon==0.7.2 \ + --hash=sha256:d1333ca7bc3046efe3655d9eeeefb299051b00870b8608cb5bc0b88e3bdb8b67 +quart==0.20.0 \ + --hash=sha256:003c08f551746710acb757de49d9b768986fd431517d0eb127380b656b98b8f1 +rapidfuzz==3.13.0 \ + --hash=sha256:6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e +readme-renderer==44.0 \ + --hash=sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151 +redis==5.2.1 \ + --hash=sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4 +referencing==0.36.2 \ + --hash=sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0 +regex==2024.11.6 \ + --hash=sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b +reportlab==4.3.1 \ + --hash=sha256:0f37dd16652db3ef84363cf744632a28c38bd480d5bf94683466852d7bb678dd +requests==2.32.3 \ + --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 +requests-ntlm==1.3.0 \ + --hash=sha256:4c7534a7d0e482bb0928531d621be4b2c74ace437e88c5a357ceb7452d25a510 +requests-toolbelt==1.0.0 \ + --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06 +rfc3339-validator==0.1.4 \ + --hash=sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa +rfc3986==2.0.0 \ + --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd +rfc3986-validator==0.1.1 \ + --hash=sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9 +rich==14.0.0 \ + --hash=sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0 +rope==1.13.0 \ + --hash=sha256:b435a0c0971244fdcd8741676a9fae697ae614c20cc36003678a7782f25c0d6c +rpds-py==0.24.0 \ + --hash=sha256:998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034 +rsa==4.7.2 \ + --hash=sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2 +rtree==1.4.0 \ + --hash=sha256:ba83efc7b7563905b1bfdfc14490c4bfb59e92e5e6156bdeb6ec5df5117252f4 +rx==3.2.0 \ + --hash=sha256:922c5f4edb3aa1beaa47bf61d65d5380011ff6adcd527f26377d05cb73ed8ec8 +scikit-image==0.25.2 \ + --hash=sha256:bdd2b8c1de0849964dbc54037f36b4e9420157e67e45a8709a80d727f52c7da2 +scikit-learn==1.6.1 \ + --hash=sha256:70b1d7e85b1c96383f872a519b3375f92f14731e279a7b4c6cfd650cf5dffc52 +scipy==1.15.3 \ + --hash=sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed +scramp==1.4.5 \ + --hash=sha256:50e37c464fc67f37994e35bee4151e3d8f9320e9c204fca83a5d313c121bbbe7 +scs==3.2.7.post2 \ + --hash=sha256:2995d4099943c3fd754b3e39fe178a9c03dcb9c7d84b40f64ac5eb26d8d6085a +seaborn==0.13.2 \ + --hash=sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987 +send2trash==1.8.3 \ + --hash=sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9 +setuptools==79.0.1 \ + --hash=sha256:e147c0549f27767ba362f9da434eab9c5dc0045d5304feb602a0af001089fc51 +shapely==2.1.0 \ + --hash=sha256:f4f47e631aa4f9ec5576eac546eb3f38802e2f82aeb0552f9612cb9a14ece1db +shellingham==1.5.4 \ + --hash=sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686 +simplejson==3.19.3 \ + --hash=sha256:1e662336db50ad665777e6548b5076329a94a0c3d4a0472971c588b3ef27de3a +simpy==4.1.1 \ + --hash=sha256:7c5ae380240fd2238671160e4830956f8055830a8317edf5c05e495b3823cd88 +six==1.17.0 \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 +sklearn-compat==0.1.3 \ + --hash=sha256:a8aaf8ef711988cbd63f187c5560b5f16b25df663aaa1d2d0e1291341d339f80 +skrub==0.5.3 \ + --hash=sha256:b6ba417fa83d1f7e9a69656e0860b061381b9bd19808692a2b5bef8588c72775 +smmap==5.0.2 \ + --hash=sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e +sniffio==1.3.1 \ + --hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 +snowballstemmer==2.2.0 \ + --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a +sortedcontainers==2.4.0 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 +sounddevice==0.5.1 \ + --hash=sha256:4313b63f2076552b23ac3e0abd3bcfc0c1c6a696fc356759a13bd113c9df90f1 +soupsieve==2.6 \ + --hash=sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9 +sphinx==8.1.3 \ + --hash=sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2 +sphinx-rtd-theme==3.0.2 \ + --hash=sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13 +sphinxcontrib-applehelp==2.0.0 \ + --hash=sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 +sphinxcontrib-devhelp==2.0.0 \ + --hash=sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 +sphinxcontrib-htmlhelp==2.1.0 \ + --hash=sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 +sphinxcontrib-jquery==4.1 \ + --hash=sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae +sphinxcontrib-jsmath==1.0.1 \ + --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 +sphinxcontrib-qthelp==2.0.0 \ + --hash=sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb +sphinxcontrib-serializinghtml==2.0.0 \ + --hash=sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 +spyder==6.0.7 \ + --hash=sha256:b725569bb8ddc7b0aab73d747d85312dc0456978370cc0f9b1a101c0fe4f076b +spyder-kernels==3.0.5 \ + --hash=sha256:9cc808e0ec4426b9ba911128e221fa2234e6c8d6e08526132e90112ff9c2bb7c +sqlalchemy==2.0.40 \ + --hash=sha256:2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0 +sqlite-bro==0.13.1 \ + --hash=sha256:c26033b0af133049ca578b5fd30b2372f002e7ff934b39774aa4d2da7638c23d +sqlite-fts4==1.0.3 \ + --hash=sha256:0359edd8dea6fd73c848989e1e2b1f31a50fe5f9d7272299ff0e8dbaa62d035f +sqlite-utils==3.38 \ + --hash=sha256:8a27441015c3b2ef475f555861f7a2592f73bc60d247af9803a11b65fc605bf9 +sqlparse==0.5.3 \ + --hash=sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca +squarify==0.4.4 \ + --hash=sha256:d7597724e29d48aa14fd2f551060d6b09e1f0a67e4cd3ea329fe03b4c9a56f11 +sse-starlette==2.2.1 \ + --hash=sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99 +sspilib==0.2.0 \ + --hash=sha256:40a97ca83e503a175d1dc9461836994e47e8b9bcf56cab81a2c22e27f1993079 +stack-data==0.6.3 \ + --hash=sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 +starlette==0.46.2 \ + --hash=sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35 +statsmodels==0.14.4 \ + --hash=sha256:7f7917a51766b4e074da283c507a25048ad29a18e527207883d73535e0dc6184 +streamlit==1.46.0 \ + --hash=sha256:f8624acabafcf18611a0fac2635cf181a7ba922b45bd131ae15fc8f80e1a5482 +superqt==0.7.3 \ + --hash=sha256:8f7d141665b31baa484747f324fc9fc2d14223f2fefc92ffed6ea35c92221304 +sv-ttk==2.6.0 \ + --hash=sha256:4319c52edf2e14732fe84bdc9788e26f9e9a1ad79451ec0f89f0120ffc8105d9 +sympy==1.14.0 \ + --hash=sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5 +tabulate==0.9.0 \ + --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f +tblib==3.1.0 \ + --hash=sha256:670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e +tenacity==9.1.2 \ + --hash=sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138 +termcolor==3.1.0 \ + --hash=sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa +terminado==0.18.1 \ + --hash=sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0 +text-unidecode==1.3 \ + --hash=sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8 +textdistance==4.6.3 \ + --hash=sha256:0cb1b2cc8e3339ddc3e0f8c870e49fb49de6ecc42a718917308b3c971f34aa56 +thefuzz==0.22.1 \ + --hash=sha256:59729b33556850b90e1093c4cf9e618af6f2e4c985df193fdf3c5b5cf02ca481 +threadpoolctl==3.6.0 \ + --hash=sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb +three-merge==0.1.1 \ + --hash=sha256:dd219f4696aa0bbec6099ac3528b4de0450ff9bde862dd8f6d6f52e745f83464 +tifffile==2025.3.30 \ + --hash=sha256:0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c +tiktoken==0.9.0 \ + --hash=sha256:5a62d7a25225bafed786a524c1b9f0910a1128f4232615bf3f8257a73aaa3b16 +tinycss2==1.4.0 \ + --hash=sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289 +tokenizers==0.21.1 \ + --hash=sha256:0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382 +toml==0.10.2 \ + --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b +tomli==2.2.1 \ + --hash=sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4 +tomli-w==1.2.0 \ + --hash=sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90 +tomlkit==0.13.2 \ + --hash=sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde +toolz==1.0.0 \ + --hash=sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236 +tornado==6.5.1 \ + --hash=sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b +tqdm==4.67.1 \ + --hash=sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2 +traitlets==5.14.3 \ + --hash=sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f +traittypes==0.2.1 \ + --hash=sha256:1340af133810b6eee1a2eb2e988f862b0d12b6c2d16f282aaf3207b782134c2e +trio==0.30.0 \ + --hash=sha256:3bf4f06b8decf8d3cf00af85f40a89824669e2d033bb32469d34840edcfc22a5 +trove-classifiers==2025.5.9.12 \ + --hash=sha256:e381c05537adac78881c8fa345fd0e9970159f4e4a04fcc42cfd3129cca640ce +twine==6.1.0 \ + --hash=sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384 +typer==0.15.2 \ + --hash=sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc +types-python-dateutil==2.9.0.20240316 \ + --hash=sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b +types-requests==2.32.0.20250328 \ + --hash=sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2 +typing-extensions==4.13.2 \ + --hash=sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c +typing-inspection==0.4.0 \ + --hash=sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f +tzdata==2025.2 \ + --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 +tzlocal==5.3.1 \ + --hash=sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d +uc-micro-py==1.0.3 \ + --hash=sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5 +ujson==5.10.0 \ + --hash=sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc +umap-learn==0.5.7 \ + --hash=sha256:6a7e0be2facfa365a5ed6588447102bdbef32a0ef449535c25c97ea7e680073c +uncertainties==3.2.2 \ + --hash=sha256:fd8543355952f4052786ed4150acaf12e23117bd0f5bd03ea07de466bce646e7 +uri-template==1.3.0 \ + --hash=sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363 +urllib3==2.4.0 \ + --hash=sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813 +uvicorn==0.34.2 \ + --hash=sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403 +vega-datasets==0.9.0 \ + --hash=sha256:3d7c63917be6ca9b154b565f4779a31fedce57b01b5b9d99d8a34a7608062a1d +waitress==3.0.0 \ + --hash=sha256:2a06f242f4ba0cc563444ca3d1998959447477363a2d7e9b8b4d75d35cfd1669 +watchdog==6.0.0 \ + --hash=sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680 +wcwidth==0.2.13 \ + --hash=sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 +webcolors==24.11.1 \ + --hash=sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9 +webencodings==0.5.1 \ + --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 +websocket-client==1.8.0 \ + --hash=sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526 +websockets==14.2 \ + --hash=sha256:44bba1a956c2c9d268bdcdf234d5e5ff4c9b6dc3e300545cbe99af59dda9dcce +werkzeug==3.1.3 \ + --hash=sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e +whatthepatch==1.0.7 \ + --hash=sha256:1b6f655fd31091c001c209529dfaabbabdbad438f5de14e3951266ea0fc6e7ed +wheel==0.45.1 \ + --hash=sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248 +widgetsnbextension==4.0.14 \ + --hash=sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575 +wordcloud==1.9.4 \ + --hash=sha256:360977705d0808a1795fcbe98afb5dc4833cb4bb8e421cbb10e93ef0bce816ff +wrapt==1.16.0 \ + --hash=sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8 +wsproto==1.2.0 \ + --hash=sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736 +xarray==2025.4.0 \ + --hash=sha256:b27defd082c5cb85d32c695708de6bb05c2838fb7caaf3f952982e602a35b9b8 +xlsxwriter==3.2.3 \ + --hash=sha256:593f8296e8a91790c6d0378ab08b064f34a642b3feb787cf6738236bd0a4860d +xyzservices==2023.10.1 \ + --hash=sha256:6a4c38d3a9f89d3e77153eff9414b36a8ee0850c9e8b85796fd1b2a85b8dfd68 +yapf==0.40.1 \ + --hash=sha256:b8bfc1f280949153e795181768ca14ef43d7312629a06c43e7abd279323af313 +yarl==1.18.3 \ + --hash=sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477 +yt-dlp==2025.2.19 \ + --hash=sha256:3ed218eaeece55e9d715afd41abc450dc406ee63bf79355169dfde312d38fdb8 +zict==3.0.0 \ + --hash=sha256:5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae +zipp==3.21.0 \ + --hash=sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931 +zstandard==0.23.0 \ + --hash=sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b diff --git a/changelogs/requir.64-3_13_5_0slim.txt b/changelogs/requir.64-3_13_5_0slim.txt new file mode 100644 index 00000000..d01e834e --- /dev/null +++ b/changelogs/requir.64-3_13_5_0slim.txt @@ -0,0 +1,998 @@ +absl-py==2.2.2 \ + --hash=sha256:e5797bc6abe45f64fd95dc06394ca3f2bedf3b5d895e9da691c9ee3397d70092 +adbc-driver-manager==1.3.0 \ + --hash=sha256:0d327006f5993385b3625e3524a851ea7050aa3b1716bddd52c8892ac9c42145 +aiofiles==23.2.1 \ + --hash=sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107 +aiohappyeyeballs==2.6.1 \ + --hash=sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8 +aiohttp==3.11.18 \ + --hash=sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01 +aiosignal==1.3.2 \ + --hash=sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5 +aiosqlite==0.20.0 \ + --hash=sha256:36a1deaca0cac40ebe32aac9977a6e2bbc7f5189f23f4a54d5908986729e5bd6 +alabaster==0.7.16 \ + --hash=sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92 +alembic==1.15.2 \ + --hash=sha256:2e76bd916d547f6900ec4bb5a90aeac1485d2c92536923d0b138c02b126edc53 +altair==5.5.0 \ + --hash=sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c +annotated-types==0.7.0 \ + --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 +ansicolors==1.1.8 \ + --hash=sha256:00d2dde5a675579325902536738dd27e4fac1fd68f773fe36c21044eb559e187 +anthropic==0.51.0 \ + --hash=sha256:b8b47d482c9aa1f81b923555cebb687c2730309a20d01be554730c8302e0f62a +anyio==4.9.0 \ + --hash=sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c +anywidget==0.9.18 \ + --hash=sha256:944b82ef1dd17b8ff0fb6d1f199f613caf9111338e6e2857da478f6e73770cb8 +appdirs==1.4.4 \ + --hash=sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128 +argcomplete==3.6.2 \ + --hash=sha256:65b3133a29ad53fb42c48cf5114752c7ab66c1c38544fdf6460f450c09b42591 +argon2-cffi==23.1.0 \ + --hash=sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea +argon2-cffi-bindings==21.2.0 \ + --hash=sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f +array-api-compat==1.12.0 \ + --hash=sha256:a0b4795b6944a9507fde54679f9350e2ad2b1e2acf4a2408a098cdc27f890a8b +arrow==1.3.0 \ + --hash=sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80 +asgi-csrf==0.11 \ + --hash=sha256:03ac140115f39d4295288a9adf74fdc6ae607f6ef44abee8466520458207242b +asgiref==3.8.1 \ + --hash=sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47 +asn1crypto==1.5.1 \ + --hash=sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67 +asteval==1.0.5 \ + --hash=sha256:082b95312578affc8a6d982f7d92b7ac5de05634985c87e7eedd3188d31149fa +astroid==3.3.9 \ + --hash=sha256:d05bfd0acba96a7bd43e222828b7d9bc1e138aaeb0649707908d3702a9831248 +astropy==6.1.6 \ + --hash=sha256:fafc65f47dedcc4a8112bce8b67f215a8076af214be34a2c34abc96d078f2b37 +astropy-iers-data==0.2024.12.23.0.33.24 \ + --hash=sha256:40d3c6b6a5cf4dc6ad91b92b7e0f949e5366234e3c4440302247429fc8294302 +asttokens==3.0.0 \ + --hash=sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2 +async-lru==2.0.5 \ + --hash=sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943 +asyncssh==2.20.0 \ + --hash=sha256:af6888d937c07a4bf31293335a6166b4d87608cdb5957b49547da6ad87ecf174 +atomicwrites==1.4.0 \ + --hash=sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197 +attrs==25.3.0 \ + --hash=sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3 +autopep8==2.0.4 \ + --hash=sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb +azure-core==1.32.0 \ + --hash=sha256:eac191a0efb23bfa83fddf321b27b122b4ec847befa3091fa736a5c32c50d7b4 +azure-cosmos==4.9.0 \ + --hash=sha256:3b60eaa01a16a857d0faf0cec304bac6fa8620a81bc268ce760339032ef617fe +azure-identity==1.21.0 \ + --hash=sha256:258ea6325537352440f71b35c3dffe9d240eae4a5126c1b7ce5efd5766bd9fd9 +babel==2.17.0 \ + --hash=sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2 +baresql==1.0.0 \ + --hash=sha256:a24d17f46beb47c221f328f7e06710e3896c6203a8e1909788d7128f27b86f01 +bcrypt==4.3.0 \ + --hash=sha256:e53e074b120f2877a35cc6c736b8eb161377caae8925c17688bd46ba56daaa5b +beautifulsoup4==4.13.3 \ + --hash=sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16 +binaryornot==0.4.4 \ + --hash=sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4 +black==25.1.0 \ + --hash=sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18 +bleach==6.2.0 \ + --hash=sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e +blinker==1.9.0 \ + --hash=sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc +bokeh==3.7.3 \ + --hash=sha256:b0e79dd737f088865212e4fdcb0f3b95d087f0f088bf8ca186a300ab1641e2c7 +branca==0.8.1 \ + --hash=sha256:d29c5fab31f7c21a92e34bf3f854234e29fecdcf5d2df306b616f20d816be425 +brotli==1.1.0 \ + --hash=sha256:9011560a466d2eb3f5a6e4929cf4a09be405c64154e12df0dd72713f6500e32b +build==1.2.2.post1 \ + --hash=sha256:1d61c0887fa860c01971625baae8bdd338e517b836a2f70dd1f7aa3a6b2fc5b5 +cachetools==5.5.2 \ + --hash=sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a +certifi==2025.1.31 \ + --hash=sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe +cffi==1.17.1 \ + --hash=sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a +chardet==5.2.0 \ + --hash=sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970 +charset-normalizer==3.4.2 \ + --hash=sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980 +clarabel==0.10.0 \ + --hash=sha256:7871b6f499ad66f71d4e7fb40754c4d986d4316f242beb62ff4f63a69785a50c +click==8.1.8 \ + --hash=sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2 +click-default-group==1.2.4 \ + --hash=sha256:9b60486923720e7fc61731bdb32b617039aba820e22e1c88766b1125592eaa5f +cloudpickle==3.1.1 \ + --hash=sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e +cohere==5.15.0 \ + --hash=sha256:22ff867c2a6f2fc2b585360c6072f584f11f275ef6d9242bac24e0fa2df1dfb5 +colorama==0.4.6 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 +colorcet==3.1.0 \ + --hash=sha256:2a7d59cc8d0f7938eeedd08aad3152b5319b4ba3bcb7a612398cc17a384cb296 +colorlog==6.9.0 \ + --hash=sha256:5906e71acd67cb07a71e779c47c4bcb45fb8c2993eebe9e5adcd6a6f1b283eff +comm==0.2.2 \ + --hash=sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3 +contourpy==1.3.2 \ + --hash=sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9 +cookiecutter==2.6.0 \ + --hash=sha256:a54a8e37995e4ed963b3e82831072d1ad4b005af736bb17b99c2cbd9d41b6e2d +cryptography==44.0.0 \ + --hash=sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede +cvxopt==1.3.2 \ + --hash=sha256:0a0987966009ad383de0918e61255d34ed9ebc783565bcb15470d4155010b6bf +cvxpy==1.6.4 \ + --hash=sha256:1eed0ac8d8c0141abc73535d652f7b133acfbab2149f5d9d6fa348353c90b442 +cycler==0.12.1 \ + --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 +cython==3.1.1 \ + --hash=sha256:e000f0533eedf3d6dfbe30bb3c58a054c58f0a7778390342fa577a0dc47adab3 +cytoolz==1.0.1 \ + --hash=sha256:90e577e08d3a4308186d9e1ec06876d4756b1e8164b92971c69739ea17e15297 +dask==2025.4.1 \ + --hash=sha256:aacbb0a9667856fe58385015efd64aca22f0c0b2c5e1b5e633531060303bb4be +datasette==0.65.1 \ + --hash=sha256:ba7adf717ddcc24a2a8ac57890fffd384a2ebb909b342e4f731ba09eba764305 +datasette-graphql==2.2 \ + --hash=sha256:cd9f61afdcaab1ce4ff6775296e6ece99305bf05cbfae4c1c938a6c9e60cd485 +datashader==0.17.0 \ + --hash=sha256:39421ff999294913e63d41954af955a5dece5d0c55d8fce1426043d70b22d07a +deap==1.4.2 \ + --hash=sha256:1abab976c75b0f18c36e81f968fcc77fac69fc9bedbab8be3323ca376f6fcfa4 +debugpy==1.8.13 \ + --hash=sha256:79ce4ed40966c4c1631d0131606b055a5a2f8e430e3f7bf8fd3744b09943e8e8 +decorator==5.2.1 \ + --hash=sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a +defusedxml==0.7.1 \ + --hash=sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 +deprecated==1.2.14 \ + --hash=sha256:6fac8b097794a90302bdbb17b9b815e732d3c4720583ff1b198499d78470466c +diff-match-patch==20241021 \ + --hash=sha256:93cea333fb8b2bc0d181b0de5e16df50dd344ce64828226bda07728818936782 +dill==0.4.0 \ + --hash=sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049 +distributed==2025.4.1 \ + --hash=sha256:3a7834451b04ef059928045eab6ff6d88ad7bcfd48adc99403127d9a6818b5fa +distro==1.9.0 \ + --hash=sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2 +django==5.2 \ + --hash=sha256:91ceed4e3a6db5aedced65e3c8f963118ea9ba753fc620831c77074e620e7d83 +dnspython==2.7.0 \ + --hash=sha256:b4c34b7d10b51bcc3a5071e7b8dee77939f1e878477eeecc965e9835f63c6c86 +docstring-to-markdown==0.17 \ + --hash=sha256:fd7d5094aa83943bf5f9e1a13701866b7c452eac19765380dead666e36d3711c +docutils==0.21.2 \ + --hash=sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2 +duckdb==1.3.0 \ + --hash=sha256:fbdfc1c0b83b90f780ae74038187ee696bb56ab727a289752372d7ec42dda65b +entrypoints==0.4 \ + --hash=sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f +et-xmlfile==1.1.0 \ + --hash=sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada +eval-type-backport==0.2.2 \ + --hash=sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a +executing==2.2.0 \ + --hash=sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa +faker==37.1.0 \ + --hash=sha256:dc2f730be71cb770e9c715b13374d80dbcee879675121ab51f9683d262ae9a1c +fasta2a==0.2.9 \ + --hash=sha256:8b855b36f29fde6dcb79ad55be337a8165381b679bec829913009c55581e284e +fastapi==0.115.12 \ + --hash=sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d +fastavro==1.10.0 \ + --hash=sha256:86baf8c9740ab570d0d4d18517da71626fe9be4d1142bea684db52bd5adb078f +fastjsonschema==2.21.1 \ + --hash=sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667 +filelock==3.18.0 \ + --hash=sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de +flake8==7.1.1 \ + --hash=sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213 +flask==3.1.0 \ + --hash=sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136 +flexcache==0.3 \ + --hash=sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32 +flexparser==0.4 \ + --hash=sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846 +flit==3.12.0 \ + --hash=sha256:2b4e7171dc22881fa6adc2dbf083e5ecc72520be3cd7587d2a803da94d6ef431 +flit-core==3.12.0 \ + --hash=sha256:e7a0304069ea895172e3c7bb703292e992c5d1555dd1233ab7b5621b5b69e62c +folium==0.19.5 \ + --hash=sha256:4333fb3e6f3e9eedb231615d22c6d7df20aea5829554bd6908675865a37803b3 +fonttools==4.57.0 \ + --hash=sha256:f1d6bc9c23356908db712d282acb3eebd4ae5ec6d8b696aa40342b1d84f8e9e3 +fqdn==1.5.1 \ + --hash=sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014 +frozenlist==1.5.0 \ + --hash=sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28 +fsspec==2025.3.2 \ + --hash=sha256:2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711 +fuzzywuzzy==0.18.0 \ + --hash=sha256:928244b28db720d1e0ee7587acf660ea49d7e4c632569cad4f1cd7e68a5f0993 +geographiclib==2.0 \ + --hash=sha256:6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734 +geopandas==1.0.1 \ + --hash=sha256:01e147d9420cc374d26f51fc23716ac307f32b49406e4bd8462c07e82ed1d3d6 +geopy==2.4.1 \ + --hash=sha256:ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7 +gitdb==4.0.12 \ + --hash=sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf +gitpython==3.1.44 \ + --hash=sha256:9e0e10cda9bed1ee64bc9a6de50e7e38a9c9943241cd7f585f6df3ed28011110 +google-auth==2.38.0 \ + --hash=sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a +google-genai==1.16.1 \ + --hash=sha256:6ae5d24282244f577ca4f0d95c09f75ab29e556602c9d3531b70161e34cd2a39 +graphene==3.4.3 \ + --hash=sha256:820db6289754c181007a150db1f7fff544b94142b556d12e3ebc777a7bf36c71 +graphql-core==3.2.6 \ + --hash=sha256:78b016718c161a6fb20a7d97bbf107f331cd1afe53e45566c59f776ed7f0b45f +graphql-relay==3.2.0 \ + --hash=sha256:c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5 +greenlet==3.1.1 \ + --hash=sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761 +griffe==1.7.2 \ + --hash=sha256:1ed9c2e338a75741fc82083fe5a1bc89cb6142efe126194cc313e34ee6af5423 +groq==0.25.0 \ + --hash=sha256:aadc78b40b1809cdb196b1aa8c7f7293108767df1508cafa3e0d5045d9328e7a +guidata==3.9.0 \ + --hash=sha256:96a19dc92850bdb3e463fa06e8c22793e090db42d1e72c6dae9bda1a98b61210 +h11==0.14.0 \ + --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 +h2==4.2.0 \ + --hash=sha256:479a53ad425bb29af087f3458a61d30780bc818e4ebcf01f0b536ba916462ed0 +h5py==3.12.1 \ + --hash=sha256:52ab036c6c97055b85b2a242cb540ff9590bacfda0c03dd0cf0661b311f522f8 +hatchling==1.27.0 \ + --hash=sha256:d3a2f3567c4f926ea39849cdf924c7e99e6686c9c8e288ae1037c8fa2a5d937b +holoviews==1.20.2 \ + --hash=sha256:1f892c04bc23e8a3a9cde082b606b9463c9ff78c3d0c00e2ddcc41fe6e738458 +hpack==4.1.0 \ + --hash=sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496 +html5lib==1.1 \ + --hash=sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d +httpcore==1.0.7 \ + --hash=sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd +httpie==3.2.4 \ + --hash=sha256:4bd0435cc4b9bca59501bc65089de96f3e93b393803f32a81951db62050ebf0b +httpx==0.28.1 \ + --hash=sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad +httpx-sse==0.4.0 \ + --hash=sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f +huggingface-hub==0.33.0 \ + --hash=sha256:e8668875b40c68f9929150d99727d39e5ebb8a05a98e4191b908dc7ded9074b3 +hupper==1.12.1 \ + --hash=sha256:e872b959f09d90be5fb615bd2e62de89a0b57efc037bdf9637fb09cdf8552b19 +hvplot==0.11.2 \ + --hash=sha256:9d576a0c2df0f1cf5041545f2a2eddcf962510162876991cae4d1779fad74556 +hypercorn==0.17.3 \ + --hash=sha256:059215dec34537f9d40a69258d323f56344805efb462959e727152b0aa504547 +hyperframe==6.1.0 \ + --hash=sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5 +hypothesis==6.130.4 \ + --hash=sha256:cda4a57115d10ecbefe0a9cc8d69d20a13eb56ecbfe7c24eaee5d368c2b7c477 +id==1.5.0 \ + --hash=sha256:f1434e1cef91f2cbb8a4ec64663d5a23b9ed43ef44c4c957d02583d61714c658 +idna==3.10 \ + --hash=sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3 +imageio==2.37.0 \ + --hash=sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed +imagesize==1.4.1 \ + --hash=sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b +imbalanced-learn==0.13.0 \ + --hash=sha256:7eb5859f7827cb3babfa5789978c22fe36e56527d9c9768df2d864d98d9b40fe +importlib-metadata==8.6.1 \ + --hash=sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e +inflection==0.5.1 \ + --hash=sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2 +iniconfig==2.1.0 \ + --hash=sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760 +intervaltree==3.1.0 \ + --hash=sha256:902b1b88936918f9b2a19e0e5eb7ccb430ae45cde4f39ea4b36932920d33952d +ipycanvas==0.13.3 \ + --hash=sha256:d37adb2f45d2fef1c3d33c69a0518055694d87827b2f577f3c426d7712f75daa +ipykernel==6.29.5 \ + --hash=sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5 +ipyleaflet==0.19.2 \ + --hash=sha256:7cc9157848baca2e1793b96e79f8bdb1aa7340521d2b7d8a62aa8bc30eab5278 +ipympl==0.9.7 \ + --hash=sha256:3698ee7eaa0b047a7603517d7aa1b71b32118a5f51754cab45ec5d994f67208f +ipython==8.36.0 \ + --hash=sha256:12b913914d010dcffa2711505ec8be4bf0180742d97f1e5175e51f22086428c1 +ipython-genutils==0.2.0 \ + --hash=sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8 +ipython-sql==0.5.0 \ + --hash=sha256:61b46ecffb956f62dbc17b5744cf70c649104c8db9afd821aa39b31f7cbb5d5b +ipywidgets==8.1.6 \ + --hash=sha256:446e7630a1d025bdc7635e1169fcc06f2ce33b5bd41c2003edeb4a47c8d4bbb1 +isoduration==20.11.0 \ + --hash=sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042 +isort==5.13.2 \ + --hash=sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6 +itsdangerous==2.2.0 \ + --hash=sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef +janus==2.0.0 \ + --hash=sha256:7e6449d34eab04cd016befbd7d8c0d8acaaaab67cb59e076a69149f9031745f9 +jaraco-classes==3.4.0 \ + --hash=sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790 +jaraco-context==6.0.1 \ + --hash=sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4 +jaraco-functools==4.1.0 \ + --hash=sha256:ad159f13428bc4acbf5541ad6dec511f91573b90fba04df61dafa2a1231cf649 +jedi==0.19.2 \ + --hash=sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9 +jellyfish==1.1.3 \ + --hash=sha256:2113195a48ce8cb99d2bb2c6d9b119f58025dde1d727101518e7150c093a66da +jinja2==3.1.6 \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 +jiter==0.9.0 \ + --hash=sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7 +joblib==1.4.2 \ + --hash=sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6 +json5==0.10.0 \ + --hash=sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa +jsonpatch==1.33 \ + --hash=sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade +jsonpointer==3.0.0 \ + --hash=sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942 +jsonschema==4.23.0 \ + --hash=sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 +jsonschema-specifications==2024.10.1 \ + --hash=sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf +julia==0.6.2 \ + --hash=sha256:90752f71376fdb9919439d20496c2dab24486dfa4fe8a831d6dd14a1bcbc04d1 +jupyter==1.1.1 \ + --hash=sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83 +jupyter-bokeh==4.0.5 \ + --hash=sha256:1110076c14c779071cf492646a1a871aefa8a477261e4721327a666e65df1a2c +jupyter-client==8.6.3 \ + --hash=sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f +jupyter-console==6.6.3 \ + --hash=sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485 +jupyter-core==5.7.2 \ + --hash=sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409 +jupyter-events==0.12.0 \ + --hash=sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb +jupyter-leaflet==0.19.2 \ + --hash=sha256:0d57e15e80c08a4360f0cde0b4c490beddc5d422bb0e9bc1c0b4479d3fb725a6 +jupyter-lsp==2.2.5 \ + --hash=sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da +jupyter-server==2.15.0 \ + --hash=sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3 +jupyter-server-terminals==0.5.3 \ + --hash=sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa +jupyterlab==4.4.2 \ + --hash=sha256:857111a50bed68542bf55dca784522fe728f9f88b4fe69e8c585db5c50900419 +jupyterlab-pygments==0.3.0 \ + --hash=sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780 +jupyterlab-server==2.27.3 \ + --hash=sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4 +jupyterlab-widgets==3.0.14 \ + --hash=sha256:54c33e3306b7fca139d165d6190dc6c0627aafa5d14adfc974a4e9a3d26cb703 +keras==3.10.0 \ + --hash=sha256:c095a6bf90cd50defadf73d4859ff794fad76b775357ef7bd1dbf96388dae7d3 +keyring==25.6.0 \ + --hash=sha256:552a3f7af126ece7ed5c89753650eec89c7eaae8617d0aa4d9ad2b75111266bd +kiwisolver==1.4.8 \ + --hash=sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2 +langchain==0.3.25 \ + --hash=sha256:931f7d2d1eaf182f9f41c5e3272859cfe7f94fc1f7cef6b3e5a46024b4884c21 +langchain-core==0.3.59 \ + --hash=sha256:9686baaff43f2c8175535da13faf40e6866769015e93130c3c1e4243e7244d70 +langchain-text-splitters==0.3.8 \ + --hash=sha256:e75cc0f4ae58dcf07d9f18776400cf8ade27fadd4ff6d264df6278bb302f6f02 +langsmith==0.3.42 \ + --hash=sha256:18114327f3364385dae4026ebfd57d1c1cb46d8f80931098f0f10abe533475ff +lazy-loader==0.4 \ + --hash=sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc +linkify-it-py==2.0.3 \ + --hash=sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79 +llvmlite==0.44.0 \ + --hash=sha256:2fb7c4f2fb86cbae6dca3db9ab203eeea0e22d73b99bc2341cdf9de93612e930 +lmfit==1.3.3 \ + --hash=sha256:a9e9ec7d0d0ec962cc6c078ad1ec6c8311d3ac0e5f0947a00a91f5509dacc2b2 +locket==1.0.0 \ + --hash=sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3 +logfire-api==3.12.0 \ + --hash=sha256:fc092c2dcb24c8462ba776f3b0c2183f82e1cd55f86e29b38cf21a048e66a17d +lxml==5.3.0 \ + --hash=sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d +mako==1.3.9 \ + --hash=sha256:95920acccb578427a9aa38e37a186b1e43156c87260d7ba18ca63aa4c7cbd3a1 +markdown==3.7 \ + --hash=sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803 +markdown-it-py==3.0.0 \ + --hash=sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 +markupsafe==3.0.2 \ + --hash=sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f +matplotlib==3.10.3 \ + --hash=sha256:151d89cb8d33cb23345cd12490c76fd5d18a56581a16d950b48c6ff19bb2ab93 +matplotlib-inline==0.1.7 \ + --hash=sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca +maturin==1.8.3 \ + --hash=sha256:85f2b882d8235c1c1cb0a38d382ccd5b3ba0674d99cb548d49df9342cc688e36 +mccabe==0.7.0 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e +mcp==1.9.3 \ + --hash=sha256:69b0136d1ac9927402ed4cf221d4b8ff875e7132b0b06edd446448766f34f9b9 +mdit-py-plugins==0.4.2 \ + --hash=sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636 +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 +mercantile==1.2.1 \ + --hash=sha256:30f457a73ee88261aab787b7069d85961a5703bb09dc57a170190bc042cd023f +mergedeep==1.3.4 \ + --hash=sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307 +missingno==0.5.2 \ + --hash=sha256:55782621ce09ba0f0a1d08e5bd6d6fe1946469fb03951fadf7d209911ca5b072 +mistralai==1.8.1 \ + --hash=sha256:badfc7e6832d894b3e9071d92ad621212b7cccd7df622c6cacdb525162ae338f +mistune==3.1.3 \ + --hash=sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9 +mizani==0.11.4 \ + --hash=sha256:5b6271dc3da2c88694dca2e0e0a7e1879f0e2fb046c789776f54d090a5243735 +ml-dtypes==0.5.1 \ + --hash=sha256:fd918d4e6a4e0c110e2e05be7a7814d10dc1b95872accbf6512b80a109b71ae1 +mlxtend==0.23.3 \ + --hash=sha256:f9fec721c4121be87dac00e513456dde5bf56b7427750719c0a291cd58b6538e +more-itertools==10.6.0 \ + --hash=sha256:6eb054cb4b6db1473f6e15fcc676a08e4732548acd47c708f0e179c2c7c01e89 +mpld3==0.5.10 \ + --hash=sha256:80877acce87ea447380fad7374668737505c8c0684aab05238e7c5dc1fab38c1 +mpmath==1.3.0 \ + --hash=sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c +msal==1.30.0 \ + --hash=sha256:423872177410cb61683566dc3932db7a76f661a5d2f6f52f02a047f101e1c1de +msal-extensions==1.2.0 \ + --hash=sha256:cf5ba83a2113fa6dc011a254a72f1c223c88d7dfad74cc30617c4679a417704d +msgpack==1.1.0 \ + --hash=sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f +multidict==6.4.3 \ + --hash=sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5 +multipledispatch==1.0.0 \ + --hash=sha256:0c53cd8b077546da4e48869f49b13164bebafd0c2a5afceb6bb6a316e7fb46e4 +mypy==1.15.0 \ + --hash=sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf +mypy-extensions==1.0.0 \ + --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d +mysql-connector-python==9.2.0 \ + --hash=sha256:6557942f6c6be3b41d2965456b53a244a7ce3e6fb81cb195c243549be72a6a24 +namex==0.0.8 \ + --hash=sha256:7ddb6c2bb0e753a311b7590f84f6da659dd0c05e65cb89d519d54c0a250c0487 +narwhals==1.36.0 \ + --hash=sha256:e3c50dd1d769bc145f57ae17c1f0f0da6c3d397d62cdd0bb167e9b618e95c9d6 +nbclient==0.10.2 \ + --hash=sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d +nbconvert==7.16.6 \ + --hash=sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b +nbformat==5.10.4 \ + --hash=sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b +nest-asyncio==1.6.0 \ + --hash=sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c +networkx==3.4.2 \ + --hash=sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f +nh3==0.2.18 \ + --hash=sha256:8ce0f819d2f1933953fca255db2471ad58184a60508f03e6285e5114b6254844 +nltk==3.9.1 \ + --hash=sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1 +notebook==7.4.2 \ + --hash=sha256:9ccef602721aaa5530852e3064710b8ae5415c4e2ce26f8896d0433222755259 +notebook-shim==0.2.4 \ + --hash=sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef +numba==0.61.2 \ + --hash=sha256:59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7 +numpy==2.2.6 \ + --hash=sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c +numpydoc==1.8.0 \ + --hash=sha256:72024c7fd5e17375dec3608a27c03303e8ad00c81292667955c6fea7a3ccf541 +openai==1.82.0 \ + --hash=sha256:8c40647fea1816516cb3de5189775b30b5f4812777e40b8768f361f232b61b30 +opencv-python==4.11.0.86 \ + --hash=sha256:085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec +openpyxl==3.1.5 \ + --hash=sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2 +opentelemetry-api==1.32.1 \ + --hash=sha256:bbd19f14ab9f15f0e85e43e6a958aa4cb1f36870ee62b7fd205783a112012724 +optree==0.14.1 \ + --hash=sha256:25ea23fc6d6c0fa7dcf85afcfe10b43ed4fdf0e9d958a3677cd27fcdf0ca17d6 +optuna==4.2.1 \ + --hash=sha256:6d38199013441d3f70fac27136e05c0188c5f4ec3848db708ac311cbdeb30dbf +orjson==3.10.16 \ + --hash=sha256:fe0a145e96d51971407cb8ba947e63ead2aa915db59d6631a355f5f2150b56b7 +osqp==0.6.7.post3 \ + --hash=sha256:acb219e941f5248da5de3ee9b70e6a5aaddf5f3989dffd1d4c03b0f7b1dfa17b +outcome==1.3.0.post0 \ + --hash=sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b +overrides==7.7.0 \ + --hash=sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49 +packaging==24.2 \ + --hash=sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 +pandas==2.2.3 \ + --hash=sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d +pandocfilters==1.5.1 \ + --hash=sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc +panel==1.6.3 \ + --hash=sha256:ccd2a0587ab382bd55b8ea099706f31b64aadac697b8a41923d3b18b9ed618d6 +papermill==2.6.0 \ + --hash=sha256:0f09da6ef709f3f14dde77cb1af052d05b14019189869affff374c9e612f2dd5 +param==2.2.0 \ + --hash=sha256:777f8c7b66ab820b70ea5ad09faaa6818308220caae89da3b5c5f359faa72a5e +parso==0.8.4 \ + --hash=sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18 +partd==1.4.2 \ + --hash=sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f +pathspec==0.12.1 \ + --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 +patsy==1.0.1 \ + --hash=sha256:751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c +pep8==1.7.1 \ + --hash=sha256:b22cfae5db09833bb9bd7c8463b53e1a9c9b39f12e304a8d0bba729c501827ee +pexpect==4.9.0 \ + --hash=sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 +pg8000==1.31.2 \ + --hash=sha256:436c771ede71af4d4c22ba867a30add0bc5c942d7ab27fadbb6934a487ecc8f6 +pickleshare==0.7.5 \ + --hash=sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56 +pillow==11.1.0 \ + --hash=sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c +platformdirs==4.3.7 \ + --hash=sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94 +plotly==6.0.1 \ + --hash=sha256:4714db20fea57a435692c548a4eb4fae454f7daddf15f8d8ba7e1045681d7768 +plotnine==0.13.6 \ + --hash=sha256:4acc1af29fa4e91e726b67d49277e8368f62e1c817f01bf14ecd8ca5e83bfaea +plotpy==2.7.4 \ + --hash=sha256:8dff5fd388048a8d3b4251329a9fe4027920386e0ebcc3c3642f59c432118c29 +pluggy==1.5.0 \ + --hash=sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669 +ply==3.11 \ + --hash=sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce +polars==1.31.0 \ + --hash=sha256:3fd874d3432fc932863e8cceff2cff8a12a51976b053f2eb6326a0672134a632 +portalocker==2.7.0 \ + --hash=sha256:a07c5b4f3985c3cf4798369631fb7011adb498e2a46d8440efc75a8f29a0f983 +prettytable==3.16.0 \ + --hash=sha256:b5eccfabb82222f5aa46b798ff02a8452cf530a352c31bddfa29be41242863aa +prince==0.16.0 \ + --hash=sha256:7e21a78d4dd06ca3ec526ee714a50b349f26de3fca6b79664150a951b31688f3 +priority==2.0.0 \ + --hash=sha256:6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa +prometheus-client==0.21.1 \ + --hash=sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301 +prompt-toolkit==3.0.51 \ + --hash=sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07 +propcache==0.3.1 \ + --hash=sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037 +protobuf==6.30.2 \ + --hash=sha256:7653c99774f73fe6b9301b87da52af0e69783a2e371e8b599b3e9cb4da4b12b9 +psutil==7.0.0 \ + --hash=sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553 +psygnal==0.12.0 \ + --hash=sha256:d779f20c6977ec9d5b9fece23b4b28bbcf0a7773539a4a176b5527aea5da27c7 +ptpython==3.0.29 \ + --hash=sha256:65d75c4871859e4305a020c9b9e204366dceb4d08e0e2bd7b7511bd5e917a402 +ptyprocess==0.7.0 \ + --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 +pure-eval==0.2.3 \ + --hash=sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0 +pyarrow==20.0.0 \ + --hash=sha256:30b3051b7975801c1e1d387e17c588d8ab05ced9b1e14eec57915f79869b5031 +pyasn1==0.6.1 \ + --hash=sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629 +pyasn1-modules==0.4.1 \ + --hash=sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd +pybind11==2.13.6 \ + --hash=sha256:237c41e29157b962835d356b370ededd57594a26d5894a795960f0047cb5caf5 +pycodestyle==2.12.0 \ + --hash=sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4 +pycparser==2.22 \ + --hash=sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc +pyct==0.5.0 \ + --hash=sha256:a4038a8885059ab8cac6f946ea30e0b5e6bdbe0b92b6723f06737035f9d65e8c +pydantic==2.10.6 \ + --hash=sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584 +pydantic-ai-slim==0.2.9 \ + --hash=sha256:d954ff84cb250d7150a7ed694e4f1f92f820205d036ee006d02fce3e62a3bc4e +pydantic-core==2.27.2 \ + --hash=sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee +pydantic-evals==0.2.9 \ + --hash=sha256:62035ae3a5321e4d892c7372ef91af0f46b675863e827f011d5cb8550dede400 +pydantic-graph==0.2.9 \ + --hash=sha256:38ad929a0ec205bd7d5875b0b408d4f13448276aa89b6ce2a1143a7552b070ce +pydantic-settings==2.8.1 \ + --hash=sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c +pydeck==0.9.1 \ + --hash=sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038 +pydocstyle==6.3.0 \ + --hash=sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019 +pydub==0.25.1 \ + --hash=sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6 +pyerfa==2.0.1.5 \ + --hash=sha256:66292d437dcf75925b694977aa06eb697126e7b86553e620371ed3e48b5e0ad0 +pyflakes==3.2.0 \ + --hash=sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a +pygithub==2.6.1 \ + --hash=sha256:6f2fa6d076ccae475f9fc392cc6cdbd54db985d4f69b8833a28397de75ed6ca3 +pygments==2.19.1 \ + --hash=sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c +pyjwt==2.10.1 \ + --hash=sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb +pylint==3.3.6 \ + --hash=sha256:8b7c2d3e86ae3f94fb27703d521dd0b9b6b378775991f504d7c3a6275aa0a6a6 +pylint-venv==3.0.4 \ + --hash=sha256:31006a3df398f58f962c9e5620e756b284e8b2bc490594ce5ee5da41920cb32c +pyls-spyder==0.4.0 \ + --hash=sha256:1505d975f866a343d0554b6dab41b53717f4b4bc6df450dfd7d48f889fe450b9 +pymongo==4.10.1 \ + --hash=sha256:45ee87a4e12337353242bc758accc7fb47a2f2d9ecc0382a61e64c8f01e86708 +pympler==1.1 \ + --hash=sha256:5b223d6027d0619584116a0cbc28e8d2e378f7a79c1e5e024f9ff3b673c58506 +pynacl==1.5.0 \ + --hash=sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93 +pynndescent==0.5.13 \ + --hash=sha256:69aabb8f394bc631b6ac475a1c7f3994c54adf3f51cd63b2730fefba5771b949 +pyodbc==5.2.0 \ + --hash=sha256:96d3127f28c0dacf18da7ae009cd48eac532d3dcc718a334b86a3c65f6a5ef5c +pyogrio==0.10.0 \ + --hash=sha256:02e54bcfb305af75f829044b0045f74de31b77c2d6546f7aaf96822066147848 +pyomo==6.9.2 \ + --hash=sha256:13ebb2f974f97afa626c2712d4f27e09a1c3d18ca11755676b743504a76e5161 +pypandoc==1.15 \ + --hash=sha256:4ededcc76c8770f27aaca6dff47724578428eca84212a31479403a9731fc2b16 +pyparsing==3.2.3 \ + --hash=sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf +pypdf==5.4.0 \ + --hash=sha256:db994ab47cadc81057ea1591b90e5b543e2b7ef2d0e31ef41a9bfe763c119dab +pyproj==3.7.0 \ + --hash=sha256:10a8dc6ec61af97c89ff032647d743f8dc023645773da42ef43f7ae1125b3509 +pyproject-hooks==1.2.0 \ + --hash=sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913 +pyqt5==5.15.11 \ + --hash=sha256:bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517 +pyqt5-qt5==5.15.2 \ + --hash=sha256:750b78e4dba6bdf1607febedc08738e318ea09e9b10aea9ff0d73073f11f6962 +pyqt5-sip==12.17.0 \ + --hash=sha256:672c209d05661fab8e17607c193bf43991d268a1eefbc2c4551fbf30fd8bb2ca +pyqtgraph==0.13.7 \ + --hash=sha256:7754edbefb6c367fa0dfb176e2d0610da3ada20aa7a5318516c74af5fb72bf7a +pyqtwebengine==5.15.7 \ + --hash=sha256:bd5e8c426d6f6b352cd15800d64a89b2a4a11e098460b818c7bdcf5e5612e44f +pyqtwebengine-qt5==5.15.2 \ + --hash=sha256:24231f19e1595018779977de6722b5c69f3d03f34a5f7574ff21cd1e764ef76d +pyserial==3.5 \ + --hash=sha256:c4451db6ba391ca6ca299fb3ec7bae67a5c55dde170964c7a14ceefec02f2cf0 +pysocks==1.7.1 \ + --hash=sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5 +pyspnego==0.11.2 \ + --hash=sha256:74abc1fb51e59360eb5c5c9086e5962174f1072c7a50cf6da0bda9a4bcfdfbd4 +pytest==8.3.5 \ + --hash=sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820 +python-barcode==0.15.1 \ + --hash=sha256:057636fba37369c22852410c8535b36adfbeb965ddfd4e5b6924455d692e0886 +python-dateutil==2.8.2 \ + --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 +python-dotenv==1.1.0 \ + --hash=sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d +python-json-logger==3.3.0 \ + --hash=sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7 +python-lsp-black==2.0.0 \ + --hash=sha256:d5efdee45f5fa9e5241f5d4d396cd46127f45c85817916b1fd92c2986652bf7e +python-lsp-jsonrpc==1.1.2 \ + --hash=sha256:7339c2e9630ae98903fdaea1ace8c47fba0484983794d6aafd0bd8989be2b03c +python-lsp-server==1.12.2 \ + --hash=sha256:750116459449184ba20811167cdf96f91296ae12f1f65ebd975c5c159388111b +python-multipart==0.0.20 \ + --hash=sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104 +python-slugify==8.0.4 \ + --hash=sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8 +pythonqwt==0.14.5 \ + --hash=sha256:be5a9d2e1ba22aaa02eb397c5b3b5e4e1d9ed2c08f45554d8b920d8fc3be6dc7 +pytoolconfig==1.3.1 \ + --hash=sha256:5d8cea8ae1996938ec3eaf44567bbc5ef1bc900742190c439a44a704d6e1b62b +pytz==2025.2 \ + --hash=sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00 +pyuca==1.2 \ + --hash=sha256:abaa12e1bd2c7c68ca8396ff8383bc0654a739cef3ae68fd7af58bf29af0a91e +pyusb==1.3.1 \ + --hash=sha256:bf9b754557af4717fe80c2b07cc2b923a9151f5c08d17bdb5345dac09d6a0430 +pyviz-comms==3.0.4 \ + --hash=sha256:a40d17db26ec13cf975809633804e712bd24b473e77388c193c44043f85d0b25 +pywavelets==1.8.0 \ + --hash=sha256:4dbebcfd55ea8a85b7fc8802d411e75337170422abf6e96019d7e46c394e80e5 +pywin32==310 \ + --hash=sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e +pywin32-ctypes==0.2.3 \ + --hash=sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8 +pywinpty==2.0.15 \ + --hash=sha256:ab5920877dd632c124b4ed17bc6dd6ef3b9f86cd492b963ffdb1a67b85b0f408 +pyyaml==6.0.2 \ + --hash=sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563 +pyzmq==26.4.0 \ + --hash=sha256:23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b +qdarkstyle==3.2.3 \ + --hash=sha256:ea980ee426d594909cf1058306832af71ff6cbad6f69237b036d1550635aefbc +qdldl==0.1.7.post5 \ + --hash=sha256:cc9be378e7bec67d4c62b7fa27cafb4f77d3e5e059d753c3dce0a5ae1ef5fea0 +qrcode==8.0 \ + --hash=sha256:9fc05f03305ad27a709eb742cf3097fa19e6f6f93bb9e2f039c0979190f6f1b1 +qstylizer==0.2.4 \ + --hash=sha256:8f384dfe86f9edb0bb596b93663a51f124f0794b94fd54057cc7cf9cea59fb6f +qtawesome==1.4.0 \ + --hash=sha256:a4d689fa071c595aa6184171ce1f0f847677cb8d2db45382c43129f1d72a3d93 +qtconsole==5.6.1 \ + --hash=sha256:3d22490d9589bace566ad4f3455b61fa2209156f40e87e19e2c3cb64e9264950 +qtpy==2.4.3 \ + --hash=sha256:72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1 +quantecon==0.7.2 \ + --hash=sha256:d1333ca7bc3046efe3655d9eeeefb299051b00870b8608cb5bc0b88e3bdb8b67 +quart==0.20.0 \ + --hash=sha256:003c08f551746710acb757de49d9b768986fd431517d0eb127380b656b98b8f1 +rapidfuzz==3.13.0 \ + --hash=sha256:9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264 +readme-renderer==44.0 \ + --hash=sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151 +redis==5.2.1 \ + --hash=sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4 +referencing==0.36.2 \ + --hash=sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0 +regex==2024.11.6 \ + --hash=sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a +reportlab==4.3.1 \ + --hash=sha256:0f37dd16652db3ef84363cf744632a28c38bd480d5bf94683466852d7bb678dd +requests==2.32.3 \ + --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 +requests-ntlm==1.3.0 \ + --hash=sha256:4c7534a7d0e482bb0928531d621be4b2c74ace437e88c5a357ceb7452d25a510 +requests-toolbelt==1.0.0 \ + --hash=sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06 +rfc3339-validator==0.1.4 \ + --hash=sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa +rfc3986==2.0.0 \ + --hash=sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd +rfc3986-validator==0.1.1 \ + --hash=sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9 +rich==14.0.0 \ + --hash=sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0 +rope==1.13.0 \ + --hash=sha256:b435a0c0971244fdcd8741676a9fae697ae614c20cc36003678a7782f25c0d6c +rpds-py==0.24.0 \ + --hash=sha256:6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a +rsa==4.7.2 \ + --hash=sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2 +rtree==1.4.0 \ + --hash=sha256:ba83efc7b7563905b1bfdfc14490c4bfb59e92e5e6156bdeb6ec5df5117252f4 +rx==3.2.0 \ + --hash=sha256:922c5f4edb3aa1beaa47bf61d65d5380011ff6adcd527f26377d05cb73ed8ec8 +scikit-image==0.25.2 \ + --hash=sha256:64785a8acefee460ec49a354706db0b09d1f325674107d7fa3eadb663fb56d6f +scikit-learn==1.6.1 \ + --hash=sha256:7a1c43c8ec9fde528d664d947dc4c0789be4077a3647f232869f41d9bf50e0fb +scipy==1.15.3 \ + --hash=sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163 +scramp==1.4.5 \ + --hash=sha256:50e37c464fc67f37994e35bee4151e3d8f9320e9c204fca83a5d313c121bbbe7 +scs==3.2.7.post2 \ + --hash=sha256:a2c48cd19e39bf87dae0b20a289fff44930458fc2ca2afa0f899058dc41e5545 +seaborn==0.13.2 \ + --hash=sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987 +send2trash==1.8.3 \ + --hash=sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9 +setuptools==79.0.1 \ + --hash=sha256:e147c0549f27767ba362f9da434eab9c5dc0045d5304feb602a0af001089fc51 +shapely==2.1.0 \ + --hash=sha256:1dc8d4364483a14aba4c844b7bd16a6fa3728887e2c33dfa1afa34a3cf4d08a5 +shellingham==1.5.4 \ + --hash=sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686 +simplejson==3.19.3 \ + --hash=sha256:3bbcdc438dc1683b35f7a8dc100960c721f922f9ede8127f63bed7dfded4c64c +simpy==4.1.1 \ + --hash=sha256:7c5ae380240fd2238671160e4830956f8055830a8317edf5c05e495b3823cd88 +six==1.17.0 \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 +sklearn-compat==0.1.3 \ + --hash=sha256:a8aaf8ef711988cbd63f187c5560b5f16b25df663aaa1d2d0e1291341d339f80 +skrub==0.5.3 \ + --hash=sha256:b6ba417fa83d1f7e9a69656e0860b061381b9bd19808692a2b5bef8588c72775 +smmap==5.0.2 \ + --hash=sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e +sniffio==1.3.1 \ + --hash=sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2 +snowballstemmer==2.2.0 \ + --hash=sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a +sortedcontainers==2.4.0 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 +sounddevice==0.5.1 \ + --hash=sha256:4313b63f2076552b23ac3e0abd3bcfc0c1c6a696fc356759a13bd113c9df90f1 +soupsieve==2.6 \ + --hash=sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9 +sphinx==8.1.3 \ + --hash=sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2 +sphinx-rtd-theme==3.0.2 \ + --hash=sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13 +sphinxcontrib-applehelp==2.0.0 \ + --hash=sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5 +sphinxcontrib-devhelp==2.0.0 \ + --hash=sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2 +sphinxcontrib-htmlhelp==2.1.0 \ + --hash=sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8 +sphinxcontrib-jquery==4.1 \ + --hash=sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae +sphinxcontrib-jsmath==1.0.1 \ + --hash=sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178 +sphinxcontrib-qthelp==2.0.0 \ + --hash=sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb +sphinxcontrib-serializinghtml==2.0.0 \ + --hash=sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331 +spyder==6.0.7 \ + --hash=sha256:b725569bb8ddc7b0aab73d747d85312dc0456978370cc0f9b1a101c0fe4f076b +spyder-kernels==3.0.5 \ + --hash=sha256:9cc808e0ec4426b9ba911128e221fa2234e6c8d6e08526132e90112ff9c2bb7c +sqlalchemy==2.0.40 \ + --hash=sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad +sqlite-bro==0.13.1 \ + --hash=sha256:c26033b0af133049ca578b5fd30b2372f002e7ff934b39774aa4d2da7638c23d +sqlite-fts4==1.0.3 \ + --hash=sha256:0359edd8dea6fd73c848989e1e2b1f31a50fe5f9d7272299ff0e8dbaa62d035f +sqlite-utils==3.38 \ + --hash=sha256:8a27441015c3b2ef475f555861f7a2592f73bc60d247af9803a11b65fc605bf9 +sqlparse==0.5.3 \ + --hash=sha256:cf2196ed3418f3ba5de6af7e82c694a9fbdbfecccdfc72e281548517081f16ca +squarify==0.4.4 \ + --hash=sha256:d7597724e29d48aa14fd2f551060d6b09e1f0a67e4cd3ea329fe03b4c9a56f11 +sse-starlette==2.2.1 \ + --hash=sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99 +sspilib==0.2.0 \ + --hash=sha256:c39a698491f43618efca8776a40fb7201d08c415c507f899f0df5ada15abefaa +stack-data==0.6.3 \ + --hash=sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 +starlette==0.46.2 \ + --hash=sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35 +statsmodels==0.14.4 \ + --hash=sha256:81030108d27aecc7995cac05aa280cf8c6025f6a6119894eef648997936c2dd0 +streamlit==1.46.0 \ + --hash=sha256:f8624acabafcf18611a0fac2635cf181a7ba922b45bd131ae15fc8f80e1a5482 +superqt==0.7.3 \ + --hash=sha256:8f7d141665b31baa484747f324fc9fc2d14223f2fefc92ffed6ea35c92221304 +sv-ttk==2.6.0 \ + --hash=sha256:4319c52edf2e14732fe84bdc9788e26f9e9a1ad79451ec0f89f0120ffc8105d9 +sympy==1.14.0 \ + --hash=sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5 +tabulate==0.9.0 \ + --hash=sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f +tblib==3.1.0 \ + --hash=sha256:670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e +tenacity==9.1.2 \ + --hash=sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138 +termcolor==3.1.0 \ + --hash=sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa +terminado==0.18.1 \ + --hash=sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0 +text-unidecode==1.3 \ + --hash=sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8 +textdistance==4.6.3 \ + --hash=sha256:0cb1b2cc8e3339ddc3e0f8c870e49fb49de6ecc42a718917308b3c971f34aa56 +thefuzz==0.22.1 \ + --hash=sha256:59729b33556850b90e1093c4cf9e618af6f2e4c985df193fdf3c5b5cf02ca481 +threadpoolctl==3.6.0 \ + --hash=sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb +three-merge==0.1.1 \ + --hash=sha256:dd219f4696aa0bbec6099ac3528b4de0450ff9bde862dd8f6d6f52e745f83464 +tifffile==2025.3.30 \ + --hash=sha256:0ed6eee7b66771db2d1bfc42262a51b01887505d35539daef118f4ff8c0f629c +tiktoken==0.9.0 \ + --hash=sha256:5ea0edb6f83dc56d794723286215918c1cde03712cbbafa0348b33448faf5b95 +tinycss2==1.4.0 \ + --hash=sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289 +tokenizers==0.21.1 \ + --hash=sha256:0f0dcbcc9f6e13e675a66d7a5f2f225a736745ce484c1a4e07476a89ccdad382 +toml==0.10.2 \ + --hash=sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b +tomli==2.2.1 \ + --hash=sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69 +tomli-w==1.2.0 \ + --hash=sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90 +tomlkit==0.13.2 \ + --hash=sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde +toolz==1.0.0 \ + --hash=sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236 +tornado==6.5.1 \ + --hash=sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b +tqdm==4.67.1 \ + --hash=sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2 +traitlets==5.14.3 \ + --hash=sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f +traittypes==0.2.1 \ + --hash=sha256:1340af133810b6eee1a2eb2e988f862b0d12b6c2d16f282aaf3207b782134c2e +trio==0.30.0 \ + --hash=sha256:3bf4f06b8decf8d3cf00af85f40a89824669e2d033bb32469d34840edcfc22a5 +trove-classifiers==2025.5.9.12 \ + --hash=sha256:e381c05537adac78881c8fa345fd0e9970159f4e4a04fcc42cfd3129cca640ce +twine==6.1.0 \ + --hash=sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384 +typer==0.15.2 \ + --hash=sha256:46a499c6107d645a9c13f7ee46c5d5096cae6f5fc57dd11eccbbb9ae3e44ddfc +types-python-dateutil==2.9.0.20240316 \ + --hash=sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b +types-requests==2.32.0.20250328 \ + --hash=sha256:72ff80f84b15eb3aa7a8e2625fffb6a93f2ad5a0c20215fc1dcfa61117bcb2a2 +typing-extensions==4.13.2 \ + --hash=sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c +typing-inspection==0.4.0 \ + --hash=sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f +tzdata==2025.2 \ + --hash=sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8 +tzlocal==5.3.1 \ + --hash=sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d +uc-micro-py==1.0.3 \ + --hash=sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5 +ujson==5.10.0 \ + --hash=sha256:4573fd1695932d4f619928fd09d5d03d917274381649ade4328091ceca175539 +umap-learn==0.5.7 \ + --hash=sha256:6a7e0be2facfa365a5ed6588447102bdbef32a0ef449535c25c97ea7e680073c +uncertainties==3.2.2 \ + --hash=sha256:fd8543355952f4052786ed4150acaf12e23117bd0f5bd03ea07de466bce646e7 +uri-template==1.3.0 \ + --hash=sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363 +urllib3==2.4.0 \ + --hash=sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813 +uvicorn==0.34.2 \ + --hash=sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403 +vega-datasets==0.9.0 \ + --hash=sha256:3d7c63917be6ca9b154b565f4779a31fedce57b01b5b9d99d8a34a7608062a1d +waitress==3.0.0 \ + --hash=sha256:2a06f242f4ba0cc563444ca3d1998959447477363a2d7e9b8b4d75d35cfd1669 +watchdog==6.0.0 \ + --hash=sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680 +wcwidth==0.2.13 \ + --hash=sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859 +webcolors==24.11.1 \ + --hash=sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9 +webencodings==0.5.1 \ + --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 +websocket-client==1.8.0 \ + --hash=sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526 +websockets==14.2 \ + --hash=sha256:b439ea828c4ba99bb3176dc8d9b933392a2413c0f6b149fdcba48393f573377f +werkzeug==3.1.3 \ + --hash=sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e +whatthepatch==1.0.7 \ + --hash=sha256:1b6f655fd31091c001c209529dfaabbabdbad438f5de14e3951266ea0fc6e7ed +wheel==0.45.1 \ + --hash=sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248 +widgetsnbextension==4.0.14 \ + --hash=sha256:4875a9eaf72fbf5079dc372a51a9f268fc38d46f767cbf85c43a36da5cb9b575 +wordcloud==1.9.4 \ + --hash=sha256:8c9a5af2fbcf029a19e827adbee58e86efe7536dca7a42380a8601113a86069b +wrapt==1.16.0 \ + --hash=sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1 +wsproto==1.2.0 \ + --hash=sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736 +xarray==2025.4.0 \ + --hash=sha256:b27defd082c5cb85d32c695708de6bb05c2838fb7caaf3f952982e602a35b9b8 +xlsxwriter==3.2.3 \ + --hash=sha256:593f8296e8a91790c6d0378ab08b064f34a642b3feb787cf6738236bd0a4860d +xyzservices==2023.10.1 \ + --hash=sha256:6a4c38d3a9f89d3e77153eff9414b36a8ee0850c9e8b85796fd1b2a85b8dfd68 +yapf==0.40.1 \ + --hash=sha256:b8bfc1f280949153e795181768ca14ef43d7312629a06c43e7abd279323af313 +yarl==1.18.3 \ + --hash=sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c +yt-dlp==2025.2.19 \ + --hash=sha256:3ed218eaeece55e9d715afd41abc450dc406ee63bf79355169dfde312d38fdb8 +zict==3.0.0 \ + --hash=sha256:5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae +zipp==3.21.0 \ + --hash=sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931 +zstandard==0.23.0 \ + --hash=sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b diff --git a/diff.py b/diff.py deleted file mode 100644 index 1fd01586..00000000 --- a/diff.py +++ /dev/null @@ -1,168 +0,0 @@ -# -*- coding: utf-8 -*- -# -# WinPython diff.py script -# Copyright © 2013 Pierre Raybaut -# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ -# Licensed under the terms of the MIT License -# (see winpython/__init__.py for details) - -import os -from pathlib import Path -import re -import shutil -from packaging import version -from winpython import utils - -CHANGELOGS_DIR = Path(__file__).parent / "changelogs" -assert CHANGELOGS_DIR.is_dir() - -class Package: - # SourceForge Wiki syntax: - PATTERN = r"\[([a-zA-Z\-\:\/\.\_0-9]*)\]\(([^\]\ ]*)\) \| ([^\|]*) \| ([^\|]*)" - # Google Code Wiki syntax: - PATTERN_OLD = r"\[([a-zA-Z\-\:\/\.\_0-9]*) ([^\]\ ]*)\] \| ([^\|]*) \| ([^\|]*)" - - def __init__(self): - self.name = self.version = self.description = self.url = None - - def __str__(self): - return f"{self.name} {self.version}\r\n{self.description}\r\nWebsite: {self.url}" - - def from_text(self, text): - match = re.match(self.PATTERN_OLD, text) or re.match(self.PATTERN, text) - if not match: - raise ValueError("Text does not match expected pattern") - self.name, self.url, self.version, self.description = match.groups() - - def to_wiki(self): - return f" * [{self.name}]({self.url}) {self.version} ({self.description})\r\n" - - def upgrade_wiki(self, other): - assert self.name.replace("-", "_").lower() == other.name.replace("-", "_").lower() - return f" * [{self.name}]({self.url}) {other.version} → {self.version} ({self.description})\r\n" - -class PackageIndex: - WINPYTHON_PATTERN = r"\#\# WinPython\-*[0-9b-t]* ([0-9\.a-zA-Z]*)" - TOOLS_LINE = "### Tools" - PYTHON_PACKAGES_LINE = "### Python packages" - HEADER_LINE1 = "Name | Version | Description" - HEADER_LINE2 = "-----|---------|------------" - - def __init__(self, version, basedir=None, flavor="", architecture=64): - self.version = version - self.flavor = flavor - self.basedir = basedir - self.architecture = architecture - self.other_packages = {} - self.python_packages = {} - self.from_file(basedir) - - def from_file(self, basedir): - fname = CHANGELOGS_DIR / f"WinPython{self.flavor}-{self.architecture}bit-{self.version}.md" - if not fname.exists(): - raise FileNotFoundError(f"Changelog file not found: {fname}") - with open(fname, "r", encoding=utils.guess_encoding(fname)[0]) as fdesc: - self.from_text(fdesc.read()) - - def from_text(self, text): - version = re.match(self.WINPYTHON_PATTERN + self.flavor, text).groups()[0] - assert version == self.version - tools_flag = python_flag = False - for line in text.splitlines(): - if line: - if line == self.TOOLS_LINE: - tools_flag, python_flag = True, False - continue - elif line == self.PYTHON_PACKAGES_LINE: - tools_flag, python_flag = False, True - continue - elif line in (self.HEADER_LINE1, self.HEADER_LINE2, "
", "
"): - continue - if tools_flag or python_flag: - package = Package() - package.from_text(line) - if tools_flag: - self.other_packages[package.name] = package - else: - self.python_packages[package.name] = package - -def diff_package_dicts(old_packages, new_packages): - """Return difference between package old and package new""" - - # wheel replace '-' per '_' in key - old = {k.replace("-", "_").lower(): v for k, v in old_packages.items()} - new = {k.replace("-", "_").lower(): v for k, v in new_packages.items()} - text = "" - - if new_keys := sorted(set(new) - set(old)): - text += "New packages:\r\n\r\n" + "".join(new[k].to_wiki() for k in new_keys) + "\r\n" - - if upgraded := [new[k].upgrade_wiki(old[k]) for k in sorted(set(old) & set(new)) if old[k].version != new[k].version]: - text += "Upgraded packages:\r\n\r\n" + f"{''.join(upgraded)}" + "\r\n" - - if removed_keys := sorted(set(old) - set(new)): - text += "Removed packages:\r\n\r\n" + "".join(old[k].to_wiki() for k in removed_keys) + "\r\n" - return text - -def find_closer_version(version1, basedir=None, flavor="", architecture=64): - """Find version which is the closest to `version`""" - builddir = Path(basedir) / f"bu{flavor}" - pattern = re.compile(rf"WinPython{flavor}-{architecture}bit-([0-9\.]*)\.(txt|md)") - versions = [pattern.match(name).groups()[0] for name in os.listdir(builddir) if pattern.match(name)] - - if version1 not in versions: - raise ValueError(f"Unknown version {version1}") - - version_below = '0.0.0.0' - for v in versions: - if version.parse(version_below) < version.parse(v) and version.parse(v) < version.parse(version1): - version_below = v - - return version_below if version_below != '0.0.0.0' else version1 - -def compare_package_indexes(version2, version1=None, basedir=None, flavor="", flavor1=None,architecture=64): - """Compare two package index Wiki pages""" - version1 = version1 if version1 else find_closer_version(version2, basedir, flavor, architecture) - flavor1 = flavor1 if flavor1 else flavor - pi1 = PackageIndex(version1, basedir, flavor1, architecture) - pi2 = PackageIndex(version2, basedir, flavor, architecture) - - text = ( - f"## History of changes for WinPython-{architecture}bit {version2 + flavor}\r\n\r\n" - f"The following changes were made to WinPython-{architecture}bit distribution since version {version1 + flavor1}.\r\n\r\n" - "
\r\n\r\n" - ) - - tools_text = diff_package_dicts(pi1.other_packages, pi2.other_packages) - if tools_text: - text += PackageIndex.TOOLS_LINE + "\r\n\r\n" + tools_text - - py_text = diff_package_dicts(pi1.python_packages, pi2.python_packages) - if py_text: - text += PackageIndex.PYTHON_PACKAGES_LINE + "\r\n\r\n" + py_text - - text += "\r\n
\r\n* * *\r\n" - return text - -def _copy_all_changelogs(version, basedir, flavor="", architecture=64): - basever = ".".join(version.split(".")[:2]) - pattern = re.compile(rf"WinPython{flavor}-{architecture}bit-{basever}([0-9\.]*)\.(txt|md)") - for name in os.listdir(CHANGELOGS_DIR): - if pattern.match(name): - shutil.copyfile(CHANGELOGS_DIR / name, Path(basedir) / f"bu{flavor}" / name) - -def write_changelog(version2, version1=None, basedir=None, flavor="", architecture=64): - """Write changelog between version1 and version2 of WinPython""" - _copy_all_changelogs(version2, basedir, flavor, architecture) - print("comparing_package_indexes", version2, basedir, flavor, architecture) - changelog_text = compare_package_indexes(version2, version1, basedir, flavor, architecture=architecture) - output_file = Path(basedir) / f"bu{flavor}" / f"WinPython{flavor}-{architecture}bit-{version2}_History.md" - - with open(output_file, "w", encoding="utf-8") as fdesc: - fdesc.write(changelog_text) - # Copy to winpython/changelogs - shutil.copyfile(output_file, CHANGELOGS_DIR / output_file.name) - -if __name__ == "__main__": - print(compare_package_indexes("3.7.4.0", "3.7.2.0", r"C:\WinP\bd37", "Zero", architecture=32)) - write_changelog("3.7.4.0", "3.7.2.0", r"C:\WinP\bd37", "Ps2", architecture=64) diff --git a/generate_a_winpython_distro.bat b/generate_a_winpython_distro.bat index 7fdbc12f..0b64a596 100644 --- a/generate_a_winpython_distro.bat +++ b/generate_a_winpython_distro.bat @@ -2,7 +2,7 @@ rem generate_a_winpython_distro.bat: to be launched from a winpython directory, @echo on REM Initialize variables -if "%my_release_level%"=="" set my_release_level=b3 +if "%my_release_level%"=="" set my_release_level= if "%my_create_installer%"=="" set my_create_installer=True rem Set archive directory and log file @@ -25,10 +25,12 @@ rem 2021-04-22 : path PyPy3 (as we don't try to copy PyPy3.exe to Python.exe) if "%target_python_exe%"=="" set target_python_exe=python.exe rem Set Python target release based on my_python_target -if %my_python_target%==311 set my_python_target_release=3119& set my_release=1 -if %my_python_target%==312 set my_python_target_release=31210& set my_release=0 -if %my_python_target%==313 set my_python_target_release=3133& set my_release=0 -if %my_python_target%==314 set my_python_target_release=3140& set my_release=0 +if %my_python_target%==311 set my_python_target_release=3119& set my_release=2 +if %my_python_target%==312 set my_python_target_release=31210& set my_release=2 +if %my_python_target%==313 set my_python_target_release=3135& set my_release=1 +if %my_python_target%==314 set my_python_target_release=3140& set my_release=1 + +set my_WINPYDIRBASE=%my_basedir%\bu%my_flavor%\WPy%my_arch%-%my_python_target_release%%my_release%%my_release_level% echo -------------------------------------- >>%my_archive_log% echo (%date% %time%) preparing winPython for %my_pyver% (%my_python_target%)release %my_release%%my_flavor% (%my_release_level%) *** %my_arch% bit ***>>%my_archive_log% @@ -59,17 +61,16 @@ call %my_buildenv%\scripts\env.bat REM Create basic build infrastructure echo "(%date% %time%) Create basic build infrastructure">>%my_archive_log% -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%', docsdirs=r'%my_docsdirs%', create_installer='False', python_target_release='%my_python_target_release%')">>%my_archive_log% +python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', basedir_wpy=r'%my_WINPYDIRBASE%', verbose=True, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', toolsdirs=r'%my_toolsdirs%')">>%my_archive_log% REM Check infrastructure is in place echo "(%date% %time%) Check infrastructure">>%my_archive_log% -set my_WINPYDIRBASE=%my_root_dir_for_builds%\bd%my_python_target%\bu%my_flavor%\Wpy%my_arch%-%my_python_target_release%%my_release%%my_release_level% set WINPYDIRBASE=%my_WINPYDIRBASE% if not exist %my_WINPYDIRBASE%\scripts\env.bat ( @echo off echo as %my_WINPYDIRBASE%\scripts\env.bat does not exist - echo please check and correct my_python_target_release=%my_python_target_release% + echo please check and correct: echo my_arch=%my_arch% echo my_python_target_release=%my_python_target_release% echo my_release=%my_release% @@ -99,20 +100,125 @@ echo -------------------------------------- >>%my_archive_log% echo "(%date% %time%) Add requirement packages">>%my_archive_log% echo -------------------------------------- >>%my_archive_log% python -m pip install -r %my_requirements% -c %my_constraints% --pre --no-index --trusted-host=None --find-links=%my_find_links% >>%my_archive_log% -python -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('spyder', to_movable=True)" +python -c "from wppm import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('spyder', to_movable=True)" + +REM Add Wheelhouse (to replace per pip lock direct ? would allow paralellism) +echo -------------------------------------- >>%my_archive_log% +echo "(%date% %time%) Add lockfile wheels">>%my_archive_log% +echo -------------------------------------- >>%my_archive_log% +set path=%my_original_path% +@echo on +call %my_WINPYDIRBASE%\scripts\env.bat +@echo on +set WINPYVERLOCK=%WINPYVER2:.=_% +set pylockinclude=%my_root_dir_for_builds%\bd%my_python_target%\bu%addlockfile%\pylock.%addlockfile%-%WINPYARCH%bit-%WINPYVERLOCK%.toml +echo pylockinclude="%pylockinclude%" +if not "Z%addlockfile%Z"=="ZZ" if exist "%pylockinclude%" ( +echo %my_WINPYDIRBASE%\python\scripts\wppm.exe "%pylockinclude%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels">>%my_archive_log% +%my_WINPYDIRBASE%\python\scripts\wppm.exe "%pylockinclude%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels" +) + +@echo on +echo wheelhousereq=%wheelhousereq% +set LOCKDIR=%WINPYDIRBASE%\..\ +set pip_lock_includedlocal=%LOCKDIR%pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_includedwheelslocal.toml +set pip_lock_includedweb=%LOCKDIR%pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_includedwheels.toml +set req_lock_includedlocal=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_includedwheelslocal.txt +set req_lock_includedweb=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_includedwheels.txt + +set pip_lock_includedlocal=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheelslocal.toml +set pip_lock_includedweb=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheels.toml +set req_lock_includedlocal=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheelslocal.txt +set req_lock_includedweb=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_wheels.txt + + +if not "Z%wheelhousereq%Z"=="ZZ" if exist "%wheelhousereq%" ( +echo JOYYYwheelhousereq=%wheelhousereq% +echo z%pip_lock_includedlocal%z=%pip_lock_includedlocal% +rem no winpython in it naturally, with deps +python.exe -m pip lock --no-index --trusted-host=None --find-links=%my_find_links% -c C:\WinP\constraints.txt -r "%wheelhousereq%" -o %pip_lock_includedlocal% +rem generating also classic requirement with hash-256, from obtained pylock.toml +python.exe -c "from wppm import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_includedlocal%', r'%req_lock_includedlocal%')" + +rem same with frozen web from local +python.exe -m pip lock --no-deps --require-hashes -c C:\WinP\constraints.txt -r "%req_lock_includedlocal%" -o %pip_lock_includedweb% + +echo %my_WINPYDIRBASE%\python\scripts\wppm.exe "%pip_lock_includedweb%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels">>%my_archive_log% +%my_WINPYDIRBASE%\python\scripts\wppm.exe "%pip_lock_includedweb%" -ws "%my_find_links%" -wd "%my_WINPYDIRBASE%\wheelhouse\included.wheels" +) + +echo -------------------------------------- >>%my_archive_log%; +echo "(%date% %time%) generate pylock.toml files and requirement.txt with hash files">>%my_archive_log% +echo -------------------------------------- >>%my_archive_log% + +set path=%my_original_path% +call %my_WINPYDIRBASE%\scripts\env.bat + +rem generate pip freeze requirements +echo %date% %time% +set LOCKDIR=%WINPYDIRBASE%\..\ + +set WINPYVERLOCK=%WINPYVER2:.=_% +set req=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_raw.txt +set wanted_req=%LOCKDIR%requirement.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%.txt + +set pip_lock_web=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.toml +set pip_lock_local=%LOCKDIR%pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_local.toml +set req_lock_web=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.txt +set req_lock_local=%LOCKDIR%requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%_local.txt + + +set my_archive_lockfile=%my_archive_dir%\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_%date:/=-%at_%my_time%.toml +set my_archive_lockfile_local=%my_archive_dir%\pylock.%my_flavor%-%WINPYARCH%bit-%WINPYVERLOCK%_%date:/=-%at_%my_time%.local.toml +set my_changelog_lockfile=%~dp0changelogs\pylock.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.toml +set my_changelog_reqfile=%~dp0changelogs\requir.%WINPYARCH%-%WINPYVERLOCK%%my_flavor%%my_release_level%.txt + +python.exe -m pip freeze>%req% +findstr /v "winpython" %req% > %wanted_req% + + +rem pip lock from pypi, from the frozen req +python.exe -m pip lock --no-deps -c C:\WinP\constraints.txt -r "%wanted_req%" -o %pip_lock_web% + +rem pip lock from local WheelHouse, from the frozen req +python.exe -m pip lock --no-deps --no-index --trusted-host=None --find-links=C:\WinP\packages.srcreq -c C:\WinP\constraints.txt -r "%wanted_req%" -o %pip_lock_local% + +rem generating also classic requirement with hash-256, from obtained pylock.toml +python.exe -c "from wppm import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_web%', r'%req_lock_web%')" +python.exe -c "from wppm import wheelhouse as wh;wh.pylock_to_req(r'%pip_lock_local%', r'%req_lock_local%')" + +rem compare the two (result from pypi and local Wheelhouse must be equal) +fc "%req_lock_web%" "%req_lock_local%" + +copy/Y %pip_lock_web% %my_archive_lockfile% +copy/Y %pip_lock_web% %my_changelog_lockfile% +copy/Y %req_lock_web% %my_changelog_reqfile% + REM Archive success echo -------------------------------------- >>%my_archive_log% echo "(%date% %time%) Archive success">>%my_archive_log% echo -------------------------------------- >>%my_archive_log% +set path=%my_original_path% +call %my_WINPYDIRBASE%\scripts\env.bat + %target_python_exe% -m pip freeze > %my_archive_log%.packages_versions.txt REM Generate changelog and binaries echo "(%date% %time%) Generate changelog and binaries">>%my_archive_log% -set path=%my_original_path% -cd /D %~dp0 -call %my_buildenv%\scripts\env.bat -python.exe -c "from make import *;make_all(%my_release%, '%my_release_level%', pyver='%my_pyver%', basedir=r'%my_basedir%', verbose=True, architecture=%my_arch%, flavor='%my_flavor%', install_options=r'%my_install_options%', find_links=r'%my_find_links%', source_dirs=r'%my_source_dirs%', create_installer='%my_create_installer%', rebuild=False, python_target_release='%my_python_target_release%')" >> %my_archive_log% + +rem markdowm and markdown diff +set mdn=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%.md +%target_python_exe% -m wppm -md>%my_basedir%\bu%my_flavor%\%mdn% +copy/y %my_basedir%\bu%my_flavor%\%mdn% %~dp0changelogs\%mdn% + +set out=WinPython%my_flavor%-%my_arch%bit-%WINPYVER2%_History.md +%target_python_exe% -c "from wppm import diff ;a=(diff.compare_package_indexes(r'%WINPYVER2%', searchdir=r'%~dp0changelogs',flavor=r'%my_flavor%',architecture=%my_arch%));f=open(r'%my_basedir%\bu%my_flavor%\%out%','w', encoding='utf-8');f.write(a);f.close()" +copy/y %my_basedir%\bu%my_flavor%\%out% %~dp0changelogs\%out% + +rem compress +set stem=WinPython%my_arch%-%WINPYVER2%%my_flavor% +%target_python_exe% -c "from wppm import utils;utils.command_installer_7zip(r'%my_WINPYDIRBASE%', r'%my_WINPYDIRBASE%\..',r'%stem%', r'%my_create_installer%')" echo -------------------------------------- >>%my_archive_log% echo "(%date% %time%) END OF CREATION">>%my_archive_log% diff --git a/generate_winpython_distros313_dot.bat b/generate_winpython_distros313_dot.bat index b0ed9351..a1290cd3 100644 --- a/generate_winpython_distros313_dot.bat +++ b/generate_winpython_distros313_dot.bat @@ -15,6 +15,7 @@ set my_release_level= rem list of installers to create separated per dot: False=none, .zip=zip, .7z=.7z, 7zip=auto-extractible 7z set my_create_installer=7zip.7z.zip +set my_create_installer=7zip.zip set my_preclear_build_directory=Yes @@ -25,11 +26,9 @@ set my_source_dirs=C:\Winp\bd313\packages.win-amd64 set my_find_links=C:\Winp\packages.srcreq set my_toolsdirs=C:\Winp\bdTools\Tools.dot -set my_docsdirs=C:\WinP\bdDocs\docs.dot set my_install_options=--no-index --pre --trusted-host=None call %~dp0\generate_a_winpython_distro.bat - pause \ No newline at end of file diff --git a/generate_winpython_distros313_slim.bat b/generate_winpython_distros313_slim.bat index 7b7a1ffc..e8829c58 100644 --- a/generate_winpython_distros313_slim.bat +++ b/generate_winpython_distros313_slim.bat @@ -30,11 +30,8 @@ set my_toolsdirs=C:\Winp\bdTools\Tools.dot REM 2024-07-13:put back pandoc (so from 598Mo to 518Mo?) set my_toolsdirs=C:\WinP\bdTools\tools64_pandoc_alone -set my_docsdirs=C:\WinP\bdDocs\docs.dot - set my_install_options=--no-index --pre --trusted-host=None call %~dp0\generate_a_winpython_distro.bat - pause \ No newline at end of file diff --git a/generate_winpython_distros313_wheel.bat b/generate_winpython_distros313_wheel.bat new file mode 100644 index 00000000..317d7774 --- /dev/null +++ b/generate_winpython_distros313_wheel.bat @@ -0,0 +1,39 @@ +rem this replace running manually from spyder the make.py +rem to launch from a winpython module 'make' directory + +set my_original_path=%path% + +set my_root_dir_for_builds=C:\Winp +set my_python_target=313 +set my_pyver=3.13 +set my_flavor=whl +set my_arch=64 + +rem settings delegated to generate_a_winpython_distro.bat +set my_release= +set my_release_level= + +rem list of installers to create separated per dot: False=none, .zip=zip, .7z=.7z, 7zip=auto-extractible 7z +set my_create_installer=7zip-mx5.7z-mx7.zip +set my_create_installer=.7z-mx9 +set my_preclear_build_directory=Yes + +set tmp_reqdir=%my_root_dir_for_builds%\bd%my_python_target% + +set my_requirements=C:\Winp\bd313\dot_requirements.txt +set my_source_dirs=C:\Winp\bd313\packages.win-amd64 + +set my_find_links=C:\Winp\packages.srcreq +set my_toolsdirs=C:\Winp\bdTools\Tools.dot + +set my_install_options=--no-index --pre --trusted-host=None + +rem set addlockfile=dot + +set wheelhousereq=C:\Winp\bd313\dot_requirements.txt +set wheelhousereq=C:\Winp\bd313\requirements64_whl.txt + + +call %~dp0\generate_a_winpython_distro.bat + +pause diff --git a/hash_launch.bat b/hash_launch.bat index 714925a4..623765d7 100644 --- a/hash_launch.bat +++ b/hash_launch.bat @@ -1,8 +1,10 @@ -call C:\WPy64-3890\scripts\env.bat +call C:\WinPdev\WPy64-310111\scripts\env.bat cd %~dp0 rem echo %date% %time%>>gdc_counting.txt -python hash.py %* >>hash_counting_%date:/=_%.txt +python -c "import sys;from winpython import hash; hash.print_hashes(sys.argv[1:])" %* >>hash_counting_%date:/=_%.txt +rem python hash.py %* >>hash_counting_%date:/=_%.txt start notepad.exe hash_counting_%date:/=_%.txt + \ No newline at end of file diff --git a/make.py b/make.py index c1a6a93a..445b8d1d 100644 --- a/make.py +++ b/make.py @@ -9,30 +9,15 @@ import os import re import shutil -import subprocess -import sys from pathlib import Path -from winpython import wppm, utils -# Local import -import diff +from wppm import wppm, utils # Define constant paths for clarity -CHANGELOGS_DIRECTORY = Path(__file__).parent / "changelogs" PORTABLE_DIRECTORY = Path(__file__).parent / "portable" -NODEJS_RELATIVE_PATH = "n" # Relative path within WinPython dir # Ensure necessary directories exist at the start -assert CHANGELOGS_DIRECTORY.is_dir(), f"Changelogs directory not found: {CHANGELOGS_DIRECTORY}" assert PORTABLE_DIRECTORY.is_dir(), f"Portable directory not found: {PORTABLE_DIRECTORY}" -def find_7zip_executable() -> str: - """Locates the 7-Zip executable (7z.exe).""" - possible_program_files = [r"C:\Program Files", r"C:\Program Files (x86)", Path(sys.prefix).parent / "t"] - for base_dir in possible_program_files: - if (executable_path := Path(base_dir) / "7-Zip" / "7z.exe").is_file(): - return str(executable_path) - raise RuntimeError("7ZIP is not installed on this computer.") - def copy_items(source_directories: list[Path], target_directory: Path, verbose: bool = False): """Copies items from source directories to the target directory.""" target_directory.mkdir(parents=True, exist_ok=True) @@ -60,19 +45,17 @@ class WinPythonDistributionBuilder: """Builds a WinPython distribution.""" def __init__(self, build_number: int, release_level: str, target_directory: Path, wheels_directory: Path, - tools_directories: list[Path] = None, documentation_directories: list[Path] = None, verbose: bool = False, - base_directory: Path = None, install_options: list[str] = None, flavor: str = ""): + tools_directories: list[Path] = None, verbose: bool = False, + install_options: list[str] = None, flavor: str = ""): """ Initializes the WinPythonDistributionBuilder. Args: build_number: The build number (integer). release_level: The release level (e.g., "beta", ""). - target_directory: The base directory where WinPython will be created. + target_directory: The base directory below which WinPython will be created. wheels_directory: Directory containing wheel files for packages. tools_directories: List of directories containing development tools to include. - documentation_directories: List of directories containing documentation to include. verbose: Enable verbose output. - base_directory: Base directory for building (optional, for relative paths). install_options: Additional pip install options. flavor: WinPython flavor (e.g., "Barebone"). """ @@ -81,11 +64,9 @@ def __init__(self, build_number: int, release_level: str, target_directory: Path self.target_directory = Path(target_directory) self.wheels_directory = Path(wheels_directory) self.tools_directories = tools_directories or [] - self.documentation_directories = documentation_directories or [] self.verbose = verbose self.winpython_directory: Path | None = None self.distribution: wppm.Distribution | None = None - self.base_directory = base_directory self.install_options = install_options or [] self.flavor = flavor self.python_zip_file: Path = self._get_python_zip_file() @@ -99,30 +80,6 @@ def _get_python_zip_file(self) -> Path: return source_item raise RuntimeError(f"Could not find Python zip package in {self.wheels_directory}") - @property - def package_index_markdown(self) -> str: - """Generates a Markdown formatted package index page.""" - return f"""## WinPython {self.winpyver2 + self.flavor} - -The following packages are included in WinPython-{self.architecture_bits}bit v{self.winpyver2 + self.flavor} {self.release_level}. - -
- -### Tools - -Name | Version | Description ------|---------|------------ -{utils.get_installed_tools_markdown(utils.get_python_executable(self.python_executable_directory))} - -### Python packages - -Name | Version | Description ------|---------|------------ -{self.distribution.get_installed_packages_markdown()} - -
-""" - @property def winpython_version_name(self) -> str: """Returns the full WinPython version string.""" @@ -146,23 +103,6 @@ def architecture_bits(self) -> int: """Returns the architecture (32 or 64 bits) of the distribution.""" return self.distribution.architecture if self.distribution else 64 - def create_installer_7zip(self, installer_type: str = ".exe"): - """Creates a WinPython installer using 7-Zip: ".exe", ".7z", ".zip")""" - self._print_action(f"Creating WinPython installer ({installer_type})") - if installer_type not in [".exe", ".7z", ".zip"]: - raise RuntimeError("installer_type {installer_type} is undefined") - DISTDIR = self.winpython_directory - filename_stem = f"Winpython{self.architecture_bits}-{self.python_full_version}.{self.build_number}{self.flavor}{self.release_level}" - fullfilename = DISTDIR.parent / (filename_stem + installer_type) - sfx_option = "-sfx7z.sfx" if installer_type == ".exe" else "" - zip_option = "-tzip" if installer_type == ".zip" else "" - command = f'"{find_7zip_executable()}" {zip_option} -mx5 a "{fullfilename}" "{DISTDIR}" {sfx_option}' - print(f'Executing 7-Zip script: "{command}"') - try: - subprocess.run(command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr) - except subprocess.CalledProcessError as e: - print(f"Error executing 7-Zip script: {e}", file=sys.stderr) - def _print_action(self, text: str): """Prints an action message with progress indicator.""" if self.verbose: @@ -181,176 +121,99 @@ def _extract_python_archive(self): def _copy_essential_files(self): """Copies pre-made objects""" - self._print_action("Copying default scripts") - copy_items([PORTABLE_DIRECTORY / "scripts"], self.winpython_directory / "scripts", self.verbose) - self._print_action("Copying launchers") copy_items([PORTABLE_DIRECTORY / "launchers_final"], self.winpython_directory, self.verbose) - docs_target_directory = self.winpython_directory / "notebooks" / "docs" - self._print_action(f"Copying documentation to {docs_target_directory}") - copy_items(self.documentation_directories, docs_target_directory, self.verbose) - tools_target_directory = self.winpython_directory / "t" self._print_action(f"Copying tools to {tools_target_directory}") copy_items(self.tools_directories, tools_target_directory, self.verbose) - if (nodejs_current_directory := tools_target_directory / "n").is_dir(): - self._print_action(f"Moving tools from {nodejs_current_directory} to {tools_target_directory.parent / NODEJS_RELATIVE_PATH}") - try: - shutil.move(nodejs_current_directory, tools_target_directory.parent / NODEJS_RELATIVE_PATH) - except Exception as e: - print(f"Error moving Node.js directory: {e}") - def _create_initial_batch_scripts(self): """Creates initial batch scripts, including environment setup.""" self._print_action("Creating initial batch scripts") # Replacements for batch scripts (PyPy compatibility) executable_name = self.distribution.short_exe if self.distribution else "python.exe" # default to python.exe if distribution is not yet set init_variables = [('WINPYthon_exe', executable_name), ('WINPYthon_subdirectory_name', self.python_directory_name), ('WINPYVER', self.winpython_version_name)] + init_variables += [('WINPYVER2', f"{self.python_full_version}.{self.build_number}"), ('WINPYFLAVOR', self.flavor), ('WINPYARCH', self.architecture_bits)] with open(self.winpython_directory / "scripts" / "env.ini", "w") as f: f.writelines([f'{a}={b}\n' for a, b in init_variables]) - def build(self, rebuild: bool = True, requirements_files_list=None, winpy_dirname: str = None): + def build(self, winpy_dir: Path = None): """Make or finalise WinPython distribution in the target directory""" print(f"Building WinPython with Python archive: {self.python_zip_file.name}") - if winpy_dirname is None: + if winpy_dir is None: raise RuntimeError("WinPython base directory to create is undefined") - self.winpython_directory = self.target_directory / winpy_dirname + self.winpython_directory = winpy_dir - if rebuild: - self._print_action(f"Creating WinPython {self.winpython_directory} base directory") - if self.winpython_directory.is_dir(): - try: - shutil.rmtree(self.winpython_directory, onexc=utils.onerror) - except TypeError: # before 3.12 - shutil.rmtree(self.winpython_directory, onerror=utils.onerror) - os.makedirs(self.winpython_directory, exist_ok=True) - # preventive re-Creation of settings directory - (self.winpython_directory / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) - self._extract_python_archive() + self._print_action(f"Creating WinPython {self.winpython_directory} base directory") + if self.winpython_directory.is_dir(): + shutil.rmtree(self.winpython_directory) + os.makedirs(self.winpython_directory, exist_ok=True) + # preventive re-Creation of settings directory + (self.winpython_directory / "settings" / "AppData" / "Roaming").mkdir(parents=True, exist_ok=True) + self._extract_python_archive() self.distribution = wppm.Distribution(self.python_executable_directory, verbose=self.verbose) - if rebuild: - self._copy_essential_files() - self._create_initial_batch_scripts() - utils.python_execmodule("ensurepip", self.distribution.target) - self.distribution.patch_standard_packages("pip") - - essential_packages = ["pip", "setuptools", "wheel", "winpython"] - for package_name in essential_packages: - actions = ["install", "--upgrade", "--pre", package_name] + self.install_options - self._print_action(f"Piping: {' '.join(actions)}") - self.distribution.do_pip_action(actions) - self.distribution.patch_standard_packages(package_name) - - if requirements_files_list: - for req in requirements_files_list: - actions = ["install", "-r", req] + (self.install_options or []) - self._print_action(f"Piping: {' '.join(actions)}") - self.distribution.do_pip_action(actions) - self.distribution.patch_standard_packages() - - self._print_action("Writing package index") - self.winpyver2 = f"{self.python_full_version}.{self.build_number}" - output_markdown_filename = str(self.winpython_directory.parent / f"WinPython{self.flavor}-{self.distribution.architecture}bit-{self.winpyver2}.md") - with open(output_markdown_filename, "w", encoding='utf-8') as f: - f.write(self.package_index_markdown) - - self._print_action("Writing changelog") - shutil.copyfile(output_markdown_filename, str(Path(CHANGELOGS_DIRECTORY) / Path(output_markdown_filename).name)) - diff.write_changelog(self.winpyver2, None, self.base_directory, self.flavor, self.distribution.architecture) - -def rebuild_winpython_package(source_directory: Path, target_directory: Path, architecture: int = 64, verbose: bool = False): - """Rebuilds the winpython package from source using flit.""" - for file in target_directory.glob("winpython-*"): - if file.suffix in (".exe", ".whl", ".gz"): - file.unlink() - utils.buildflit_wininst(source_directory, copy_to=target_directory, verbose=verbose) - -def make_all(build_number: int, release_level: str, pyver: str, architecture: int, basedir: Path, - verbose: bool = False, rebuild: bool = True, create_installer: str = "True", install_options=["--no-index"], - flavor: str = "", requirements: str | list[Path] = None, find_links: str | list[Path] = None, - source_dirs: Path = None, toolsdirs: str | list[Path] = None, docsdirs: str | list[Path] = None, - python_target_release: str = None, # e.g. "37101" for 3.7.10 + self._copy_essential_files() + self._create_initial_batch_scripts() + utils.python_execmodule("ensurepip", self.distribution.target) + self.distribution.patch_standard_packages("pip") + essential_packages = ["pip", "setuptools", "wheel", "wppm"] + for package_name in essential_packages: + actions = ["install", "--upgrade", "--pre", package_name] + self.install_options + self._print_action(f"Piping: {' '.join(actions)}") + self.distribution.do_pip_action(actions) + self.distribution.patch_standard_packages(package_name) + +def make_all(build_number: int, release_level: str, basedir_wpy: Path = None, + verbose: bool = False, install_options=["--no-index"], + flavor: str = "", find_links: str | list[Path] = None, + source_dirs: Path = None, toolsdirs: str | list[Path] = None, ): """ Make a WinPython distribution for a given set of parameters: Args: build_number: build number [int] release_level: release level (e.g. 'beta1', '') [str] - pyver: python version ('3.4' or 3.5') - architecture: [int] (32 or 64) - basedir: where to create the build (r'D:\Winpython\basedir34') + basedir_wpy: top directory of the build (c:\...\Wpy...) verbose: Enable verbose output (bool). - rebuild: Whether to rebuild the distribution (bool). - create_installer: Type of installer to create (str). install_options: pip options (r'--no-index --pre --trusted-host=None') flavor: WinPython flavor (str). - requirements: package lists for pip (r'D:\requirements.txt') find_links: package directories (r'D:\Winpython\packages.srcreq') source_dirs: the python.zip + rebuilt winpython wheel package directory toolsdirs: Directory with development tools r'D:\WinPython\basedir34\t.Slim' - docsdirs: Directory with documentation r'D:\WinPython\basedir34\docs.Slim' - python_target_release: Target Python release (str). """ - assert basedir is not None, "The *basedir* directory must be specified" - assert architecture in (32, 64) + assert basedir_wpy is not None, "The *winpython_dirname* directory must be specified" tools_dirs_list = parse_list_argument(toolsdirs, ",") - docs_dirs_list = parse_list_argument(docsdirs, ",") install_options_list = parse_list_argument(install_options, " ") find_links_dirs_list = parse_list_argument(find_links, ",") - requirements_files_list = [Path(f) for f in parse_list_argument(requirements, ",") if f] find_links_options = [f"--find-links={link}" for link in find_links_dirs_list + [source_dirs]] - build_directory = Path(basedir) / ("bu" + flavor) - - if rebuild: - utils.print_box(f"Making WinPython {architecture}bits at {Path(basedir) / ('bu' + flavor)}") - os.makedirs(build_directory, exist_ok=True) - # use source_dirs as the directory to re-build Winpython wheel - winpython_source_dir = Path(__file__).resolve().parent - rebuild_winpython_package(winpython_source_dir, Path(source_dirs), architecture, verbose) + winpy_dir = Path(basedir_wpy) + utils.print_box(f"Making WinPython at {winpy_dir}") + os.makedirs(winpy_dir, exist_ok=True) builder = WinPythonDistributionBuilder( - build_number, release_level, build_directory, wheels_directory=source_dirs, + build_number, release_level, winpy_dir.parent, wheels_directory=source_dirs, tools_directories=[Path(d) for d in tools_dirs_list], - documentation_directories=[Path(d) for d in docs_dirs_list], - verbose=verbose, base_directory=basedir, + verbose=verbose, install_options=install_options_list + find_links_options, flavor=flavor ) - # define the directory where to create the distro - python_minor_version_str = "".join(builder.python_name.replace(".amd64", "").split(".")[-2:-1]) - while not python_minor_version_str.isdigit() and len(python_minor_version_str) > 0: - python_minor_version_str = python_minor_version_str[:-1] - # simplify for PyPy - if python_target_release is not None: - winpython_dirname = f"WPy{architecture}-{python_target_release}{build_number}{release_level}" - else: - winpython_dirname = f"WPy{architecture}-{pyver.replace('.', '')}{python_minor_version_str}{build_number}{release_level}" - - builder.build(rebuild=rebuild, requirements_files_list=requirements_files_list, winpy_dirname=winpython_dirname) + builder.build(winpy_dir=winpy_dir) - for installer_type in [".zip", ".7z", ".exe"]: - if installer_type in create_installer.lower().replace("7zip",".exe"): - builder.create_installer_7zip(installer_type) if __name__ == "__main__": # DO create only one Winpython distribution at a time make_all( build_number=1, - release_level="build3", - pyver="3.4", - basedir=r"D:\Winpython\basedir34", + release_level="b3", + basedir_wpy=r"D:\WinPython\bd314\budot\WPy64-31401b3", verbose=True, - architecture=64, - flavor="Barebone", - requirements=r"D:\Winpython\basedir34\barebone_requirements.txt", + flavor="dot", install_options=r"--no-index --pre --trusted-host=None", find_links=r"D:\Winpython\packages.srcreq", - source_dirs=r"D:\WinPython\basedir34\packages.win-amd64", - toolsdirs=r"D:\WinPython\basedir34\t.Slim", - docsdirs=r"D:\WinPython\basedir34\docs.Slim", + source_dirs=r"D:\WinPython\bd314\packages.win-amd64", + toolsdirs=r"D:\WinPython\bd314\t.Slim", ) diff --git a/portable/build_my_launchers.bat b/portable/launchers_building/build_my_launchers.bat similarity index 56% rename from portable/build_my_launchers.bat rename to portable/launchers_building/build_my_launchers.bat index 579a96e6..2585eb5c 100644 --- a/portable/build_my_launchers.bat +++ b/portable/launchers_building/build_my_launchers.bat @@ -9,24 +9,29 @@ rem pick the right ones and rename them in launchers_final set do_launcher=%~dp0launchers_src\build_one_launcher.bat set do_launcher_original=%~dp0launchers_src_original\build_one_launcher.bat -::WINDOWS launchers -rem call %do_launcher% "python.ico" "winidle.bat" "IDLE (Python GUI)" WINDOWS proposed echo displace this pause if you want to re-build more pause rem exit -call %do_launcher% "powershell.ico" "cmd_ps.bat" "WinPython Powershell Prompt" WINDOWS proposed +:: WINDOWS launchers with Drag & Drop +call %do_launcher% "python.ico" "winidle.bat" "IDLE (Python GUI)" WINDOWS proposed call %do_launcher% "spyder.ico" "winspyder.bat" "Spyder" WINDOWS proposed -call %do_launcher% "spyder_reset.ico" "spyder_reset.bat" "Spyder reset" WINDOWS proposed -call %do_launcher% "code.ico" "winvscode.bat" "VS Code" WINDOWS proposed -:: CONSOLE launchers -call %do_launcher% "cmd.ico" "cmd.bat" "WinPython Command Prompt" CONSOLE proposed -call %do_launcher% "python.ico" "winpython.bat" "WinPython Interpreter" CONSOLE proposed +:: CONSOLE launchers with Drag & Drop call %do_launcher% "jupyter.ico" "winipython_notebook.bat" "Jupyter Notebook" CONSOLE proposed call %do_launcher% "jupyter.ico" "winjupyter_lab.bat" "Jupyter Lab" CONSOLE proposed call %do_launcher% "winpython.ico" "wpcp.bat" "WinPython Control Panel" CONSOLE proposed + +:: WINDOWS launchers with no Drag & Drop +call %do_launcher_original% "powershell.ico" "cmd_ps.bat" "WinPython Powershell Prompt" WINDOWS proposed +call %do_launcher_original% "spyder_reset.ico" "spyder_reset.bat" "Spyder reset" WINDOWS proposed +call %do_launcher_original% "code.ico" "winvscode.bat" "VS Code" WINDOWS proposed + +:: CONSOLE launchers with no Drag & Drop +call %do_launcher_original% "cmd.ico" "cmd.bat" "WinPython Command Prompt" CONSOLE proposed +call %do_launcher_original% "python.ico" "winpython.bat" "WinPython Interpreter" CONSOLE proposed + pause diff --git a/portable/icons/cmd.ico b/portable/launchers_building/icons/cmd.ico similarity index 100% rename from portable/icons/cmd.ico rename to portable/launchers_building/icons/cmd.ico diff --git a/portable/icons/code.ico b/portable/launchers_building/icons/code.ico similarity index 100% rename from portable/icons/code.ico rename to portable/launchers_building/icons/code.ico diff --git a/portable/icons/ijulia.ico b/portable/launchers_building/icons/ijulia.ico similarity index 100% rename from portable/icons/ijulia.ico rename to portable/launchers_building/icons/ijulia.ico diff --git a/portable/icons/install.ico b/portable/launchers_building/icons/install.ico similarity index 100% rename from portable/icons/install.ico rename to portable/launchers_building/icons/install.ico diff --git a/portable/icons/ipython.ico b/portable/launchers_building/icons/ipython.ico similarity index 100% rename from portable/icons/ipython.ico rename to portable/launchers_building/icons/ipython.ico diff --git a/portable/icons/julia.ico b/portable/launchers_building/icons/julia.ico similarity index 100% rename from portable/icons/julia.ico rename to portable/launchers_building/icons/julia.ico diff --git a/portable/icons/jupyter.ico b/portable/launchers_building/icons/jupyter.ico similarity index 100% rename from portable/icons/jupyter.ico rename to portable/launchers_building/icons/jupyter.ico diff --git a/portable/icons/powershell.ico b/portable/launchers_building/icons/powershell.ico similarity index 100% rename from portable/icons/powershell.ico rename to portable/launchers_building/icons/powershell.ico diff --git a/portable/icons/python.ico b/portable/launchers_building/icons/python.ico similarity index 100% rename from portable/icons/python.ico rename to portable/launchers_building/icons/python.ico diff --git a/portable/icons/spyder.ico b/portable/launchers_building/icons/spyder.ico similarity index 100% rename from portable/icons/spyder.ico rename to portable/launchers_building/icons/spyder.ico diff --git a/portable/icons/spyder_reset.ico b/portable/launchers_building/icons/spyder_reset.ico similarity index 100% rename from portable/icons/spyder_reset.ico rename to portable/launchers_building/icons/spyder_reset.ico diff --git a/portable/icons/terminal.ico b/portable/launchers_building/icons/terminal.ico similarity index 100% rename from portable/icons/terminal.ico rename to portable/launchers_building/icons/terminal.ico diff --git a/portable/icons/uninstall.ico b/portable/launchers_building/icons/uninstall.ico similarity index 100% rename from portable/icons/uninstall.ico rename to portable/launchers_building/icons/uninstall.ico diff --git a/portable/icons/winpython.ico b/portable/launchers_building/icons/winpython.ico similarity index 100% rename from portable/icons/winpython.ico rename to portable/launchers_building/icons/winpython.ico diff --git a/portable/images/banner.bmp b/portable/launchers_building/images/banner.bmp similarity index 100% rename from portable/images/banner.bmp rename to portable/launchers_building/images/banner.bmp diff --git a/portable/images/banner.pdn b/portable/launchers_building/images/banner.pdn similarity index 100% rename from portable/images/banner.pdn rename to portable/launchers_building/images/banner.pdn diff --git a/portable/images/installer_logo.bmp b/portable/launchers_building/images/installer_logo.bmp similarity index 100% rename from portable/images/installer_logo.bmp rename to portable/launchers_building/images/installer_logo.bmp diff --git a/portable/images/splash.bmp b/portable/launchers_building/images/splash.bmp similarity index 100% rename from portable/images/splash.bmp rename to portable/launchers_building/images/splash.bmp diff --git a/portable/images/splash.pdn b/portable/launchers_building/images/splash.pdn similarity index 100% rename from portable/images/splash.pdn rename to portable/launchers_building/images/splash.pdn diff --git a/portable/images/win.bmp b/portable/launchers_building/images/win.bmp similarity index 100% rename from portable/images/win.bmp rename to portable/launchers_building/images/win.bmp diff --git a/portable/images/win.pdn b/portable/launchers_building/images/win.pdn similarity index 100% rename from portable/images/win.pdn rename to portable/launchers_building/images/win.pdn diff --git a/portable/images/winpython_title.svg b/portable/launchers_building/images/winpython_title.svg similarity index 100% rename from portable/images/winpython_title.svg rename to portable/launchers_building/images/winpython_title.svg diff --git a/portable/images/winpython_title_portrait.svg b/portable/launchers_building/images/winpython_title_portrait.svg similarity index 100% rename from portable/images/winpython_title_portrait.svg rename to portable/launchers_building/images/winpython_title_portrait.svg diff --git a/portable/launchers_final_original/IDLE (Python GUI).exe b/portable/launchers_building/launchers_final_original/IDLE (Python GUI).exe similarity index 100% rename from portable/launchers_final_original/IDLE (Python GUI).exe rename to portable/launchers_building/launchers_final_original/IDLE (Python GUI).exe diff --git a/portable/launchers_final_original/Jupyter Lab.exe b/portable/launchers_building/launchers_final_original/Jupyter Lab.exe similarity index 100% rename from portable/launchers_final_original/Jupyter Lab.exe rename to portable/launchers_building/launchers_final_original/Jupyter Lab.exe diff --git a/portable/launchers_final_original/Jupyter Notebook.exe b/portable/launchers_building/launchers_final_original/Jupyter Notebook.exe similarity index 100% rename from portable/launchers_final_original/Jupyter Notebook.exe rename to portable/launchers_building/launchers_final_original/Jupyter Notebook.exe diff --git a/portable/launchers_final_original/Spyder reset.exe b/portable/launchers_building/launchers_final_original/Spyder reset.exe similarity index 100% rename from portable/launchers_final_original/Spyder reset.exe rename to portable/launchers_building/launchers_final_original/Spyder reset.exe diff --git a/portable/launchers_final_original/Spyder.exe b/portable/launchers_building/launchers_final_original/Spyder.exe similarity index 100% rename from portable/launchers_final_original/Spyder.exe rename to portable/launchers_building/launchers_final_original/Spyder.exe diff --git a/portable/launchers_final_original/VS Code.exe b/portable/launchers_building/launchers_final_original/VS Code.exe similarity index 100% rename from portable/launchers_final_original/VS Code.exe rename to portable/launchers_building/launchers_final_original/VS Code.exe diff --git a/portable/launchers_final_original/WinPython Command Prompt.exe b/portable/launchers_building/launchers_final_original/WinPython Command Prompt.exe similarity index 100% rename from portable/launchers_final_original/WinPython Command Prompt.exe rename to portable/launchers_building/launchers_final_original/WinPython Command Prompt.exe diff --git a/portable/launchers_final_original/WinPython Control Panel.exe b/portable/launchers_building/launchers_final_original/WinPython Control Panel.exe similarity index 100% rename from portable/launchers_final_original/WinPython Control Panel.exe rename to portable/launchers_building/launchers_final_original/WinPython Control Panel.exe diff --git a/portable/launchers_final_original/WinPython Interpreter.exe b/portable/launchers_building/launchers_final_original/WinPython Interpreter.exe similarity index 100% rename from portable/launchers_final_original/WinPython Interpreter.exe rename to portable/launchers_building/launchers_final_original/WinPython Interpreter.exe diff --git a/portable/launchers_final_original/WinPython Powershell Prompt.exe b/portable/launchers_building/launchers_final_original/WinPython Powershell Prompt.exe similarity index 100% rename from portable/launchers_final_original/WinPython Powershell Prompt.exe rename to portable/launchers_building/launchers_final_original/WinPython Powershell Prompt.exe diff --git a/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI).exe b/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI).exe new file mode 100644 index 00000000..65523199 Binary files /dev/null and b/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI).exe differ diff --git a/portable/launchers_final_proposed/IDLE (Python GUI).exe b/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_2025-05-09_not_ok.exe similarity index 100% rename from portable/launchers_final_proposed/IDLE (Python GUI).exe rename to portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_2025-05-09_not_ok.exe diff --git a/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_20250401.exe b/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_20250401.exe new file mode 100644 index 00000000..c1e0c9dc Binary files /dev/null and b/portable/launchers_building/launchers_final_proposed/IDLE (Python GUI)_20250401.exe differ diff --git a/portable/launchers_final_proposed/Jupyter Lab.exe b/portable/launchers_building/launchers_final_proposed/Jupyter Lab.exe similarity index 100% rename from portable/launchers_final_proposed/Jupyter Lab.exe rename to portable/launchers_building/launchers_final_proposed/Jupyter Lab.exe diff --git a/portable/launchers_final_proposed/Jupyter Notebook.exe b/portable/launchers_building/launchers_final_proposed/Jupyter Notebook.exe similarity index 100% rename from portable/launchers_final_proposed/Jupyter Notebook.exe rename to portable/launchers_building/launchers_final_proposed/Jupyter Notebook.exe diff --git a/portable/launchers_final_proposed/Spyder reset.exe b/portable/launchers_building/launchers_final_proposed/Spyder reset.exe similarity index 100% rename from portable/launchers_final_proposed/Spyder reset.exe rename to portable/launchers_building/launchers_final_proposed/Spyder reset.exe diff --git a/portable/launchers_building/launchers_final_proposed/Spyder.exe b/portable/launchers_building/launchers_final_proposed/Spyder.exe new file mode 100644 index 00000000..93b1a050 Binary files /dev/null and b/portable/launchers_building/launchers_final_proposed/Spyder.exe differ diff --git a/portable/launchers_final_proposed/Spyder.exe b/portable/launchers_building/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe similarity index 100% rename from portable/launchers_final_proposed/Spyder.exe rename to portable/launchers_building/launchers_final_proposed/Spyder_2025-05-08_no_drag_and_drop.exe diff --git a/portable/launchers_final_proposed/VS Code.exe b/portable/launchers_building/launchers_final_proposed/VS Code.exe similarity index 100% rename from portable/launchers_final_proposed/VS Code.exe rename to portable/launchers_building/launchers_final_proposed/VS Code.exe diff --git a/portable/launchers_final_proposed/WinPython Command Prompt.exe b/portable/launchers_building/launchers_final_proposed/WinPython Command Prompt.exe similarity index 100% rename from portable/launchers_final_proposed/WinPython Command Prompt.exe rename to portable/launchers_building/launchers_final_proposed/WinPython Command Prompt.exe diff --git a/portable/launchers_building/launchers_final_proposed/WinPython Control Panel.exe b/portable/launchers_building/launchers_final_proposed/WinPython Control Panel.exe new file mode 100644 index 00000000..72a57a67 Binary files /dev/null and b/portable/launchers_building/launchers_final_proposed/WinPython Control Panel.exe differ diff --git a/portable/launchers_final_proposed/WinPython Control Panel.exe b/portable/launchers_building/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe similarity index 100% rename from portable/launchers_final_proposed/WinPython Control Panel.exe rename to portable/launchers_building/launchers_final_proposed/WinPython Control Panel_2025-05-09.exe diff --git a/portable/launchers_final_proposed/WinPython Interpreter.exe b/portable/launchers_building/launchers_final_proposed/WinPython Interpreter.exe similarity index 100% rename from portable/launchers_final_proposed/WinPython Interpreter.exe rename to portable/launchers_building/launchers_final_proposed/WinPython Interpreter.exe diff --git a/portable/launchers_final_proposed/WinPython Powershell Prompt.exe b/portable/launchers_building/launchers_final_proposed/WinPython Powershell Prompt.exe similarity index 100% rename from portable/launchers_final_proposed/WinPython Powershell Prompt.exe rename to portable/launchers_building/launchers_final_proposed/WinPython Powershell Prompt.exe diff --git a/portable/launchers_final_proposed/license.txt b/portable/launchers_building/launchers_final_proposed/license.txt similarity index 100% rename from portable/launchers_final_proposed/license.txt rename to portable/launchers_building/launchers_final_proposed/license.txt diff --git a/portable/launchers_src/LICENSE b/portable/launchers_building/launchers_src/LICENSE similarity index 100% rename from portable/launchers_src/LICENSE rename to portable/launchers_building/launchers_src/LICENSE diff --git a/portable/launchers_src/build_one_launcher.bat b/portable/launchers_building/launchers_src/build_one_launcher.bat similarity index 97% rename from portable/launchers_src/build_one_launcher.bat rename to portable/launchers_building/launchers_src/build_one_launcher.bat index 233f68de..c48374c4 100644 --- a/portable/launchers_src/build_one_launcher.bat +++ b/portable/launchers_building/launchers_src/build_one_launcher.bat @@ -3,6 +3,7 @@ set icon_name=%1 set LAUNCH_TARGET=%2 set launcher_name=%3 set subsystem=%4 +set destination=%5 set icon_name=%icon_name:"=% set LAUNCH_TARGET=%LAUNCH_TARGET:"=% @@ -12,7 +13,7 @@ set subsystem=%subsystem:"=% set ROOT_PATH=%~dp0..\ set SCRIPT_PATH=%~dp0 set TEMPO_PATH=%ROOT_PATH%launchers_temp -set OUTPUT_DIR=%ROOT_PATH%launchers_final +set OUTPUT_DIR=%ROOT_PATH%launchers_%destination% set "ICON_FILE=%ROOT_PATH%icons\%icon_name%" set LAUNCHER_EXE=%OUTPUT_DIR%\%launcher_name%.exe diff --git a/portable/launchers_src/launcher_template_CONSOLE.cpp b/portable/launchers_building/launchers_src/launcher_template_CONSOLE.cpp similarity index 100% rename from portable/launchers_src/launcher_template_CONSOLE.cpp rename to portable/launchers_building/launchers_src/launcher_template_CONSOLE.cpp diff --git a/portable/launchers_src/launcher_template_WINDOWS.cpp b/portable/launchers_building/launchers_src/launcher_template_WINDOWS.cpp similarity index 100% rename from portable/launchers_src/launcher_template_WINDOWS.cpp rename to portable/launchers_building/launchers_src/launcher_template_WINDOWS.cpp diff --git a/portable/launchers_src_original/LICENSE b/portable/launchers_building/launchers_src_original/LICENSE similarity index 100% rename from portable/launchers_src_original/LICENSE rename to portable/launchers_building/launchers_src_original/LICENSE diff --git a/portable/launchers_src_original/build_one_launcher.bat b/portable/launchers_building/launchers_src_original/build_one_launcher.bat similarity index 97% rename from portable/launchers_src_original/build_one_launcher.bat rename to portable/launchers_building/launchers_src_original/build_one_launcher.bat index 233f68de..c48374c4 100644 --- a/portable/launchers_src_original/build_one_launcher.bat +++ b/portable/launchers_building/launchers_src_original/build_one_launcher.bat @@ -3,6 +3,7 @@ set icon_name=%1 set LAUNCH_TARGET=%2 set launcher_name=%3 set subsystem=%4 +set destination=%5 set icon_name=%icon_name:"=% set LAUNCH_TARGET=%LAUNCH_TARGET:"=% @@ -12,7 +13,7 @@ set subsystem=%subsystem:"=% set ROOT_PATH=%~dp0..\ set SCRIPT_PATH=%~dp0 set TEMPO_PATH=%ROOT_PATH%launchers_temp -set OUTPUT_DIR=%ROOT_PATH%launchers_final +set OUTPUT_DIR=%ROOT_PATH%launchers_%destination% set "ICON_FILE=%ROOT_PATH%icons\%icon_name%" set LAUNCHER_EXE=%OUTPUT_DIR%\%launcher_name%.exe diff --git a/portable/launchers_src_original/launcher_template_CONSOLE.cpp b/portable/launchers_building/launchers_src_original/launcher_template_CONSOLE.cpp similarity index 100% rename from portable/launchers_src_original/launcher_template_CONSOLE.cpp rename to portable/launchers_building/launchers_src_original/launcher_template_CONSOLE.cpp diff --git a/portable/launchers_src_original/launcher_template_WINDOWS.cpp b/portable/launchers_building/launchers_src_original/launcher_template_WINDOWS.cpp similarity index 100% rename from portable/launchers_src_original/launcher_template_WINDOWS.cpp rename to portable/launchers_building/launchers_src_original/launcher_template_WINDOWS.cpp diff --git a/portable/launchers_final/IDLE (Python GUI).exe b/portable/launchers_final/IDLE (Python GUI).exe index c1e0c9dc..65523199 100644 Binary files a/portable/launchers_final/IDLE (Python GUI).exe and b/portable/launchers_final/IDLE (Python GUI).exe differ diff --git a/portable/launchers_final/Spyder.exe b/portable/launchers_final/Spyder.exe index 43874aa7..93b1a050 100644 Binary files a/portable/launchers_final/Spyder.exe and b/portable/launchers_final/Spyder.exe differ diff --git a/portable/launchers_final/WinPython Control Panel.exe b/portable/launchers_final/WinPython Control Panel.exe index 5795bf9c..72a57a67 100644 Binary files a/portable/launchers_final/WinPython Control Panel.exe and b/portable/launchers_final/WinPython Control Panel.exe differ diff --git a/portable/license.txt b/portable/launchers_final/license.txt similarity index 97% rename from portable/license.txt rename to portable/launchers_final/license.txt index 75f3c134..da461f3b 100644 --- a/portable/license.txt +++ b/portable/launchers_final/license.txt @@ -1,37 +1,37 @@ -Note ----- - -WinPython components are distributed as they were received from -their copyright holder, under their own copyright and/or license, -and without any linking with each other. - -WinPython software collection (i.e. the collection of software, -libraries and documents) is licensed under the terms of the -following license agreement. - - -WinPython License Agreement (MIT License) ------------------------------------------ - -Copyright (c) 2012 Pierre Raybaut, 2016+ WinPython team - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +Note +---- + +WinPython components are distributed as they were received from +their copyright holder, under their own copyright and/or license, +and without any linking with each other. + +WinPython software collection (i.e. the collection of software, +libraries and documents) is licensed under the terms of the +following license agreement. + + +WinPython License Agreement (MIT License) +----------------------------------------- + +Copyright (c) 2012 Pierre Raybaut, 2016+ WinPython team + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/portable/launchers_final/notebooks/docs/README.txt b/portable/launchers_final/notebooks/docs/README.txt new file mode 100644 index 00000000..a0aab429 --- /dev/null +++ b/portable/launchers_final/notebooks/docs/README.txt @@ -0,0 +1 @@ +Examples are now to be found at github.com/winpython/winpython_afterdoc \ No newline at end of file diff --git a/portable/scripts/WinPythonIni.py b/portable/launchers_final/scripts/WinPythonIni.py similarity index 98% rename from portable/scripts/WinPythonIni.py rename to portable/launchers_final/scripts/WinPythonIni.py index 7bc11bb9..ddc0c2e7 100644 --- a/portable/scripts/WinPythonIni.py +++ b/portable/launchers_final/scripts/WinPythonIni.py @@ -17,6 +17,7 @@ USERPROFILE = %HOME% [environment] ## Uncomment lines to override environment variables +#SPYDER_CONFDIR = %HOME%\settings\.spyder-py3 #JUPYTERLAB_SETTINGS_DIR = %HOME%\.jupyter\lab #JUPYTERLAB_WORKSPACES_DIR = %HOME%\.jupyter\lab\workspaces #R_HOME=%WINPYDIRBASE%\t\R @@ -26,6 +27,7 @@ #JULIA=%JULIA_HOME%%JULIA_EXE% #JULIA_PKGDIR=%WINPYDIRBASE%\settings\.julia #QT_PLUGIN_PATH=%WINPYDIR%\Lib\site-packages\pyqt5_tools\Qt\plugins + ''' def get_file(file_name): diff --git a/portable/scripts/WinPython_PS_Prompt.ps1 b/portable/launchers_final/scripts/WinPython_PS_Prompt.ps1 similarity index 96% rename from portable/scripts/WinPython_PS_Prompt.ps1 rename to portable/launchers_final/scripts/WinPython_PS_Prompt.ps1 index ecd2d6aa..fc730090 100644 --- a/portable/scripts/WinPython_PS_Prompt.ps1 +++ b/portable/launchers_final/scripts/WinPython_PS_Prompt.ps1 @@ -63,8 +63,4 @@ Param([int]$x=$host.ui.rawui.windowsize.width, } # Windows10 yelling at us with 150 40 6000 # Set-WindowSize 195 40 6000 - -### Colorize to distinguish -$host.ui.RawUI.BackgroundColor = "Black" -$host.ui.RawUI.ForegroundColor = "White" } diff --git a/portable/scripts/activate.bat b/portable/launchers_final/scripts/activate.bat similarity index 100% rename from portable/scripts/activate.bat rename to portable/launchers_final/scripts/activate.bat diff --git a/portable/scripts/cmd.bat b/portable/launchers_final/scripts/cmd.bat similarity index 100% rename from portable/scripts/cmd.bat rename to portable/launchers_final/scripts/cmd.bat diff --git a/portable/scripts/cmd_ps.bat b/portable/launchers_final/scripts/cmd_ps.bat similarity index 100% rename from portable/scripts/cmd_ps.bat rename to portable/launchers_final/scripts/cmd_ps.bat diff --git a/portable/scripts/env.bat b/portable/launchers_final/scripts/env.bat similarity index 97% rename from portable/scripts/env.bat rename to portable/launchers_final/scripts/env.bat index 316f6587..952df8e4 100644 --- a/portable/scripts/env.bat +++ b/portable/launchers_final/scripts/env.bat @@ -30,6 +30,7 @@ rem set PYTHONUTF8=1 creates issues in "movable" patching set HOME=%WINPYDIRBASE%\settings rem see https://github.com/winpython/winpython/issues/839 rem set USERPROFILE=%HOME% +set SPYDER_CONFDIR=%HOME%\settings\.spyder-py3 set JUPYTER_DATA_DIR=%HOME% set JUPYTER_CONFIG_DIR=%WINPYDIR%\etc\jupyter set JUPYTER_CONFIG_PATH=%WINPYDIR%\etc\jupyter diff --git a/portable/scripts/env_for_icons.bat b/portable/launchers_final/scripts/env_for_icons.bat similarity index 100% rename from portable/scripts/env_for_icons.bat rename to portable/launchers_final/scripts/env_for_icons.bat diff --git a/portable/launchers_final/scripts/make_working_directory_and_userprofile_be_winpython.bat b/portable/launchers_final/scripts/make_working_directory_and_userprofile_be_winpython.bat new file mode 100644 index 00000000..489aef0b --- /dev/null +++ b/portable/launchers_final/scripts/make_working_directory_and_userprofile_be_winpython.bat @@ -0,0 +1,3 @@ +call "%~dp0env_for_icons.bat" +"%PYTHON%" -c "from wppm.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" +"%PYTHON%" -c "from wppm.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[inactive_environment_common]', '[active_environment_common]' )" \ No newline at end of file diff --git a/portable/launchers_final/scripts/make_working_directory_be_not_winpython.bat b/portable/launchers_final/scripts/make_working_directory_be_not_winpython.bat new file mode 100644 index 00000000..7a726169 --- /dev/null +++ b/portable/launchers_final/scripts/make_working_directory_be_not_winpython.bat @@ -0,0 +1,3 @@ +call "%~dp0env_for_icons.bat" +"%PYTHON%" -c "from wppm.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" +"%PYTHON%" -c "from wppm.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[inactive_environment_per_user]', '[active_environment_per_user]' )" \ No newline at end of file diff --git a/portable/launchers_final/scripts/make_working_directory_be_winpython.bat b/portable/launchers_final/scripts/make_working_directory_be_winpython.bat new file mode 100644 index 00000000..0f422a4e --- /dev/null +++ b/portable/launchers_final/scripts/make_working_directory_be_winpython.bat @@ -0,0 +1,2 @@ +call "%~dp0env_for_icons.bat" +"%PYTHON%" -c "from wppm.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" diff --git a/portable/scripts/python.bat b/portable/launchers_final/scripts/python.bat similarity index 100% rename from portable/scripts/python.bat rename to portable/launchers_final/scripts/python.bat diff --git a/portable/scripts/readme.txt b/portable/launchers_final/scripts/readme.txt similarity index 100% rename from portable/scripts/readme.txt rename to portable/launchers_final/scripts/readme.txt diff --git a/portable/scripts/spyder_reset.bat b/portable/launchers_final/scripts/spyder_reset.bat similarity index 100% rename from portable/scripts/spyder_reset.bat rename to portable/launchers_final/scripts/spyder_reset.bat diff --git a/portable/scripts/upgrade_pip.bat b/portable/launchers_final/scripts/upgrade_pip.bat similarity index 56% rename from portable/scripts/upgrade_pip.bat rename to portable/launchers_final/scripts/upgrade_pip.bat index da212592..4443ed16 100644 --- a/portable/scripts/upgrade_pip.bat +++ b/portable/launchers_final/scripts/upgrade_pip.bat @@ -3,5 +3,5 @@ call "%~dp0env.bat" echo this will upgrade pip with latest version, then patch it for WinPython portability ok ? pause "%WINPYDIR%\python.exe" -m pip install --upgrade pip -"%WINPYDIR%\python.exe" -c "from winpython import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=True) +"%WINPYDIR%\python.exe" -c "from wppm import wppm;dist=wppm.Distribution(r'%WINPYDIR%');dist.patch_standard_packages('pip', to_movable=True) pause \ No newline at end of file diff --git a/portable/launchers_final/scripts/winidle.bat b/portable/launchers_final/scripts/winidle.bat new file mode 100644 index 00000000..797549ab --- /dev/null +++ b/portable/launchers_final/scripts/winidle.bat @@ -0,0 +1,4 @@ +@echo off +call "%~dp0env_for_icons.bat" %* +rem "%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\idlelib\idle.pyw" %* +"%WINPYDIR%\python.exe" -m idlelib %* \ No newline at end of file diff --git a/portable/launchers_final/scripts/winipython_notebook.bat b/portable/launchers_final/scripts/winipython_notebook.bat new file mode 100644 index 00000000..f5681520 --- /dev/null +++ b/portable/launchers_final/scripts/winipython_notebook.bat @@ -0,0 +1,4 @@ +@echo off +call "%~dp0env_for_icons.bat" %* +rem "%WINPYDIR%\scripts\jupyter-notebook.exe" %* +"%WINPYDIR%\python.exe" -m jupyter notebook %* \ No newline at end of file diff --git a/portable/launchers_final/scripts/winjupyter_lab.bat b/portable/launchers_final/scripts/winjupyter_lab.bat new file mode 100644 index 00000000..ffdf2fce --- /dev/null +++ b/portable/launchers_final/scripts/winjupyter_lab.bat @@ -0,0 +1,4 @@ +@echo off +call "%~dp0env_for_icons.bat" %* +rem "%WINPYDIR%\scripts\jupyter-lab.exe" %* +"%WINPYDIR%\python.exe" -m jupyter lab %* \ No newline at end of file diff --git a/portable/scripts/winpython.bat b/portable/launchers_final/scripts/winpython.bat similarity index 58% rename from portable/scripts/winpython.bat rename to portable/launchers_final/scripts/winpython.bat index 9f98d397..2a0706ec 100644 --- a/portable/scripts/winpython.bat +++ b/portable/launchers_final/scripts/winpython.bat @@ -1,8 +1,8 @@ @echo off call "%~dp0env_for_icons.bat" %* rem backward compatibility for non-ptpython users -if exist "%WINPYDIR%\scripts\ptpython.exe" ( - "%WINPYDIR%\scripts\ptpython.exe" %* +if exist "%WINPYDIR%\Lib\site-packages\ptpython" ( + "%WINPYDIR%\python.exe" -m ptpython %* ) else ( "%WINPYDIR%\python.exe" %* ) \ No newline at end of file diff --git a/portable/launchers_final/scripts/winspyder.bat b/portable/launchers_final/scripts/winspyder.bat new file mode 100644 index 00000000..1a843ca0 --- /dev/null +++ b/portable/launchers_final/scripts/winspyder.bat @@ -0,0 +1,5 @@ +@echo off +call "%~dp0env_for_icons.bat" %* +rem "%WINPYDIR%\scripts\spyder.exe" %* -w "%WINPYWORKDIR1%" +"%WINPYDIR%\scripts\spyder.exe" %* + diff --git a/portable/scripts/winvscode.bat b/portable/launchers_final/scripts/winvscode.bat similarity index 100% rename from portable/scripts/winvscode.bat rename to portable/launchers_final/scripts/winvscode.bat diff --git a/portable/launchers_final/scripts/wpcp.bat b/portable/launchers_final/scripts/wpcp.bat new file mode 100644 index 00000000..251a8348 --- /dev/null +++ b/portable/launchers_final/scripts/wpcp.bat @@ -0,0 +1,4 @@ +@echo off +call "%~dp0env_for_icons.bat" %* +rem cmd.exe /k "echo wppm & wppm" %* +cmd.exe /k "echo wppm & "%WINPYDIR%\python.exe" -m wppm" %* \ No newline at end of file diff --git a/portable/scripts/WinPython_Terminal.bat b/portable/scripts/WinPython_Terminal.bat deleted file mode 100644 index 3e55a021..00000000 --- a/portable/scripts/WinPython_Terminal.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -Powershell.exe -Command "& {Start-Process PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -noexit -File ""%~dp0WinPython_PS_Prompt.ps1""'}" -exit \ No newline at end of file diff --git a/portable/scripts/make_working_directory_and_userprofile_be_winpython.bat b/portable/scripts/make_working_directory_and_userprofile_be_winpython.bat deleted file mode 100644 index 2806dc14..00000000 --- a/portable/scripts/make_working_directory_and_userprofile_be_winpython.bat +++ /dev/null @@ -1,3 +0,0 @@ -call "%~dp0env_for_icons.bat" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[inactive_environment_common]', '[active_environment_common]' )" \ No newline at end of file diff --git a/portable/scripts/make_working_directory_be_not_winpython.bat b/portable/scripts/make_working_directory_be_not_winpython.bat deleted file mode 100644 index 759de71d..00000000 --- a/portable/scripts/make_working_directory_be_not_winpython.bat +++ /dev/null @@ -1,3 +0,0 @@ -call "%~dp0env_for_icons.bat" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[inactive_environment_per_user]', '[active_environment_per_user]' )" \ No newline at end of file diff --git a/portable/scripts/make_working_directory_be_winpython.bat b/portable/scripts/make_working_directory_be_winpython.bat deleted file mode 100644 index bcdd3c45..00000000 --- a/portable/scripts/make_working_directory_be_winpython.bat +++ /dev/null @@ -1,2 +0,0 @@ -call "%~dp0env_for_icons.bat" -"%PYTHON%" -c "from winpython.utils import patch_sourcefile;patch_sourcefile(r'%~dp0..\settings\winpython.ini', '[active_environment', '[inactive_environment' )" diff --git a/portable/scripts/register_python_for_all.bat b/portable/scripts/register_python_for_all.bat deleted file mode 100644 index 9f45aa70..00000000 --- a/portable/scripts/register_python_for_all.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -call "%~dp0env.bat" -"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\winpython\associate.py" --all diff --git a/portable/scripts/unregister_python_for_all.bat b/portable/scripts/unregister_python_for_all.bat deleted file mode 100644 index b1600226..00000000 --- a/portable/scripts/unregister_python_for_all.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -call "%~dp0env.bat" -"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\winpython\associate.py" --unregister --all diff --git a/portable/scripts/winidle.bat b/portable/scripts/winidle.bat deleted file mode 100644 index 79a6a01a..00000000 --- a/portable/scripts/winidle.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\idlelib\idle.pyw" %* \ No newline at end of file diff --git a/portable/scripts/winipython_notebook.bat b/portable/scripts/winipython_notebook.bat deleted file mode 100644 index 7ee541d9..00000000 --- a/portable/scripts/winipython_notebook.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\scripts\jupyter-notebook.exe" %* \ No newline at end of file diff --git a/portable/scripts/winjupyter_lab.bat b/portable/scripts/winjupyter_lab.bat deleted file mode 100644 index 845d1f0b..00000000 --- a/portable/scripts/winjupyter_lab.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\scripts\jupyter-lab.exe" %* \ No newline at end of file diff --git a/portable/scripts/winspyder.bat b/portable/scripts/winspyder.bat deleted file mode 100644 index deae01c5..00000000 --- a/portable/scripts/winspyder.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -call "%~dp0env_for_icons.bat" %* -"%WINPYDIR%\scripts\spyder.exe" %* -w "%WINPYWORKDIR1%" \ No newline at end of file diff --git a/portable/scripts/wpcp.bat b/portable/scripts/wpcp.bat deleted file mode 100644 index 5edb982c..00000000 --- a/portable/scripts/wpcp.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -call "%~dp0env_for_icons.bat" %* -cmd.exe /k "echo wppm & wppm %*" \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 2e96abec..4460ae5a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,13 +3,13 @@ requires = ["flit_core"] build-backend = "flit_core.buildapi" [project] -name = "winpython" +name = "wppm" authors = [ {name = "Pierre Raybaut"}, {name = "stonebig"}, ] dependencies = [] -requires-python = ">=3.8" +requires-python = ">=3.10" readme = "README.rst" license = {file = "LICENSE"} classifiers=[ @@ -25,7 +25,7 @@ classifiers=[ 'Topic :: Software Development :: Widget Sets', ] dynamic = ["version",] -description="WinPython distribution tools, including WPPM" +description="WinPython Package Management" keywords = ["Portable","Windows"] [project.urls] @@ -33,4 +33,4 @@ Documentation = "https://winpython.github.io/" Source = "https://github.com/winpython/winpython" [project.scripts] -wppm = "winpython.wppm:main" +wppm = "wppm.wppm:main" diff --git a/winpython/__init__.py b/wppm/__init__.py similarity index 95% rename from winpython/__init__.py rename to wppm/__init__.py index b865bf4c..a454a334 100644 --- a/winpython/__init__.py +++ b/wppm/__init__.py @@ -1,33 +1,33 @@ -# -*- coding: utf-8 -*- -""" -WinPython License Agreement (MIT License) ------------------------------------------ - -Copyright (c) 2012-2013 Pierre Raybaut -Copyright (c) 2014-2025+ The Winpython development team https://github.com/winpython/ - -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. -""" - -__version__ = '15.4.20250507' -__license__ = __doc__ -__project_url__ = 'http://winpython.github.io/' +# -*- coding: utf-8 -*- +""" +WinPython License Agreement (MIT License) +----------------------------------------- + +Copyright (c) 2012-2013 Pierre Raybaut +Copyright (c) 2014-2025+ The Winpython development team https://github.com/winpython/ + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +""" + +__version__ = '17.1.20250705a1' +__license__ = __doc__ +__project_url__ = 'http://winpython.github.io/' diff --git a/wppm/__main__.py b/wppm/__main__.py new file mode 100644 index 00000000..f34bb5e4 --- /dev/null +++ b/wppm/__main__.py @@ -0,0 +1,6 @@ +import os +import sys +if __name__ == "__main__": + from wppm import wppm + + sys.exit(wppm.main()) \ No newline at end of file diff --git a/winpython/associate.py b/wppm/associate.py similarity index 80% rename from winpython/associate.py rename to wppm/associate.py index 5d5854ff..9e02182b 100644 --- a/winpython/associate.py +++ b/wppm/associate.py @@ -1,238 +1,300 @@ -# -*- coding: utf-8 -*- -# -# associate.py = Register a Python distribution -# Copyright © 2012 Pierre Raybaut -# Licensed under the terms of the MIT License -# (see winpython/__init__.py for details) - -import sys -import os -from pathlib import Path -import importlib.util -import winreg -from winpython import utils -from argparse import ArgumentParser - - -# --- Helper functions for Registry --- - -def _set_reg_value(root, key_path, name, value, reg_type=winreg.REG_SZ, verbose=False): - """Helper to create key and set a registry value using CreateKeyEx.""" - rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" - if verbose: - print(f"{rootkey_name}\\{key_path}\\{name if name else ''}:{value}") - try: - # Use CreateKeyEx with context manager for automatic closing - with winreg.CreateKeyEx(root, key_path, 0, winreg.KEY_WRITE) as key: - winreg.SetValueEx(key, name, 0, reg_type, value) - except OSError as e: - print(f"Error creating/setting registry value {rootkey_name}\\{key_path}\\{name}: {e}", file=sys.stderr) - -def _delete_reg_key(root, key_path, verbose=False): - """Helper to delete a registry key, ignoring if not found.""" - rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" - if verbose: - print(f"{rootkey_name}\\{key_path}") - try: - # DeleteKey can only delete keys with no subkeys. - # For keys with (still) subkeys, use DeleteKeyEx on the parent key if available - winreg.DeleteKey(root, key_path) - except FileNotFoundError: - if verbose: - print(f"Registry key not found (skipping deletion): {rootkey_name}\\{key_path}") - except OSError as e: # Catch other potential errors like key not empty - print(f"Error deleting registry key {rootkey_name}\\{key_path}: {e}", file=sys.stderr) - - -# --- Helper functions for Start Menu Shortcuts --- - -def _has_pywin32(): - """Check if pywin32 (pythoncom) is installed.""" - return importlib.util.find_spec('pythoncom') is not None - -def _remove_start_menu_folder(target, current=True, has_pywin32=False): - "remove menu Folder for target WinPython if pywin32 exists" - if has_pywin32: - utils.remove_winpython_start_menu_folder(current=current) - else: - print("Skipping start menu removal as pywin32 package is not installed.") - -def _get_shortcut_data(target, current=True, has_pywin32=False): - "get windows menu access data if pywin32 exists, otherwise empty list" - if not has_pywin32: - return [] - - wpdir = str(Path(target).parent) - data = [] - for name in os.listdir(wpdir): - bname, ext = Path(name).stem, Path(name).suffix - if ext.lower() == ".exe": - # Path for the shortcut file in the start menu folder - shortcut_name = str(Path(utils.create_winpython_start_menu_folder(current=current)) / bname) + '.lnk' - data.append( - ( - str(Path(wpdir) / name), # Target executable path - bname, # Description/Name - shortcut_name, # Shortcut file path - ) - ) - return data - -# --- PythonCore entries (PEP-0514 and WinPython specific) --- - - -def register_in_registery(target, current=True, reg_type=winreg.REG_SZ, verbose=True) -> tuple[list[any], ...]: - """Register in Windows (like regedit)""" - - # --- Constants --- - DROP_HANDLER_CLSID = "{60254CA5-953B-11CF-8C96-00AA00B8708C}" - - # --- CONFIG --- - target_path = Path(target).resolve() - python_exe = str(target_path / "python.exe") - pythonw_exe = str(target_path / "pythonw.exe") - spyder_exe = str(target_path.parent / "Spyder.exe") - icon_py = str(target_path / "DLLs" / "py.ico") - icon_pyc = str(target_path / "DLLs" / "pyc.ico") - idle_path = str(target_path / "Lib" / "idlelib" / "idle.pyw") - doc_path = str(target_path / "Doc" / "html" / "index.html") - python_infos = utils.get_python_infos(target) # ('3.11', 64) - short_version = python_infos[0] # e.g., '3.11' - version = utils.get_python_long_version(target) # e.g., '3.11.5' - arch = f'{python_infos[1]}bit' # e.g., '64bit' - display = f"Python {version} ({arch})" - - permanent_entries = [] # key_path, name, value - dynamic_entries = [] # key_path, name, value - core_entries = [] # key_path, name, value - lost_entries = [] # intermediate keys to remove later - # --- File associations --- - ext_map = {".py": "Python.File", ".pyw": "Python.NoConFile", ".pyc": "Python.CompiledFile"} - ext_label = {".py": "Python File", ".pyw": "Python File (no console)", ".pyc": "Compiled Python File"} - for ext, ftype in ext_map.items(): - permanent_entries.append((f"Software\\Classes\\{ext}", None, ftype)) - if ext in (".py", ".pyw"): - permanent_entries.append((f"Software\\Classes\\{ext}", "Content Type", "text/plain")) - - # --- Descriptions, Icons, DropHandlers --- - for ext, ftype in ext_map.items(): - dynamic_entries.append((f"Software\\Classes\\{ftype}", None, ext_label[ext])) - dynamic_entries.append((f"Software\\Classes\\{ftype}\\DefaultIcon", None, icon_py if "Compiled" not in ftype else icon_pyc)) - dynamic_entries.append((f"Software\\Classes\\{ftype}\\shellex\\DropHandler", None, DROP_HANDLER_CLSID)) - lost_entries.append((f"Software\\Classes\\{ftype}\\shellex", None, None)) - - # --- Shell commands --- - for ext, ftype in ext_map.items(): - dynamic_entries.append((f"Software\\Classes\\{ftype}\\shell\\open\\command", None, f'''"{pythonw_exe if ftype=='Python.NoConFile' else python_exe}" "%1" %*''')) - lost_entries.append((f"Software\\Classes\\{ftype}\\shell\\open", None, None)) - lost_entries.append((f"Software\\Classes\\{ftype}\\shell", None, None)) - - dynamic_entries.append((rf"Software\Classes\Python.File\shell\Edit with IDLE\command", None, f'"{pythonw_exe}" "{idle_path}" -n -e "%1"')) - dynamic_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with IDLE\command", None, f'"{pythonw_exe}" "{idle_path}" -n -e "%1"')) - lost_entries.append((rf"Software\Classes\Python.File\shell\Edit with IDLE", None, None)) - lost_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with IDLE", None, None)) - - if Path(spyder_exe).exists(): - dynamic_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1"')) - dynamic_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1"')) - lost_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder", None, None)) - lost_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder", None, None)) - - # --- WinPython Core registry entries (PEP 514 style) --- - base = f"Software\\Python\\WinPython\\{short_version}" - core_entries.append((base, "DisplayName", display)) - core_entries.append((base, "SupportUrl", "https://winpython.github.io")) - core_entries.append((base, "SysVersion", short_version)) - core_entries.append((base, "SysArchitecture", arch)) - core_entries.append((base, "Version", version)) - - core_entries.append((f"{base}\\InstallPath", None, str(target))) - core_entries.append((f"{base}\\InstallPath", "ExecutablePath", python_exe)) - core_entries.append((f"{base}\\InstallPath", "WindowedExecutablePath", pythonw_exe)) - core_entries.append((f"{base}\\InstallPath\\InstallGroup", None, f"Python {short_version}")) - - core_entries.append((f"{base}\\Modules", None, "")) - core_entries.append((f"{base}\\PythonPath", None, f"{target}\\Lib;{target}\\DLLs")) - core_entries.append((f"{base}\\Help\\Main Python Documentation", None, doc_path)) - lost_entries.append((f"{base}\\Help", None, None)) - lost_entries.append((f"Software\\Python\\WinPython", None, None)) - - return permanent_entries, dynamic_entries, core_entries, lost_entries - -# --- Main Register/Unregister Functions --- - -def register(target, current=True, reg_type=winreg.REG_SZ, verbose=True): - """Register a Python distribution in Windows registry and create Start Menu shortcuts""" - root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE - has_pywin32 = _has_pywin32() - - if verbose: - print(f'Creating WinPython registry entries for {target}') - - permanent_entries, dynamic_entries, core_entries, lost_entries = register_in_registery(target) - # Set registry entries for given target - for key_path, name, value in permanent_entries + dynamic_entries + core_entries: - _set_reg_value(root, key_path, name, value, verbose=verbose) - - # Create start menu entries - if has_pywin32: - if verbose: - print(f'Creating WinPython menu for all icons in {target.parent}') - for path, desc, fname in _get_shortcut_data(target, current=current, has_pywin32=True): - try: - utils.create_shortcut(path, desc, fname, verbose=verbose) - except Exception as e: - print(f"Error creating shortcut for {desc} at {fname}: {e}", file=sys.stderr) - else: - print("Skipping start menu shortcut creation as pywin32 package is needed.") - -def unregister(target, current=True, verbose=True): - """Unregister a Python distribution from Windows registry and remove Start Menu shortcuts""" - root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE - has_pywin32 = _has_pywin32() - - if verbose: - print(f'Removing WinPython registry entries for {target}') - - permanent_entries, dynamic_entries, core_entries , lost_entries = register_in_registery(target) - - # List of keys to attempt to delete, ordered from most specific to general - keys_to_delete = sorted(list(set(key_path for key_path , name, value in (dynamic_entries + core_entries + lost_entries))), key=len, reverse=True) - - rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" - for key_path in keys_to_delete: - _delete_reg_key(root, key_path, verbose=verbose) - - # Remove start menu shortcuts - if has_pywin32: - if verbose: - print(f'Removing WinPython menu for all icons in {target.parent}') - _remove_start_menu_folder(target, current=current, has_pywin32=True) - # The original code had commented out code to delete .lnk files individually. - else: - print("Skipping start menu removal as pywin32 package is needed.") - - -if __name__ == "__main__": - # Ensure we are running from the target WinPython environment - parser = ArgumentParser(description="Register or Un-register Python file extensions, icons "\ - "and Windows explorer context menu to this "\ - "Python distribution.") - parser.add_argument('--unregister', action="store_true", - help='register to all users, requiring administrative '\ - 'privileges (default: register to current user only)') - parser.add_argument('--all', action="store_true", - help='action is to all users, requiring administrative '\ - 'privileges (default: to current user only)') - args = parser.parse_args() - expected_target = Path(sys.prefix) - command = "unregister" if args.unregister else "register" - users = "all" if args.all else "user" - print(f"Attempting to {command} the Python environment for {users} at: {expected_target}") - - target_dir = sys.prefix # Or get from arguments - is_current_user = True # Or get from arguments - if command == "register": - register(expected_target, current=not args.all) - else: - unregister(expected_target, current=not args.all) +# -*- coding: utf-8 -*- +# +# associate.py = Register a Python distribution +# Copyright © 2012 Pierre Raybaut +# Licensed under the terms of the MIT License +# (see winpython/__init__.py for details) + +import sys +import os +from pathlib import Path +import importlib.util +import winreg +from . import utils +from argparse import ArgumentParser + +def get_special_folder_path(path_name): + """Return special folder path.""" + from win32com.shell import shell, shellcon + try: + csidl = getattr(shellcon, path_name) + return shell.SHGetSpecialFolderPath(0, csidl, False) + except OSError: + print(f"{path_name} is an unknown path ID") + +def get_winpython_start_menu_folder(current=True): + """Return WinPython Start menu shortcuts folder.""" + folder = get_special_folder_path("CSIDL_PROGRAMS") + if not current: + try: + folder = get_special_folder_path("CSIDL_COMMON_PROGRAMS") + except OSError: + pass + return str(Path(folder) / 'WinPython') + +def remove_winpython_start_menu_folder(current=True): + """Remove WinPython Start menu folder -- remove it if it already exists""" + path = get_winpython_start_menu_folder(current=current) + if Path(path).is_dir(): + try: + shutil.rmtree(path, onexc=onerror) + except WindowsError: + print(f"Directory {path} could not be removed", file=sys.stderr) + +def create_winpython_start_menu_folder(current=True): + """Create WinPython Start menu folder.""" + path = get_winpython_start_menu_folder(current=current) + if Path(path).is_dir(): + try: + shutil.rmtree(path, onexc=onerror) + except WindowsError: + print(f"Directory {path} could not be removed", file=sys.stderr) + Path(path).mkdir(parents=True, exist_ok=True) + return path + +def create_shortcut(path, description, filename, arguments="", workdir="", iconpath="", iconindex=0, verbose=True): + """Create Windows shortcut (.lnk file).""" + import pythoncom + from win32com.shell import shell + ilink = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink) + ilink.SetPath(path) + ilink.SetDescription(description) + if arguments: + ilink.SetArguments(arguments) + if workdir: + ilink.SetWorkingDirectory(workdir) + if iconpath or iconindex: + ilink.SetIconLocation(iconpath, iconindex) + # now save it. + ipf = ilink.QueryInterface(pythoncom.IID_IPersistFile) + if not filename.endswith('.lnk'): + filename += '.lnk' + if verbose: + print(f'create menu *{filename}*') + try: + ipf.Save(filename, 0) + except: + print("a fail !") + +# --- Helper functions for Registry --- + +def _set_reg_value(root, key_path, name, value, reg_type=winreg.REG_SZ, verbose=False): + """Helper to create key and set a registry value using CreateKeyEx.""" + rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" + if verbose: + print(f"{rootkey_name}\\{key_path}\\{name if name else ''}:{value}") + try: + # Use CreateKeyEx with context manager for automatic closing + with winreg.CreateKeyEx(root, key_path, 0, winreg.KEY_WRITE) as key: + winreg.SetValueEx(key, name, 0, reg_type, value) + except OSError as e: + print(f"Error creating/setting registry value {rootkey_name}\\{key_path}\\{name}: {e}", file=sys.stderr) + +def _delete_reg_key(root, key_path, verbose=False): + """Helper to delete a registry key, ignoring if not found.""" + rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" + if verbose: + print(f"{rootkey_name}\\{key_path}") + try: + # DeleteKey can only delete keys with no subkeys. + # For keys with (still) subkeys, use DeleteKeyEx on the parent key if available + winreg.DeleteKey(root, key_path) + except FileNotFoundError: + if verbose: + print(f"Registry key not found (skipping deletion): {rootkey_name}\\{key_path}") + except OSError as e: # Catch other potential errors like key not empty + print(f"Error deleting registry key {rootkey_name}\\{key_path}: {e}", file=sys.stderr) + + +# --- Helper functions for Start Menu Shortcuts --- + +def _has_pywin32(): + """Check if pywin32 (pythoncom) is installed.""" + return importlib.util.find_spec('pythoncom') is not None + +def _remove_start_menu_folder(target, current=True, has_pywin32=False): + "remove menu Folder for target WinPython if pywin32 exists" + if has_pywin32: + remove_winpython_start_menu_folder(current=current) + else: + print("Skipping start menu removal as pywin32 package is not installed.") + +def _get_shortcut_data(target, current=True, has_pywin32=False): + "get windows menu access data if pywin32 exists, otherwise empty list" + if not has_pywin32: + return [] + + wpdir = str(Path(target).parent) + data = [] + for name in os.listdir(wpdir): + bname, ext = Path(name).stem, Path(name).suffix + if ext.lower() == ".exe": + # Path for the shortcut file in the start menu folder + shortcut_name = str(Path(create_winpython_start_menu_folder(current=current)) / bname) + '.lnk' + data.append( + ( + str(Path(wpdir) / name), # Target executable path + bname, # Description/Name + shortcut_name, # Shortcut file path + ) + ) + return data + +# --- PythonCore entries (PEP-0514 and WinPython specific) --- + + +def register_in_registery(target, current=True, reg_type=winreg.REG_SZ, verbose=True) -> tuple[list[any], ...]: + """Register in Windows (like regedit)""" + + # --- Constants --- + DROP_HANDLER_CLSID = "{60254CA5-953B-11CF-8C96-00AA00B8708C}" + + # --- CONFIG --- + target_path = Path(target).resolve() + python_exe = str(target_path / "python.exe") + pythonw_exe = str(target_path / "pythonw.exe") + spyder_exe = str(target_path.parent / "Spyder.exe") + icon_py = str(target_path / "DLLs" / "py.ico") + icon_pyc = str(target_path / "DLLs" / "pyc.ico") + idle_path = str(target_path / "Lib" / "idlelib" / "idle.pyw") + doc_path = str(target_path / "Doc" / "html" / "index.html") + python_infos = utils.get_python_infos(target) # ('3.11', 64) + short_version = python_infos[0] # e.g., '3.11' + version = utils.get_python_long_version(target) # e.g., '3.11.5' + arch = f'{python_infos[1]}bit' # e.g., '64bit' + display = f"Python {version} ({arch})" + + permanent_entries = [] # key_path, name, value + dynamic_entries = [] # key_path, name, value + core_entries = [] # key_path, name, value + lost_entries = [] # intermediate keys to remove later + # --- File associations --- + ext_map = {".py": "Python.File", ".pyw": "Python.NoConFile", ".pyc": "Python.CompiledFile"} + ext_label = {".py": "Python File", ".pyw": "Python File (no console)", ".pyc": "Compiled Python File"} + for ext, ftype in ext_map.items(): + permanent_entries.append((f"Software\\Classes\\{ext}", None, ftype)) + if ext in (".py", ".pyw"): + permanent_entries.append((f"Software\\Classes\\{ext}", "Content Type", "text/plain")) + + # --- Descriptions, Icons, DropHandlers --- + for ext, ftype in ext_map.items(): + dynamic_entries.append((f"Software\\Classes\\{ftype}", None, ext_label[ext])) + dynamic_entries.append((f"Software\\Classes\\{ftype}\\DefaultIcon", None, icon_py if "Compiled" not in ftype else icon_pyc)) + dynamic_entries.append((f"Software\\Classes\\{ftype}\\shellex\\DropHandler", None, DROP_HANDLER_CLSID)) + lost_entries.append((f"Software\\Classes\\{ftype}\\shellex", None, None)) + + # --- Shell commands --- + for ext, ftype in ext_map.items(): + dynamic_entries.append((f"Software\\Classes\\{ftype}\\shell\\open\\command", None, f'''"{pythonw_exe if ftype=='Python.NoConFile' else python_exe}" "%1" %*''')) + lost_entries.append((f"Software\\Classes\\{ftype}\\shell\\open", None, None)) + lost_entries.append((f"Software\\Classes\\{ftype}\\shell", None, None)) + + dynamic_entries.append((rf"Software\Classes\Python.File\shell\Edit with IDLE\command", None, f'"{pythonw_exe}" "{idle_path}" -n -e "%1"')) + dynamic_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with IDLE\command", None, f'"{pythonw_exe}" "{idle_path}" -n -e "%1"')) + lost_entries.append((rf"Software\Classes\Python.File\shell\Edit with IDLE", None, None)) + lost_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with IDLE", None, None)) + + if Path(spyder_exe).exists(): + dynamic_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1" -w "%w"')) + dynamic_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder\command", None, f'"{spyder_exe}" "%1" -w "%w"')) + lost_entries.append((rf"Software\Classes\Python.File\shell\Edit with Spyder", None, None)) + lost_entries.append((rf"Software\Classes\Python.NoConFile\shell\Edit with Spyder", None, None)) + + # --- WinPython Core registry entries (PEP 514 style) --- + base = f"Software\\Python\\WinPython\\{short_version}" + core_entries.append((base, "DisplayName", display)) + core_entries.append((base, "SupportUrl", "https://winpython.github.io")) + core_entries.append((base, "SysVersion", short_version)) + core_entries.append((base, "SysArchitecture", arch)) + core_entries.append((base, "Version", version)) + + core_entries.append((f"{base}\\InstallPath", None, str(target))) + core_entries.append((f"{base}\\InstallPath", "ExecutablePath", python_exe)) + core_entries.append((f"{base}\\InstallPath", "WindowedExecutablePath", pythonw_exe)) + core_entries.append((f"{base}\\InstallPath\\InstallGroup", None, f"Python {short_version}")) + + core_entries.append((f"{base}\\Modules", None, "")) + core_entries.append((f"{base}\\PythonPath", None, f"{target}\\Lib;{target}\\DLLs")) + core_entries.append((f"{base}\\Help\\Main Python Documentation", None, doc_path)) + lost_entries.append((f"{base}\\Help", None, None)) + lost_entries.append((f"Software\\Python\\WinPython", None, None)) + + return permanent_entries, dynamic_entries, core_entries, lost_entries + +# --- Main Register/Unregister Functions --- + +def register(target, current=True, reg_type=winreg.REG_SZ, verbose=True): + """Register a Python distribution in Windows registry and create Start Menu shortcuts""" + root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE + has_pywin32 = _has_pywin32() + + if verbose: + print(f'Creating WinPython registry entries for {target}') + + permanent_entries, dynamic_entries, core_entries, lost_entries = register_in_registery(target) + # Set registry entries for given target + for key_path, name, value in permanent_entries + dynamic_entries + core_entries: + _set_reg_value(root, key_path, name, value, verbose=verbose) + + # Create start menu entries + if has_pywin32: + if verbose: + print(f'Creating WinPython menu for all icons in {target.parent}') + for path, desc, fname in _get_shortcut_data(target, current=current, has_pywin32=True): + try: + create_shortcut(path, desc, fname, verbose=verbose) + except Exception as e: + print(f"Error creating shortcut for {desc} at {fname}: {e}", file=sys.stderr) + else: + print("Skipping start menu shortcut creation as pywin32 package is needed.") + +def unregister(target, current=True, verbose=True): + """Unregister a Python distribution from Windows registry and remove Start Menu shortcuts""" + root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE + has_pywin32 = _has_pywin32() + + if verbose: + print(f'Removing WinPython registry entries for {target}') + + permanent_entries, dynamic_entries, core_entries , lost_entries = register_in_registery(target) + + # List of keys to attempt to delete, ordered from most specific to general + keys_to_delete = sorted(list(set(key_path for key_path , name, value in (dynamic_entries + core_entries + lost_entries))), key=len, reverse=True) + + rootkey_name = "HKEY_CURRENT_USER" if root == winreg.HKEY_CURRENT_USER else "HKEY_LOCAL_MACHINE" + for key_path in keys_to_delete: + _delete_reg_key(root, key_path, verbose=verbose) + + # Remove start menu shortcuts + if has_pywin32: + if verbose: + print(f'Removing WinPython menu for all icons in {target.parent}') + _remove_start_menu_folder(target, current=current, has_pywin32=True) + # The original code had commented out code to delete .lnk files individually. + else: + print("Skipping start menu removal as pywin32 package is needed.") + + +if __name__ == "__main__": + # Ensure we are running from the target WinPython environment + parser = ArgumentParser(description="Register or Un-register Python file extensions, icons "\ + "and Windows explorer context menu to this "\ + "Python distribution.") + parser.add_argument('--unregister', action="store_true", + help='register to all users, requiring administrative '\ + 'privileges (default: register to current user only)') + parser.add_argument('--all', action="store_true", + help='action is to all users, requiring administrative '\ + 'privileges (default: to current user only)') + args = parser.parse_args() + expected_target = Path(sys.prefix) + command = "unregister" if args.unregister else "register" + users = "all" if args.all else "user" + print(f"Attempting to {command} the Python environment for {users} at: {expected_target}") + + target_dir = sys.prefix # Or get from arguments + is_current_user = True # Or get from arguments + if command == "register": + register(expected_target, current=not args.all) + else: + unregister(expected_target, current=not args.all) diff --git a/wppm/diff.py b/wppm/diff.py new file mode 100644 index 00000000..12671faf --- /dev/null +++ b/wppm/diff.py @@ -0,0 +1,211 @@ +# -*- coding: utf-8 -*- +# +# WinPython diff.py script (streamlined, with historical and flexible modes) +# Copyright © 2013 Pierre Raybaut +# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ +# Licensed under the terms of the MIT License + +import os +import re +import sys +import shutil +from pathlib import Path +from packaging import version +from . import utils + +CHANGELOGS_DIR = Path(__file__).parent.parent / "changelogs" + +class Package: + PATTERNS = [ + r"\[([\w\-\:\/\.\_]+)\]\(([^)]+)\) \| ([^\|]*) \| ([^\|]*)", # SourceForge + r"\[([\w\-\:\/\.\_]+) ([^\]\ ]+)\] \| ([^\|]*) \| ([^\|]*)" # Google Code + ] + def __init__(self, text=None): + self.name = self.url = self.version = self.description = None + if text: + self.from_text(text) + def from_text(self, text): + for pattern in self.PATTERNS: + match = re.match(pattern, text) + if match: + self.name, self.url, self.version, self.description = match.groups() + return + raise ValueError(f"Unrecognized package line format: {text}") + +class PackageIndex: + HEADERS = {"tools": "### Tools", "python": "### Python packages", "wheelhouse": "### WheelHouse packages"} + BLANKS = ["Name | Version | Description", "-----|---------|------------", "", "
", "
"] + + def __init__(self, content): + self.packages = {k: {} for k in self.HEADERS} + self._parse_index(content) + + def _parse_index(self, text): + current = None + for line in text.splitlines(): + if line in self.HEADERS.values(): + current = [k for k, v in self.HEADERS.items() if v == line][0] + continue + if line.strip() in self.BLANKS: + continue + if current: + try: + pkg = Package(line) + self.packages[current][pkg.name] = pkg + except Exception: + continue + +def compare_packages(old, new): + def normalize(d): return {k.replace("-", "_").lower(): v for k, v in d.items()} + old, new = normalize(old), normalize(new) + added = [new[k] for k in new if k not in old] + upgraded = [new[k] for k in new if k in old and new[k].version != old[k].version] + removed = [old[k] for k in old if k not in new] + output = "" + if added: + output += "\nNew packages:\n" + "".join(f" * {p.name} {p.version} ({p.description})\n" for p in added) + if upgraded: + output += "\nUpgraded packages:\n" + "".join(f" * {p.name} {old[p.name].version} → {p.version} ({p.description})\n" for p in upgraded if p.name in old) + if removed: + output += "\nRemoved packages:\n" + "".join(f" * {p.name} {p.version} ({p.description})\n" for p in removed) + return output or "\nNo differences found.\n" + +def compare_markdown_sections(md1, md2, header1="python", header2="python", label1="Input1", label2="Input2"): + pkgs1 = PackageIndex(md1).packages + pkgs2 = PackageIndex(md2).packages + diff = compare_packages(pkgs1[header1], pkgs2[header2]) + # If comparing the same section, use the historical header + if header1 == header2 and header1 in PackageIndex.HEADERS: + title = PackageIndex.HEADERS[header1] + else: + title = f"## {label1} [{header1}] vs {label2} [{header2}]" + return f"{title}\n\n{diff}" + +def compare_markdown_section_pairs(md1, md2, header_pairs, label1="Input1", label2="Input2"): + pkgs1 = PackageIndex(md1).packages + pkgs2 = PackageIndex(md2).packages + text = f"# {label1} vs {label2} section-pairs comparison\n" + for h1, h2 in header_pairs: + diff = compare_packages(pkgs1[h1], pkgs2[h2]) + if diff.strip() and diff != "No differences found.\n": + text += f"\n## {label1} [{h1}] vs {label2} [{h2}]\n\n{diff}\n" + return text + +def compare_files(file1, file2, mode="full", header1=None, header2=None, header_pairs=None): + with open(file1, encoding=utils.guess_encoding(file1)[0]) as f1, \ + open(file2, encoding=utils.guess_encoding(file2)[0]) as f2: + md1, md2 = f1.read(), f2.read() + if mode == "full": + result = "" + for k in PackageIndex.HEADERS: + result += compare_markdown_sections(md1, md2, k, k, file1, file2) + "\n" + return result + elif mode == "section": + return compare_markdown_sections(md1, md2, header1, header2, file1, file2) + elif mode == "pairs": + return compare_markdown_section_pairs(md1, md2, header_pairs, file1, file2) + else: + raise ValueError("Unknown mode.") + +# --- ORIGINAL/HISTORICAL VERSION-TO-VERSION COMPARISON --- + +def find_previous_version(target_version, searchdir=None, flavor="", architecture=64): + search_dir = Path(searchdir) if searchdir else CHANGELOGS_DIR + pattern = re.compile(rf"WinPython{flavor}-{architecture}bit-([0-9\.]+)\.(txt|md)") + versions = [pattern.match(f).group(1) for f in os.listdir(search_dir) if pattern.match(f)] + versions = [v for v in versions if version.parse(v) < version.parse(target_version)] + return max(versions, key=version.parse, default=target_version) + +def load_version_markdown(version, searchdir, flavor="", architecture=64): + filename = Path(searchdir) / f"WinPython{flavor}-{architecture}bit-{version}.md" + if not filename.exists(): + raise FileNotFoundError(f"Changelog not found: {filename}") + with open(filename, "r", encoding=utils.guess_encoding(filename)[0]) as f: + return f.read() + +def compare_package_indexes(version2, version1=None, searchdir=None, flavor="", flavor1=None, architecture=64): + searchdir = Path(searchdir) if searchdir else CHANGELOGS_DIR + version1 = version1 or find_previous_version(version2, searchdir, flavor, architecture) + flavor1 = flavor1 or flavor + md1 = load_version_markdown(version1, searchdir, flavor1, architecture) + md2 = load_version_markdown(version2, searchdir, flavor, architecture) + result = f"# WinPython {architecture}bit {version2}{flavor} vs {version1}{flavor1}\n" + result = ( + f"## History of changes for WinPython-{architecture}bit {version2 + flavor}\r\n\r\n" + f"The following changes were made to WinPython-{architecture}bit distribution since version {version1 + flavor1}.\n\n\n" + "
\n\n" + ) + for k in PackageIndex.HEADERS: + result += compare_markdown_sections(md1, md2, k, k, version1, version2) + "\n" + return result+ "\n
\n\n* * *\n" + +def copy_changelogs(version, searchdir, flavor="", architecture=64, basedir=None): + """Copy all changelogs for a major.minor version into basedir.""" + basever = ".".join(str(version).split(".")[:2]) + pattern = re.compile(rf"WinPython{flavor}-{architecture}bit-{basever}[0-9\.]*\.(txt|md)") + dest = Path(basedir) + for fname in os.listdir(searchdir): + if pattern.match(fname): + shutil.copyfile(Path(searchdir) / fname, dest / fname) + +def write_changelog(version2, version1=None, searchdir=None, flavor="", architecture=64, basedir=None): + """Write changelog between version1 and version2 of WinPython.""" + searchdir = Path(searchdir) if searchdir else CHANGELOGS_DIR + if basedir: + copy_changelogs(version2, searchdir, flavor, architecture, basedir) + changelog = compare_package_indexes(version2, version1, searchdir, flavor, architecture=architecture) + output_file = searchdir / f"WinPython{flavor}-{architecture}bit-{version2}_History.md" + with open(output_file, "w", encoding="utf-8") as f: + f.write(changelog) + if basedir: + shutil.copyfile(output_file, Path(basedir) / output_file.name) + +def print_usage(): + print("Usage:") + print(" python diff.py file1.md file2.md") + print(" - Compare all sections of two markdown files.") + print(" python diff.py file1.md file2.md --section header1 header2") + print(" - Compare section 'header1' of file1 with section 'header2' of file2.") + print(" python diff.py file1.md file2.md --pairs header1a header2a [header1b header2b ...]") + print(" - Compare pairs of sections. Example: python diff.py f1.md f2.md --pairs python wheelhouse tools tools") + print(" python diff.py [searchdir] [flavor] [architecture]") + print(" - Compare WinPython markdown changelogs by version (historical mode).") + print(" python diff.py --write-changelog [searchdir] [flavor] [architecture] [basedir]") + print(" - Write changelog between version1 and version2 to file (and optionally copy to basedir).") + +if __name__ == "__main__": + args = sys.argv + if len(args) >= 3 and all(arg.lower().endswith('.md') for arg in args[1:3]): + file1, file2 = args[1], args[2] + if len(args) == 3: + print(compare_files(file1, file2)) + elif args[3] == "--section" and len(args) >= 6: + h1, h2 = args[4], args[5] + print(compare_files(file1, file2, mode="section", header1=h1, header2=h2)) + elif args[3] == "--pairs" and len(args) > 4 and len(args[4:]) % 2 == 0: + pairs = list(zip(args[4::2], args[5::2])) + print(compare_files(file1, file2, mode="pairs", header_pairs=pairs)) + else: + print_usage() + elif len(args) >= 2 and args[1] == "--write-changelog": + # Usage: --write-changelog [searchdir] [flavor] [architecture] [basedir] + if len(args) < 4: + print_usage() + sys.exit(1) + version2 = args[2] + version1 = args[3] + searchdir = args[4] if len(args) > 4 else CHANGELOGS_DIR + flavor = args[5] if len(args) > 5 else "" + architecture = int(args[6]) if len(args) > 6 else 64 + basedir = args[7] if len(args) > 7 else None + write_changelog(version2, version1, searchdir, flavor, architecture, basedir) + print(f"Changelog written for {version2} vs {version1}.") + elif len(args) >= 3: + version2 = args[1] + version1 = args[2] if len(args) > 2 and not args[2].endswith('.md') else None + searchdir = args[3] if len(args) > 3 else CHANGELOGS_DIR + flavor = args[4] if len(args) > 4 else "" + architecture = int(args[5]) if len(args) > 5 else 64 + print(compare_package_indexes(version2, version1, searchdir, flavor, architecture=architecture)) + else: + print_usage() \ No newline at end of file diff --git a/hash.py b/wppm/hash.py similarity index 96% rename from hash.py rename to wppm/hash.py index d16bff0a..e0bdd46a 100644 --- a/hash.py +++ b/wppm/hash.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- -# -# WinPython hash.py script +""" +hash.py: compute hash of given files into a markdown output +""" # Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ # Licensed under the terms of the MIT License # (see winpython/__init__.py for details) diff --git a/wppm/packagemetadata.py b/wppm/packagemetadata.py new file mode 100644 index 00000000..a51e8331 --- /dev/null +++ b/wppm/packagemetadata.py @@ -0,0 +1,92 @@ +# -*- coding: utf-8 -*- +""" +packagemetadata.py - get metadata from designated place +""" +import os +import re +import tarfile +import zipfile +import sys +from pathlib import Path +from typing import Dict, List, Optional, Tuple +from . import utils +import importlib.metadata +import email +from packaging.utils import canonicalize_name +# --- Abstract metadata accessor --- + +class PackageMetadata: + """A minimal abstraction for package metadata.""" + def __init__(self, name, version, requires, summary, description, metadata): + self.name = name + self.version = version + self.requires = requires # List[str] of dependencies + self.summary = summary + self.description = description + self.metadata = metadata + +def get_installed_metadata(path = None) -> List[PackageMetadata]: + # Use importlib.metadata or pkg_resources + pkgs = [] + distro = importlib.metadata.distributions(path = path) if path else importlib.metadata.distributions() + for dist in distro: + name = canonicalize_name(dist.metadata['Name']) + version = dist.version + summary = dist.metadata.get("Summary", ""), + description = dist.metadata.get("Description", ""), + requires = dist.requires or [] + metadata = dist.metadata + pkgs.append(PackageMetadata(name, version, requires, summary, description, metadata)) + return pkgs + +def get_directory_metadata(directory: str) -> List[PackageMetadata]: + # For each .whl/.tar.gz file in directory, extract metadata + pkgs = [] + for fname in os.listdir(directory): + if fname.endswith('.whl'): + # Extract METADATA from wheel + meta = extract_metadata_from_wheel(os.path.join(directory, fname)) + pkgs.append(meta) + elif fname.endswith('.tar.gz'): + # Extract PKG-INFO from sdist + meta = extract_metadata_from_sdist(os.path.join(directory, fname)) + pkgs.append(meta) + return pkgs + +def extract_metadata_from_wheel(path: str) -> PackageMetadata: + with zipfile.ZipFile(path) as zf: + for name in zf.namelist(): + if name.endswith(r'.dist-info/METADATA') and name.split("/")[1] == "METADATA": + with zf.open(name) as f: + # Parse metadata (simple parsing for Name, Version, Requires-Dist) + return parse_metadata_file(f.read().decode()) + raise ValueError(f"No METADATA found in {path}") + +def extract_metadata_from_sdist(path: str) -> PackageMetadata: + with tarfile.open(path, "r:gz") as tf: + for member in tf.getmembers(): + if member.name.endswith('PKG-INFO'): + f = tf.extractfile(member) + return parse_metadata_file(f.read().decode()) + raise ValueError(f"No PKG-INFO found in {path}") + +def parse_metadata_file(txt: str) -> PackageMetadata: + meta = email.message_from_string(txt) + name = canonicalize_name(meta.get('Name', '')) + version = meta.get('Version', '') + summary = meta.get('Summary', '') + description = meta.get('Description', '') + requires = meta.get_all('Requires-Dist') or [] + return PackageMetadata(name, version, requires, summary, description, dict(meta.items())) + +def main(): + if len(sys.argv) > 1: + # Directory mode + directory = sys.argv[1] + pkgs = get_directory_metadata(directory) + else: + # Installed packages mode + pkgs = get_installed_metadata() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/winpython/piptree.py b/wppm/piptree.py similarity index 88% rename from winpython/piptree.py rename to wppm/piptree.py index 23a53ff3..11700945 100644 --- a/winpython/piptree.py +++ b/wppm/piptree.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """ -Enhanced script to inspect and display Python package dependencies, +piptree.py: inspect and display Python package dependencies, supporting both downward and upward dependency trees. Requires Python 3.8+ due to importlib.metadata. """ @@ -17,6 +17,8 @@ from pip._vendor.packaging.markers import Marker from importlib.metadata import Distribution, distributions from pathlib import Path +from . import utils +from . import packagemetadata as pm logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) @@ -25,19 +27,10 @@ class PipDataError(Exception): """Custom exception for PipData related errors.""" pass -def sum_up(text: str, max_length: int = 144, stop_at: str = ". ") -> str: - """Summarize text to fit within max_length, ending at last complete sentence.""" - summary = (text + os.linesep).splitlines()[0] - if len(summary) <= max_length: - return summary - if stop_at and stop_at in summary[:max_length]: - return summary[:summary.rfind(stop_at, 0, max_length)] + stop_at.rstrip() - return summary[:max_length].rstrip() - class PipData: """Manages package metadata and dependency relationships in a Python environment.""" - def __init__(self, target: Optional[str] = None): + def __init__(self, target: Optional[str] = None, wheelhouse = None): """ Initialize the PipData instance. @@ -47,7 +40,7 @@ def __init__(self, target: Optional[str] = None): self.raw: Dict[str, Dict] = {} self.environment = self._get_environment() try: - packages = self._get_packages(target or sys.executable) + packages = self._get_packages(target or sys.executable, wheelhouse) self._process_packages(packages) self._populate_reverse_dependencies() except Exception as e: @@ -75,12 +68,14 @@ def _get_environment(self) -> Dict[str, str]: "sys_platform": sys.platform, } - def _get_packages(self, search_path: str) -> List[Distribution]: + def _get_packages(self, search_path: str, wheelhouse) -> List[Distribution]: """Retrieve installed packages from the specified path.""" + if wheelhouse: + return pm.get_directory_metadata(wheelhouse) if sys.executable == search_path: - return Distribution.discover() + return pm.get_installed_metadata() #Distribution.discover() else: - return distributions(path=[str(Path(search_path).parent / 'lib' / 'site-packages')]) + return pm.get_installed_metadata(path=[str(Path(search_path).parent / 'lib' / 'site-packages')]) #distributions(path=[str(Path(search_path).parent / 'lib' / 'site-packages')]) def _process_packages(self, packages: List[Distribution]) -> None: """Process packages metadata and store them in the distro dictionary.""" @@ -202,10 +197,12 @@ def _get_dependency_tree(self, package_name: str, extra: str = "", version_req: extra + ',' in dependency["req_extra"] + ',' and \ Marker(dependency["req_marker"]).evaluate(environment=environment | {"extra": up_req})): # IA risk error: # dask[array] go upwards as dask[dataframe], so {"extra": up_req} , not {"extra": extra} + #tag downward limiting dependancies + wall = " " if dependency["req_version"][:1] in("<", "~") or dependency["req_version"].startswith("==") else "" ret += self._get_dependency_tree( dependency["req_key"], up_req, - f"[requires: {package_name}" + f"[requires{wall}: {package_name}" + (f"[{dependency['req_extra']}]" if dependency["req_extra"] != "" else "") + f'{dependency["req_version"]}]', depth, @@ -247,16 +244,18 @@ def down(self, pp: str = "", extra: str = "", depth: int = 20, indent: int = 5, lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2] return "\n".join(lines).replace('"', "") - def up(self, pp: str, extra: str = "", depth: int = 20, indent: int = 5, version_req: str = "", verbose: bool = False) -> str: + def up(self, ppw: str, extra: str = "", depth: int = 20, indent: int = 5, version_req: str = "", verbose: bool = False) -> str: """Generate upward dependency tree as formatted string.""" + pp = ppw[:-1] if ppw.endswith('!') else ppw + ppend = "!" if ppw.endswith('!') else "" #show only downward limiting dependancies if pp == ".": - results = [self.up(p, extra, depth, indent, version_req, verbose) for p in sorted(self.distro)] + results = [aa:=self.up(p + ppend, extra, depth, indent, version_req, verbose) if '[requires :' in aa else None for p in sorted(self.distro)] return '\n'.join(filter(None, results)) if extra == ".": if pp in self.distro: extras = set(self.distro[pp]["provided"]).union(set(self.distro[pp]["provides"])) - results = [self.up(pp, e, depth, indent, version_req, verbose=verbose) for e in sorted(extras)] + results = [self.up(pp + ppend, e, depth, indent, version_req, verbose=verbose) for e in sorted(extras)] return '\n'.join(filter(None, results)) return "" @@ -264,8 +263,8 @@ def up(self, pp: str, extra: str = "", depth: int = 20, indent: int = 5, version return "" rawtext = json.dumps(self._get_dependency_tree(pp, extra, version_req, depth, verbose=verbose, upward=True), indent=indent) - lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2] - return "\n".join(filter(None, lines)).replace('"', "") + lines = [l for l in rawtext.split("\n") if len(l.strip()) > 2 and ( ppend=="" or not "[requires:" in l)] + return "\n".join(filter(None, lines)).replace('"', "").replace('[requires :', '[requires:') def description(self, pp: str) -> None: """Return package description or None if not found.""" @@ -287,5 +286,5 @@ def pip_list(self, full: bool = False, max_length: int = 144) -> List[Tuple[str, """ pkgs = sorted(self.distro.items()) if full: - return [(p, d["version"], sum_up(d["summary"], max_length)) for p, d in pkgs] + return [(p, d["version"], utils.sum_up(d["summary"], max_length)) for p, d in pkgs] return [(p, d["version"]) for p, d in pkgs] diff --git a/winpython/utils.py b/wppm/utils.py similarity index 74% rename from winpython/utils.py rename to wppm/utils.py index 40961ec1..20f154e7 100644 --- a/winpython/utils.py +++ b/wppm/utils.py @@ -1,397 +1,351 @@ -# -*- coding: utf-8 -*- -# -# WinPython utilities -# Copyright © 2012 Pierre Raybaut -# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ -# Licensed under the terms of the MIT License -# (see winpython/__init__.py for details) - -import os -import sys -import stat -import shutil -import locale -import tempfile -import subprocess -import configparser as cp -from pathlib import Path -import re -import tarfile -import zipfile -import atexit -import winreg - -# SOURCE_PATTERN defines what an acceptable source package name is -SOURCE_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z]*[\-]?[0-9]*)(\.zip|\.tar\.gz|\-(py[2-7]*|py[2-7]*\.py[2-7]*)\-none\-any\.whl)' - -# WHEELBIN_PATTERN defines what an acceptable binary wheel package is -WHEELBIN_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z0-9\+]*[0-9]?)-cp([0-9]*)\-[0-9|c|o|n|e|p|m]*\-(win32|win\_amd64)\.whl' - -def get_python_executable(path=None): - """Return the path to the Python executable.""" - python_path = Path(path) if path else Path(sys.executable) - base_dir = python_path if python_path.is_dir() else python_path.parent - python_exe = base_dir / 'python.exe' - pypy_exe = base_dir / 'pypy3.exe' # For PyPy - return str(python_exe if python_exe.is_file() else pypy_exe) - -def get_site_packages_path(path=None): - """Return the path to the Python site-packages directory.""" - python_path = Path(path) if path else Path(sys.executable) - base_dir = python_path if python_path.is_dir() else python_path.parent - site_packages = base_dir / 'Lib' / 'site-packages' - pypy_site_packages = base_dir / 'site-packages' # For PyPy - return str(pypy_site_packages if pypy_site_packages.is_dir() else site_packages) - -def get_installed_tools_markdown(path=None)-> str: - """Generates Markdown for installed tools section in package index.""" - tool_lines = [] - python_exe = Path(get_python_executable(path)) - version = exec_shell_cmd(f'powershell (Get-Item {python_exe}).VersionInfo.FileVersion', python_exe.parent).splitlines()[0] - tool_lines.append(f"[Python](http://www.python.org/) | {version} | Python programming language with standard library") - if (node_exe := python_exe.parent.parent / "n" / "node.exe").exists(): - version = exec_shell_cmd(f'powershell (Get-Item {node_exe}).VersionInfo.FileVersion', node_exe.parent).splitlines()[0] - tool_lines.append(f"[Nodejs](https://nodejs.org) | {version} | a JavaScript runtime built on Chrome's V8 JavaScript engine") - - if (pandoc_exe := python_exe.parent.parent / "t" / "pandoc.exe").exists(): - version = exec_shell_cmd("pandoc -v", pandoc_exe.parent).splitlines()[0].split(" ")[-1] - tool_lines.append(f"[Pandoc](https://pandoc.org) | {version} | an universal document converter") - - if (vscode_exe := python_exe.parent.parent / "t" / "VSCode" / "Code.exe").exists(): - version = exec_shell_cmd(f'powershell (Get-Item {vscode_exe}).VersionInfo.FileVersion', vscode_exe.parent).splitlines()[0] - tool_lines.append(f"[VSCode](https://code.visualstudio.com) | {version} | a source-code editor developed by Microsoft") - return "\n".join(tool_lines) - - -def onerror(function, path, excinfo): - """Error handler for `shutil.rmtree`.""" - if not os.access(path, os.W_OK): - os.chmod(path, stat.S_IWUSR) - function(path) - else: - raise - -def getFileProperties(fname): - """Read all properties of the given file return them as a dictionary.""" - import win32api - prop_names = ('ProductName', 'ProductVersion', 'FileDescription', 'FileVersion') - props = {'FixedFileInfo': None, 'StringFileInfo': None, 'FileVersion': None} - - try: - fixed_info = win32api.GetFileVersionInfo(fname, '\\') - props['FixedFileInfo'] = fixed_info - props['FileVersion'] = "{}.{}.{}.{}".format( - fixed_info['FileVersionMS'] // 65536, - fixed_info['FileVersionMS'] % 65536, - fixed_info['FileVersionLS'] // 65536, - fixed_info['FileVersionLS'] % 65536 - ) - lang, codepage = win32api.GetFileVersionInfo(fname, '\\VarFileInfo\\Translation')[0] - props['StringFileInfo'] = { - prop_name: win32api.GetFileVersionInfo(fname, f'\\StringFileInfo\\{lang:04X}{codepage:04X}\\{prop_name}') - for prop_name in prop_names - } - except: - pass - - return props - -def get_special_folder_path(path_name): - """Return special folder path.""" - from win32com.shell import shell, shellcon - try: - csidl = getattr(shellcon, path_name) - return shell.SHGetSpecialFolderPath(0, csidl, False) - except OSError: - print(f"{path_name} is an unknown path ID") - -def get_winpython_start_menu_folder(current=True): - """Return WinPython Start menu shortcuts folder.""" - folder = get_special_folder_path("CSIDL_PROGRAMS") - if not current: - try: - folder = get_special_folder_path("CSIDL_COMMON_PROGRAMS") - except OSError: - pass - return str(Path(folder) / 'WinPython') - -def remove_winpython_start_menu_folder(current=True): - """Remove WinPython Start menu folder -- remove it if it already exists""" - path = get_winpython_start_menu_folder(current=current) - if Path(path).is_dir(): - try: - shutil.rmtree(path, onexc=onerror) - except WindowsError: - print(f"Directory {path} could not be removed", file=sys.stderr) - -def create_winpython_start_menu_folder(current=True): - """Create WinPython Start menu folder.""" - path = get_winpython_start_menu_folder(current=current) - if Path(path).is_dir(): - try: - shutil.rmtree(path, onexc=onerror) - except WindowsError: - print(f"Directory {path} could not be removed", file=sys.stderr) - Path(path).mkdir(parents=True, exist_ok=True) - return path - -def create_shortcut(path, description, filename, arguments="", workdir="", iconpath="", iconindex=0, verbose=True): - """Create Windows shortcut (.lnk file).""" - import pythoncom - from win32com.shell import shell - ilink = pythoncom.CoCreateInstance(shell.CLSID_ShellLink, None, pythoncom.CLSCTX_INPROC_SERVER, shell.IID_IShellLink) - ilink.SetPath(path) - ilink.SetDescription(description) - if arguments: - ilink.SetArguments(arguments) - if workdir: - ilink.SetWorkingDirectory(workdir) - if iconpath or iconindex: - ilink.SetIconLocation(iconpath, iconindex) - # now save it. - ipf = ilink.QueryInterface(pythoncom.IID_IPersistFile) - if not filename.endswith('.lnk'): - filename += '.lnk' - if verbose: - print(f'create menu *{filename}*') - try: - ipf.Save(filename, 0) - except: - print("a fail !") - -def print_box(text): - """Print text in a box""" - line0 = "+" + ("-" * (len(text) + 2)) + "+" - line1 = "| " + text + " |" - print("\n\n" + "\n".join([line0, line1, line0]) + "\n") - -def is_python_distribution(path): - """Return True if path is a Python distribution.""" - has_exec = Path(get_python_executable(path)).is_file() - has_site = Path(get_site_packages_path(path)).is_dir() - return has_exec and has_site - -def decode_fs_string(string): - """Convert string from file system charset to unicode.""" - charset = sys.getfilesystemencoding() or locale.getpreferredencoding() - return string.decode(charset) - -def exec_shell_cmd(args, path): - """Execute shell command (*args* is a list of arguments) in *path*.""" - process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=path, shell=True) - return decode_fs_string(process.stdout.read()) - -def exec_run_cmd(args, path=None): - """Run a single command (*args* is a list of arguments) in optional *path*.""" - process = subprocess.run(args, capture_output=True, cwd=path, text=True) - return process.stdout - -def python_query(cmd, path): - """Execute Python command using the Python interpreter located in *path*.""" - the_exe = get_python_executable(path) - return exec_shell_cmd(f'"{the_exe}" -c "{cmd}"', path).splitlines()[0] - -def python_execmodule(cmd, path): - """Execute Python command using the Python interpreter located in *path*.""" - the_exe = get_python_executable(path) - exec_shell_cmd(f'{the_exe} -m {cmd}', path) - -def get_python_infos(path): - """Return (version, architecture) for the Python distribution located in *path*.""" - is_64 = python_query("import sys; print(sys.maxsize > 2**32)", path) - arch = {"True": 64, "False": 32}.get(is_64, None) - ver = python_query("import sys;print(f'{sys.version_info.major}.{sys.version_info.minor}')", path) - return ver, arch - -def get_python_long_version(path): - """Return long version (X.Y.Z) for the Python distribution located in *path*.""" - ver = python_query("import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}')", path) - return ver if re.match(r"([0-9]*)\.([0-9]*)\.([0-9]*)", ver) else None - -def patch_shebang_line(fname, pad=b" ", to_movable=True, targetdir=""): - """Remove absolute path to python.exe in shebang lines in binary files, or re-add it.""" - target_dir = targetdir if to_movable else os.path.abspath(os.path.join(os.path.dirname(fname), r"..")) + "\\" - executable = sys.executable - shebang_line = re.compile(rb"""(#!.*pythonw?\.exe)"?""") # Python3+ - if "pypy3" in sys.executable: - shebang_line = re.compile(rb"""(#!.*pypy3w?\.exe)"?""") # Pypy3+ - target_dir = target_dir.encode("utf-8") - - with open(fname, "rb") as fh: - initial_content = fh.read() - content = shebang_line.split(initial_content, maxsplit=1) - if len(content) != 3: - return - exe = os.path.basename(content[1][2:]) - content[1] = b"#!" + target_dir + exe # + (pad * (len(content[1]) - len(exe) - 2)) - final_content = b"".join(content) - if initial_content == final_content: - return - try: - with open(fname, "wb") as fo: - fo.write(final_content) - print("patched", fname) - except Exception: - print("failed to patch", fname) - -def patch_shebang_line_py(fname, to_movable=True, targetdir=""): - """Changes shebang line in '.py' file to relative or absolue path""" - import fileinput - exec_path = r'#!.\python.exe' if to_movable else '#!' + sys.executable - if 'pypy3' in sys.executable: - exec_path = r'#!.\pypy3.exe' if to_movable else exec_path - for line in fileinput.input(fname, inplace=True): - if re.match(r'^#\!.*python\.exe$', line) or re.match(r'^#\!.*pypy3\.exe$', line): - print(exec_path) - else: - print(line, end='') - -def guess_encoding(csv_file): - """guess the encoding of the given file""" - with open(csv_file, "rb") as f: - data = f.read(5) - if data.startswith(b"\xEF\xBB\xBF"): # UTF-8 with a "BOM" (normally no BOM in utf-8) - return ["utf-8-sig"] - try: - with open(csv_file, encoding="utf-8") as f: - preview = f.read(222222) - return ["utf-8"] - except: - return [locale.getdefaultlocale()[1], "utf-8"] - -def replace_in_file(filepath: Path, replacements: list[tuple[str, str]], filedest: Path = None, verbose=False): - """ - Replaces strings in a file - Args: - filepath: Path to the file to modify. - replacements: A list of tuples of ('old string 'new string') - filedest: optional output file, otherwise will be filepath - """ - the_encoding = guess_encoding(filepath)[0] - with open(filepath, "r", encoding=the_encoding) as f: - content = f.read() - new_content = content - for old_text, new_text in replacements: - new_content = new_content.replace(old_text, new_text) - outfile = filedest if filedest else filepath - if new_content != content or str(outfile) != str(filepath): - with open(outfile, "w", encoding=the_encoding) as f: - f.write(new_content) - if verbose: - print(f"patched from {Path(filepath).name} into {outfile} !") - -def patch_sourcefile(fname, in_text, out_text, silent_mode=False): - """Replace a string in a source file.""" - if not silent_mode: - print(f"patching {fname} from {in_text} to {out_text}") - if Path(fname).is_file() and in_text != out_text: - replace_in_file(Path(fname), [(in_text, out_text)]) - -def extract_archive(fname, targetdir=None, verbose=False): - """Extract .zip, .exe or .tar.gz archive to a temporary directory. - Return the temporary directory path""" - targetdir = targetdir or create_temp_dir() - Path(targetdir).mkdir(parents=True, exist_ok=True) - if Path(fname).suffix in ('.zip', '.exe'): - obj = zipfile.ZipFile(fname, mode="r") - elif fname.endswith('.tar.gz'): - obj = tarfile.open(fname, mode='r:gz') - else: - raise RuntimeError(f"Unsupported archive filename {fname}") - obj.extractall(path=targetdir) - return targetdir - -def get_source_package_infos(fname): - """Return a tuple (name, version) of the Python source package.""" - if fname.endswith('.whl'): - return Path(fname).name.split("-")[:2] - match = re.match(SOURCE_PATTERN, Path(fname).name) - return match.groups()[:2] if match else None - -def buildflit_wininst(root, python_exe=None, copy_to=None, verbose=False): - """Build Wheel from Python package located in *root* with flit.""" - python_exe = python_exe or sys.executable - cmd = [python_exe, '-m', 'flit', 'build'] - if verbose: - subprocess.call(cmd, cwd=root) - else: - subprocess.Popen(cmd, cwd=root, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() - distdir = Path(root) / 'dist' - if not distdir.is_dir(): - raise RuntimeError( - "Build failed: see package README file for further details regarding installation requirements.\n\n" - "For more concrete debugging infos, please try to build the package from the command line:\n" - "1. Open a WinPython command prompt\n" - "2. Change working directory to the appropriate folder\n" - "3. Type `python -m flit build`" - ) - for distname in os.listdir(distdir): - if re.match(SOURCE_PATTERN, distname) or re.match(WHEELBIN_PATTERN, distname): - break - else: - raise RuntimeError(f"Build failed: not a pure Python package? {distdir}") - - src_fname = distdir / distname - if copy_to: - dst_fname = Path(copy_to) / distname - shutil.move(src_fname, dst_fname) - if verbose: - print(f"Move: {src_fname} --> {dst_fname}") - -def direct_pip_install(fname, python_exe=None, verbose=False, install_options=None): - """Direct install via python -m pip !""" - python_exe = python_exe or sys.executable - myroot = Path(python_exe).parent - cmd = [python_exe, "-m", "pip", "install"] + (install_options or []) + [fname] - if not verbose: - process = subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout, stderr = process.communicate() - the_log = f"{stdout}\n {stderr}" - if " not find " in the_log or " not found " in the_log: - print(f"Failed to Install: \n {fname} \n msg: {the_log}") - raise RuntimeError - process.stdout.close() - process.stderr.close() - else: - subprocess.call(cmd, cwd=myroot) - print(f"Installed {fname} via {' '.join(cmd)}") - return fname - -def do_script(this_script, python_exe=None, copy_to=None, verbose=False, install_options=None): - """Execute a script (get-pip typically).""" - python_exe = python_exe or sys.executable - myroot = Path(python_exe).parent - # cmd = [python_exe, myroot + r'\Scripts\pip-script.py', 'install'] - cmd = [python_exe] + (install_options or []) + ([this_script] if this_script else []) - print("Executing ", cmd) - if not verbose: - subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() - else: - subprocess.call(cmd, cwd=myroot) - print("Executed ", cmd) - return 'ok' - -def columns_width(list_of_lists): - """Return the maximum string length of each column of a list of lists.""" - if not isinstance(list_of_lists, list): - return [0] - return [max(len(str(item)) for item in sublist) for sublist in zip(*list_of_lists)] - -def formatted_list(list_of_list, full=False, max_width=70): - """Format a list_of_list to fixed length columns.""" - columns_size = columns_width(list_of_list) - columns = range(len(columns_size)) - return [list(line[col].ljust(columns_size[col])[:max_width] for col in columns) for line in list_of_list] - -def normalize(this): - """Apply PEP 503 normalization to the string.""" - return re.sub(r"[-_.]+", "-", this).lower() - -if __name__ == '__main__': - print_box("Test") - dname = sys.prefix - print((dname + ':', '\n', get_python_infos(dname))) - - tmpdir = r'D:\Tests\winpython_tests' - Path(tmpdir).mkdir(parents=True, exist_ok=True) - print(extract_archive(str(Path(r'D:\WinP\bd37') / 'packages.win-amd64' / 'python-3.7.3.amd64.zip'), tmpdir)) +# -*- coding: utf-8 -*- +# +# WinPython utilities +# Copyright © 2012 Pierre Raybaut +# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ +# Licensed under the terms of the MIT License +# (see winpython/__init__.py for details) + +import os +import sys +import stat +import shutil +import locale +import subprocess +from pathlib import Path +import re +import tarfile +import zipfile + +# SOURCE_PATTERN defines what an acceptable source package name is +SOURCE_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z]*[\-]?[0-9]*)(\.zip|\.tar\.gz|\-(py[2-7]*|py[2-7]*\.py[2-7]*)\-none\-any\.whl)' + +# WHEELBIN_PATTERN defines what an acceptable binary wheel package is +WHEELBIN_PATTERN = r'([a-zA-Z0-9\-\_\.]*)-([0-9\.\_]*[a-z0-9\+]*[0-9]?)-cp([0-9]*)\-[0-9|c|o|n|e|p|m]*\-(win32|win\_amd64)\.whl' + +def get_python_executable(path=None): + """Return the path to the Python executable.""" + python_path = Path(path) if path else Path(sys.executable) + base_dir = python_path if python_path.is_dir() else python_path.parent + python_exe = base_dir / 'python.exe' + pypy_exe = base_dir / 'pypy3.exe' # For PyPy + return str(python_exe if python_exe.is_file() else pypy_exe) + +def get_site_packages_path(path=None): + """Return the path to the Python site-packages directory.""" + python_path = Path(path) if path else Path(sys.executable) + base_dir = python_path if python_path.is_dir() else python_path.parent + site_packages = base_dir / 'Lib' / 'site-packages' + pypy_site_packages = base_dir / 'site-packages' # For PyPy + return str(pypy_site_packages if pypy_site_packages.is_dir() else site_packages) + +def get_installed_tools(path=None)-> str: + """Generates Markdown for installed tools section in package index.""" + tool_lines = [] + python_exe = Path(get_python_executable(path)) + version = exec_shell_cmd(f'powershell (Get-Item {python_exe}).VersionInfo.FileVersion', python_exe.parent).splitlines()[0] + tool_lines.append(("Python" ,f"http://www.python.org/", version, "Python programming language with standard library")) + if (node_exe := python_exe.parent.parent / "n" / "node.exe").exists(): + version = exec_shell_cmd(f'powershell (Get-Item {node_exe}).VersionInfo.FileVersion', node_exe.parent).splitlines()[0] + tool_lines.append(("Nodejs", "https://nodejs.org", version, "a JavaScript runtime built on Chrome's V8 JavaScript engine")) + + if (pandoc_exe := python_exe.parent.parent / "t" / "pandoc.exe").exists(): + version = exec_shell_cmd("pandoc -v", pandoc_exe.parent).splitlines()[0].split(" ")[-1] + tool_lines.append(("Pandoc", "https://pandoc.org", version, "an universal document converter")) + + if (vscode_exe := python_exe.parent.parent / "t" / "VSCode" / "Code.exe").exists(): + version = exec_shell_cmd(f'powershell (Get-Item {vscode_exe}).VersionInfo.FileVersion', vscode_exe.parent).splitlines()[0] + tool_lines.append(("VSCode","https://code.visualstudio.com", version, "a source-code editor developed by Microsoft")) + return tool_lines + +def onerror(function, path, excinfo): + """Error handler for `shutil.rmtree`.""" + if not os.access(path, os.W_OK): + os.chmod(path, stat.S_IWUSR) + function(path) + else: + raise + +def sum_up(text: str, max_length: int = 144, stop_at: str = ". ") -> str: + """Summarize text to fit within max_length, ending at last complete sentence.""" + summary = (text + os.linesep).splitlines()[0].strip() + if len(summary) <= max_length: + return summary + if stop_at and stop_at in summary[:max_length]: + return summary[:summary.rfind(stop_at, 0, max_length)] + stop_at.strip() + return summary[:max_length].strip() + +def print_box(text): + """Print text in a box""" + line0 = "+" + ("-" * (len(text) + 2)) + "+" + line1 = "| " + text + " |" + print("\n\n" + "\n".join([line0, line1, line0]) + "\n") + +def is_python_distribution(path): + """Return True if path is a Python distribution.""" + has_exec = Path(get_python_executable(path)).is_file() + has_site = Path(get_site_packages_path(path)).is_dir() + return has_exec and has_site + +def decode_fs_string(string): + """Convert string from file system charset to unicode.""" + charset = sys.getfilesystemencoding() or locale.getpreferredencoding() + return string.decode(charset) + +def exec_shell_cmd(args, path): + """Execute shell command (*args* is a list of arguments) in *path*.""" + process = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=path, shell=True) + return decode_fs_string(process.stdout.read()) + +def exec_run_cmd(args, path=None): + """Run a single command (*args* is a list of arguments) in optional *path*.""" + process = subprocess.run(args, capture_output=True, cwd=path, text=True) + return process.stdout + +def python_query(cmd, path): + """Execute Python command using the Python interpreter located in *path*.""" + the_exe = get_python_executable(path) + return exec_shell_cmd(f'"{the_exe}" -c "{cmd}"', path).splitlines()[0] + +def python_execmodule(cmd, path): + """Execute Python command using the Python interpreter located in *path*.""" + the_exe = get_python_executable(path) + exec_shell_cmd(f'{the_exe} -m {cmd}', path) + +def get_python_infos(path): + """Return (version, architecture) for the Python distribution located in *path*.""" + is_64 = python_query("import sys; print(sys.maxsize > 2**32)", path) + arch = {"True": 64, "False": 32}.get(is_64, None) + ver = python_query("import sys;print(f'{sys.version_info.major}.{sys.version_info.minor}')", path) + return ver, arch + +def get_python_long_version(path): + """Return long version (X.Y.Z) for the Python distribution located in *path*.""" + ver = python_query("import sys; print(f'{sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}')", path) + return ver if re.match(r"([0-9]*)\.([0-9]*)\.([0-9]*)", ver) else None + +def patch_shebang_line(fname, pad=b" ", to_movable=True, targetdir=""): + """Remove absolute path to python.exe in shebang lines in binary files, or re-add it.""" + target_dir = targetdir if to_movable else os.path.abspath(os.path.join(os.path.dirname(fname), r"..")) + "\\" + executable = sys.executable + shebang_line = re.compile(rb"""(#!.*pythonw?\.exe)"?""") # Python3+ + if "pypy3" in sys.executable: + shebang_line = re.compile(rb"""(#!.*pypy3w?\.exe)"?""") # Pypy3+ + target_dir = target_dir.encode("utf-8") + + with open(fname, "rb") as fh: + initial_content = fh.read() + content = shebang_line.split(initial_content, maxsplit=1) + if len(content) != 3: + return + exe = os.path.basename(content[1][2:]) + content[1] = b"#!" + target_dir + exe # + (pad * (len(content[1]) - len(exe) - 2)) + final_content = b"".join(content) + if initial_content == final_content: + return + try: + with open(fname, "wb") as fo: + fo.write(final_content) + print("patched", fname) + except Exception: + print("failed to patch", fname) + +def patch_shebang_line_py(fname, to_movable=True, targetdir=""): + """Changes shebang line in '.py' file to relative or absolue path""" + import fileinput + exec_path = r'#!.\python.exe' if to_movable else '#!' + sys.executable + if 'pypy3' in sys.executable: + exec_path = r'#!.\pypy3.exe' if to_movable else exec_path + for line in fileinput.input(fname, inplace=True): + if re.match(r'^#\!.*python\.exe$', line) or re.match(r'^#\!.*pypy3\.exe$', line): + print(exec_path) + else: + print(line, end='') + +def guess_encoding(csv_file): + """guess the encoding of the given file""" + with open(csv_file, "rb") as f: + data = f.read(5) + if data.startswith(b"\xEF\xBB\xBF"): # UTF-8 with a "BOM" (normally no BOM in utf-8) + return ["utf-8-sig"] + try: + with open(csv_file, encoding="utf-8") as f: + preview = f.read(222222) + return ["utf-8"] + except: + return [locale.getdefaultlocale()[1], "utf-8"] + +def replace_in_file(filepath: Path, replacements: list[tuple[str, str]], filedest: Path = None, verbose=False): + """ + Replaces strings in a file + Args: + filepath: Path to the file to modify. + replacements: A list of tuples of ('old string 'new string') + filedest: optional output file, otherwise will be filepath + """ + the_encoding = guess_encoding(filepath)[0] + with open(filepath, "r", encoding=the_encoding) as f: + content = f.read() + new_content = content + for old_text, new_text in replacements: + new_content = new_content.replace(old_text, new_text) + outfile = filedest if filedest else filepath + if new_content != content or str(outfile) != str(filepath): + with open(outfile, "w", encoding=the_encoding) as f: + f.write(new_content) + if verbose: + print(f"patched from {Path(filepath).name} into {outfile} !") + +def patch_sourcefile(fname, in_text, out_text, silent_mode=False): + """Replace a string in a source file.""" + if not silent_mode: + print(f"patching {fname} from {in_text} to {out_text}") + if Path(fname).is_file() and in_text != out_text: + replace_in_file(Path(fname), [(in_text, out_text)]) + +def extract_archive(fname, targetdir=None, verbose=False): + """Extract .zip, .exe or .tar.gz archive to a temporary directory. + Return the temporary directory path""" + targetdir = targetdir or create_temp_dir() + Path(targetdir).mkdir(parents=True, exist_ok=True) + if Path(fname).suffix in ('.zip', '.exe'): + obj = zipfile.ZipFile(fname, mode="r") + elif fname.endswith('.tar.gz'): + obj = tarfile.open(fname, mode='r:gz') + else: + raise RuntimeError(f"Unsupported archive filename {fname}") + obj.extractall(path=targetdir) + return targetdir + +def get_source_package_infos(fname): + """Return a tuple (name, version) of the Python source package.""" + if fname.endswith('.whl'): + return Path(fname).name.split("-")[:2] + match = re.match(SOURCE_PATTERN, Path(fname).name) + return match.groups()[:2] if match else None + +def buildflit_wininst(root, python_exe=None, copy_to=None, verbose=False): + """Build Wheel from Python package located in *root* with flit.""" + python_exe = python_exe or sys.executable + cmd = [python_exe, '-m', 'flit', 'build'] + if verbose: + subprocess.call(cmd, cwd=root) + else: + subprocess.Popen(cmd, cwd=root, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() + distdir = Path(root) / 'dist' + if not distdir.is_dir(): + raise RuntimeError( + "Build failed: see package README file for further details regarding installation requirements.\n\n" + "For more concrete debugging infos, please try to build the package from the command line:\n" + "1. Open a WinPython command prompt\n" + "2. Change working directory to the appropriate folder\n" + "3. Type `python -m flit build`" + ) + for distname in os.listdir(distdir): + if re.match(SOURCE_PATTERN, distname) or re.match(WHEELBIN_PATTERN, distname): + break + else: + raise RuntimeError(f"Build failed: not a pure Python package? {distdir}") + + src_fname = distdir / distname + if copy_to: + dst_fname = Path(copy_to) / distname + shutil.move(src_fname, dst_fname) + if verbose: + print(f"Move: {src_fname} --> {dst_fname}") + +def direct_pip_install(fname, python_exe=None, verbose=False, install_options=None): + """Direct install via python -m pip !""" + python_exe = python_exe or sys.executable + myroot = Path(python_exe).parent + cmd = [python_exe, "-m", "pip", "install"] + (install_options or []) + [fname] + if not verbose: + process = subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = process.communicate() + the_log = f"{stdout}\n {stderr}" + if " not find " in the_log or " not found " in the_log: + print(f"Failed to Install: \n {fname} \n msg: {the_log}") + raise RuntimeError + process.stdout.close() + process.stderr.close() + else: + subprocess.call(cmd, cwd=myroot) + print(f"Installed {fname} via {' '.join(cmd)}") + return fname + +def do_script(this_script, python_exe=None, copy_to=None, verbose=False, install_options=None): + """Execute a script (get-pip typically).""" + python_exe = python_exe or sys.executable + myroot = Path(python_exe).parent + # cmd = [python_exe, myroot + r'\Scripts\pip-script.py', 'install'] + cmd = [python_exe] + (install_options or []) + ([this_script] if this_script else []) + print("Executing ", cmd) + if not verbose: + subprocess.Popen(cmd, cwd=myroot, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() + else: + subprocess.call(cmd, cwd=myroot) + print("Executed ", cmd) + return 'ok' + +def columns_width(list_of_lists): + """Return the maximum string length of each column of a list of lists.""" + if not isinstance(list_of_lists, list): + return [0] + return [max(len(str(item)) for item in sublist) for sublist in zip(*list_of_lists)] + +def formatted_list(list_of_list, full=False, max_width=70): + """Format a list_of_list to fixed length columns.""" + columns_size = columns_width(list_of_list) + columns = range(len(columns_size)) + return [list(line[col].ljust(columns_size[col])[:max_width] for col in columns) for line in list_of_list] + +def normalize(this): + """Apply PEP 503 normalization to the string.""" + return re.sub(r"[-_.]+", "-", this).lower() + +def zip_directory(folder_path, output_zip_path): + folder_path = Path(folder_path) + output_zip_path = Path(output_zip_path) + + with zipfile.ZipFile(output_zip_path, 'w', compression=zipfile.ZIP_DEFLATED) as zipf: + for file in folder_path.rglob('*'): + if file.is_file(): + arcname = file.relative_to(folder_path) + zipf.write(file, arcname) + +def find_7zip_executable() -> str: + """Locates the 7-Zip executable (7z.exe).""" + possible_program_files = [r"C:\Program Files", r"C:\Program Files (x86)", Path(sys.prefix).parent / "t"] + for base_dir in possible_program_files: + if (executable_path := Path(base_dir) / "7-Zip" / "7z.exe").is_file(): + return str(executable_path) + raise RuntimeError("7ZIP is not installed on this computer.") + +def create_installer_7zip(origin, destination, filename_stem, installer_type: str = "exe", compression= "mx5"): + """Creates a WinPython installer using 7-Zip: "exe", "7z", "zip")""" + fullfilename = destination / (filename_stem + "." + installer_type) + if installer_type not in ["exe", "7z", "zip"]: + return + sfx_option = "-sfx7z.sfx" if installer_type == "exe" else "" + zip_option = "-tzip" if installer_type == "zip" else "" + compress_level = "mx5" if compression == "" else compression + command = f'"{find_7zip_executable()}" {zip_option} -{compress_level} a "{fullfilename}" "{origin}" {sfx_option}' + print(f'Executing 7-Zip script: "{command}"') + try: + subprocess.run(command, shell=True, check=True, stderr=sys.stderr, stdout=sys.stderr) + except subprocess.CalledProcessError as e: + print(f"Error executing 7-Zip script: {e}", file=sys.stderr) + +def command_installer_7zip(origin, destination, filename_stem, create_installer: str = "exe"): + for commmand in create_installer.lower().replace("7zip",".exe").split('.'): + installer_type, compression = (commmand + "-").split("-")[:2] + create_installer_7zip(Path(origin), Path(destination), filename_stem, installer_type, compression) + +if __name__ == '__main__': + print_box("Test") + dname = sys.prefix + print((dname + ':', '\n', get_python_infos(dname))) + + tmpdir = r'D:\Tests\winpython_tests' + Path(tmpdir).mkdir(parents=True, exist_ok=True) + print(extract_archive(str(Path(r'D:\WinP\bd37') / 'packages.win-amd64' / 'python-3.7.3.amd64.zip'), tmpdir)) diff --git a/wppm/wheelhouse.py b/wppm/wheelhouse.py new file mode 100644 index 00000000..f500dc31 --- /dev/null +++ b/wppm/wheelhouse.py @@ -0,0 +1,215 @@ +#!/usr/bin/env python3 +""" +WheelHouse.py - manage WinPython local WheelHouse. +""" +import os +import re +import tarfile +import zipfile +import sys +from pathlib import Path +from collections import defaultdict +import shutil +import subprocess +from typing import Dict, List, Optional, Tuple +from . import packagemetadata as pm +from . import utils + +from packaging.utils import canonicalize_name, parse_wheel_filename, parse_sdist_filename + +# Use tomllib if available (Python 3.11+), otherwise fall back to tomli +try: + import tomllib # Python 3.11+ +except ImportError: + try: + import tomli as tomllib # For older Python versions + except ImportError: + print("Please install tomli for Python < 3.11: pip install tomli") + sys.exit(1) + +def parse_pylock_toml(path: Path) -> Dict[str, Dict[str, str | List[str]]]: + """Parse a pylock.toml file and extract package information.""" + with open(path, "rb") as f: + data = tomllib.load(f) + + # This dictionary maps package names to (version, [hashes]) + package_hashes = defaultdict(lambda: {"version": "", "hashes": []}) + + for entry in data.get("packages", []): + name = entry["name"] + version = entry["version"] + all_hashes = [] + + # Handle wheels + for wheel in entry.get("wheels", []): + sha256 = wheel.get("hashes", {}).get("sha256") + if sha256: + all_hashes.append(sha256) + + # Handle sdist (if present) + sdist = entry.get("sdist") + if sdist and "hashes" in sdist: + sha256 = sdist["hashes"].get("sha256") + if sha256: + all_hashes.append(sha256) + + package_hashes[name]["version"] = version + package_hashes[name]["hashes"].extend(all_hashes) + + return package_hashes + +def write_requirements_txt(package_hashes: Dict[str, Dict[str, str | List[str]]], output_path: Path) -> None: + """Write package requirements to a requirements.txt file.""" + with open(output_path, "w") as f: + for name, data in sorted(package_hashes.items()): + version = data["version"] + hashes = data["hashes"] + + if hashes: + f.write(f"{name}=={version} \\\n") + for i, h in enumerate(hashes): + end = " \\\n" if i < len(hashes) - 1 else "\n" + f.write(f" --hash=sha256:{h}{end}") + else: + f.write(f"{name}=={version}\n") + + print(f"✅ requirements.txt written to {output_path}") + +def pylock_to_req(path: Path, output_path: Optional[Path] = None) -> None: + """Convert a pylock.toml file to requirements.txt.""" + pkgs = parse_pylock_toml(path) + if not output_path: + output_path = path.parent / (path.stem.replace('pylock', 'requirement_with_hash') + '.txt') + write_requirements_txt(pkgs, output_path) + +def run_pip_command(command: List[str], check: bool = True, capture_output=True) -> Tuple[bool, Optional[str]]: + """Run a pip command and return the result.""" + print('\n', ' '.join(command),'\n') + try: + result = subprocess.run( + command, + capture_output=capture_output, + text=True, + check=check + ) + return (result.returncode == 0), (result.stderr or result.stdout) + except subprocess.CalledProcessError as e: + return False, e.stderr + except FileNotFoundError: + return False, "pip or Python not found." + except Exception as e: + return False, f"Unexpected error: {e}" + +def get_wheels(requirements: Path, wheeldrain: Path, wheelorigin: Optional[Path] = None + , only_check: bool = True,post_install: bool = False) -> bool: + """Download or check Python wheels based on requirements.""" + added = [] + if wheelorigin: + added = ['--no-index', '--trusted-host=None', f'--find-links={wheelorigin}'] + pre_checks = [sys.executable, "-m", "pip", "install", "--dry-run", "--no-deps", "--require-hashes", "-r", str(requirements)] + added + instruction = [sys.executable, "-m", "pip", "download", "--no-deps", "--require-hashes", "-r", str(requirements), "--dest", str(wheeldrain)] + added + if wheeldrain: + added = ['--no-index', '--trusted-host=None', f'--find-links={wheeldrain}'] + post_install_cmd = [sys.executable, "-m", "pip", "install", "--no-deps", "--require-hashes", "-r", str(requirements)] + added + + # Run pip dry-run, only if a move of wheels + if wheelorigin and wheelorigin != wheeldrain: + success, output = run_pip_command(pre_checks, check=False) + if not success: + print("❌ Dry-run failed. Here's the output:\n") + print(output or "") + return False + + print("✅ Requirements can be installed successfully (dry-run passed).\n") + + # All ok + if only_check and not post_install: + return True + + # Want to install + if not only_check and post_install: + success, output = run_pip_command(post_install_cmd, check=False, capture_output=False) + if not success: + print("❌ Installation failed. Here's the output:\n") + print(output or "") + return False + return True + + # Otherwise download also, but not install direct + success, output = run_pip_command(instruction) + if not success: + print("❌ Download failed. Here's the output:\n") + print(output or "") + return False + + return True + +def get_pylock_wheels(wheelhouse: Path, lockfile: Path, wheelorigin: Optional[Path] = None, wheeldrain: Optional[Path] = None) -> None: + """Get wheels asked pylock file.""" + filename = Path(lockfile).name + wheelhouse.mkdir(parents=True, exist_ok=True) + trusted_wheelhouse = wheelhouse / "included.wheels" + trusted_wheelhouse.mkdir(parents=True, exist_ok=True) + + filename_lock = wheelhouse / filename + filename_req = wheelhouse / (Path(lockfile).stem.replace('pylock', 'requirement') + '.txt') + + pylock_to_req(Path(lockfile), filename_req) + + if not str(Path(lockfile)) == str(filename_lock): + shutil.copy2(lockfile, filename_lock) + + # We create a destination for wheels that is specific, so we can check all is there + destination_wheelhouse = Path(wheeldrain) if wheeldrain else wheelhouse / Path(lockfile).name.replace('.toml', '.wheels') + destination_wheelhouse.mkdir(parents=True, exist_ok=True) + # there can be an override + + + in_trusted = False + + if wheelorigin is None: + # Try from trusted WheelHouse + print(f"\n\n*** Checking if we can install from our Local WheelHouse: ***\n {trusted_wheelhouse}\n\n") + in_trusted = get_wheels(filename_req, destination_wheelhouse, wheelorigin=trusted_wheelhouse, only_check=True) + if in_trusted: + print(f"\n\n*** We can install from Local WheelHouse: ***\n {trusted_wheelhouse}\n\n") + in_installed = get_wheels(filename_req, trusted_wheelhouse, wheelorigin=trusted_wheelhouse, only_check=False, post_install=True) + + if not in_trusted: + post_install = True if wheelorigin and Path(wheelorigin).is_dir and Path(wheelorigin).samefile(destination_wheelhouse) else False + if post_install: + print(f"\n\n*** Installing from Local WheelHouse: ***\n {destination_wheelhouse}\n\n") + else: + print(f"\n\n*** Re-Checking if we can install from: {'pypi.org' if not wheelorigin or wheelorigin == '' else wheelorigin}\n\n") + + in_pylock = get_wheels(filename_req, destination_wheelhouse, wheelorigin=wheelorigin, only_check=False, post_install=post_install) + if in_pylock: + if not post_install: + print(f"\n\n*** You can now install from this dedicated WheelHouse: ***\n {destination_wheelhouse}") + print(f"\n via:\n wppm {filename_lock} -wh {destination_wheelhouse}\n") + else: + print(f"\n\n*** We can't install {filename} ! ***\n\n") + +def list_packages_with_metadata(directory: str) -> List[Tuple[str, str, str]]: + "get metadata from a Wheelhouse directory" + packages = pm.get_directory_metadata(directory) + results = [ (p.name, p.version, p.summary) for p in packages] + return results + +def main() -> None: + """Main entry point for the script.""" + if len(sys.argv) != 2: + print("Usage: python pylock_to_requirements.py pylock.toml") + sys.exit(1) + + path = Path(sys.argv[1]) + if not path.exists(): + print(f"❌ File not found: {path}") + sys.exit(1) + + pkgs = parse_pylock_toml(path) + dest = path.parent / (path.stem.replace('pylock', 'requirement_with_hash') + '.txt') + write_requirements_txt(pkgs, dest) + +if __name__ == "__main__": + main() diff --git a/winpython/wppm.py b/wppm/wppm.py similarity index 65% rename from winpython/wppm.py rename to wppm/wppm.py index 659d14a4..1f852236 100644 --- a/winpython/wppm.py +++ b/wppm/wppm.py @@ -1,349 +1,406 @@ -# -*- coding: utf-8 -*- -# -# WinPython Package Manager -# Copyright © 2012 Pierre Raybaut -# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ -# Licensed under the terms of the MIT License -# (see winpython/__init__.py for details) - -import os -import re -import sys -import shutil -import subprocess -import json -from pathlib import Path -from argparse import ArgumentParser, RawTextHelpFormatter -from winpython import utils, piptree, associate - -# Workaround for installing PyVISA on Windows from source: -os.environ["HOME"] = os.environ["USERPROFILE"] - -class Package: - """Standardize a Package from filename or pip list.""" - def __init__(self, fname: str, suggested_summary: str = None): - self.fname = fname - self.description = piptree.sum_up(suggested_summary) if suggested_summary else "" - self.name, self.version = None, None - if fname.lower().endswith((".zip", ".tar.gz", ".whl")): - bname = Path(self.fname).name # e.g., "sqlite_bro-1.0.0..." - infos = utils.get_source_package_infos(bname) # get name, version - if infos: - self.name, self.version = utils.normalize(infos[0]), infos[1] - self.url = f"https://pypi.org/project/{self.name}" - self.files = [] - - def __str__(self): - return f"{self.name} {self.version}\r\n{self.description}\r\nWebsite: {self.url}" - - -class Distribution: - """Handles operations on a WinPython distribution.""" - def __init__(self, target: str = None, verbose: bool = False): - self.target = target or str(Path(sys.executable).parent) # Default target more explicit - self.verbose = verbose - self.pip = None - self.to_be_removed = [] - self.version, self.architecture = utils.get_python_infos(self.target) - self.python_exe = utils.get_python_executable(self.target) - self.short_exe = Path(self.python_exe).name - - def create_file(self, package, name, dstdir, contents): - """Generate data file -- path is relative to distribution root dir""" - dst = Path(dstdir) / name - if self.verbose: - print(f"create: {dst}") - full_dst = Path(self.target) / dst - with open(full_dst, "w") as fd: - fd.write(contents) - package.files.append(str(dst)) - - def get_installed_packages(self, update: bool = False) -> list[Package]: - """Return installed packages.""" - if str(Path(sys.executable).parent) == self.target: - self.pip = piptree.PipData() - else: - self.pip = piptree.PipData(utils.get_python_executable(self.target)) - pip_list = self.pip.pip_list(full=True) - return [Package(f"{i[0].replace('-', '_').lower()}-{i[1]}-py3-none-any.whl", suggested_summary=i[2]) for i in pip_list] - - def get_installed_packages_markdown(self) -> str: - """Generates Markdown for installed packages section in package index.""" - package_lines = [ - f"[{pkg.name}]({pkg.url}) | {pkg.version} | {pkg.description}" - for pkg in sorted(self.get_installed_packages(), key=lambda p: p.name.lower()) - ] - return "\n".join(package_lines) - - def find_package(self, name: str) -> Package | None: - """Find installed package by name.""" - for pack in self.get_installed_packages(): - if utils.normalize(pack.name) == utils.normalize(name): - return pack - - def patch_all_shebang(self, to_movable: bool = True, max_exe_size: int = 999999, targetdir: str = ""): - """Make all python launchers relative.""" - for ffname in Path(self.target).glob("Scripts/*.exe"): - if ffname.stat().st_size <= max_exe_size: - utils.patch_shebang_line(ffname, to_movable=to_movable, targetdir=targetdir) - for ffname in Path(self.target).glob("Scripts/*.py"): - utils.patch_shebang_line_py(ffname, to_movable=to_movable, targetdir=targetdir) - - def install(self, package: Package, install_options: list[str] = None): - """Install package in distribution.""" - if package.fname.endswith((".whl", ".tar.gz", ".zip")): # Check extension with tuple - self.install_bdist_direct(package, install_options=install_options) - self.handle_specific_packages(package) - # minimal post-install actions - self.patch_standard_packages(package.name) - - def do_pip_action(self, actions: list[str] = None, install_options: list[str] = None): - """Execute pip action in the distribution.""" - my_list = install_options or [] - my_actions = actions or [] - executing = str(Path(self.target).parent / "scripts" / "env.bat") - if Path(executing).is_file(): - complement = [r"&&", "cd", "/D", self.target, r"&&", utils.get_python_executable(self.target), "-m", "pip"] - else: - executing = utils.get_python_executable(self.target) - complement = ["-m", "pip"] - try: - fname = utils.do_script(this_script=None, python_exe=executing, verbose=self.verbose, install_options=complement + my_actions + my_list) - except RuntimeError as e: - if not self.verbose: - print("Failed!") - raise - else: - print(f"Pip action failed with error: {e}") # Print error if verbose - - def patch_standard_packages(self, package_name="", to_movable=True): - """patch Winpython packages in need""" - import filecmp - - # 'pywin32' minimal post-install (pywin32_postinstall.py do too much) - if package_name.lower() in ("", "pywin32"): - origin = Path(self.target) / "site-packages" / "pywin32_system32" - destin = Path(self.target) - if origin.is_dir(): - for name in os.listdir(origin): - here, there = origin / name, destin / name - if not there.exists() or not filecmp.cmp(here, there): - shutil.copyfile(here, there) - # 'pip' to do movable launchers (around line 100) !!!! - # rational: https://github.com/pypa/pip/issues/2328 - if package_name.lower() == "pip" or package_name == "": - # ensure pip will create movable launchers - # sheb_mov1 = classic way up to WinPython 2016-01 - # sheb_mov2 = tried way, but doesn't work for pip (at least) - the_place = Path(self.target) / "lib" / "site-packages" / "pip" / "_vendor" / "distlib" / "scripts.py" - sheb_fix = " executable = get_executable()" - sheb_mov1 = " executable = os.path.join(os.path.basename(get_executable()))" - sheb_mov2 = " executable = os.path.join('..',os.path.basename(get_executable()))" - if to_movable: - utils.patch_sourcefile(the_place, sheb_fix, sheb_mov1) - utils.patch_sourcefile(the_place, sheb_mov2, sheb_mov1) - else: - utils.patch_sourcefile(the_place, sheb_mov1, sheb_fix) - utils.patch_sourcefile(the_place, sheb_mov2, sheb_fix) - - # create movable launchers for previous package installations - self.patch_all_shebang(to_movable=to_movable) - if package_name.lower() in ("", "spyder"): - # spyder don't goes on internet without I ask - utils.patch_sourcefile( - Path(self.target) / "lib" / "site-packages" / "spyder" / "config" / "main.py", - "'check_updates_on_startup': True,", - "'check_updates_on_startup': False,", - ) - - - def handle_specific_packages(self, package): - """Packages requiring additional configuration""" - if package.name.lower() in ("pyqt4", "pyqt5", "pyside2"): - # Qt configuration file (where to find Qt) - name = "qt.conf" - contents = """[Paths]\nPrefix = .\nBinaries = .""" - self.create_file(package, name, str(Path("Lib") / "site-packages" / package.name), contents) - self.create_file(package, name, ".", contents.replace(".", f"./Lib/site-packages/{package.name}")) - # pyuic script - if package.name.lower() == "pyqt5": - # see http://code.activestate.com/lists/python-list/666469/ - tmp_string = r"""@echo off -if "%WINPYDIR%"=="" call "%~dp0..\..\scripts\env.bat" -"%WINPYDIR%\python.exe" -m PyQt5.uic.pyuic %1 %2 %3 %4 %5 %6 %7 %8 %9""" - else: - tmp_string = r"""@echo off -if "%WINPYDIR%"=="" call "%~dp0..\..\scripts\env.bat" -"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\package.name\uic\pyuic.py" %1 %2 %3 %4 %5 %6 %7 %8 %9""" - # PyPy adaption: python.exe or pypy3.exe - my_exec = Path(utils.get_python_executable(self.target)).name - tmp_string = tmp_string.replace("python.exe", my_exec).replace("package.name", package.name) - self.create_file(package, f"pyuic{package.name[-1]}.bat", "Scripts", tmp_string) - # Adding missing __init__.py files (fixes Issue 8) - uic_path = str(Path("Lib") / "site-packages" / package.name / "uic") - for dirname in ("Loader", "port_v2", "port_v3"): - self.create_file(package, "__init__.py", str(Path(uic_path) / dirname), "") - - def _print(self, package: Package, action: str): - """Print package-related action text.""" - text = f"{action} {package.name} {package.version}" - if self.verbose: - utils.print_box(text) - else: - print(f" {text}...", end=" ") - - def _print_done(self): - """Print OK at the end of a process""" - if not self.verbose: - print("OK") - - def uninstall(self, package): - """Uninstall package from distribution""" - self._print(package, "Uninstalling") - if package.name != "pip": - # trick to get true target (if not current) - this_exec = utils.get_python_executable(self.target) # PyPy ! - subprocess.call([this_exec, "-m", "pip", "uninstall", package.name, "-y"], cwd=self.target) - self._print_done() - - def install_bdist_direct(self, package, install_options=None): - """Install a package directly !""" - self._print(package,f"Installing {package.fname.split('.')[-1]}") - try: - fname = utils.direct_pip_install( - package.fname, - python_exe=utils.get_python_executable(self.target), # PyPy ! - verbose=self.verbose, - install_options=install_options, - ) - except RuntimeError: - if not self.verbose: - print("Failed!") - raise - package = Package(fname) - self._print_done() - -def main(test=False): - - registerWinPythonHelp = f"Register WinPython: associate file extensions, icons and context menu with this WinPython" - unregisterWinPythonHelp = f"Unregister WinPython: de-associate file extensions, icons and context menu from this WinPython" - parser = ArgumentParser( - description="WinPython Package Manager: handle a WinPython Distribution and its packages", - formatter_class=RawTextHelpFormatter, - ) - parser.add_argument("fname", metavar="package", nargs="?", default="", type=str, help="optional package name or package wheel") - parser.add_argument("-v", "--verbose", action="store_true", help="show more details on packages and actions") - parser.add_argument( "--register", dest="registerWinPython", action="store_true", help=registerWinPythonHelp) - # parser.add_argument( "--register_forall", action="store_true", help="Register distribution for all users") - parser.add_argument("--unregister", dest="unregisterWinPython", action="store_true", help=unregisterWinPythonHelp) - # parser.add_argument( "--unregister_forall", action="store_true", help="un-Register distribution for all users") - parser.add_argument("--fix", action="store_true", help="make WinPython fix") - parser.add_argument("--movable", action="store_true", help="make WinPython movable") - parser.add_argument("-ls", "--list", action="store_true", help="list installed packages matching the given [optional] package expression: wppm -ls, wppm -ls pand") - parser.add_argument("-lsa", dest="all", action="store_true",help=f"list details of package names matching given regular expression: wppm -lsa pandas -l1") - parser.add_argument("-p",dest="pipdown",action="store_true",help="show Package dependencies of the given package[option]: wppm -p pandas[test]") - parser.add_argument("-r", dest="pipup", action="store_true", help=f"show Reverse dependancies of the given package[option]: wppm -r pytest[test]") - parser.add_argument("-l", "--levels", type=int, default=2, help="show 'LEVELS' levels of dependencies (with -p, -r), default is 2: wppm -p pandas -l1") - parser.add_argument("-t", "--target", default=sys.prefix, help=f'path to target Python distribution (default: "{sys.prefix}")') - parser.add_argument("-i", "--install", action="store_true", help="install a given package wheel (use pip for more features)") - parser.add_argument("-u", "--uninstall", action="store_true", help="uninstall package (use pip for more features)") - - - args = parser.parse_args() - targetpython = None - if args.target and args.target != sys.prefix: - targetpython = args.target if args.target.lower().endswith('.exe') else str(Path(args.target) / 'python.exe') - if args.install and args.uninstall: - raise RuntimeError("Incompatible arguments: --install and --uninstall") - if args.registerWinPython and args.unregisterWinPython: - raise RuntimeError("Incompatible arguments: --install and --uninstall") - if args.pipdown: - pip = piptree.PipData(targetpython) - pack, extra, *other = (args.fname + "[").replace("]", "[").split("[") - print(pip.down(pack, extra, args.levels, verbose=args.verbose)) - sys.exit() - elif args.pipup: - pip = piptree.PipData(targetpython) - pack, extra, *other = (args.fname + "[").replace("]", "[").split("[") - print(pip.up(pack, extra, args.levels, verbose=args.verbose)) - sys.exit() - elif args.list: - pip = piptree.PipData(targetpython) - todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0]))] - titles = [['Package', 'Version', 'Summary'], ['_' * max(x, 6) for x in utils.columns_width(todo)]] - listed = utils.formatted_list(titles + todo, max_width=70) - for p in listed: - print(*p) - sys.exit() - elif args.all: - pip = piptree.PipData(targetpython) - todo = [l for l in pip.pip_list(full=True) if bool(re.search(args.fname, l[0]))] - for l in todo: - # print(pip.distro[l[0]]) - title = f"** Package: {l[0]} **" - print("\n" + "*" * len(title), f"\n{title}", "\n" + "*" * len(title)) - for key, value in pip.raw[l[0]].items(): - rawtext = json.dumps(value, indent=2, ensure_ascii=False) - lines = [l for l in rawtext.split(r"\n") if len(l.strip()) > 2] - if key.lower() != 'description' or args.verbose: - print(f"{key}: ", "\n".join(lines).replace('"', "")) - sys.exit() - if args.registerWinPython: - print(registerWinPythonHelp) - if utils.is_python_distribution(args.target): - dist = Distribution(args.target) - else: - raise OSError(f"Invalid Python distribution {args.target}") - print(f"registering {args.target}") - print("continue ? Y/N") - theAnswer = input() - if theAnswer == "Y": - associate.register(dist.target, verbose=args.verbose) - sys.exit() - if args.unregisterWinPython: - print(unregisterWinPythonHelp) - if utils.is_python_distribution(args.target): - dist = Distribution(args.target) - else: - raise OSError(f"Invalid Python distribution {args.target}") - print(f"unregistering {args.target}") - print("continue ? Y/N") - theAnswer = input() - if theAnswer == "Y": - associate.unregister(dist.target, verbose=args.verbose) - sys.exit() - if utils.is_python_distribution(args.target): - dist = Distribution(args.target, verbose=True) - cmd_fix = rf"from winpython import wppm;dist=wppm.Distribution(r'{dist.target}');dist.patch_standard_packages('pip', to_movable=False)" - cmd_mov = rf"from winpython import wppm;dist=wppm.Distribution(r'{dist.target}');dist.patch_standard_packages('pip', to_movable=True)" - if args.fix: - # dist.patch_standard_packages('pip', to_movable=False) # would fail on wppm.exe - p = subprocess.Popen(["start", "cmd", "/k",dist.python_exe, "-c" , cmd_fix], shell = True, cwd=dist.target) - sys.exit() - if args.movable: - p = subprocess.Popen(["start", "cmd", "/k",dist.python_exe, "-c" , cmd_mov], shell = True, cwd=dist.target) - sys.exit() - if not args.install and not args.uninstall: - args.install = True - if not Path(args.fname).is_file() and args.install: - if args.fname == "": - parser.print_help() - sys.exit() - else: - raise FileNotFoundError(f"File not found: {args.fname}") - try: - if args.uninstall: - package = dist.find_package(args.fname) - dist.uninstall(package) - elif args.install: - package = Package(args.fname) - if args.install: - dist.install(package) - except NotImplementedError: - raise RuntimeError("Package is not (yet) supported by WPPM") - else: - raise OSError(f"Invalid Python distribution {args.target}") - - -if __name__ == "__main__": +# -*- coding: utf-8 -*- +# +# WinPython Package Manager +# Copyright © 2012 Pierre Raybaut +# Copyright © 2014-2025+ The Winpython development team https://github.com/winpython/ +# Licensed under the terms of the MIT License +# (see winpython/__init__.py for details) + +import os +import re +import sys +import shutil +import subprocess +import json +from pathlib import Path +from argparse import ArgumentParser, RawTextHelpFormatter +from . import utils, piptree, associate, diff +from . import wheelhouse as wh +from operator import itemgetter +# Workaround for installing PyVISA on Windows from source: +os.environ["HOME"] = os.environ["USERPROFILE"] + +class Package: + """Standardize a Package from filename or pip list.""" + def __init__(self, fname: str, suggested_summary: str = None): + self.fname = fname + self.description = (utils.sum_up(suggested_summary) if suggested_summary else "").strip() + self.name, self.version = fname, '?.?.?' + if fname.lower().endswith((".zip", ".tar.gz", ".whl")): + bname = Path(self.fname).name # e.g., "sqlite_bro-1.0.0..." + infos = utils.get_source_package_infos(bname) # get name, version + if infos: + self.name, self.version = utils.normalize(infos[0]), infos[1] + self.url = f"https://pypi.org/project/{self.name}" + self.files = [] + + def __str__(self): + return f"{self.name} {self.version}\r\n{self.description}\r\nWebsite: {self.url}" + + +class Distribution: + """Handles operations on a WinPython distribution.""" + def __init__(self, target: str = None, verbose: bool = False): + self.target = target or str(Path(sys.executable).parent) # Default target more explicit + self.verbose = verbose + self.pip = None + self.to_be_removed = [] + self.version, self.architecture = utils.get_python_infos(self.target) + self.python_exe = utils.get_python_executable(self.target) + self.short_exe = Path(self.python_exe).name + self.wheelhouse = Path(self.target).parent / "wheelhouse" + + def create_file(self, package, name, dstdir, contents): + """Generate data file -- path is relative to distribution root dir""" + dst = Path(dstdir) / name + if self.verbose: + print(f"create: {dst}") + full_dst = Path(self.target) / dst + with open(full_dst, "w") as fd: + fd.write(contents) + package.files.append(str(dst)) + + def get_installed_packages(self, update: bool = False) -> list[Package]: + """Return installed packages.""" + if str(Path(sys.executable).parent) == self.target: + self.pip = piptree.PipData() + else: + self.pip = piptree.PipData(utils.get_python_executable(self.target)) + pip_list = self.pip.pip_list(full=True) + return [Package(f"{i[0].replace('-', '_').lower()}-{i[1]}-py3-none-any.whl", suggested_summary=i[2]) for i in pip_list] + + def render_markdown_for_list(self, title, items): + """Generates a Markdown section; name, url, version, summary""" + md = f"### {title}\n\n" + md += "Name | Version | Description\n" + md += "-----|---------|------------\n" + for name, url, version, summary in sorted(items, key=lambda p: (p[0].lower(), p[2])): + md += f"[{name}]({url}) | {version} | {summary}\n" + md += "\n" + return md + + def generate_package_index_markdown(self, python_executable_directory: str|None = None, winpyver2: str|None = None, + flavor: str|None = None, architecture_bits: int|None = None + , release_level: str|None = None, wheeldir: str|None = None) -> str: + """Generates a Markdown formatted package index page.""" + my_ver , my_arch = utils.get_python_infos(python_executable_directory or self.target) + my_winpyver2 = winpyver2 or os.getenv("WINPYVER2","") + my_winpyver2 = my_winpyver2 if my_winpyver2 != "" else my_ver + my_flavor = flavor or os.getenv("WINPYFLAVOR", "") + my_release_level = release_level or os.getenv("WINPYVER", "").replace(my_winpyver2+my_flavor, "") + + tools_list = utils.get_installed_tools(utils.get_python_executable(python_executable_directory)) + package_list = [(pkg.name, pkg.url, pkg.version, pkg.description) for pkg in self.get_installed_packages()] + wheelhouse_list = [] + my_wheeldir = Path(wheeldir) if wheeldir else self.wheelhouse / 'included.wheels' + if my_wheeldir.is_dir(): + wheelhouse_list = [(name, f"https://pypi.org/project/{name}", version, utils.sum_up(summary)) + for name, version, summary in wh.list_packages_with_metadata(str(my_wheeldir)) ] + + return f"""## WinPython {my_winpyver2 + my_flavor} + +The following packages are included in WinPython-{my_arch}bit v{my_winpyver2 + my_flavor} {my_release_level}. + +
+ +{self.render_markdown_for_list("Tools", tools_list)} +{self.render_markdown_for_list("Python packages", package_list)} +{self.render_markdown_for_list("WheelHouse packages", wheelhouse_list)} +
+""" + + def find_package(self, name: str) -> Package | None: + """Find installed package by name.""" + for pack in self.get_installed_packages(): + if utils.normalize(pack.name) == utils.normalize(name): + return pack + + def patch_all_shebang(self, to_movable: bool = True, max_exe_size: int = 999999, targetdir: str = ""): + """Make all python launchers relative.""" + for ffname in Path(self.target).glob("Scripts/*.exe"): + if ffname.stat().st_size <= max_exe_size: + utils.patch_shebang_line(ffname, to_movable=to_movable, targetdir=targetdir) + for ffname in Path(self.target).glob("Scripts/*.py"): + utils.patch_shebang_line_py(ffname, to_movable=to_movable, targetdir=targetdir) + + def install(self, package: Package, install_options: list[str] = None): + """Install package in distribution.""" + if package.fname.endswith((".whl", ".tar.gz", ".zip")) or ( + ' ' not in package.fname and ';' not in package.fname and len(package.fname) >1): # Check extension with tuple + self.install_bdist_direct(package, install_options=install_options) + self.handle_specific_packages(package) + # minimal post-install actions + self.patch_standard_packages(package.name) + + def do_pip_action(self, actions: list[str] = None, install_options: list[str] = None): + """Execute pip action in the distribution.""" + my_list = install_options or [] + my_actions = actions or [] + executing = str(Path(self.target).parent / "scripts" / "env.bat") + if Path(executing).is_file(): + complement = [r"&&", "cd", "/D", self.target, r"&&", utils.get_python_executable(self.target), "-m", "pip"] + else: + executing = utils.get_python_executable(self.target) + complement = ["-m", "pip"] + try: + fname = utils.do_script(this_script=None, python_exe=executing, verbose=self.verbose, install_options=complement + my_actions + my_list) + except RuntimeError as e: + if not self.verbose: + print("Failed!") + raise + else: + print(f"Pip action failed with error: {e}") # Print error if verbose + + def patch_standard_packages(self, package_name="", to_movable=True): + """patch Winpython packages in need""" + import filecmp + + # 'pywin32' minimal post-install (pywin32_postinstall.py do too much) + if package_name.lower() in ("", "pywin32"): + origin = Path(self.target) / "site-packages" / "pywin32_system32" + destin = Path(self.target) + if origin.is_dir(): + for name in os.listdir(origin): + here, there = origin / name, destin / name + if not there.exists() or not filecmp.cmp(here, there): + shutil.copyfile(here, there) + # 'pip' to do movable launchers (around line 100) !!!! + # rational: https://github.com/pypa/pip/issues/2328 + if package_name.lower() == "pip" or package_name == "": + # ensure pip will create movable launchers + # sheb_mov1 = classic way up to WinPython 2016-01 + # sheb_mov2 = tried way, but doesn't work for pip (at least) + the_place = Path(self.target) / "lib" / "site-packages" / "pip" / "_vendor" / "distlib" / "scripts.py" + sheb_fix = " executable = get_executable()" + sheb_mov1 = " executable = os.path.join(os.path.basename(get_executable()))" + sheb_mov2 = " executable = os.path.join('..',os.path.basename(get_executable()))" + if to_movable: + utils.patch_sourcefile(the_place, sheb_fix, sheb_mov1) + utils.patch_sourcefile(the_place, sheb_mov2, sheb_mov1) + else: + utils.patch_sourcefile(the_place, sheb_mov1, sheb_fix) + utils.patch_sourcefile(the_place, sheb_mov2, sheb_fix) + + # create movable launchers for previous package installations + self.patch_all_shebang(to_movable=to_movable) + if package_name.lower() in ("", "spyder"): + # spyder don't goes on internet without you ask + utils.patch_sourcefile( + Path(self.target) / "lib" / "site-packages" / "spyder" / "config" / "main.py", + "'check_updates_on_startup': True,", + "'check_updates_on_startup': False,", + ) + + + def handle_specific_packages(self, package): + """Packages requiring additional configuration""" + if package.name.lower() in ("pyqt4", "pyqt5", "pyside2"): + # Qt configuration file (where to find Qt) + name = "qt.conf" + contents = """[Paths]\nPrefix = .\nBinaries = .""" + self.create_file(package, name, str(Path("Lib") / "site-packages" / package.name), contents) + self.create_file(package, name, ".", contents.replace(".", f"./Lib/site-packages/{package.name}")) + # pyuic script + if package.name.lower() == "pyqt5": + # see http://code.activestate.com/lists/python-list/666469/ + tmp_string = r"""@echo off +if "%WINPYDIR%"=="" call "%~dp0..\..\scripts\env.bat" +"%WINPYDIR%\python.exe" -m PyQt5.uic.pyuic %1 %2 %3 %4 %5 %6 %7 %8 %9""" + else: + tmp_string = r"""@echo off +if "%WINPYDIR%"=="" call "%~dp0..\..\scripts\env.bat" +"%WINPYDIR%\python.exe" "%WINPYDIR%\Lib\site-packages\package.name\uic\pyuic.py" %1 %2 %3 %4 %5 %6 %7 %8 %9""" + # PyPy adaption: python.exe or pypy3.exe + my_exec = Path(utils.get_python_executable(self.target)).name + tmp_string = tmp_string.replace("python.exe", my_exec).replace("package.name", package.name) + self.create_file(package, f"pyuic{package.name[-1]}.bat", "Scripts", tmp_string) + # Adding missing __init__.py files (fixes Issue 8) + uic_path = str(Path("Lib") / "site-packages" / package.name / "uic") + for dirname in ("Loader", "port_v2", "port_v3"): + self.create_file(package, "__init__.py", str(Path(uic_path) / dirname), "") + + def _print(self, package: Package, action: str): + """Print package-related action text.""" + text = f"{action} {package.name} {package.version}" + if self.verbose: + utils.print_box(text) + else: + print(f" {text}...", end=" ") + + def _print_done(self): + """Print OK at the end of a process""" + if not self.verbose: + print("OK") + + def uninstall(self, package): + """Uninstall package from distribution""" + self._print(package, "Uninstalling") + if package.name != "pip": + # trick to get true target (if not current) + this_exec = utils.get_python_executable(self.target) # PyPy ! + subprocess.call([this_exec, "-m", "pip", "uninstall", package.name, "-y"], cwd=self.target) + self._print_done() + + def install_bdist_direct(self, package, install_options=None): + """Install a package directly !""" + self._print(package,f"Installing {package.fname.split('.')[-1]}") + try: + fname = utils.direct_pip_install( + package.fname, + python_exe=utils.get_python_executable(self.target), # PyPy ! + verbose=self.verbose, + install_options=install_options, + ) + except RuntimeError: + if not self.verbose: + print("Failed!") + raise + package = Package(fname) + self._print_done() + +def main(test=False): + + registerWinPythonHelp = f"Register WinPython: associate file extensions, icons and context menu with this WinPython" + unregisterWinPythonHelp = f"Unregister WinPython: de-associate file extensions, icons and context menu from this WinPython" + parser = ArgumentParser(prog="wppm", + description="WinPython Package Manager: handle a WinPython Distribution and its packages", + formatter_class=RawTextHelpFormatter, + ) + parser.add_argument("fname", metavar="package(s) or lockfile", nargs="*", default=[""], type=str, help="optional package names, wheels, or lockfile") + parser.add_argument("-v", "--verbose", action="store_true", help="show more details on packages and actions") + parser.add_argument( "--register", dest="registerWinPython", action="store_true", help=registerWinPythonHelp) + parser.add_argument("--unregister", dest="unregisterWinPython", action="store_true", help=unregisterWinPythonHelp) + parser.add_argument("--fix", action="store_true", help="make WinPython fix") + parser.add_argument("--movable", action="store_true", help="make WinPython movable") + parser.add_argument("-ws", dest="wheelsource", default=None, type=str, help="wheels location, '.' = WheelHouse): wppm pylock.toml -ws source_of_wheels, wppm -ls -ws .") + parser.add_argument("-wd", dest="wheeldrain" , default=None, type=str, help="wheels destination: wppm pylock.toml -wd destination_of_wheels") + parser.add_argument("-ls", "--list", action="store_true", help="list installed packages matching [optional] expression: wppm -ls, wppm -ls pand") + parser.add_argument("-lsa", dest="all", action="store_true",help=f"list details of packages matching [optional] expression: wppm -lsa pandas -l1") + parser.add_argument("-md", dest="markdown", action="store_true",help=f"markdown summary of the installation") + parser.add_argument("-p",dest="pipdown",action="store_true",help="show Package dependencies of the given package[option], [.]=all: wppm -p pandas[.]") + parser.add_argument("-r", dest="pipup", action="store_true", help=f"show Reverse (!= constraining) dependancies of the given package[option]: wppm -r pytest![test]") + parser.add_argument("-l", dest="levels", type=int, default=-1, help="show 'LEVELS' levels of dependencies (with -p, -r): wppm -p pandas -l1") + parser.add_argument("-t", dest="target", default=sys.prefix, help=f'path to target Python distribution (default: "{sys.prefix}")') + parser.add_argument("-i", "--install", action="store_true", help="install a given package wheel or pylock file (use pip for more features)") + parser.add_argument("-u", "--uninstall", action="store_true", help="uninstall package (use pip for more features)") + + args = parser.parse_args() + targetpython = None + if args.target and args.target != sys.prefix: + targetpython = args.target if args.target.lower().endswith('.exe') else str(Path(args.target) / 'python.exe') + if args.wheelsource == ".": # play in default WheelHouse + if utils.is_python_distribution(args.target): + dist = Distribution(args.target) + args.wheelsource = dist.wheelhouse / 'included.wheels' + if args.install and args.uninstall: + raise RuntimeError("Incompatible arguments: --install and --uninstall") + if args.registerWinPython and args.unregisterWinPython: + raise RuntimeError("Incompatible arguments: --install and --uninstall") + if args.pipdown: + pip = piptree.PipData(targetpython, args.wheelsource) + for args_fname in args.fname: + pack, extra, *other = (args_fname + "[").replace("]", "[").split("[") + print(pip.down(pack, extra, args.levels if args.levels>0 else 2, verbose=args.verbose)) + sys.exit() + elif args.pipup: + pip = piptree.PipData(targetpython, args.wheelsource) + for args_fname in args.fname: + pack, extra, *other = (args_fname + "[").replace("]", "[").split("[") + print(pip.up(pack, extra, args.levels if args.levels>=0 else 1, verbose=args.verbose)) + sys.exit() + elif args.list: + pip = piptree.PipData(targetpython, args.wheelsource) + todo= [] + for args_fname in args.fname: + todo += [l for l in pip.pip_list(full=True) if bool(re.search(args_fname, l[0]))] + todo = sorted(set(todo)) #, key=lambda p: (p[0].lower(), p[2]) + titles = [['Package', 'Version', 'Summary'], ['_' * max(x, 6) for x in utils.columns_width(todo)]] + listed = utils.formatted_list(titles + todo, max_width=70) + for p in listed: + print(*p) + sys.exit() + elif args.all: + pip = piptree.PipData(targetpython, args.wheelsource) + for args_fname in args.fname: + todo = [l for l in pip.pip_list(full=True) if bool(re.search(args_fname, l[0]))] + for l in sorted(set(todo)): + title = f"** Package: {l[0]} **" + print("\n" + "*" * len(title), f"\n{title}", "\n" + "*" * len(title)) + for key, value in pip.raw[l[0]].items(): + rawtext = json.dumps(value, indent=2, ensure_ascii=False) + lines = [l for l in rawtext.split(r"\n") if len(l.strip()) > 2] + if key.lower() != 'description' or args.verbose: + print(f"{key}: ", "\n".join(lines).replace('"', "")) + sys.exit() + if args.registerWinPython: + print(registerWinPythonHelp) + if utils.is_python_distribution(args.target): + dist = Distribution(args.target) + else: + raise OSError(f"Invalid Python distribution {args.target}") + print(f"registering {args.target}") + print("continue ? Y/N") + theAnswer = input() + if theAnswer == "Y": + associate.register(dist.target, verbose=args.verbose) + sys.exit() + if args.unregisterWinPython: + print(unregisterWinPythonHelp) + if utils.is_python_distribution(args.target): + dist = Distribution(args.target) + else: + raise OSError(f"Invalid Python distribution {args.target}") + print(f"unregistering {args.target}") + print("continue ? Y/N") + theAnswer = input() + if theAnswer == "Y": + associate.unregister(dist.target, verbose=args.verbose) + sys.exit() + if utils.is_python_distribution(args.target): + dist = Distribution(args.target, verbose=True) + cmd_fix = rf"from winpython import wppm;dist=wppm.Distribution(r'{dist.target}');dist.patch_standard_packages('pip', to_movable=False)" + cmd_mov = rf"from winpython import wppm;dist=wppm.Distribution(r'{dist.target}');dist.patch_standard_packages('pip', to_movable=True)" + if args.fix: + # dist.patch_standard_packages('pip', to_movable=False) # would fail on wppm.exe + p = subprocess.Popen(["start", "cmd", "/k",dist.python_exe, "-c" , cmd_fix], shell = True, cwd=dist.target) + sys.exit() + if args.movable: + p = subprocess.Popen(["start", "cmd", "/k",dist.python_exe, "-c" , cmd_mov], shell = True, cwd=dist.target) + sys.exit() + if args.markdown: + default = dist.generate_package_index_markdown() + if args.wheelsource: + compare = dist.generate_package_index_markdown(wheeldir = args.wheelsource) + print(diff.compare_markdown_sections(default, compare,'python', 'wheelhouse', 'installed', 'wheelhouse')) + else: + print(default) + sys.exit() + if not args.install and not args.uninstall and args.fname[0].endswith(".toml"): + args.install = True # for Drag & Drop of .toml (and not wheel) + if args.fname[0] == "" or (not args.install and not args.uninstall): + parser.print_help() + sys.exit() + else: + try: + for args_fname in args.fname: + filename = Path(args_fname).name + install_from_wheelhouse = ["--no-index", "--trusted-host=None", f"--find-links={dist.wheelhouse / 'included.wheels'}"] + if filename.split('.')[0] == "pylock" and filename.split('.')[-1] == 'toml': + print(' a lock file !', args_fname, dist.target) + wh.get_pylock_wheels(dist.wheelhouse, Path(args_fname), args.wheelsource, args.wheeldrain) + sys.exit() + if args.uninstall: + package = dist.find_package(args_fname) + dist.uninstall(package) + elif args.install: + package = Package(args_fname) + if args.install: + dist.install(package, install_options=install_from_wheelhouse) + except NotImplementedError: + raise RuntimeError("Package is not (yet) supported by WPPM") + else: + raise OSError(f"Invalid Python distribution {args.target}") + + +if __name__ == "__main__": main() \ No newline at end of file