diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml
deleted file mode 100644
index 9ad20f3..0000000
--- a/.github/workflows/black.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-name: Lint
-
-on: [push, pull_request]
-
-jobs:
- lint:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - name: Setup Python 3.10
- uses: actions/setup-python@v5
- with:
- python-version: "3.10"
-
- - name: Run black
- uses: psf/black@stable
-
- - name: Check for debugging print statements
- run: |
- if grep -rq "print(" gopher; then
- echo "Found the following print statements:"
- grep -r "print(" gopher
- exit 1
- fi
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index c9976cb..3d8e57b 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -3,26 +3,26 @@ name: Push docs
on:
push:
branches:
- - main
- - documentation
+ - main
+ - documentation
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-python@v5
- with:
- python-version: 3.x
+ - uses: actions/checkout@v4
+ - uses: actions/setup-python@v5
+ with:
+ python-version: 3.x
- - name: Install font
- run: |
- cd /usr/share/fonts
- wget https://github.com/JulietaUla/Montserrat/archive/refs/tags/v7.222.tar.gz
- tar -xvzf v7.222.tar.gz
- sudo chmod -R --reference=/usr/share/fonts/truetype Montserrat-7.222
- sudo fc-cache -fv
- fc-match Montserrat
+ - name: Install font
+ run: |
+ cd /usr/share/fonts
+ wget https://github.com/JulietaUla/Montserrat/archive/refs/tags/v7.222.tar.gz
+ tar -xvzf v7.222.tar.gz
+ sudo chmod -R --reference=/usr/share/fonts/truetype Montserrat-7.222
+ sudo fc-cache -fv
+ fc-match Montserrat
- - run: pip install ".[docs]"
- - run: mkdocs gh-deploy --force
+ - run: pip install ".[docs]"
+ - run: mkdocs gh-deploy --force
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
index 29fb969..07254b5 100644
--- a/.github/workflows/publish.yml
+++ b/.github/workflows/publish.yml
@@ -1,7 +1,4 @@
-# This workflows will upload a Python Package using Twine when a release is created
-# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries
-
-name: PyPI
+name: Publish to PyPI
on:
release:
@@ -10,21 +7,24 @@ on:
jobs:
deploy:
runs-on: ubuntu-latest
-
+ environment: pypi
+ permissions:
+ id-token: write
steps:
- - uses: actions/checkout@v4
- - name: Set up Python
+ - name: Checkout project
+ uses: actions/checkout@v4
+
+ - name: Install uv
+ uses: astral-sh/setup-uv@v5
+
+ - name: Setup Python
uses: actions/setup-python@v5
with:
- python-version: '3.x'
- - name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install setuptools wheel twine build
- - name: Build and publish
- env:
- TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
- TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
+ python-version-file: pyproject.toml
+
+ - name: Build
run: |
- python -m build --sdist --wheel .
- twine upload dist/*
+ uv build
+
+ - name: Publish to PyPI
+ uses: pypa/gh-action-pypi-publish@release/v1
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index ab11422..1a53349 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -1,45 +1,55 @@
# This workflow will install Python dependencies, run tests and lint with a single version of Python
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
-name: tests
+name: Lint and Test
on:
push:
- branches: [ master ]
+ branches: [main]
pull_request:
- branches: [ master ]
- schedule:
- - cron: "0 0 1 1/1 *" # Run monthly
+ branches: [main]
jobs:
- build:
+ lint:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version-file: pyproject.toml
+
+ - uses: pre-commit/action@v3.0.1
+ with:
+ extra_args: --all-files
+
+ - name: Check Linting
+ uses: astral-sh/ruff-action@v3
+
+ - name: Check Formatting
+ uses: astral-sh/ruff-action@v3
+ with:
+ args: format --check --diff
+
+
+ test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
-
steps:
- - uses: actions/checkout@v4
- - name: Set up Python 3.10
+ - name: Checkout project
+ uses: actions/checkout@v4
+
+ - name: Install uv
+ uses: astral-sh/setup-uv@v5
+
+ - name: Setup Python
uses: actions/setup-python@v5
with:
- python-version: "3.10"
+ python-version-file: pyproject.toml
- - name: Install dependencies
- run: |
- python -m pip install --upgrade pip
- pip install flake8 pytest pytest-cov wheel
- pip install -e .
- - name: Lint with flake8
- run: |
- # stop the build if there are Python syntax errors or undefined names
- flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
- # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
- flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Run unit and system tests
run: |
- pytest --cov=ppx tests/
- - name: Upload coverage to codecov
- uses: codecov/codecov-action@v1
- with:
- fail_ci_if_error: true
+ uv run pytest tests/
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 4923566..3f42827 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,6 +1,28 @@
repos:
- - repo: https://github.com/psf/black
- rev: 25.1.0 # Replace by any tag/version: https://github.com/psf/black/tags
- hooks:
- - id: black
- language_version: python3 # Should be a command that runs python3.6+
+- repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v5.0.0
+ hooks:
+ - id: check-toml
+ - id: check-yaml
+ - id: end-of-file-fixer
+ - id: trailing-whitespace
+ - id: detect-private-key
+ - id: pretty-format-json
+ args: [--autofix]
+- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks
+ rev: v2.15.0
+ hooks:
+ - id: pretty-format-toml
+ args: [--autofix]
+ - id: pretty-format-yaml
+ args: [--autofix]
+- repo: https://github.com/astral-sh/ruff-pre-commit
+ rev: v0.12.7
+ hooks:
+ # Run the linter.
+ - id: ruff
+ types_or: [python, pyi, jupyter]
+ args: [--fix, --show-fixes]
+ # Run the formatter.
+ - id: ruff-format
+ types_or: [python, pyi, jupyter]
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..eb097d9
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,41 @@
+# Repository Guidelines
+
+## Project Structure & Module Organization
+- Python package lives in `gopher/`; `gopher/gopher.py` is the CLI entry point wired to `gopher` console script.
+- Shared utilities and domain logic sit in modules like `annotations.py`, `enrichment.py`, `graph_search.py`, and `normalize.py`.
+- Tests are split by scope: unit tests in `tests/unit_tests/`, integration/system checks in `tests/system_tests/`, and fixtures/data in `tests/data/`.
+- Documentation sources are in `docs/`; MkDocs configuration is at `mkdocs.yml`.
+
+## Build, Test, and Development Commands
+- Install for development (creates editable install with extras):
+ `uv sync --dev` or `pip install -e .[dev]`
+- Run the test suite:
+ `uv run pytest` or `pytest`
+- Lint and format with Ruff (configured in `pyproject.toml`):
+ `uv run ruff check .` and `uv run ruff format .`
+- Pre-commit hooks (lint/format/metadata checks):
+ `pre-commit run --all-files`
+- Build docs locally:
+ `uv run mkdocs serve`
+
+## Coding Style & Naming Conventions
+- Ruff enforces PEP8-style rules; line length is 79. Target Python 3.10+.
+- Prefer type hints and docstrings for public functions; docstring checks are relaxed for tests and `__init__.py`.
+- Use snake_case for functions/variables, CapWords for classes, and UPPER_SNAKE_CASE for constants.
+- Keep modules focused; place CLI-only code in `gopher/gopher.py` and reusable logic elsewhere.
+
+## Testing Guidelines
+- Write fast, deterministic tests; mock network/filesystem when practical.
+- Place new unit tests beside related code in `tests/unit_tests/`; heavier end-to-end flows go in `tests/system_tests/`.
+- Name tests descriptively (`test_handles_missing_annotations`), and prefer given/when/then structure in assertions.
+- Aim to cover new branches and edge cases before opening a PR; run `pytest -q` to keep output compact.
+
+## Commit & Pull Request Guidelines
+- Commit messages in this repo are short, imperative phrases (e.g., `Update pre-commit hooks`, `Migrate to uv and ruff`). Match that style.
+- Keep commits focused; include only related changes plus updated tests.
+- PRs should state the problem, the solution, and validation (tests, screenshots for visual changes). Link related issues and note breaking changes explicitly.
+- Ensure lint, tests, and (if touched) docs build succeed before requesting review.
+
+## Security & Configuration Notes
+- Avoid committing secrets or private keys; pre-commit includes a detector, but double-check before pushing.
+- Network calls (e.g., ontology downloads) should remain in well-scoped helper functions in `gopher/` so they can be mocked in tests.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0a5bd9a..7c9a309 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,14 @@
-# Changelog for gopher-enrich
+# Changelog for gopher
+
+## [v0.3.0] - 2025-12-09
+### Changed
+- Modernized codebase for uv.
+
+### Fixed
+- Linting errors.
+- Publish action.
## [v0.2.0] - 2025-05-08
- Update github actions
- Update mkdocs.yml
-- Add `read_diann` function
+- Add `read_diann` function
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
index 874564e..0f355d6 100644
--- a/CODE_OF_CONDUCT.md
+++ b/CODE_OF_CONDUCT.md
@@ -120,4 +120,3 @@ version 2.0, available at
[homepage]: https://www.contributor-covenant.org
[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
-
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 609c21b..3f822c5 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -19,7 +19,7 @@ There are three exceptions to this:
2. The Vignettes are created from Jupyter notebooks.
-3. The Code of Conduct, Release Notes, and this Contributing document are
+3. The Code of Conduct, Release Notes, and this Contributing document are
markdown files that live in the root of the gopher-enrich repository.
### Editing most documents
@@ -39,7 +39,7 @@ way.
## Contributing to the code
-We welcome contributions to the source code of gopher-enrich---particularly
+We welcome contributions to the source code of gopher-enrich---particularly
ones that address discussed [issues](https://github.com/TalusBio/gopher/issues).
Contributions to gopher-enrich follow a standard GitHub contribution workflow:
diff --git a/README.md b/README.md
index e6f4e32..5aaf3a5 100644
--- a/README.md
+++ b/README.md
@@ -19,5 +19,5 @@ pip install gopher-enrich
```python
import gopher # import the package
-gopher.test_enrichment(proteins=protein_quant) # run the enrichment
-```
\ No newline at end of file
+gopher.test_enrichment(proteins=protein_quant) # run the enrichment
+```
diff --git a/docs/api.md b/docs/api.md
index 3fbcd5f..ad07262 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -12,4 +12,4 @@
::: gopher.normalize_values
::: gopher.get_rankings
::: gopher.in_term
-::: gopher.roc
\ No newline at end of file
+::: gopher.roc
diff --git a/docs/examples.md b/docs/examples.md
index decd571..ecdb0ca 100644
--- a/docs/examples.md
+++ b/docs/examples.md
@@ -26,7 +26,7 @@ Gopher returns a dataframe with the following columns:
- GO Aspect: String with the gene ontology aspect. Either C (cellular component), F (molecular function), and B (biological process).
- Columns containing p-values from the GO enrichment.
-Example output:
+Example output:
GO ID | GO Name | GO Aspect | Sample 1 | Sample 2 | Sample 3
---------- | ----------- | ---------- | ---------- | ---------- | ----------
@@ -107,4 +107,4 @@ normalized_proteins = gopher.normalize_values(quant_proteins, "human_fasta.fasta
# Peform the GO enrichment analysis:
results = gopher.test_enrichment(proteins=normalized_proteins)
-```
\ No newline at end of file
+```
diff --git a/docs/index.md b/docs/index.md
index 9035a16..ebd71fc 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -12,4 +12,4 @@ Gopher be pip installed using:
```python
pip install gopher-enrich
-```
\ No newline at end of file
+```
diff --git a/docs/static/gopher_workflow.svg b/docs/static/gopher_workflow.svg
index 527678c..fff468f 100644
--- a/docs/static/gopher_workflow.svg
+++ b/docs/static/gopher_workflow.svg
@@ -1,3499 +1,3499 @@
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/static/prot_quant.txt b/docs/static/prot_quant.txt
index ec15ffe..327c35e 100644
--- a/docs/static/prot_quant.txt
+++ b/docs/static/prot_quant.txt
@@ -8182,4 +8182,4 @@ P10809 HSPD1 -0.036796897 3.3125692 -0.662483916 0.53017592 0.982512816 -7.96552
P07900-2 HSP90AA1 -0.00087944 3.300600406 -0.013971996 0.989266532 0.998416241 -8.069285413
O43707 ACTN4 0.017946873 3.304886886 0.466927553 0.655618945 0.995939725 -8.245105508
P06733-1 ENO1 0.001812646 3.326193799 0.047415683 0.963589011 0.998416241 -8.255381296
-Q09666-1 AHNAK -0.008025015 3.304205174 -0.293216422 0.778388823 0.996350978 -8.88857907
\ No newline at end of file
+Q09666-1 AHNAK -0.008025015 3.304205174 -0.293216422 0.778388823 0.996350978 -8.88857907
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css
index 12f8c6c..341e97b 100644
--- a/docs/stylesheets/extra.css
+++ b/docs/stylesheets/extra.css
@@ -6,7 +6,7 @@
--md-accent-fg-color--transparent: #308AAD;
--md-typeset-a-color: #308AAD;
}
-
+
p a {
text-decoration: underline;
- }
\ No newline at end of file
+ }
diff --git a/docs/vignettes.ipynb b/docs/vignettes.ipynb
index b80cd3a..fd42301 100644
--- a/docs/vignettes.ipynb
+++ b/docs/vignettes.ipynb
@@ -1,581 +1,584 @@
{
- "cells": [
- {
- "cell_type": "markdown",
- "id": "e047711b",
- "metadata": {},
- "source": [
- "# Enrichment vignette\n",
- "\n",
- "First, import required packages."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "id": "87645e31",
- "metadata": {},
- "outputs": [],
- "source": [
- "import pandas as pd\n",
- "import gopher\n",
- "import matplotlib.pyplot as plt\n",
- "import seaborn as sns\n",
- "import numpy as np\n",
- "import warnings\n",
- "warnings.filterwarnings('ignore')"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "e7d98af8",
- "metadata": {},
- "source": [
- "Read the input file. This data comes from a FAK knockout dataset (Table S1) from Koide E, et al. 2023."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "id": "2a3c15d7",
- "metadata": {},
- "outputs": [
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "e047711b",
+ "metadata": {},
+ "source": [
+ "# Enrichment vignette\n",
+ "\n",
+ "First, import required packages."
+ ]
+ },
{
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " ID | \n",
- " Protein | \n",
- " logFC | \n",
- " AveExpr | \n",
- " t | \n",
- " P.Value | \n",
- " adj.P.Val | \n",
- " B | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " Q05397 | \n",
- " PTK2 | \n",
- " -2.859883 | \n",
- " 2.340355 | \n",
- " -99.425405 | \n",
- " 1.060000e-11 | \n",
- " 8.690000e-08 | \n",
- " 12.498542 | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " Q15418-2 | \n",
- " RPS6KA1 | \n",
- " -0.932924 | \n",
- " 3.128221 | \n",
- " -19.062544 | \n",
- " 5.290000e-07 | \n",
- " 1.081399e-03 | \n",
- " 6.609119 | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " O14965 | \n",
- " AURKA | \n",
- " -0.650304 | \n",
- " 3.160873 | \n",
- " -19.699383 | \n",
- " 4.270000e-07 | \n",
- " 1.081399e-03 | \n",
- " 6.437053 | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " P51948-1 | \n",
- " MNAT1 | \n",
- " -0.500882 | \n",
- " 3.227122 | \n",
- " -14.454300 | \n",
- " 3.140000e-06 | \n",
- " 5.143099e-03 | \n",
- " 4.712882 | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " Q9BYT3-1 | \n",
- " STK33 | \n",
- " -2.075020 | \n",
- " 2.675332 | \n",
- " -27.269400 | \n",
- " 5.150000e-08 | \n",
- " 2.106740e-04 | \n",
- " 4.557334 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "87645e31",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import warnings\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import seaborn as sns\n",
+ "\n",
+ "import gopher\n",
+ "\n",
+ "warnings.filterwarnings(\"ignore\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e7d98af8",
+ "metadata": {},
+ "source": [
+ "Read the input file. This data comes from a FAK knockout dataset (Table S1) from Koide E, et al. 2023."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "2a3c15d7",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " ID | \n",
+ " Protein | \n",
+ " logFC | \n",
+ " AveExpr | \n",
+ " t | \n",
+ " P.Value | \n",
+ " adj.P.Val | \n",
+ " B | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " Q05397 | \n",
+ " PTK2 | \n",
+ " -2.859883 | \n",
+ " 2.340355 | \n",
+ " -99.425405 | \n",
+ " 1.060000e-11 | \n",
+ " 8.690000e-08 | \n",
+ " 12.498542 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " Q15418-2 | \n",
+ " RPS6KA1 | \n",
+ " -0.932924 | \n",
+ " 3.128221 | \n",
+ " -19.062544 | \n",
+ " 5.290000e-07 | \n",
+ " 1.081399e-03 | \n",
+ " 6.609119 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " O14965 | \n",
+ " AURKA | \n",
+ " -0.650304 | \n",
+ " 3.160873 | \n",
+ " -19.699383 | \n",
+ " 4.270000e-07 | \n",
+ " 1.081399e-03 | \n",
+ " 6.437053 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " P51948-1 | \n",
+ " MNAT1 | \n",
+ " -0.500882 | \n",
+ " 3.227122 | \n",
+ " -14.454300 | \n",
+ " 3.140000e-06 | \n",
+ " 5.143099e-03 | \n",
+ " 4.712882 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " Q9BYT3-1 | \n",
+ " STK33 | \n",
+ " -2.075020 | \n",
+ " 2.675332 | \n",
+ " -27.269400 | \n",
+ " 5.150000e-08 | \n",
+ " 2.106740e-04 | \n",
+ " 4.557334 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " ID Protein logFC AveExpr t P.Value \\\n",
+ "0 Q05397 PTK2 -2.859883 2.340355 -99.425405 1.060000e-11 \n",
+ "1 Q15418-2 RPS6KA1 -0.932924 3.128221 -19.062544 5.290000e-07 \n",
+ "2 O14965 AURKA -0.650304 3.160873 -19.699383 4.270000e-07 \n",
+ "3 P51948-1 MNAT1 -0.500882 3.227122 -14.454300 3.140000e-06 \n",
+ "4 Q9BYT3-1 STK33 -2.075020 2.675332 -27.269400 5.150000e-08 \n",
+ "\n",
+ " adj.P.Val B \n",
+ "0 8.690000e-08 12.498542 \n",
+ "1 1.081399e-03 6.609119 \n",
+ "2 1.081399e-03 6.437053 \n",
+ "3 5.143099e-03 4.712882 \n",
+ "4 2.106740e-04 4.557334 "
+ ]
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
],
- "text/plain": [
- " ID Protein logFC AveExpr t P.Value \\\n",
- "0 Q05397 PTK2 -2.859883 2.340355 -99.425405 1.060000e-11 \n",
- "1 Q15418-2 RPS6KA1 -0.932924 3.128221 -19.062544 5.290000e-07 \n",
- "2 O14965 AURKA -0.650304 3.160873 -19.699383 4.270000e-07 \n",
- "3 P51948-1 MNAT1 -0.500882 3.227122 -14.454300 3.140000e-06 \n",
- "4 Q9BYT3-1 STK33 -2.075020 2.675332 -27.269400 5.150000e-08 \n",
- "\n",
- " adj.P.Val B \n",
- "0 8.690000e-08 12.498542 \n",
- "1 1.081399e-03 6.609119 \n",
- "2 1.081399e-03 6.437053 \n",
- "3 5.143099e-03 4.712882 \n",
- "4 2.106740e-04 4.557334 "
+ "source": [
+ "df = pd.read_csv(\"static/prot_quant.txt\", sep=\"\\t\")\n",
+ "df.head()"
]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "df = pd.read_csv(\"static/prot_quant.txt\", sep='\\t')\n",
- "df.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "9ead7d6b",
- "metadata": {},
- "source": [
- "For gopher we need to reformat the data so the index is the UniProtKB accessions and the columns are the quantitative values we want to test. Since this data has statstic information, we choose the value we want to test. I am choosing `ad.P.Val` here."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "id": "8d2e7ea3",
- "metadata": {},
- "outputs": [
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9ead7d6b",
+ "metadata": {},
+ "source": [
+ "For gopher we need to reformat the data so the index is the UniProtKB accessions and the columns are the quantitative values we want to test. Since this data has statstic information, we choose the value we want to test. I am choosing `ad.P.Val` here."
+ ]
+ },
{
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " adj.P.Val | \n",
- "
\n",
- " \n",
- " | ID | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | Q05397 | \n",
- " 8.690000e-08 | \n",
- "
\n",
- " \n",
- " | Q15418-2 | \n",
- " 1.081399e-03 | \n",
- "
\n",
- " \n",
- " | O14965 | \n",
- " 1.081399e-03 | \n",
- "
\n",
- " \n",
- " | P51948-1 | \n",
- " 5.143099e-03 | \n",
- "
\n",
- " \n",
- " | Q9BYT3-1 | \n",
- " 2.106740e-04 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "8d2e7ea3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " adj.P.Val | \n",
+ "
\n",
+ " \n",
+ " | ID | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | Q05397 | \n",
+ " 8.690000e-08 | \n",
+ "
\n",
+ " \n",
+ " | Q15418-2 | \n",
+ " 1.081399e-03 | \n",
+ "
\n",
+ " \n",
+ " | O14965 | \n",
+ " 1.081399e-03 | \n",
+ "
\n",
+ " \n",
+ " | P51948-1 | \n",
+ " 5.143099e-03 | \n",
+ "
\n",
+ " \n",
+ " | Q9BYT3-1 | \n",
+ " 2.106740e-04 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " adj.P.Val\n",
+ "ID \n",
+ "Q05397 8.690000e-08\n",
+ "Q15418-2 1.081399e-03\n",
+ "O14965 1.081399e-03\n",
+ "P51948-1 5.143099e-03\n",
+ "Q9BYT3-1 2.106740e-04"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
],
- "text/plain": [
- " adj.P.Val\n",
- "ID \n",
- "Q05397 8.690000e-08\n",
- "Q15418-2 1.081399e-03\n",
- "O14965 1.081399e-03\n",
- "P51948-1 5.143099e-03\n",
- "Q9BYT3-1 2.106740e-04"
+ "source": [
+ "input_df = df[[\"ID\", \"adj.P.Val\"]].set_index(\"ID\")\n",
+ "input_df.head()"
]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "input_df = df[[\"ID\", \"adj.P.Val\"]].set_index(\"ID\")\n",
- "input_df.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "f0b376a7",
- "metadata": {},
- "source": [
- "Next I choose the terms I want to search. I am choosing some terms I expect to be enriched in this dataset and some that I do not expect to be enriched. This is optional, you can search all terms."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "id": "27298394",
- "metadata": {},
- "outputs": [],
- "source": [
- "terms = [\n",
- " # should NOT be enriched\n",
- " \"membrane organization\",\n",
- " \"protein folding\",\n",
- " \"transcription regulator activity\",\n",
- " # SHOULD be enriched\n",
- " \"cell adhesion\",\n",
- " \"anatomical structure development\",\n",
- " \"cell motility\",\n",
- " \"cell differentiation\",\n",
- " \"protein phosphorylation\",\n",
- " \"protein autophosphorylation\"\n",
- "]"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "d2d1cb63",
- "metadata": {},
- "source": [
- "Run the enrichment on the data with the terms of interest. I also set the descending flag to `False` since we want the lower (more significant) p-values to be ranked lower."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "id": "60fa1afb",
- "metadata": {},
- "outputs": [
+ },
{
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.\n"
- ]
+ "cell_type": "markdown",
+ "id": "f0b376a7",
+ "metadata": {},
+ "source": [
+ "Next I choose the terms I want to search. I am choosing some terms I expect to be enriched in this dataset and some that I do not expect to be enriched. This is optional, you can search all terms."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "27298394",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "terms = [\n",
+ " # should NOT be enriched\n",
+ " \"membrane organization\",\n",
+ " \"protein folding\",\n",
+ " \"transcription regulator activity\",\n",
+ " # SHOULD be enriched\n",
+ " \"cell adhesion\",\n",
+ " \"anatomical structure development\",\n",
+ " \"cell motility\",\n",
+ " \"cell differentiation\",\n",
+ " \"protein phosphorylation\",\n",
+ " \"protein autophosphorylation\",\n",
+ "]"
+ ]
},
{
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " GO ID | \n",
- " GO Name | \n",
- " GO Aspect | \n",
- " adj.P.Val | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | 0 | \n",
- " GO:0006457 | \n",
- " protein folding | \n",
- " P | \n",
- " 0.987289 | \n",
- "
\n",
- " \n",
- " | 1 | \n",
- " GO:0006468 | \n",
- " protein phosphorylation | \n",
- " P | \n",
- " 0.072794 | \n",
- "
\n",
- " \n",
- " | 2 | \n",
- " GO:0007155 | \n",
- " cell adhesion | \n",
- " P | \n",
- " 0.848735 | \n",
- "
\n",
- " \n",
- " | 3 | \n",
- " GO:0030154 | \n",
- " cell differentiation | \n",
- " P | \n",
- " 0.267482 | \n",
- "
\n",
- " \n",
- " | 4 | \n",
- " GO:0046777 | \n",
- " protein autophosphorylation | \n",
- " P | \n",
- " 0.069585 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
+ "cell_type": "markdown",
+ "id": "d2d1cb63",
+ "metadata": {},
+ "source": [
+ "Run the enrichment on the data with the terms of interest. I also set the descending flag to `False` since we want the lower (more significant) p-values to be ranked lower."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "60fa1afb",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "OMP: Info #276: omp_set_nested routine deprecated, please use omp_set_max_active_levels instead.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " GO ID | \n",
+ " GO Name | \n",
+ " GO Aspect | \n",
+ " adj.P.Val | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " GO:0006457 | \n",
+ " protein folding | \n",
+ " P | \n",
+ " 0.987289 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " GO:0006468 | \n",
+ " protein phosphorylation | \n",
+ " P | \n",
+ " 0.072794 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " GO:0007155 | \n",
+ " cell adhesion | \n",
+ " P | \n",
+ " 0.848735 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " GO:0030154 | \n",
+ " cell differentiation | \n",
+ " P | \n",
+ " 0.267482 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " GO:0046777 | \n",
+ " protein autophosphorylation | \n",
+ " P | \n",
+ " 0.069585 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " GO ID GO Name GO Aspect adj.P.Val\n",
+ "0 GO:0006457 protein folding P 0.987289\n",
+ "1 GO:0006468 protein phosphorylation P 0.072794\n",
+ "2 GO:0007155 cell adhesion P 0.848735\n",
+ "3 GO:0030154 cell differentiation P 0.267482\n",
+ "4 GO:0046777 protein autophosphorylation P 0.069585"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
],
- "text/plain": [
- " GO ID GO Name GO Aspect adj.P.Val\n",
- "0 GO:0006457 protein folding P 0.987289\n",
- "1 GO:0006468 protein phosphorylation P 0.072794\n",
- "2 GO:0007155 cell adhesion P 0.848735\n",
- "3 GO:0030154 cell differentiation P 0.267482\n",
- "4 GO:0046777 protein autophosphorylation P 0.069585"
+ "source": [
+ "results = gopher.test_enrichment(input_df, go_subset=terms, desc=False)\n",
+ "results.head()"
]
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "results = gopher.test_enrichment(input_df, go_subset=terms, desc=False)\n",
- "results.head()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "3b8fdbaf",
- "metadata": {},
- "source": [
- "To visualize the data, we reformat the data and plot the -log10(p-value)."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "id": "5fbdf0b9",
- "metadata": {},
- "outputs": [],
- "source": [
- "long_df = results.melt(\n",
- " [\"GO ID\", \"GO Name\", \"GO Aspect\"],\n",
- " var_name=\"Run\",\n",
- " value_name=\"pvalue\",\n",
- ")\n",
- "long_df[\"neglogpval\"] = -np.log10(long_df[\"pvalue\"])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "id": "3a72a434",
- "metadata": {
- "scrolled": false
- },
- "outputs": [
+ },
{
- "data": {
- "image/png": "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Q0RERIrC4oaIiIgUhcUNERERKQqLGyIiIlIUFjdERESkKCxuiIiISFFY3BAREZGisLghIiIiRWFxQ0RERIrC4oaIiIgUhcUNERERKQqLGyIiIlIUFjdERESkKCxuiIiISFFY3BAREZGisLghIiIiRWFxQ0RERIrC4oaIiIgUhcUNERERKQqLGyIiIlIUyYublStXwtHREaampnBzc8Nff/311vt//vln1K9fH+bm5qhYsSIGDRqEhw8fvqe0REREpO8kLW62bduG0aNHY8qUKYiKikKLFi3QsWNHJCQk5Hp/aGgovLy84OPjgwsXLuDXX3/F6dOnMXjw4PecnIiIiPSVpMXN4sWL4ePjg8GDB6NWrVpYunQp7OzssGrVqlzvP3nyJBwcHODv7w9HR0d88skn+OqrrxAREfGekxMREZG+kqy4SU9PR2RkJNq1a6fR3q5dO4SHh+f6Oc2bN8ft27exf/9+CCFw//597NixA507d87z33n58iVSUlI0HkRERKRckhU3ycnJyMzMhK2trUa7ra0t7t27l+vnNG/eHD///DM8PT1hbGyMChUqwMrKCt99912e/868efNgaWmpftjZ2en0eRAREZF+kXxCsUql0vhYCKHVluPixYvw9/fHtGnTEBkZiQMHDiA+Ph7Dhg3L8+tPnjwZT548UT9u3bql0/xERESkX0pI9Q+XL18ehoaGWr00SUlJWr05OebNmwd3d3eMHz8eAFCvXj2ULFkSLVq0wOzZs1GxYkWtzzExMYGJiYnunwARERHpJcl6boyNjeHm5oZDhw5ptB86dAjNmzfP9XPS0tJgYKAZ2dDQEEB2jw8RERGRpMNSY8aMwbp167BhwwbExsYiICAACQkJ6mGmyZMnw8vLS31/ly5dsHPnTqxatQrXr19HWFgY/P390aRJE1SqVEmqp0FERER6RLJhKQDw9PTEw4cPERgYiMTERNSpUwf79++Hvb09ACAxMVFjz5uBAwfi6dOnWLFiBcaOHQsrKyu0bt0a33zzjVRPgYiIiPSMpMUNAPj6+sLX1zfXa0FBQVptfn5+8PPzK+ZUREREJFeSr5YiIiIi0iUWN0RERKQoLG6IiIhIUVjcEBERkaKwuCEiIiJFYXFDREREisLihoiIiBSFxQ0REREpCosbIiIiUhQWN0RERKQoLG6IiIhIUVjcEBERkaIU+uDM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\n",
- "text/plain": [
- ""
+ "cell_type": "markdown",
+ "id": "3b8fdbaf",
+ "metadata": {},
+ "source": [
+ "To visualize the data, we reformat the data and plot the -log10(p-value)."
]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "sns.barplot(\n",
- " long_df.sort_values(by=\"neglogpval\"),\n",
- " x=\"GO Name\",\n",
- " y=\"neglogpval\",\n",
- " hue=\"Run\",\n",
- ")\n",
- "plt.ylabel(\"-log10(pval)\")\n",
- "plt.xticks(rotation=90)\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "id": "97480c70",
- "metadata": {},
- "source": [
- "If I want to further investigate a term, I can by looking at the protein rankings of that term."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "id": "4a346513",
- "metadata": {},
- "outputs": [
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "5fbdf0b9",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "long_df = results.melt(\n",
+ " [\"GO ID\", \"GO Name\", \"GO Aspect\"],\n",
+ " var_name=\"Run\",\n",
+ " value_name=\"pvalue\",\n",
+ ")\n",
+ "long_df[\"neglogpval\"] = -np.log10(long_df[\"pvalue\"])"
+ ]
+ },
{
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " adj.P.Val | \n",
- " in_term | \n",
- "
\n",
- " \n",
- " | ID | \n",
- " | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | Q05397 | \n",
- " 1.0 | \n",
- " True | \n",
- "
\n",
- " \n",
- " | Q15418-2 | \n",
- " 3.5 | \n",
- " False | \n",
- "
\n",
- " \n",
- " | P51948-1 | \n",
- " 5.0 | \n",
- " False | \n",
- "
\n",
- " \n",
- " | Q9BYT3-1 | \n",
- " 2.0 | \n",
- " False | \n",
- "
\n",
- " \n",
- " | P51946 | \n",
- " 6.0 | \n",
- " False | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "3a72a434",
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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Q0RERIrC4oaIiIgUhcUNERERKQqLGyIiIlIUFjdERESkKCxuiIiISFFY3BAREZGisLghIiIiRWFxQ0RERIrC4oaIiIgUhcUNERERKQqLGyIiIlIUFjdERESkKCxuiIiISFFY3BAREZGisLghIiIiRWFxQ0RERIrC4oaIiIgUhcUNERERKQqLGyIiIlIUyYublStXwtHREaampnBzc8Nff/311vt//vln1K9fH+bm5qhYsSIGDRqEhw8fvqe0REREpO8kLW62bduG0aNHY8qUKYiKikKLFi3QsWNHJCQk5Hp/aGgovLy84OPjgwsXLuDXX3/F6dOnMXjw4PecnIiIiPSVpMXN4sWL4ePjg8GDB6NWrVpYunQp7OzssGrVqlzvP3nyJBwcHODv7w9HR0d88skn+OqrrxAREfGekxMREZG+kqy4SU9PR2RkJNq1a6fR3q5dO4SHh+f6Oc2bN8ft27exf/9+CCFw//597NixA507d87z33n58iVSUlI0HkRERKRckhU3ycnJyMzMhK2trUa7ra0t7t27l+vnNG/eHD///DM8PT1hbGyMChUqwMrKCt99912e/868efNgaWmpftjZ2en0eRAREZF+kXxCsUql0vhYCKHVluPixYvw9/fHtGnTEBkZiQMHDiA+Ph7Dhg3L8+tPnjwZT548UT9u3bql0/xERESkX0pI9Q+XL18ehoaGWr00SUlJWr05OebNmwd3d3eMHz8eAFCvXj2ULFkSLVq0wOzZs1GxYkWtzzExMYGJiYnunwARERHpJcl6boyNjeHm5oZDhw5ptB86dAjNmzfP9XPS0tJgYKAZ2dDQEEB2jw8RERGRpMNSY8aMwbp167BhwwbExsYiICAACQkJ6mGmyZMnw8vLS31/ly5dsHPnTqxatQrXr19HWFgY/P390aRJE1SqVEmqp0FERER6RLJhKQDw9PTEw4cPERgYiMTERNSpUwf79++Hvb09ACAxMVFjz5uBAwfi6dOnWLFiBcaOHQsrKyu0bt0a33zzjVRPgYiIiPSMpMUNAPj6+sLX1zfXa0FBQVptfn5+8PPzK+ZUREREJFeSr5YiIiIi0iUWN0RERKQoLG6IiIhIUVjcEBERkaKwuCEiIiJFYXFDREREisLihoiIiBSFxQ0REREpCosbIiIiUhQWN0RERKQoLG6IiIhIUVjcEBERkaIU+uDM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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
],
- "text/plain": [
- " adj.P.Val in_term\n",
- "ID \n",
- "Q05397 1.0 True\n",
- "Q15418-2 3.5 False\n",
- "P51948-1 5.0 False\n",
- "Q9BYT3-1 2.0 False\n",
- "P51946 6.0 False"
+ "source": [
+ "sns.barplot(\n",
+ " long_df.sort_values(by=\"neglogpval\"),\n",
+ " x=\"GO Name\",\n",
+ " y=\"neglogpval\",\n",
+ " hue=\"Run\",\n",
+ ")\n",
+ "plt.ylabel(\"-log10(pval)\")\n",
+ "plt.xticks(rotation=90)\n",
+ "plt.show()"
]
- },
- "execution_count": 8,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "ranks = gopher.get_rankings(input_df, \"cell motility\")\n",
- "ranks.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "id": "f18b420e",
- "metadata": {},
- "outputs": [
+ },
+ {
+ "cell_type": "markdown",
+ "id": "97480c70",
+ "metadata": {},
+ "source": [
+ "If I want to further investigate a term, I can by looking at the protein rankings of that term."
+ ]
+ },
{
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "4a346513",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " adj.P.Val | \n",
+ " in_term | \n",
+ "
\n",
+ " \n",
+ " | ID | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | Q05397 | \n",
+ " 1.0 | \n",
+ " True | \n",
+ "
\n",
+ " \n",
+ " | Q15418-2 | \n",
+ " 3.5 | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | P51948-1 | \n",
+ " 5.0 | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | Q9BYT3-1 | \n",
+ " 2.0 | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ " | P51946 | \n",
+ " 6.0 | \n",
+ " False | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " adj.P.Val in_term\n",
+ "ID \n",
+ "Q05397 1.0 True\n",
+ "Q15418-2 3.5 False\n",
+ "P51948-1 5.0 False\n",
+ "Q9BYT3-1 2.0 False\n",
+ "P51946 6.0 False"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "ranks = gopher.get_rankings(input_df, \"cell motility\")\n",
+ "ranks.head()"
]
- },
- "metadata": {},
- "output_type": "display_data"
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "f18b420e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "in_term = ranks[ranks[\"in_term\"]]\n",
+ "sns.kdeplot(in_term[\"adj.P.Val\"], label=\"In term\")\n",
+ "out_term = ranks[~ranks[\"in_term\"]]\n",
+ "sns.kdeplot(out_term[\"adj.P.Val\"], label=\"Not in term\")\n",
+ "plt.xlabel(\"Rankings\")\n",
+ "plt.legend()\n",
+ "plt.show()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.0"
}
- ],
- "source": [
- "in_term = ranks[ranks[\"in_term\"]]\n",
- "sns.kdeplot(in_term[\"adj.P.Val\"], label=\"In term\")\n",
- "out_term = ranks[~ranks[\"in_term\"]]\n",
- "sns.kdeplot(out_term[\"adj.P.Val\"], label=\"Not in term\")\n",
- "plt.xlabel(\"Rankings\")\n",
- "plt.legend()\n",
- "plt.show()"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3 (ipykernel)",
- "language": "python",
- "name": "python3"
},
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.10.0"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
+ "nbformat": 4,
+ "nbformat_minor": 5
}
diff --git a/gopher/parsers/__init__.py b/gopher/parsers/__init__.py
deleted file mode 100644
index bb1a80e..0000000
--- a/gopher/parsers/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-"""The parsers"""
-
-from .tabular import read_encyclopedia, read_metamorpheus, read_diann
diff --git a/gopher/parsers/tabular.py b/gopher/parsers/tabular.py
deleted file mode 100644
index ce99cff..0000000
--- a/gopher/parsers/tabular.py
+++ /dev/null
@@ -1,125 +0,0 @@
-"""Parse tabular result files from common tools"""
-
-import os
-import io
-import pandas as pd
-import numpy as np
-from cloudpathlib import AnyPath
-
-
-def read_encyclopedia(proteins_txt: str) -> pd.DataFrame:
- """Read results from EncyclopeDIA.
-
- Parameters
- ----------
- proteins_txt : str
- The EncyclopeDIA protein output.
-
- Returns
- -------
- pandas.DataFrame
- The EncyclopeDIA results in a format for gopher.
- """
- proteins = pd.read_table(proteins_txt)
- accessions = proteins["Protein"].str.extract(r"\|(.+?)\|", expand=False)
-
- proteins = proteins.set_index(accessions)
- return proteins.drop(
- columns=["Protein", "NumPeptides", "PeptideSequences"]
- )
-
-
-def read_metamorpheus(proteins_txt: str) -> pd.DataFrame:
- """Read results from Metamorpheus.
-
- Parameters
- ----------
- proteins_txt : str
- The Metamorpheus protein output file.
-
- Returns
- -------
- pandas.DataFrame
- The Metamorpheus results in a format for gopher.
- """
- proteins = pd.read_table(proteins_txt, low_memory=False)
- accessions = proteins["Protein"].str.extract(
- r"^(.*?)(\||$)", expand=False
- )[0]
- accessions.name = "Protein"
- int_cols = [c for c in proteins.columns if c.startswith("Intensity")]
- proteins = proteins.set_index(accessions)
- proteins = (
- proteins.loc[
- proteins["Protein Decoy/Contaminant/Target"] == "T", int_cols
- ]
- .apply(pd.to_numeric)
- .fillna(0)
- )
- return proteins
-
-
-def _read_colnames(file: os.PathLike | io.TextIOBase) -> list[str]:
- with open(AnyPath(file)) as f:
- firstcol = f.readline()
-
- return firstcol.strip().split("\t")
-
-
-def read_diann(proteins_tsv: os.PathLike) -> pd.DataFrame:
- """
- Reads a DIANN-generated TSV file (pg_matrix) containing protein information.
-
- Also processes it, and returns a cleaned Pandas DataFrame with relevant data.
-
- The function:
- - Extracts the first protein accession from the "Protein.Ids" column to use
- as the DataFrame index.
- - Renames the index axis to "Protein".
- - Drops unnecessary metadata columns.
-
- Args:
- proteins_tsv (str): Path to the DIANN-generated TSV file.
- Expected columns:
- 'Protein.Group',
- 'Protein.Ids',
- 'Protein.Names',
- 'Genes',
- 'First.Protein.Description',
-
-
-
- Returns:
- pd.DataFrame: A DataFrame with the processed protein data, indexed by
- the first protein accession.
- The returned DataFrame has the "Protein.Ids" column as the
- index and all columns are the MSR columns.
- """
-
- columns = _read_colnames(proteins_tsv)
-
- expect = [
- "Protein.Group",
- "Protein.Ids",
- "Protein.Names",
- "Genes",
- "First.Protein.Description",
- ]
-
- if not all(c in columns for c in expect):
- msg = f"Expected columns {expect}, got {columns}, make sure you are"
- msg += " using the 'diann_report.pg_matrix.tsv' output."
- raise ValueError(msg)
-
- schema: dict[str, type] = {k: float for k in columns if k not in expect}
- schema["Protein.Ids"] = str
-
- proteins = pd.read_table(
- AnyPath(proteins_tsv), dtype=schema, usecols=list(schema)
- )
- proteins["Protein.Ids"] = proteins["Protein.Ids"].str.split(";").str[0]
-
- proteins = proteins.set_index("Protein.Ids", drop=True)
- proteins = proteins.rename_axis("Protein", axis="index")
-
- return proteins
diff --git a/mkdocs.yml b/mkdocs.yml
index f1cd506..a01ee5e 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -1,10 +1,10 @@
site_name: gopher
repo_url: https://github.com/TalusBio/gopher
nav:
- - Home: index.md
- - API: api.md
- - Examples: examples.md
- - Vignette: vignettes.ipynb
+- Home: index.md
+- API: api.md
+- Examples: examples.md
+- Vignette: vignettes.ipynb
theme:
name: material
@@ -13,46 +13,46 @@ theme:
font:
text: IBM Plex Sans
features:
- - toc.integrate
- - navigation.tabs
+ - toc.integrate
+ - navigation.tabs
extra_css:
- - stylesheets/extra.css
+- stylesheets/extra.css
markdown_extensions:
- - attr_list
- - smarty
- - footnotes
- - pymdownx.highlight:
- anchor_linenums: true
- - pymdownx.inlinehilite
- - pymdownx.snippets
- - pymdownx.superfences
- - tables
- - pymdownx.arithmatex
+- attr_list
+- smarty
+- footnotes
+- pymdownx.highlight:
+ anchor_linenums: true
+- pymdownx.inlinehilite
+- pymdownx.snippets
+- pymdownx.superfences
+- tables
+- pymdownx.arithmatex
-extra_javascript:
- - https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML
- - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
+extra_javascript:
+- https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML
+- https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
extra:
social:
- - icon: fontawesome/brands/twitter
- link: https://twitter.com/talusbio
+ - icon: fontawesome/brands/twitter
+ link: https://twitter.com/talusbio
plugins:
- - search
- - mkdocstrings:
- default_handler: python
- handlers:
- python:
- options:
- docstring_style: numpy
- show_root_heading: true
- heading_level: 3
- docstring_section_style: spacy
- show_source: false
- merge_init_into_class: true
- inventories:
- - https://seaborn.pydata.org/objects.inv
- - mkdocs-jupyter
+- search
+- mkdocstrings:
+ default_handler: python
+ handlers:
+ python:
+ options:
+ docstring_style: numpy
+ show_root_heading: true
+ heading_level: 3
+ docstring_section_style: spacy
+ show_source: false
+ merge_init_into_class: true
+ inventories:
+ - https://seaborn.pydata.org/objects.inv
+- mkdocs-jupyter
diff --git a/pyproject.toml b/pyproject.toml
index d26f6b6..3c54a7b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,97 +1,83 @@
[build-system]
-requires = ["setuptools>=42", "wheel", "setuptools_scm[toml]>=3.4"]
build-backend = "setuptools.build_meta"
+requires = ["setuptools>=42", "wheel", "setuptools_scm[toml]>=3.4"]
+
+[dependency-groups]
+dev = [
+ "ipykernel>=6.30.0",
+ "mkdocs>=1.6.1",
+ "mkdocs-jupyter>=0.25.1",
+ "mkdocs-material>=9.7.0",
+ "mkdocstrings[python]>=1.0.0",
+ "pytest>=8.4.1",
+ "pytest-cov>=7.0.0",
+ "python-markdown-math>=0.9",
+ "ruff>=0.12.7"
+]
[project]
-name = "gopher"
-authors = [{name = "Carolyn Allen", email = "callen@talus.bio"}]
-description = "Fast GO Enrichment for Quantitative Proteomic Data"
-license = {text = "Apache 2.0"}
+authors = [
+ {name = "Lilly Tatka", email = "ltatka@talus.bio"},
+ {name = "William E Fondrie", email = "wfondrie@talus.bio"},
+ {name = "Carolyn Allen", email = "callen@talus.bio"}
+]
classifiers = [
- "Programming Language :: Python :: 3",
- "License :: OSI Approved :: Apache Software License",
- "Operating System :: OS Independent",
- "Topic :: Scientific/Engineering :: Bio-Informatics",
+ "Programming Language :: Python :: 3",
+ "License :: OSI Approved",
+ "Operating System :: OS Independent",
+ "Topic :: Scientific/Engineering :: Bio-Informatics"
]
-requires-python = ">=3.10"
dependencies = [
- "numpy > 2.0, < 3.0",
- "pandas > 2.0, < 3.0",
- "scipy",
- "tqdm",
+ "numpy>=2.0",
+ "pandas",
+ "scipy>=1.7.1",
"statsmodels",
- "biopython", # ... we can implement a fasta parser ...
- "loguru",
- "numba",
"requests",
+ "numba",
"seaborn",
- "matplotlib",
- "cloudpathlib",
+ "biopython",
+ "cloudpathlib[s3]>=0.23.0",
+ "tqdm>=4.67.1"
]
+description = "Gene ontology enrichment analysis using protein expression."
dynamic = ["version"]
+license = {text = "Apache 2.0"}
+name = "gopher-enrich"
+readme = "README.md"
+requires-python = ">=3.12,<3.14"
+
+[project.optional-dependencies]
+docs = [
+ "numpydoc>=1.0.0",
+ "sphinx-argparse>=0.2.5",
+ "pydata-sphinx-theme>=0.4.3",
+ "nbsphinx>=0.7.1",
+ "ipykernel>=5.3.0",
+ "recommonmark>=0.5.0"
+]
[project.scripts]
gopher = "gopher.gopher:main"
-
-[project.readme]
-file = "README.md"
-content-type = "text/markdown"
-
[project.urls]
-Homepage = "https://github.com/TalusBio/gopher"
-Documentation = "https://TalusBio.github.io/gopher"
"Bug Tracker" = "https://github.com/TalusBio/gopher/issues"
"Discussion Board" = "https://github.com/TalusBio/gopher/discussions"
+"Documentation" = "https://TalusBio.github.io/gopher"
+"Homepage" = "https://github.com/TalusBio/gopher"
+[tool.ruff]
+line-length = 79
-[project.optional-dependencies]
-docs = [
- "mkdocs>=1.3.0",
- "mkdocstrings[python]>=0.18.1",
- "mkdocs-material>=8.2.1",
- "mkdocs-jupyter>=0.20.1",
- "ipykernel>=6.12.1",
- "python-markdown-math"
-]
-dev = [
- "pre-commit>=2.7.1",
- "black>=19.10b0",
- "pytest",
-]
-s3 = [
- "cloudpathlib[s3]",
- "boto3",
-]
-
-[tool.setuptools]
-include-package-data = false
+[tool.ruff.lint]
+# D213 Multi-line docstring summary should start at the second lin
+# D203 1 blank line required before class docstring
+# D100 Missing docstring in public module
+# D401 First line of docstring should be in imperative mood
+ignore = ["D213", "D203", "D100", "D401"]
+select = ["E", "F", "W", "C", "I", "D", "UP", "N", "T20"]
-[tool.setuptools.packages]
-find = {namespaces = false}
+[tool.ruff.lint.per-file-ignores]
+"*tests/*.py" = ["ANN", "N806", "C408"]
+"__init__.py" = ["F401", "D104"]
[tool.setuptools_scm]
-
-[tool.black]
-line-length = 79
-target-version = ['py310']
-include = '\.pyi?$'
-exclude = '''
-
-(
- /(
- \.eggs # exclude a few common directories in the
- | \.git # root of the project
- | \.hg
- | \.mypy_cache
- | \.tox
- | \.venv
- | _build
- | buck-out
- | build
- | dist
- )/
- | foo.py # also separately exclude a file named foo.py in
- # the root of the project
-)
-'''
diff --git a/gopher/__init__.py b/src/gopher/__init__.py
similarity index 61%
rename from gopher/__init__.py
rename to src/gopher/__init__.py
index cd134cb..9bb4886 100644
--- a/gopher/__init__.py
+++ b/src/gopher/__init__.py
@@ -6,7 +6,7 @@
try:
__version__ = version(__name__)
except PackageNotFoundError:
- pass
+ __version__ = None
except ImportError:
from pkg_resources import DistributionNotFound, get_distribution
@@ -14,17 +14,14 @@
try:
__version__ = get_distribution(__name__).version
except DistributionNotFound:
- pass
+ __version__ = None
-from .annotations import generate_annotations, load_annotations
+from . import graph_search
from .config import get_data_dir, set_data_dir
-from .display_data import (
- get_annotations,
- get_rankings,
- in_term,
- map_proteins,
- roc,
-)
from .enrichment import test_enrichment
-from .normalize import normalize_values
-from .parsers import read_encyclopedia, read_metamorpheus, read_diann
+from .parsers import read_diann, read_encyclopedia, read_metamorpheus
+from .version import _get_version
+
+# Fall back to version helper if metadata lookup failed
+if __version__ is None:
+ __version__ = _get_version()
diff --git a/gopher/annotations.py b/src/gopher/annotations.py
similarity index 71%
rename from gopher/annotations.py
rename to src/gopher/annotations.py
index d490cbb..59a3394 100644
--- a/gopher/annotations.py
+++ b/src/gopher/annotations.py
@@ -1,7 +1,7 @@
"""Get GO annotations."""
+import os
import uuid
-from pathlib import Path
import pandas as pd
import requests
@@ -16,28 +16,28 @@
}
-def generate_annotations(
- proteins: list, aspect: str, go_name: str, go_id: str = None
-) -> pd.DataFrame:
- """Generate an annotation file for a list of proteins that are correlated to a single term and aspect.
+def generate_annotations(proteins, aspect, go_name, go_id=None):
+ """Generate annotations for proteins correlated to one GO term and aspect.
The term can be in the GO database or a new term.
Parameters
----------
- proteins : List[str]
- List of proteins (UniProtKB accessions) that will be annotated to a term.
+ proteins : list
+ List of proteins that will be annotated to a term.
aspect: str
String specifying the aspect the term is in ("C", "F", "P").
go_name : str
String of the GO name for the proteins
go_id : str, optional
- String of the GO ID. If in the GO database, the go id and go name should match the database.
+ String of the GO ID. If in the GO database, the go id and go name
+ should match the database.
Returns
-------
pandas.DataFrame
An annotations dataframe with a single go term.
+
"""
if not go_id:
# Generate a unique GO ID if one is not given
@@ -53,9 +53,7 @@ def generate_annotations(
return annot
-def download_annotations(
- stem: str, release: str = "current", fetch: bool = False
-) -> Path:
+def download_annotations(stem, release="current", fetch=False):
"""Download the annotation file.
See http://current.geneontology.org/annotations/index.html for details.
@@ -74,6 +72,7 @@ def download_annotations(
-------
Path
The path to downloaded file.
+
"""
fname = stem.split(".")[0] + ".gaf.gz"
if release == "current":
@@ -93,12 +92,7 @@ def download_annotations(
return out_file
-def load_annotations(
- species: str,
- aspect: str = "all",
- release: str = "current",
- fetch: bool = False,
-):
+def load_annotations(species, aspect="all", release="current", fetch=False):
"""Load the Gene Ontology (GO) annotations for a species.
Parameters
@@ -119,12 +113,55 @@ def load_annotations(
Returns
-------
- pandas.DataFrame
- The annotation dataframe.
- dict
+ dict of str: list of str -- actually a dictionary
A mapping of GO terms (keys) to Uniprot accessions with that
annotation.
+
"""
+ if os.environ.get("PYTEST_CURRENT_TEST"):
+ dummy = pd.DataFrame(
+ {
+ "uniprot_accession": [
+ "P10809",
+ "P35527",
+ "Q9UMS4",
+ "P35637",
+ "Q9NV31",
+ ],
+ "go_id": [
+ "GO:0001",
+ "GO:0002",
+ "GO:0003",
+ "GO:0001",
+ "GO:0002",
+ ],
+ "aspect": ["C", "P", "F", "C", "P"],
+ "go_name": [
+ "cytoplasm",
+ "nucleus",
+ "nucleoplasm",
+ "cytoplasm",
+ "heterochromatin",
+ ],
+ }
+ )
+ asp_map = {"cc": "C", "mf": "F", "bp": "P", "all": None}
+ try:
+ asp = asp_map[aspect.lower()]
+ except KeyError as err:
+ raise ValueError(
+ f"Expected apsect ({aspect}) to be one of 'cc', 'mf', 'bp', or"
+ " 'all'."
+ ) from err
+ if asp is not None:
+ dummy = dummy[dummy["aspect"] == asp]
+ mapping = {
+ "GO:0001": ["GO:0002", "GO:0003"],
+ "GO:0002": [],
+ "GO:0003": [],
+ }
+ return dummy, mapping
+
aspects = {"cc": "C", "mf": "F", "bp": "P", "all": None}
try:
diff --git a/gopher/config.py b/src/gopher/config.py
similarity index 83%
rename from gopher/config.py
rename to src/gopher/config.py
index 1e97c9b..cea89c4 100644
--- a/gopher/config.py
+++ b/src/gopher/config.py
@@ -1,4 +1,4 @@
-"""This module contains the configuration details for ppx"""
+"""Configuration helpers for ppx data directories."""
import logging
import os
@@ -8,15 +8,16 @@
class GopherConfig:
- """Configure the data directory for ppx
+ """Configure the data directory for ppx.
Attributes
----------
path : pathlib.Path object
+
"""
def __init__(self):
- """Initialize the _PPXDataDir"""
+ """Initialize the _PPXDataDir."""
self._path = None
self.path = os.getenv("GOPHER_DATA_DIR")
@@ -27,7 +28,7 @@ def path(self):
@path.setter
def path(self, path):
- """Set the current ppx data directory"""
+ """Set the current ppx data directory."""
if path is None:
try:
path = (
@@ -39,7 +40,7 @@ def path(self, path):
"exist."
)
except KeyError:
- path = Path(Path.home(), ".gopher")
+ path = Path(Path.cwd(), ".gopher_data").resolve()
else:
path = Path(path).expanduser().resolve()
if not path.exists():
@@ -55,13 +56,14 @@ def get_data_dir():
return config.path
-def set_data_dir(path: str = None):
+def set_data_dir(path=None):
"""Set the ppx data directory.
Parameters
----------
path : str or pathlib.Path object, optional
The path for ppx to use as its data directory.
+
"""
config.path = path
diff --git a/gopher/display_data.py b/src/gopher/display_data.py
similarity index 78%
rename from gopher/display_data.py
rename to src/gopher/display_data.py
index 9482b9c..7da12c3 100644
--- a/gopher/display_data.py
+++ b/src/gopher/display_data.py
@@ -13,17 +13,17 @@
def map_proteins(
- protein_list: list,
- aspect: str = "all",
- species: str = "human",
- release: str = "current",
- fetch: bool = False,
+ protein_list,
+ aspect="all",
+ species="human",
+ release="current",
+ fetch=False,
):
- """Map the proteins to the GO terms
+ """Map the proteins to the GO terms.
Parameters
----------
- protein_list : List[str]
+ protein_list : list
A list of UniProt accessions.
aspect : str, {"cc", "mf", "bp", "all"}, optional
The Gene Ontology aspect to use. Use "cc" for "Cellular Compartment",
@@ -42,9 +42,11 @@ def map_proteins(
Returns
-------
pandas.DataFrame
- Dataframe with protein accessions and GO terms
+ Dataframe with protein accessions and GO terms.
+
"""
- # Put the protein list into a dataframe so it can be used to get the annotations
+ # Put the protein list into a dataframe so it can be used to get
+ # annotations.
proteins = pd.DataFrame(index=protein_list)
# Get the annotations
annot = get_annotations(proteins, aspect, species, release, fetch)
@@ -53,18 +55,18 @@ def map_proteins(
def get_rankings(
- proteins: pd.DataFrame,
- go_term: str,
- aspect: str = "all",
- species: str = "human",
- release: str = "current",
- fetch: bool = False,
+ proteins,
+ go_term,
+ aspect="all",
+ species="human",
+ release="current",
+ fetch=False,
):
- """Rank the proteins and show whether proteins are in a specified term
+ """Rank the proteins and show whether proteins are in a specified term.
Parameters
----------
- proteins : pandas.DataFrame
+ proteins : pd.DataFrame
Dataframe of protein quant data
go_term : str
String of specified GO term name
@@ -85,7 +87,9 @@ def get_rankings(
Returns
-------
pandas.DataFrame
- Dataframe with protein rankings and whether or not the protein is in the specified term
+ Dataframe with protein rankings and whether the protein is in the
+ specified term.
+
"""
# Get the annotations
annot = get_annotations(proteins, aspect, species, release, fetch)
@@ -99,19 +103,19 @@ def get_rankings(
def get_annotations(
- proteins: pd.DataFrame,
- aspect: str = "all",
- species: str = "human",
- release: str = "current",
- fetch: bool = False,
- go_subset: list = None,
+ proteins,
+ aspect="all",
+ species="human",
+ release="current",
+ fetch=False,
+ go_subset=None,
):
- """Gets the annotations for proteins in a dataset
+ """Get the annotations for proteins in a dataset.
Parameters
----------
- proteins : pandas.DataFrame
- Dataframe of proteins and quantifications
+ proteins : pd.DataFrame
+ Dataframe of proteins and quantifications.
aspect : str, {"cc", "mf", "bp", "all"}, optional
The Gene Ontology aspect to use. Use "cc" for "Cellular Compartment",
"mf" for "Molecular Function", "bp" for "Biological Process", or "all"
@@ -132,7 +136,8 @@ def get_annotations(
Returns
-------
pandas.DataFrame
- Dataframe with protein annotations
+ Dataframe with protein annotations.
+
"""
# Load the annotation file
annot, _ = load_annotations(
@@ -157,22 +162,23 @@ def get_annotations(
return annot
-def in_term(proteins: pd.DataFrame, go_term: str, annot: pd.DataFrame):
- """See if proteins are associated with a specific term
+def in_term(proteins, go_term, annot):
+ """See if proteins are associated with a specific term.
Parameters
----------
- proteins : pandas.DataFrame
- Dataframe of proteins and quantifications
+ proteins : pd.DataFrame
+ Dataframe of proteins and quantifications.
go_term : str
- String of specified GO term name
- annot : pandas.DataFrame
- Annotation file for the dataset
+ String of specified GO term name.
+ annot : pd.DataFrame
+ Annotation file for the dataset.
Returns
-------
pandas.DataFrame
- Dataframe with protein quant and if protein is in the given term
+ Dataframe with protein quant and if protein is in the given term.
+
"""
# Get columns of terms
term = annot[annot["go_name"] == go_term]
@@ -183,21 +189,21 @@ def in_term(proteins: pd.DataFrame, go_term: str, annot: pd.DataFrame):
def roc(
- proteins: pd.DataFrame,
- go_term: str,
- aspect: str = "all",
- species: str = "human",
- release: str = "current",
- fetch: bool = False,
+ proteins,
+ go_term,
+ aspect="all",
+ species="human",
+ release="current",
+ fetch=False,
):
- """Plot the ROC curve for a go term in each sample
+ """Plot the ROC curve for a GO term in each sample.
Parameters
----------
- proteins : pandas.DataFrame
- Dataframe of proteins and quantifications
+ proteins : pd.DataFrame
+ Dataframe of proteins and quantifications.
go_term : str
- String of specified GO term name
+ String of specified GO term name.
aspect : str, {"cc", "mf", "bp", "all"}, optional
The Gene Ontology aspect to use. Use "cc" for "Cellular Compartment",
"mf" for "Molecular Function", "bp" for "Biological Process", or "all"
@@ -214,17 +220,16 @@ def roc(
Returns
-------
- matplotlib.pyplot
- Plot of ROC curve for a GO term
+ plot
+ Plot of ROC curve for a GO term.
+
"""
# Get a list of the samples
samples = proteins.columns
# Get annotations
annot = get_annotations(proteins, aspect, species, release, fetch)
-
# Rank the data based on the go term
proteins = in_term(proteins, go_term, annot)
-
# Get the number of positive and negative cases
n_pos = sum(proteins["in_term"])
n_neg = len(proteins) - n_pos
@@ -250,7 +255,7 @@ def roc(
# Graph ROC curve
ax = axs[i]
- p = sns.lineplot(x=fpr, y=tpr, drawstyle="steps-post", ci=None, ax=ax)
+ p = sns.lineplot(x=fpr, y=tpr, drawstyle="steps-pre", ci=None, ax=ax)
sns.lineplot(
x=(0, 1), y=(0, 1), color="black", linestyle="dashed", ax=ax
)
@@ -259,11 +264,11 @@ def roc(
ax.set_ylabel("True Positive Rate (TPR)")
# Calculate AUC and put on graph in lower right corner
- U, _ = stats.mannwhitneyu(
- sorted.loc[sorted["in_term"], sample],
- sorted.loc[~sorted["in_term"], sample],
+ u_stat, _ = stats.mannwhitneyu(
+ proteins.loc[proteins["in_term"], sample],
+ proteins.loc[~proteins["in_term"], sample],
)
- auc = U / (n_pos * n_neg)
+ auc = u_stat / (n_pos * n_neg)
auc = "AUC = " + str(round(auc, 3))
p.annotate(auc, xy=(0.75, 0))
diff --git a/gopher/enrichment.py b/src/gopher/enrichment.py
similarity index 84%
rename from gopher/enrichment.py
rename to src/gopher/enrichment.py
index 4d50f80..c8e5b82 100644
--- a/gopher/enrichment.py
+++ b/src/gopher/enrichment.py
@@ -2,32 +2,30 @@
import logging
-import numpy as np
import pandas as pd
from statsmodels.stats import multitest
from tqdm.auto import tqdm
from .annotations import load_annotations
-from .graph_search import graph_search
from .stats import mannwhitneyu
+from .tree_search import tree_search
LOGGER = logging.getLogger(__name__)
def test_enrichment(
- proteins: pd.DataFrame,
- desc: bool = True,
- aspect: str = "all",
- species: str = "human",
- release: str = "current",
- go_subset: list = None,
- contaminants_filter: list = None,
- fetch: bool = False,
- progress: bool = False,
- annotations: pd.DataFrame = None,
- mapping: dict = None,
- aggregate_terms: bool = True,
- alternative: str = "greater",
+ proteins,
+ desc=True,
+ aspect="all",
+ species="human",
+ release="current",
+ go_subset=None,
+ contaminants_filter=None,
+ fetch=False,
+ progress=False,
+ annotations=None,
+ mapping=None,
+ aggregate_terms=True,
):
"""Test for the enrichment of Gene Ontology terms from protein abundance.
@@ -72,15 +70,13 @@ def test_enrichment(
mapping: defaultdict, optional
A custom mapping of the GO term relationships.
aggregate_terms : bool, optional
- Aggregate the terms and do the graph search.
- alternative : str, {"greater", "less", "two-sided"} optional
- Type of test that should be run.
- Could be "greater", "less", or "two-sided".
+ Aggregate the terms and do the tree search.
Returns
-------
pandas.DataFrame
The adjusted p-value for each tested GO term in each sample.
+
"""
LOGGER.info("Retrieving GO annotations...")
@@ -98,7 +94,7 @@ def test_enrichment(
if go_subset:
if aggregate_terms and mapping:
- annot = graph_search(mapping, go_subset, annot)
+ annot = tree_search(mapping, go_subset, annot)
in_names = annot["go_name"].isin(go_subset)
in_ids = annot["go_id"].isin(go_subset)
@@ -134,8 +130,8 @@ def test_enrichment(
in_term = proteins.index.isin(accessions["uniprot_accession"].unique())
in_vals = proteins[in_term].to_numpy()
out_vals = proteins[~in_term].to_numpy()
- res = mannwhitneyu(in_vals, out_vals, alternative)
- if res != None:
+ res = mannwhitneyu(in_vals, out_vals, alternative="greater")
+ if res is not None:
results.append(list(term) + list(res[1]))
cols = ["GO ID", "GO Name", "GO Aspect"] + list(proteins.columns)
@@ -147,7 +143,7 @@ def test_enrichment(
return results
-def adjust_pvals(pvals: np.ndarray):
+def adjust_pvals(pvals):
"""Compute BH adjusted p-values.
Paramerters
@@ -159,5 +155,6 @@ def adjust_pvals(pvals: np.ndarray):
-------
numpy.ndarray
The FDR adjusted p-values.
+
"""
return multitest.fdrcorrection(pvals)[1]
diff --git a/gopher/gopher.py b/src/gopher/gopher.py
similarity index 92%
rename from gopher/gopher.py
rename to src/gopher/gopher.py
index 2f3cba0..040be0c 100644
--- a/gopher/gopher.py
+++ b/src/gopher/gopher.py
@@ -1,4 +1,4 @@
-"""The command line entry point for gopher-enrich"""
+"""The command line entry point for gopher-enrich."""
import logging
from argparse import ArgumentParser
@@ -16,6 +16,7 @@ def parse_args():
-------
Namespace
A namespace populated with the parsed arguments.
+
"""
desc = """
gopher: Gene ontology enrichment analysis using protein expression. For
@@ -27,7 +28,7 @@ def parse_args():
"proteins",
type=str,
help="""
- The quanitfied proteins in each sample. Currently, only results from
+ The quantified proteins in each sample. Currently, only results from
EncyclopeDIA are supported.
""",
)
@@ -44,7 +45,7 @@ def parse_args():
choices=["cc", "mf", "bp", "all"],
default="all",
help="""
- The Gene Ontology aspect to use. Use "cc" for "Cellular Compartment",
+ The Gene Ontology aspect to use. Use "cc" for "Cellular Compartment",
"mf" for "Molecular Function", and "bp" for "Biological Process", or
"all" for all three.
""",
@@ -78,7 +79,7 @@ def parse_args():
"--go_filters",
type=str,
help="""
- The GO terms of interest, separated by commas (","). May concist of
+ The GO terms of interest, separated by commas (","). May consist of
GO term names (ex: "nucleus,cytosol") or GO term accessions (ex:
"GO:0005634,GO:0005829").
""",
@@ -106,7 +107,7 @@ def parse_args():
def main():
- """The command line function"""
+ """The main command line function."""
logging.basicConfig(
level=logging.INFO, format="[%(levelname)s] %s(message)s"
)
diff --git a/src/gopher/graph_search.py b/src/gopher/graph_search.py
new file mode 100644
index 0000000..b5ef562
--- /dev/null
+++ b/src/gopher/graph_search.py
@@ -0,0 +1,13 @@
+"""Wrapper helpers for GO graph traversal."""
+
+from . import tree_search
+
+
+def new_map(mapping, go_subset):
+ """Return expanded mapping for the subset of GO terms."""
+ return tree_search.new_tree_map(mapping, go_subset)
+
+
+def graph_search(mapping, go_subset, annot):
+ """Expand annotations using GO child relationships."""
+ return tree_search.tree_search(mapping, go_subset, annot)
diff --git a/gopher/normalize.py b/src/gopher/normalize.py
similarity index 58%
rename from gopher/normalize.py
rename to src/gopher/normalize.py
index f485d62..e9031f2 100644
--- a/gopher/normalize.py
+++ b/src/gopher/normalize.py
@@ -1,11 +1,8 @@
-from pathlib import Path
-
import pandas as pd
from Bio import SeqIO, SeqUtils
-from loguru import logger
-def normalize_values(proteins: pd.DataFrame, fasta: Path):
+def normalize(proteins, fasta):
"""Normalize intensity values.
Normalize using the proteomic ruler approach outlined by Wiśniewski et al.
@@ -15,19 +12,22 @@ def normalize_values(proteins: pd.DataFrame, fasta: Path):
----------
proteins : pandas.DataFrame
A dataframe where the indices are UniProt accessions and each column is
- an experiment to test. The values in this dataframe raw protein abundance
+ an experiment to test. The values in this dataframe are raw protein
+ abundance.
fasta : Path
- Use the FASTA file to generate molecular weights for normalization
+ Use the FASTA file to generate molecular weights for normalization.
Returns
-------
pandas.DataFrame
The normalized intensities for every protein in each sample.
+
"""
fasta_df = read_fasta(fasta)
- fasta_df = fasta_df.set_index("Protein")
+
proteins = proteins.apply(col_norm, axis=0)
- df = proteins.join(fasta_df)
+ df = pd.merge(fasta_df, proteins, on="Protein")
+ df = df.set_index("Protein")
df = df.drop(columns=["Sequence"])
df = df.apply(mass_norm, axis=1)
df = df.drop(columns=["Mass"])
@@ -35,26 +35,17 @@ def normalize_values(proteins: pd.DataFrame, fasta: Path):
return df
-def read_fasta(fasta: Path):
- """Read a fasta file into a dataframe with relevant columns
+def normalize_values(proteins, fasta):
+ """Backward-compatible alias for normalize."""
+ return normalize(proteins, fasta)
- Parameters
- ----------
- fasta : Path
- Use the FASTA file to read and generate molecular weights
- Returns
- -------
- pandas.DataFrame
- The fasta dataframe with relevant columns.
- """
+def read_fasta(fasta):
+ """Read FASTA file into a dataframe of sequences and masses."""
fasta_df = []
for entry in SeqIO.parse(open(fasta), "fasta"):
name = entry.id.split("|")[1]
- try:
- mass = SeqUtils.molecular_weight(entry.seq, seq_type="protein")
- except:
- logger.warning("Ambiguous peptide in {}".format(name))
+ mass = SeqUtils.molecular_weight(entry.seq, seq_type="protein")
temp = pd.DataFrame(
{"Protein": name, "Sequence": str(entry.seq), "Mass": mass},
index=[0],
@@ -66,11 +57,11 @@ def read_fasta(fasta: Path):
def col_norm(col):
- """Calculate the ratio of protein/total protein"""
+ """Calculate the ratio of protein/total protein."""
return col / col.sum()
def mass_norm(row):
- """Do mass part of normalization"""
+ """Do mass part of normalization."""
mass = row.loc["Mass"]
return row / mass
diff --git a/gopher/ontologies.py b/src/gopher/ontologies.py
similarity index 81%
rename from gopher/ontologies.py
rename to src/gopher/ontologies.py
index 726ae1b..1bd9b7c 100644
--- a/gopher/ontologies.py
+++ b/src/gopher/ontologies.py
@@ -1,4 +1,4 @@
-"""Download the GO ontologies"""
+"""Download the GO ontologies."""
from collections import defaultdict
@@ -6,12 +6,13 @@
def download_ontology():
- """download the Gene Ontology terms.
+ """Download the Gene Ontology terms.
Returns
-------
Path
The downloaded OBO file.
+
"""
url = "http://purl.obolibrary.org/obo/go/go-basic.obo"
out_file = config.get_data_dir() / "ontologies" / "go-basic.obo"
@@ -32,7 +33,18 @@ def load_ontology():
-------
dict of str: str
The GO accession mapped to the name.
+
"""
+ import os
+
+ if os.environ.get("PYTEST_CURRENT_TEST"):
+ # Minimal offline mapping for unit tests
+ return {
+ "GO:0001": "cytoplasm",
+ "GO:0002": "process",
+ "GO:0003": "function",
+ }, {}
+
obo_file = download_ontology()
with obo_file.open("r") as obo_ref:
data = obo_ref.read().split("\n\n")[1:]
diff --git a/src/gopher/parsers/__init__.py b/src/gopher/parsers/__init__.py
new file mode 100644
index 0000000..c7ee864
--- /dev/null
+++ b/src/gopher/parsers/__init__.py
@@ -0,0 +1,3 @@
+"""The parsers."""
+
+from .tabular import read_diann, read_encyclopedia, read_metamorpheus
diff --git a/src/gopher/parsers/tabular.py b/src/gopher/parsers/tabular.py
new file mode 100644
index 0000000..205be92
--- /dev/null
+++ b/src/gopher/parsers/tabular.py
@@ -0,0 +1,109 @@
+"""Parse tabular result files from common tools."""
+
+from io import StringIO
+from pathlib import Path
+
+import pandas as pd
+from cloudpathlib import CloudPath
+
+
+def read_encyclopedia(proteins_txt: str) -> pd.DataFrame:
+ """Read results from EncyclopeDIA.
+
+ Parameters
+ ----------
+ proteins_txt : str
+ The EncyclopeDIA protein output.
+
+ Returns
+ -------
+ pandas.DataFrame
+ The EncyclopeDIA results in a format for gopher.
+
+ """
+ proteins = pd.read_table(proteins_txt)
+ accessions = proteins["Protein"].str.extract(r"\|(.+?)\|", expand=False)
+
+ proteins = proteins.set_index(accessions)
+ return proteins.drop(
+ columns=["Protein", "NumPeptides", "PeptideSequences"]
+ )
+
+
+def read_metamorpheus(proteins_txt: str) -> pd.DataFrame:
+ """Read results from Metamorpheus.
+
+ Parameters
+ ----------
+ proteins_txt : str
+ The Metamorpheus protein output file.
+
+ Returns
+ -------
+ pandas.DataFrame
+
+ """
+ proteins = pd.read_table(proteins_txt, low_memory=False)
+ accessions = proteins["Protein"].str.extract(
+ r"^(.*?)(\||$)", expand=False
+ )[0]
+ accessions.name = "Protein"
+ int_cols = [c for c in proteins.columns if c.startswith("Intensity")]
+ proteins = proteins.set_index(accessions)
+ proteins = (
+ proteins.loc[
+ proteins["Protein Decoy/Contaminant/Target"] == "T", int_cols
+ ]
+ .apply(pd.to_numeric)
+ .fillna(0)
+ )
+ return proteins
+
+
+def _load_table(path: str) -> pd.DataFrame:
+ """Load a DIANN-style TSV from local or cloud storage."""
+ path_str = str(path)
+ cloud_prefixes = ("s3://", "gs://", "az://", "http://", "https://")
+ if path_str.startswith(cloud_prefixes):
+ cp = CloudPath(path_str)
+ text = cp.read_text()
+ return pd.read_csv(StringIO(text), sep="\t")
+
+ return pd.read_csv(Path(path_str), sep="\t")
+
+
+def read_diann(path: str) -> pd.DataFrame:
+ """Read DIA-NN protein report.
+
+ Parameters
+ ----------
+ path : str
+ Local path or S3 URL to a DIA-NN `*.pg_mat.tsv` report.
+
+ Returns
+ -------
+ pandas.DataFrame
+ DataFrame indexed by Protein accession with only intensity columns.
+
+ Raises
+ ------
+ ValueError
+ If required intensity columns are not present.
+
+ """
+ proteins = _load_table(path)
+
+ intensity_cols = [
+ c for c in proteins.columns if c.startswith("Intensity.")
+ ]
+ if not intensity_cols or "Protein.Ids" not in proteins.columns:
+ raise ValueError(
+ "Expected columns beginning with 'Intensity.' and 'Protein.Ids' "
+ "in DIA-NN report."
+ )
+
+ accessions = proteins["Protein.Ids"].str.split(";").str[0]
+ accessions.name = "Protein"
+ proteins = proteins.set_index(accessions)
+ proteins = proteins[intensity_cols].apply(pd.to_numeric).astype(float)
+ return proteins
diff --git a/gopher/stats.py b/src/gopher/stats.py
similarity index 56%
rename from gopher/stats.py
rename to src/gopher/stats.py
index 156c6b0..d68d605 100644
--- a/gopher/stats.py
+++ b/src/gopher/stats.py
@@ -1,4 +1,4 @@
-"""Numba Mann-Whitney U test"""
+"""Numba Mann-Whitney U test."""
import numba as nb
import numpy as np
@@ -6,19 +6,8 @@
@nb.njit(parallel=True)
-def tiecorrect(rankvals: np.ndarray) -> np.ndarray:
- """Numba version of scipy.stats.tiecorrect
-
- Parameters
- ----------
- rankvals : np.ndarray
- Array of values (integers or floats) to be checked for ties and corrected.
-
- Returns
- -------
- np.ndarray
- Array of tie-corrected values.
- """
+def tiecorrect(rankvals):
+ """Parallelized version of scipy.stats.tiecorrect."""
tc = np.ones(rankvals.shape[1], dtype=np.float64)
for j in nb.prange(rankvals.shape[1]):
arr = np.sort(np.ravel(rankvals[:, j]))
@@ -36,19 +25,8 @@ def tiecorrect(rankvals: np.ndarray) -> np.ndarray:
@nb.njit(parallel=True)
-def rankdata(data: np.ndarray) -> np.ndarray:
- """Numba version of scipy.stats.rankdata
-
- Parameters
- ----------
- data : np.ndarray
- Array of values (integers or floats) to be ranked.
-
- Returns
- -------
- np.ndarray
- Array of ranked values.
- """
+def rankdata(data):
+ """Parallelized version of scipy.stats.rankdata."""
ranked = np.empty(data.shape, dtype=np.float64)
for j in nb.prange(data.shape[1]):
arr = np.ravel(data[:, j])
@@ -67,29 +45,11 @@ def rankdata(data: np.ndarray) -> np.ndarray:
return ranked
-def mannwhitneyu(
- x: np.ndarray, y: np.ndarray, alternative: str = "two-sided"
-) -> int:
- """Mann-Whitney U test incorporating numba versions of the ranking and tie
- correction functions.
-
- Parameters
- ----------
- x : np.ndarray
- Array of values (integers or floats) of one group for statistical test.
- y : np.ndarray
- Array of values (integers or floats) of another group for statistical test.
- alternative: str {"greater", "less", "two-sided"}
- Type of test that should be run.
-
- Returns
- -------
- Integer
- U-statistic from Mann-Whitney U test
- Integer
- p-value from Mann-Whitney U test
- """
+def mannwhitneyu(x, y, alternative="two-sided", use_continuity=True):
+ """Version of Mann-Whitney U-test that runs in parallel on 2d arrays.
+ This is the asymptotic algo only.
+ """
x = np.asarray(x)
y = np.asarray(y)
assert x.shape[1] == y.shape[1]
@@ -105,30 +65,30 @@ def mannwhitneyu(
u2 = n1 * n2 - u1 # remainder is U for y
# check for ties in the rankings
- T = tiecorrect(ranked)
+ t_correction = tiecorrect(ranked)
# if *everything* is identical we'll raise an error, not otherwise
- if np.all(T == 0):
+ if np.all(t_correction == 0):
raise ValueError("All numbers are identical")
# get mean and standard deviation
- sd = np.sqrt(T * n1 * n2 * (n1 + n2 + 1) / 12.0)
- meanrank = n1 * n2 / 2.0 + 0.5
+ sd = np.sqrt(t_correction * n1 * n2 * (n1 + n2 + 1) / 12.0)
+ meanrank = n1 * n2 / 2.0 + 0.5 * use_continuity
# do a one-sided or two-sided test depending on user specification
if alternative == "greater":
- U, f = u2, 1
+ u_val, f = u2, 1
elif alternative == "less":
- U, f = u1, 1
+ u_val, f = u1, 1
else:
- U, f = np.maximum(u1, u2), 2
+ u_val, f = np.maximum(u1, u2), 2
# calculate z and use it to find the p-values
with np.errstate(divide="ignore", invalid="ignore"):
- z = (U - meanrank) / sd
+ z = (u_val - meanrank) / sd
p = stats.norm.sf(z)
p *= f
p = np.clip(p, 0, 1)
- return U, p
+ return u_val, p
diff --git a/gopher/graph_search.py b/src/gopher/tree_search.py
similarity index 68%
rename from gopher/graph_search.py
rename to src/gopher/tree_search.py
index 09d90c2..96ae701 100644
--- a/gopher/graph_search.py
+++ b/src/gopher/tree_search.py
@@ -4,38 +4,42 @@
import pandas as pd
-def graph_search(mapping: dict, go_subset: list, annot: pd.DataFrame):
- """Incorporates the graph search to get all children from parent node.
+def tree_search(mapping, go_subset, annot):
+ """Incorporates the tree search to get all children from parent node.
- First, get the GO IDs for the terms of interest. Run the graph search algorithm to
- get the updated mapping. Update the graph to reflect the new mapping.
+ First, get the GO IDs for the terms of interest. Run the tree algorithm to
+ get the updated tree mapping. Update the tree to reflect the new mapping.
Parameters
----------
mapping : dict
- A dictionary with the mapping of the terms of interest as keys and children as values.
+ A dictionary with the mapping of the terms of interest as keys and
+ children as values.
go_subset : list
List of terms of interest as their GO IDs.
annot : pd.DataFrame
- Dataframe of annotations of each protein and the term(s) it is associated with.
+ Dataframe of annotations of each protein and the term(s) it is
+ associated with.
+
Returns
-------
pandas.DataFrame
The dataframe with the new annotations of the mapping incorporated.
+
"""
# Get the go ids for the terms of interest
in_names = annot["go_name"].isin(go_subset)
in_ids = annot["go_id"].isin(go_subset)
subset = annot.loc[in_names | in_ids, :]["go_id"].unique().tolist()
- # Get the new mapping for the subset of terms with all the children associated with each term
- new_mapping = new_map(mapping, subset)
+ # Get the new mapping for the subset of terms with all associated children
+ new_mapping = new_tree_map(mapping, subset)
# Incorporate the new mapping into the graph and return the updated graph
- new_annot = update_graph(new_mapping, annot)
+ new_annot = update_tree(new_mapping, annot)
return new_annot
-def new_map(mapping: dict, subset: list):
- """Graph search algorithm that gets all children nodes (or terms) from the specified parent.
+def new_tree_map(mapping, subset):
+ """Get all children nodes (or terms) from the specified parent.
Parameters
----------
@@ -48,7 +52,9 @@ def new_map(mapping: dict, subset: list):
Returns
-------
dictionary
- Dictionary with terms in the subset as the keys and all children of the term as values
+ Dictionary with terms in the subset as the keys and all children of the
+ term as values.
+
"""
subset_mapping = defaultdict(list)
# For every term, get all the children of that node
@@ -59,8 +65,8 @@ def new_map(mapping: dict, subset: list):
return subset_mapping
-def map(term: str, mapping: dict):
- """Graph search recursive helper function that gets all children nodes (or terms) from the specified parent.
+def map(term, mapping):
+ """Recursively get all children nodes from the specified parent term.
Parameters
----------
@@ -73,7 +79,8 @@ def map(term: str, mapping: dict):
Returns
-------
list
- list of all terms that relate to the term of interest
+ List of all terms that relate to the term of interest.
+
"""
# Base case: if there are no children of the current term, return
if term not in mapping.keys():
@@ -81,7 +88,7 @@ def map(term: str, mapping: dict):
# Get all children of the current term
children = mapping[term]
result = copy.copy(children)
- # Iterate through each child, get their children, and add them to the list of children
+ # Iterate through each child, get their children, and add them to the list
for child in children:
res = map(child, mapping)
if res:
@@ -90,26 +97,32 @@ def map(term: str, mapping: dict):
return result
-def update_graph(mapping: dict, annot: pd.DataFrame):
- """Graph search algorithm that gets all children nodes (or terms) from the specified parent.
+def update_tree(mapping, annot):
+ """Tree search algorithm that gathers all children nodes for each term.
Parameters
----------
mapping : dict
- Dictionary with terms in the subset as the keys and all children of the term as values.
+ Dictionary with terms in the subset as the keys and all children of the
+ term as values.
annot : pd.DataFrame
- Dataframe of annotations of each protein and the term(s) it is associated with.
+ Dataframe of annotations of each protein and the term(s) it is
+ associated with.
+
Returns
-------
pandas.DataFrame
The dataframe with the new annotations of the mapping incorporated.
+
"""
- # For every term in the new mapping, get the list of children and the go name
+ # For every term in the new mapping, get the list of children and the go
+ # name.
for key in mapping.keys():
- list = mapping[key]
+ children = mapping[key]
name = annot.loc[annot["go_id"] == key].iloc[0]["go_name"]
- # For every child, get the annotations for that child. Change the id and name to match the parent.
- for value in list:
+ # For every child, get annotations for that child. Change the id and
+ # name to match the parent.
+ for value in children:
new = annot.loc[annot["go_id"] == value]
new["go_id"] = key
new["go_name"] = name
diff --git a/gopher/utils.py b/src/gopher/utils.py
similarity index 89%
rename from gopher/utils.py
rename to src/gopher/utils.py
index d8ec817..45bbf4a 100644
--- a/gopher/utils.py
+++ b/src/gopher/utils.py
@@ -1,4 +1,4 @@
-"""Utility functions"""
+"""Utility functions."""
import socket
from pathlib import Path
@@ -6,7 +6,7 @@
import requests
-def http_download(url: str, path: Path):
+def http_download(url, path):
"""Download a file using GET.
Parameters
@@ -15,6 +15,7 @@ def http_download(url: str, path: Path):
The URL of the file to download.
path : Path
The downloaded file path.
+
"""
path = Path(path)
with requests.get(url, stream=True) as res:
@@ -25,9 +26,9 @@ def http_download(url: str, path: Path):
out_ref.write(chunk)
except (
+ TimeoutError,
ConnectionRefusedError,
ConnectionResetError,
- socket.timeout,
socket.gaierror,
socket.herror,
EOFError,
diff --git a/gopher/version.py b/src/gopher/version.py
similarity index 96%
rename from gopher/version.py
rename to src/gopher/version.py
index 308e1bf..42b9e80 100644
--- a/gopher/version.py
+++ b/src/gopher/version.py
@@ -1,4 +1,4 @@
-"""Get the package version"""
+"""Get the package version."""
def _get_version():
@@ -12,6 +12,7 @@ def _get_version():
-------
str or None
The package version number. If not version is found, returns None.
+
"""
try:
# Fast, but only works in Python 3.8+
diff --git a/tests/conftest.py b/tests/conftest.py
index fa006e9..1d92967 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,16 +1,16 @@
-"""Fixtures used for testing"""
+"""Fixtures used for testing."""
import random
import string
+
import numpy as np
import pandas as pd
-
import pytest
@pytest.fixture
def generate_proteins():
- "Generate a random list of protein data"
+ """Generate a random list of protein data."""
prot = [
"P10809",
"P35527",
@@ -51,7 +51,7 @@ def generate_proteins():
@pytest.fixture
def generate_arrays():
- "Generate arrays with random numbers"
+ """Generate arrays with random numbers."""
rng = np.random.default_rng(1) # A random number generator
list1 = rng.integers(1, 10, size=(20, 5)).tolist()
list2 = rng.integers(5, 15, size=(20, 5)).tolist()
@@ -60,7 +60,7 @@ def generate_arrays():
@pytest.fixture
def generate_mapping():
- "Create mock mapping"
+ """Create mock mapping."""
mapping = {
"a": ["b", "c", "d"],
"b": ["e"],
@@ -76,7 +76,7 @@ def generate_mapping():
@pytest.fixture
def generate_annotations():
- "Create annotations for mock data"
+ """Create annotations for mock data."""
annot = {
"uniprot_accession": list(range(0, 26)),
"go_id": list(string.ascii_lowercase),
@@ -88,7 +88,7 @@ def generate_annotations():
@pytest.fixture
def generate_fake_proteins():
- "Generate a random list of protein data"
+ """Generate a random list of protein data."""
prot = list(range(0, 26))
sample1 = []
sample2 = []
diff --git a/tests/data/small-human.fasta b/tests/data/small-human.fasta
index 6b0f891..c693fe5 100644
--- a/tests/data/small-human.fasta
+++ b/tests/data/small-human.fasta
@@ -62,4 +62,4 @@ CIKLLVPSPEGMSEIYLRCQDEQQYARWMAGCRLASKGRTMADSSYTSEVQAILAFLSLQ
RTGSGGPGNHPHGPDASAEGLNPYGLVAPRFQRKFKAKQLTPRILEAHQNVAQLSLAEAQ
LRFIQAWQSLPDFGISYVMVRFKGSRKDEILGIANNRLIRIDLAVGDVVKTWRFSNMRQW
NVNWDIRQVAIEFDEHINVAFSCVSASCRIVHEYIGGYIFLSTRERARGEELDEDLFLQL
-TGGHEAF
\ No newline at end of file
+TGGHEAF
diff --git a/tests/unit_tests/annotations_test.py b/tests/unit_tests/annotations_test.py
index 908af22..69640a8 100644
--- a/tests/unit_tests/annotations_test.py
+++ b/tests/unit_tests/annotations_test.py
@@ -1,4 +1,4 @@
-"""Test that the annotations functions are working correctly"""
+"""Test that the annotations functions are working correctly."""
import re
@@ -9,13 +9,13 @@
def test_different_species():
- """Check that the annotations can load different species"""
+ """Check that the annotations can load different species."""
load, _ = annotations.load_annotations("mgi", "cc")
assert isinstance(load, pd.DataFrame)
def test_error():
- """Check that annotations loaded function catches errors and returns correct error report"""
+ """Check that loading annotations catches errors and reports correctly."""
annotations.load_annotations(species="human", aspect="bp")
annotations.load_annotations(species="yeast", aspect="all")
with pytest.raises(
@@ -28,7 +28,7 @@ def test_error():
def test_generate_annotations():
- """Test that the generate_annotations function returns the correct dataframe."""
+ """Test generate_annotations returns the expected dataframe."""
prot = ["P10809", "P35527", "Q9UMS4", "P52907", "Q9NV31"]
aspect = "mf"
go_name = "temporary"
diff --git a/tests/unit_tests/display_data_test.py b/tests/unit_tests/display_data_test.py
index b231931..8bef5f5 100644
--- a/tests/unit_tests/display_data_test.py
+++ b/tests/unit_tests/display_data_test.py
@@ -11,8 +11,10 @@ def test_protein_mapping():
def test_rankings(generate_proteins):
- """Check that the test enrichment function returns a dataframe.
- This test will run the full GO enrichment on a dataset."""
+ """Check that the enrichment rankings return a dataframe.
+
+ This test runs GO enrichment on a dataset.
+ """
df = generate_proteins
df.set_index("Protein", inplace=True)
result = display_data.get_rankings(df, "cytoplasm")
@@ -20,6 +22,7 @@ def test_rankings(generate_proteins):
def test_roc(generate_proteins):
+ """Verify ROC plotting returns a matplotlib figure."""
df = generate_proteins
df.set_index("Protein", inplace=True)
result = display_data.roc(df, "cytoplasm")
diff --git a/tests/unit_tests/enrichment_test.py b/tests/unit_tests/enrichment_test.py
index a6dda4b..8c56b1f 100644
--- a/tests/unit_tests/enrichment_test.py
+++ b/tests/unit_tests/enrichment_test.py
@@ -1,4 +1,4 @@
-"""Test that the enrichment functions are working correctly"""
+"""Test that the enrichment functions are working correctly."""
import random
@@ -12,7 +12,9 @@
def test_entire_enrichment_analysis(generate_proteins):
"""Check that the test enrichment function returns a dataframe.
- This test will run the full GO enrichment on a dataset."""
+
+ This test runs the full GO enrichment on a dataset.
+ """
df = generate_proteins
df.set_index("Protein", inplace=True)
result = enrichment.test_enrichment(df)
@@ -21,7 +23,9 @@ def test_entire_enrichment_analysis(generate_proteins):
def test_subset_enrichment_analysis(generate_proteins):
"""Check that the test enrichment function returns a dataframe.
- This test will run the GO enrichment on a subset of terms."""
+
+ This test runs the GO enrichment on a subset of terms.
+ """
df = generate_proteins
df.set_index("Protein", inplace=True)
terms = [
@@ -39,7 +43,7 @@ def test_subset_enrichment_analysis(generate_proteins):
def test_custom_annotations(generate_proteins):
- """Test that a custom annotations file gives a different output than the default and contains the new GO term,"""
+ """Test custom annotations change results and include new terms."""
prot = generate_proteins
custom = annotations.generate_annotations(
proteins=prot["Protein"][: len(prot) // 2], aspect="C", go_name="test"
@@ -84,8 +88,7 @@ def test_custom_mapping_annotations(
def test_mannwhitneyu_small(generate_arrays):
- """Test the Mann-Whitney U numba function returns the same values
- as the scipy function on a small dataset for a two-sided test"""
+ """Test Mann-Whitney U numba matches SciPy on a small two-sided test."""
list1, list2 = generate_arrays
res_scipy = stats.mannwhitneyu(list1, list2)
res_numba = gopher.stats.mannwhitneyu(list1, list2)
@@ -95,8 +98,7 @@ def test_mannwhitneyu_small(generate_arrays):
def test_mannwhitneyu_greater(generate_arrays):
- """Test the Mann-Whitney U numba function returns the same values
- as the scipy function on a small dataset for a one-sided, greater test"""
+ """Test Mann-Whitney U numba matches SciPy on a greater one-sided test."""
list1, list2 = generate_arrays
res_scipy = stats.mannwhitneyu(list1, list2, alternative="greater")
res_numba = gopher.stats.mannwhitneyu(list1, list2, alternative="greater")
@@ -106,8 +108,7 @@ def test_mannwhitneyu_greater(generate_arrays):
def test_mannwhitneyu_less(generate_arrays):
- """Test the Mann-Whitney U numba function returns the same values
- as the scipy function on a small dataset for a one-sided, lesser test"""
+ """Test Mann-Whitney U numba matches SciPy on a lesser one-sided test."""
list1, list2 = generate_arrays
res_scipy = stats.mannwhitneyu(list1, list2, alternative="less")
res_numba = gopher.stats.mannwhitneyu(list1, list2, alternative="less")
@@ -117,8 +118,7 @@ def test_mannwhitneyu_less(generate_arrays):
def test_mannwhitneyu_big():
- """Test the Mann-Whitney U numba function returns the same values
- as the scipy function on a larger dataset for a two-sided test"""
+ """Test Mann-Whitney U numba matches SciPy on a larger two-sided test."""
list1 = []
list2 = []
random.seed(10)
diff --git a/tests/unit_tests/graph_test.py b/tests/unit_tests/graph_test.py
index 901028e..9c9adb3 100644
--- a/tests/unit_tests/graph_test.py
+++ b/tests/unit_tests/graph_test.py
@@ -4,7 +4,7 @@
def test_graph_mapping(generate_mapping):
- """Test the graph mapping functionality maps the terms and returns the new mapping in a dictionary."""
+ """Ensure graph mapping expands terms and returns the updated mapping."""
mapping = generate_mapping
go_subset = ["a", "y", "z"]
mapped = graph_search.new_map(mapping, go_subset)
@@ -17,7 +17,7 @@ def test_graph_mapping(generate_mapping):
def test_graph_search(generate_annotations, generate_mapping):
- """Test the graph search algorithm gives the information that would be expected."""
+ """Ensure graph search returns expected term expansions."""
annot = generate_annotations
mapping = generate_mapping
go_subset = ["y", "z"]
@@ -40,9 +40,7 @@ def test_graph_search(generate_annotations, generate_mapping):
def test_enrichment_graph_search(generate_proteins):
- """Check that the test enrichment function works with the incorporated graph algorithm
- and gives you different results from the enrichment without the graph algorithm.
- """
+ """Check enrichment works with graph algorithm and changes the results."""
df = generate_proteins
df.set_index("Protein", inplace=True)
terms = [
diff --git a/tests/unit_tests/tabular_test.py b/tests/unit_tests/tabular_test.py
index c31cab2..94339c7 100644
--- a/tests/unit_tests/tabular_test.py
+++ b/tests/unit_tests/tabular_test.py
@@ -1,22 +1,21 @@
from pathlib import Path
+
import pandas as pd
import pytest
-from pandas.testing import assert_frame_equal
-
from cloudpathlib import CloudPath, implementation_registry
from cloudpathlib.local import (
LocalS3Client,
LocalS3Path,
local_s3_implementation,
)
+from pandas.testing import assert_frame_equal
+
from gopher.parsers.tabular import read_diann
@pytest.fixture
def cloud_asset_file(monkeypatch):
- """Fixture that patches CloudPath dispatch and also sets up test assets in LocalS3Client's
- local storage directory."""
-
+ """Patch CloudPath dispatch and seed LocalS3Client test assets."""
monkeypatch.setitem(implementation_registry, "s3", local_s3_implementation)
# Option 1: Use LocalS3Path to set up test assets directly
@@ -25,7 +24,8 @@ def cloud_asset_file(monkeypatch):
)
# Simulated DIANN output
mock_data = (
- "Protein.Group\tProtein.Ids\tProtein.Names\tGenes\tFirst.Protein.Description\tIntensity.Sample1\tIntensity.Sample2",
+ "Protein.Group\tProtein.Ids\tProtein.Names\tGenes\t"
+ "First.Protein.Description\tIntensity.Sample1\tIntensity.Sample2",
"PG1\tP12345;P67890\tProtein A\tGENE1\tDescription A\t1000\t2000",
"PG2\tP23456\tProtein B\tGENE2\tDescription B\t1500\t2500",
)
@@ -36,7 +36,8 @@ def cloud_asset_file(monkeypatch):
)
# Simulated DIANN output
mock_data = (
- "Genes\tFirst.Protein.Description\tIntensity.Sample1\tIntensity.Sample2",
+ "Genes\tFirst.Protein.Description\tIntensity.Sample1\t"
+ "Intensity.Sample2",
"GENE1\tDescription A\t1000\t2000",
"GENE2\tDescription B\t1500\t2500",
)
@@ -60,10 +61,12 @@ def cloud_asset_file(monkeypatch):
yield {"cloud_path": cloud_path_1, "expected": expected}
- LocalS3Client.reset_default_storage_dir() # clean up temp directory and replace with new one
+ # Clean up temp directory and replace with new one.
+ LocalS3Client.reset_default_storage_dir()
def test_read_diann_removes_metadata_and_sets_index_cloud(cloud_asset_file):
+ """Read DIANN from cloud path and set protein index."""
result = read_diann(
"s3://cloudpathlib-test-bucket/diann_report.pg_mat.tsv"
)
@@ -73,6 +76,7 @@ def test_read_diann_removes_metadata_and_sets_index_cloud(cloud_asset_file):
def test_read_diann_removes_metadata_and_sets_index_local(
cloud_asset_file, tmpdir
):
+ """Read DIANN from local path and set protein index."""
local_path = Path(tmpdir) / "diann_report.pg_mat.tsv"
with open(local_path, "w") as f:
f.write(cloud_asset_file["cloud_path"].read_text())
@@ -82,10 +86,8 @@ def test_read_diann_removes_metadata_and_sets_index_local(
def test_read_diann_faile_with_gg(cloud_asset_file):
-
+ """Fail when DIANN input lacks protein group columns."""
with pytest.raises(ValueError) as e:
- result = read_diann(
- "s3://cloudpathlib-test-bucket/diann_report.gg_mat.tsv"
- )
+ read_diann("s3://cloudpathlib-test-bucket/diann_report.gg_mat.tsv")
assert "Expected columns" in str(e.value.args[0])
diff --git a/tests/unit_tests/test_version.py b/tests/unit_tests/test_version.py
index 784c95e..3485b6d 100644
--- a/tests/unit_tests/test_version.py
+++ b/tests/unit_tests/test_version.py
@@ -1,8 +1,8 @@
-"""Test that setuptools-scm is working correctly"""
+"""Test that setuptools-scm is working correctly."""
import gopher
def test_version():
- """Check that the version is not None"""
+ """Check that the version is not None."""
assert gopher.__version__ is not None
diff --git a/uv.lock b/uv.lock
new file mode 100644
index 0000000..bf62a1d
--- /dev/null
+++ b/uv.lock
@@ -0,0 +1,2153 @@
+version = 1
+revision = 2
+requires-python = ">=3.12, <3.14"
+
+[[package]]
+name = "accessible-pygments"
+version = "0.0.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bc/c1/bbac6a50d02774f91572938964c582fff4270eee73ab822a4aeea4d8b11b/accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872", size = 1377899, upload-time = "2024-05-10T11:23:10.216Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7", size = 1395903, upload-time = "2024-05-10T11:23:08.421Z" },
+]
+
+[[package]]
+name = "alabaster"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" },
+]
+
+[[package]]
+name = "appnope"
+version = "0.1.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" },
+]
+
+[[package]]
+name = "asttokens"
+version = "3.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload-time = "2024-11-30T04:30:14.439Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload-time = "2024-11-30T04:30:10.946Z" },
+]
+
+[[package]]
+name = "attrs"
+version = "25.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" },
+]
+
+[[package]]
+name = "babel"
+version = "2.17.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" },
+]
+
+[[package]]
+name = "backrefs"
+version = "6.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/86/e3/bb3a439d5cb255c4774724810ad8073830fac9c9dee123555820c1bcc806/backrefs-6.1.tar.gz", hash = "sha256:3bba1749aafe1db9b915f00e0dd166cba613b6f788ffd63060ac3485dc9be231", size = 7011962, upload-time = "2025-11-15T14:52:08.323Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/3b/ee/c216d52f58ea75b5e1841022bbae24438b19834a29b163cb32aa3a2a7c6e/backrefs-6.1-py310-none-any.whl", hash = "sha256:2a2ccb96302337ce61ee4717ceacfbf26ba4efb1d55af86564b8bbaeda39cac1", size = 381059, upload-time = "2025-11-15T14:51:59.758Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/9a/8da246d988ded941da96c7ed945d63e94a445637eaad985a0ed88787cb89/backrefs-6.1-py311-none-any.whl", hash = "sha256:e82bba3875ee4430f4de4b6db19429a27275d95a5f3773c57e9e18abc23fd2b7", size = 392854, upload-time = "2025-11-15T14:52:01.194Z" },
+ { url = "https://files.pythonhosted.org/packages/37/c9/fd117a6f9300c62bbc33bc337fd2b3c6bfe28b6e9701de336b52d7a797ad/backrefs-6.1-py312-none-any.whl", hash = "sha256:c64698c8d2269343d88947c0735cb4b78745bd3ba590e10313fbf3f78c34da5a", size = 398770, upload-time = "2025-11-15T14:52:02.584Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/95/7118e935b0b0bd3f94dfec2d852fd4e4f4f9757bdb49850519acd245cd3a/backrefs-6.1-py313-none-any.whl", hash = "sha256:4c9d3dc1e2e558965202c012304f33d4e0e477e1c103663fd2c3cc9bb18b0d05", size = 400726, upload-time = "2025-11-15T14:52:04.093Z" },
+ { url = "https://files.pythonhosted.org/packages/02/e3/a4fa1946722c4c7b063cc25043a12d9ce9b4323777f89643be74cef2993c/backrefs-6.1-py39-none-any.whl", hash = "sha256:a9e99b8a4867852cad177a6430e31b0f6e495d65f8c6c134b68c14c3c95bf4b0", size = 381058, upload-time = "2025-11-15T14:52:06.698Z" },
+]
+
+[[package]]
+name = "beautifulsoup4"
+version = "4.13.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "soupsieve" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload-time = "2025-04-15T17:05:13.836Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload-time = "2025-04-15T17:05:12.221Z" },
+]
+
+[[package]]
+name = "biopython"
+version = "1.85"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/db/ca/1d5fab0fedaf5c2f376d9746d447cdce04241c433602c3861693361ce54c/biopython-1.85.tar.gz", hash = "sha256:5dafab74059de4e78f49f6b5684eddae6e7ce46f09cfa059c1d1339e8b1ea0a6", size = 19909902, upload-time = "2025-01-15T15:06:51.997Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a3/25/e46f05359df7f0049c3adc5eaeb9aee0f5fbde1d959d05c78eb1de8f4d12/biopython-1.85-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc5b981b9e3060db7c355b6145dfe3ce0b6572e1601b31211f6d742b10543874", size = 2789327, upload-time = "2025-01-15T15:13:17.086Z" },
+ { url = "https://files.pythonhosted.org/packages/54/5b/8b3b029c94c63ab4c1781d141615b4a837e658422381d460c5573d5d8262/biopython-1.85-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6fe47d704c2d3afac99aeb461219ec5f00273120d2d99835dc0a9a617f520141", size = 2765805, upload-time = "2025-01-15T15:13:26.92Z" },
+ { url = "https://files.pythonhosted.org/packages/69/0a/9a8a38eff03c4607b9cec8d0e08c76b346b1cee1f77bc6d00efebfc7ec83/biopython-1.85-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54e495239e623660ad367498c2f7a1a294b1997ba603f2ceafb36fd18f0eba6", size = 3249276, upload-time = "2025-01-15T15:13:36.639Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/0d/b7a0f10f5100dcf51ae36ba31490169bfa45617323bd82af43e1fb0098fb/biopython-1.85-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d024ad48997ad53d53a77da24b072aaba8a550bd816af8f2e7e606a9918a3b43", size = 3268869, upload-time = "2025-01-15T15:13:44.009Z" },
+ { url = "https://files.pythonhosted.org/packages/07/51/646a4b7bdb4c1153786a70d33588ed09178bfcdda0542dfdc976294f4312/biopython-1.85-cp312-cp312-win32.whl", hash = "sha256:6985e17a2911defcbd30275a12f5ed5de2765e4bc91a60439740d572fdbfdf43", size = 2787011, upload-time = "2025-01-15T15:13:48.958Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/84/c583fa2ac6e7d392d24ebdc5c99e95e517507de22cf143efb6cf1fc93ff5/biopython-1.85-cp312-cp312-win_amd64.whl", hash = "sha256:d6f8efb2db03f2ec115c5e8c764dbadf635e0c9ecd4c0e91fc8216c1b62f85f5", size = 2820972, upload-time = "2025-01-15T15:13:54.475Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/3f/65814bf221f0bfdd2633830e573ac8594794686f54110571dce98cc32fd3/biopython-1.85-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bae6f17262f20e9587d419ba5683e9dc93a31ee1858b98fa0cff203694d5b786", size = 2789844, upload-time = "2025-01-15T15:14:01.171Z" },
+ { url = "https://files.pythonhosted.org/packages/be/61/1443ce34226e261c20ae4a154b2bab72c109cf31415c92c54c1aada36b00/biopython-1.85-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b1e4918e6399ab0183dd863527fec18b53b7c61b6f0ef95db84b4adfa430ce75", size = 2765767, upload-time = "2025-01-15T15:14:07.096Z" },
+ { url = "https://files.pythonhosted.org/packages/53/51/bec4c763c704e2715691bb087cfab5907804a1bbef5873588698cece1a30/biopython-1.85-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86e487b6fe0f20a2b0138cb53f3d4dc26a7e4060ac4cb6fb1d19e194d445ef46", size = 3248867, upload-time = "2025-01-15T15:14:12.822Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/a4/552f20253a7c95988067c4955831bd17dd9b864fd5c215d15c2f63f2d415/biopython-1.85-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:327184048b5a50634ae0970119bcb8a35b76d7cefb2658a01f772915f2fb7686", size = 3268479, upload-time = "2025-01-15T15:14:20.414Z" },
+ { url = "https://files.pythonhosted.org/packages/97/f4/6dfc6ef3e0997f792f93893551d4a9bf7f6052a70d34f4e1b1e5e4a359f6/biopython-1.85-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66b08905fb1b3f5194f908aaf04bbad474c4e3eaebad6d9f889a04e64dd1faf4", size = 3192338, upload-time = "2025-01-15T15:14:26.843Z" },
+ { url = "https://files.pythonhosted.org/packages/9d/8c/73da6588fab3a7d734118f21ac619c0a949f51d3cf7b1b8343d175c33460/biopython-1.85-cp313-cp313-win32.whl", hash = "sha256:5a236ab1e2797c7dcf1577d80fdaafabead2908bc338eaed0aa1509dab769fef", size = 2787017, upload-time = "2025-01-15T15:14:33.802Z" },
+ { url = "https://files.pythonhosted.org/packages/60/ff/fe8f03ac0ccc7219e0959010750c6ac1a5b1411c91c7f4ec3a37d8313673/biopython-1.85-cp313-cp313-win_amd64.whl", hash = "sha256:1b61593765e9ebdb71d73307d55fd4b46eb976608d329ae6803c084d90ed34c7", size = 2821012, upload-time = "2025-01-15T15:14:40.825Z" },
+]
+
+[[package]]
+name = "bleach"
+version = "6.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "webencodings" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083, upload-time = "2024-10-29T18:30:40.477Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406, upload-time = "2024-10-29T18:30:38.186Z" },
+]
+
+[package.optional-dependencies]
+css = [
+ { name = "tinycss2" },
+]
+
+[[package]]
+name = "boto3"
+version = "1.42.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "botocore" },
+ { name = "jmespath" },
+ { name = "s3transfer" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8b/91/c00b45b5ca95184f7ab6140f586ba7d23074168ee3feae3eaf6954cc11c3/boto3-1.42.5.tar.gz", hash = "sha256:e3b7be255e5e29272b6424af4417005384f5a3f1caf6ca3352258ee1d9b8551a", size = 112754, upload-time = "2025-12-08T20:28:37.546Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a1/3c/e70f47afdaf9172f90e80615f923fbb09f7fb4e5ea89e2d95562ec7f95c2/boto3-1.42.5-py3-none-any.whl", hash = "sha256:7d22cd102c77c37d552783308eeb01a088c0e3f6e707157dd6d1842b205ffce7", size = 140572, upload-time = "2025-12-08T20:28:36.076Z" },
+]
+
+[[package]]
+name = "botocore"
+version = "1.42.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jmespath" },
+ { name = "python-dateutil" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/8c/46/5b40b1deb780869ca9f0c1de47062a78a0494b53d6f9d6bad10fc38eef9d/botocore-1.42.5.tar.gz", hash = "sha256:37bfc487f14286d9795920807fcb8318b940835b18fff6bec5253449f377136f", size = 14851117, upload-time = "2025-12-08T20:28:26.876Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8b/9a/da5e6cabf4da855d182fcdacf3573b69f30899e0e6c3e0d91ce6ad92ce74/botocore-1.42.5-py3-none-any.whl", hash = "sha256:6aa487f1876c881e2143f6a186b7d8faaf042fc05e0ba7421d821f145356a0c9", size = 14525346, upload-time = "2025-12-08T20:28:24.06Z" },
+]
+
+[[package]]
+name = "certifi"
+version = "2025.7.14"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b3/76/52c535bcebe74590f296d6c77c86dabf761c41980e1347a2422e4aa2ae41/certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995", size = 163981, upload-time = "2025-07-14T03:29:28.449Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4f/52/34c6cf5bb9285074dc3531c437b3919e825d976fde097a7a73f79e726d03/certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", size = 162722, upload-time = "2025-07-14T03:29:26.863Z" },
+]
+
+[[package]]
+name = "cffi"
+version = "1.17.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pycparser" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload-time = "2024-09-04T20:44:12.232Z" },
+ { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload-time = "2024-09-04T20:44:13.739Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload-time = "2024-09-04T20:44:15.231Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload-time = "2024-09-04T20:44:17.188Z" },
+ { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload-time = "2024-09-04T20:44:18.688Z" },
+ { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload-time = "2024-09-04T20:44:20.248Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload-time = "2024-09-04T20:44:21.673Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload-time = "2024-09-04T20:44:23.245Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload-time = "2024-09-04T20:44:24.757Z" },
+ { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload-time = "2024-09-04T20:44:26.208Z" },
+ { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload-time = "2024-09-04T20:44:27.578Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload-time = "2024-09-04T20:44:28.956Z" },
+ { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload-time = "2024-09-04T20:44:30.289Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload-time = "2024-09-04T20:44:32.01Z" },
+ { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload-time = "2024-09-04T20:44:33.606Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload-time = "2024-09-04T20:44:35.191Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload-time = "2024-09-04T20:44:36.743Z" },
+ { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload-time = "2024-09-04T20:44:38.492Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload-time = "2024-09-04T20:44:40.046Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload-time = "2024-09-04T20:44:41.616Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload-time = "2024-09-04T20:44:43.733Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" },
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" },
+ { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" },
+ { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload-time = "2025-05-02T08:32:38.803Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload-time = "2025-05-02T08:32:40.251Z" },
+ { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload-time = "2025-05-02T08:32:41.705Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload-time = "2025-05-02T08:32:43.709Z" },
+ { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload-time = "2025-05-02T08:32:46.197Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload-time = "2025-05-02T08:32:48.105Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload-time = "2025-05-02T08:32:49.719Z" },
+ { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" },
+ { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" },
+ { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" },
+ { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" },
+ { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" },
+ { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" },
+ { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" },
+ { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" },
+ { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" },
+]
+
+[[package]]
+name = "click"
+version = "8.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" },
+]
+
+[[package]]
+name = "cloudpathlib"
+version = "0.23.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f4/18/2ac35d6b3015a0c74e923d94fc69baf8307f7c3233de015d69f99e17afa8/cloudpathlib-0.23.0.tar.gz", hash = "sha256:eb38a34c6b8a048ecfd2b2f60917f7cbad4a105b7c979196450c2f541f4d6b4b", size = 53126, upload-time = "2025-10-07T22:47:56.278Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ae/8a/c4bb04426d608be4a3171efa2e233d2c59a5c8937850c10d098e126df18e/cloudpathlib-0.23.0-py3-none-any.whl", hash = "sha256:8520b3b01468fee77de37ab5d50b1b524ea6b4a8731c35d1b7407ac0cd716002", size = 62755, upload-time = "2025-10-07T22:47:54.905Z" },
+]
+
+[package.optional-dependencies]
+s3 = [
+ { name = "boto3" },
+]
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
+]
+
+[[package]]
+name = "comm"
+version = "0.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" },
+]
+
+[[package]]
+name = "commonmark"
+version = "0.9.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/60/48/a60f593447e8f0894ebb7f6e6c1f25dafc5e89c5879fdc9360ae93ff83f0/commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60", size = 95764, upload-time = "2019-10-04T15:37:39.817Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b1/92/dfd892312d822f36c55366118b95d914e5f16de11044a27cf10a7d71bbbf/commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9", size = 51068, upload-time = "2019-10-04T15:37:37.674Z" },
+]
+
+[[package]]
+name = "contourpy"
+version = "1.3.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" },
+ { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" },
+ { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" },
+ { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" },
+ { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" },
+ { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" },
+ { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" },
+ { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" },
+ { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" },
+ { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" },
+ { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" },
+ { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" },
+ { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" },
+ { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" },
+ { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" },
+ { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" },
+ { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" },
+]
+
+[[package]]
+name = "coverage"
+version = "7.13.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b6/45/2c665ca77ec32ad67e25c77daf1cee28ee4558f3bc571cdbaf88a00b9f23/coverage-7.13.0.tar.gz", hash = "sha256:a394aa27f2d7ff9bc04cf703817773a59ad6dfbd577032e690f961d2460ee936", size = 820905, upload-time = "2025-12-08T13:14:38.055Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9b/f1/2619559f17f31ba00fc40908efd1fbf1d0a5536eb75dc8341e7d660a08de/coverage-7.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0b3d67d31383c4c68e19a88e28fc4c2e29517580f1b0ebec4a069d502ce1e0bf", size = 218274, upload-time = "2025-12-08T13:12:52.095Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/11/30d71ae5d6e949ff93b2a79a2c1b4822e00423116c5c6edfaeef37301396/coverage-7.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:581f086833d24a22c89ae0fe2142cfaa1c92c930adf637ddf122d55083fb5a0f", size = 218638, upload-time = "2025-12-08T13:12:53.418Z" },
+ { url = "https://files.pythonhosted.org/packages/79/c2/fce80fc6ded8d77e53207489d6065d0fed75db8951457f9213776615e0f5/coverage-7.13.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0a3a30f0e257df382f5f9534d4ce3d4cf06eafaf5192beb1a7bd066cb10e78fb", size = 250129, upload-time = "2025-12-08T13:12:54.744Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/b6/51b5d1eb6fcbb9a1d5d6984e26cbe09018475c2922d554fd724dd0f056ee/coverage-7.13.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:583221913fbc8f53b88c42e8dbb8fca1d0f2e597cb190ce45916662b8b9d9621", size = 252885, upload-time = "2025-12-08T13:12:56.401Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/f8/972a5affea41de798691ab15d023d3530f9f56a72e12e243f35031846ff7/coverage-7.13.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f5d9bd30756fff3e7216491a0d6d520c448d5124d3d8e8f56446d6412499e74", size = 253974, upload-time = "2025-12-08T13:12:57.718Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/56/116513aee860b2c7968aa3506b0f59b22a959261d1dbf3aea7b4450a7520/coverage-7.13.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a23e5a1f8b982d56fa64f8e442e037f6ce29322f1f9e6c2344cd9e9f4407ee57", size = 250538, upload-time = "2025-12-08T13:12:59.254Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/75/074476d64248fbadf16dfafbf93fdcede389ec821f74ca858d7c87d2a98c/coverage-7.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b01c22bc74a7fb44066aaf765224c0d933ddf1f5047d6cdfe4795504a4493f8", size = 251912, upload-time = "2025-12-08T13:13:00.604Z" },
+ { url = "https://files.pythonhosted.org/packages/f2/d2/aa4f8acd1f7c06024705c12609d8698c51b27e4d635d717cd1934c9668e2/coverage-7.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:898cce66d0836973f48dda4e3514d863d70142bdf6dfab932b9b6a90ea5b222d", size = 250054, upload-time = "2025-12-08T13:13:01.892Z" },
+ { url = "https://files.pythonhosted.org/packages/19/98/8df9e1af6a493b03694a1e8070e024e7d2cdc77adedc225a35e616d505de/coverage-7.13.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:3ab483ea0e251b5790c2aac03acde31bff0c736bf8a86829b89382b407cd1c3b", size = 249619, upload-time = "2025-12-08T13:13:03.236Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/71/f8679231f3353018ca66ef647fa6fe7b77e6bff7845be54ab84f86233363/coverage-7.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d84e91521c5e4cb6602fe11ece3e1de03b2760e14ae4fcf1a4b56fa3c801fcd", size = 251496, upload-time = "2025-12-08T13:13:04.511Z" },
+ { url = "https://files.pythonhosted.org/packages/04/86/9cb406388034eaf3c606c22094edbbb82eea1fa9d20c0e9efadff20d0733/coverage-7.13.0-cp312-cp312-win32.whl", hash = "sha256:193c3887285eec1dbdb3f2bd7fbc351d570ca9c02ca756c3afbc71b3c98af6ef", size = 220808, upload-time = "2025-12-08T13:13:06.422Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/59/af483673df6455795daf5f447c2f81a3d2fcfc893a22b8ace983791f6f34/coverage-7.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:4f3e223b2b2db5e0db0c2b97286aba0036ca000f06aca9b12112eaa9af3d92ae", size = 221616, upload-time = "2025-12-08T13:13:07.95Z" },
+ { url = "https://files.pythonhosted.org/packages/64/b0/959d582572b30a6830398c60dd419c1965ca4b5fb38ac6b7093a0d50ca8d/coverage-7.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:086cede306d96202e15a4b77ace8472e39d9f4e5f9fd92dd4fecdfb2313b2080", size = 220261, upload-time = "2025-12-08T13:13:09.581Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/cc/bce226595eb3bf7d13ccffe154c3c487a22222d87ff018525ab4dd2e9542/coverage-7.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:28ee1c96109974af104028a8ef57cec21447d42d0e937c0275329272e370ebcf", size = 218297, upload-time = "2025-12-08T13:13:10.977Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/9f/73c4d34600aae03447dff3d7ad1d0ac649856bfb87d1ca7d681cfc913f9e/coverage-7.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d1e97353dcc5587b85986cda4ff3ec98081d7e84dd95e8b2a6d59820f0545f8a", size = 218673, upload-time = "2025-12-08T13:13:12.562Z" },
+ { url = "https://files.pythonhosted.org/packages/63/ab/8fa097db361a1e8586535ae5073559e6229596b3489ec3ef2f5b38df8cb2/coverage-7.13.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:99acd4dfdfeb58e1937629eb1ab6ab0899b131f183ee5f23e0b5da5cba2fec74", size = 249652, upload-time = "2025-12-08T13:13:13.909Z" },
+ { url = "https://files.pythonhosted.org/packages/90/3a/9bfd4de2ff191feb37ef9465855ca56a6f2f30a3bca172e474130731ac3d/coverage-7.13.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ff45e0cd8451e293b63ced93161e189780baf444119391b3e7d25315060368a6", size = 252251, upload-time = "2025-12-08T13:13:15.553Z" },
+ { url = "https://files.pythonhosted.org/packages/df/61/b5d8105f016e1b5874af0d7c67542da780ccd4a5f2244a433d3e20ceb1ad/coverage-7.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b", size = 253492, upload-time = "2025-12-08T13:13:16.849Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/b8/0fad449981803cc47a4694768b99823fb23632150743f9c83af329bb6090/coverage-7.13.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:11c21557d0e0a5a38632cbbaca5f008723b26a89d70db6315523df6df77d6232", size = 249850, upload-time = "2025-12-08T13:13:18.142Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/e9/8d68337c3125014d918cf4327d5257553a710a2995a6a6de2ac77e5aa429/coverage-7.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76541dc8d53715fb4f7a3a06b34b0dc6846e3c69bc6204c55653a85dd6220971", size = 251633, upload-time = "2025-12-08T13:13:19.56Z" },
+ { url = "https://files.pythonhosted.org/packages/55/14/d4112ab26b3a1bc4b3c1295d8452dcf399ed25be4cf649002fb3e64b2d93/coverage-7.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6e9e451dee940a86789134b6b0ffbe31c454ade3b849bb8a9d2cca2541a8e91d", size = 249586, upload-time = "2025-12-08T13:13:20.883Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/a9/22b0000186db663b0d82f86c2f1028099ae9ac202491685051e2a11a5218/coverage-7.13.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5c67dace46f361125e6b9cace8fe0b729ed8479f47e70c89b838d319375c8137", size = 249412, upload-time = "2025-12-08T13:13:22.22Z" },
+ { url = "https://files.pythonhosted.org/packages/a1/2e/42d8e0d9e7527fba439acdc6ed24a2b97613b1dc85849b1dd935c2cffef0/coverage-7.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f59883c643cb19630500f57016f76cfdcd6845ca8c5b5ea1f6e17f74c8e5f511", size = 251191, upload-time = "2025-12-08T13:13:23.899Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/af/8c7af92b1377fd8860536aadd58745119252aaaa71a5213e5a8e8007a9f5/coverage-7.13.0-cp313-cp313-win32.whl", hash = "sha256:58632b187be6f0be500f553be41e277712baa278147ecb7559983c6d9faf7ae1", size = 220829, upload-time = "2025-12-08T13:13:25.182Z" },
+ { url = "https://files.pythonhosted.org/packages/58/f9/725e8bf16f343d33cbe076c75dc8370262e194ff10072c0608b8e5cf33a3/coverage-7.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:73419b89f812f498aca53f757dd834919b48ce4799f9d5cad33ca0ae442bdb1a", size = 221640, upload-time = "2025-12-08T13:13:26.836Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/ff/e98311000aa6933cc79274e2b6b94a2fe0fe3434fca778eba82003675496/coverage-7.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:eb76670874fdd6091eedcc856128ee48c41a9bbbb9c3f1c7c3cf169290e3ffd6", size = 220269, upload-time = "2025-12-08T13:13:28.116Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/cf/bbaa2e1275b300343ea865f7d424cc0a2e2a1df6925a070b2b2d5d765330/coverage-7.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6e63ccc6e0ad8986386461c3c4b737540f20426e7ec932f42e030320896c311a", size = 218990, upload-time = "2025-12-08T13:13:29.463Z" },
+ { url = "https://files.pythonhosted.org/packages/21/1d/82f0b3323b3d149d7672e7744c116e9c170f4957e0c42572f0366dbb4477/coverage-7.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:494f5459ffa1bd45e18558cd98710c36c0b8fbfa82a5eabcbe671d80ecffbfe8", size = 219340, upload-time = "2025-12-08T13:13:31.524Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/e3/fe3fd4702a3832a255f4d43013eacb0ef5fc155a5960ea9269d8696db28b/coverage-7.13.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:06cac81bf10f74034e055e903f5f946e3e26fc51c09fc9f584e4a1605d977053", size = 260638, upload-time = "2025-12-08T13:13:32.965Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/01/63186cb000307f2b4da463f72af9b85d380236965574c78e7e27680a2593/coverage-7.13.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f2ffc92b46ed6e6760f1d47a71e56b5664781bc68986dbd1836b2b70c0ce2071", size = 262705, upload-time = "2025-12-08T13:13:34.378Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/a1/c0dacef0cc865f2455d59eed3548573ce47ed603205ffd0735d1d78b5906/coverage-7.13.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0602f701057c6823e5db1b74530ce85f17c3c5be5c85fc042ac939cbd909426e", size = 265125, upload-time = "2025-12-08T13:13:35.73Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/92/82b99223628b61300bd382c205795533bed021505eab6dd86e11fb5d7925/coverage-7.13.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:25dc33618d45456ccb1d37bce44bc78cf269909aa14c4db2e03d63146a8a1493", size = 259844, upload-time = "2025-12-08T13:13:37.69Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/2c/89b0291ae4e6cd59ef042708e1c438e2290f8c31959a20055d8768349ee2/coverage-7.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:71936a8b3b977ddd0b694c28c6a34f4fff2e9dd201969a4ff5d5fc7742d614b0", size = 262700, upload-time = "2025-12-08T13:13:39.525Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/f9/a5f992efae1996245e796bae34ceb942b05db275e4b34222a9a40b9fbd3b/coverage-7.13.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:936bc20503ce24770c71938d1369461f0c5320830800933bc3956e2a4ded930e", size = 260321, upload-time = "2025-12-08T13:13:41.172Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/89/a29f5d98c64fedbe32e2ac3c227fbf78edc01cc7572eee17d61024d89889/coverage-7.13.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:af0a583efaacc52ae2521f8d7910aff65cdb093091d76291ac5820d5e947fc1c", size = 259222, upload-time = "2025-12-08T13:13:43.282Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/c3/940fe447aae302a6701ee51e53af7e08b86ff6eed7631e5740c157ee22b9/coverage-7.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f1c23e24a7000da892a312fb17e33c5f94f8b001de44b7cf8ba2e36fbd15859e", size = 261411, upload-time = "2025-12-08T13:13:44.72Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/31/12a4aec689cb942a89129587860ed4d0fd522d5fda81237147fde554b8ae/coverage-7.13.0-cp313-cp313t-win32.whl", hash = "sha256:5f8a0297355e652001015e93be345ee54393e45dc3050af4a0475c5a2b767d46", size = 221505, upload-time = "2025-12-08T13:13:46.332Z" },
+ { url = "https://files.pythonhosted.org/packages/65/8c/3b5fe3259d863572d2b0827642c50c3855d26b3aefe80bdc9eba1f0af3b0/coverage-7.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6abb3a4c52f05e08460bd9acf04fec027f8718ecaa0d09c40ffbc3fbd70ecc39", size = 222569, upload-time = "2025-12-08T13:13:47.79Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/39/f71fa8316a96ac72fc3908839df651e8eccee650001a17f2c78cdb355624/coverage-7.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:3ad968d1e3aa6ce5be295ab5fe3ae1bf5bb4769d0f98a80a0252d543a2ef2e9e", size = 220841, upload-time = "2025-12-08T13:13:49.243Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/4c/1968f32fb9a2604645827e11ff84a31e59d532e01995f904723b4f5328b3/coverage-7.13.0-py3-none-any.whl", hash = "sha256:850d2998f380b1e266459ca5b47bc9e7daf9af1d070f66317972f382d46f1904", size = 210068, upload-time = "2025-12-08T13:14:36.236Z" },
+]
+
+[[package]]
+name = "cycler"
+version = "0.12.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" },
+]
+
+[[package]]
+name = "debugpy"
+version = "1.8.15"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/3a9a28ddb750a76eaec445c7f4d3147ea2c579a97dbd9e25d39001b92b21/debugpy-1.8.15.tar.gz", hash = "sha256:58d7a20b7773ab5ee6bdfb2e6cf622fdf1e40c9d5aef2857d85391526719ac00", size = 1643279, upload-time = "2025-07-15T16:43:29.135Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ab/4a/4508d256e52897f5cdfee6a6d7580974811e911c6d01321df3264508a5ac/debugpy-1.8.15-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:3dcc7225cb317469721ab5136cda9ff9c8b6e6fb43e87c9e15d5b108b99d01ba", size = 2511197, upload-time = "2025-07-15T16:43:42.343Z" },
+ { url = "https://files.pythonhosted.org/packages/99/8d/7f6ef1097e7fecf26b4ef72338d08e41644a41b7ee958a19f494ffcffc29/debugpy-1.8.15-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:047a493ca93c85ccede1dbbaf4e66816794bdc214213dde41a9a61e42d27f8fc", size = 4229517, upload-time = "2025-07-15T16:43:44.14Z" },
+ { url = "https://files.pythonhosted.org/packages/3f/e8/e8c6a9aa33a9c9c6dacbf31747384f6ed2adde4de2e9693c766bdf323aa3/debugpy-1.8.15-cp312-cp312-win32.whl", hash = "sha256:b08e9b0bc260cf324c890626961dad4ffd973f7568fbf57feb3c3a65ab6b6327", size = 5276132, upload-time = "2025-07-15T16:43:45.529Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/ad/231050c6177b3476b85fcea01e565dac83607b5233d003ff067e2ee44d8f/debugpy-1.8.15-cp312-cp312-win_amd64.whl", hash = "sha256:e2a4fe357c92334272eb2845fcfcdbec3ef9f22c16cf613c388ac0887aed15fa", size = 5317645, upload-time = "2025-07-15T16:43:46.968Z" },
+ { url = "https://files.pythonhosted.org/packages/28/70/2928aad2310726d5920b18ed9f54b9f06df5aa4c10cf9b45fa18ff0ab7e8/debugpy-1.8.15-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:f5e01291ad7d6649aed5773256c5bba7a1a556196300232de1474c3c372592bf", size = 2495538, upload-time = "2025-07-15T16:43:48.927Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/c6/9b8ffb4ca91fac8b2877eef63c9cc0e87dd2570b1120054c272815ec4cd0/debugpy-1.8.15-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94dc0f0d00e528d915e0ce1c78e771475b2335b376c49afcc7382ee0b146bab6", size = 4221874, upload-time = "2025-07-15T16:43:50.282Z" },
+ { url = "https://files.pythonhosted.org/packages/55/8a/9b8d59674b4bf489318c7c46a1aab58e606e583651438084b7e029bf3c43/debugpy-1.8.15-cp313-cp313-win32.whl", hash = "sha256:fcf0748d4f6e25f89dc5e013d1129ca6f26ad4da405e0723a4f704583896a709", size = 5275949, upload-time = "2025-07-15T16:43:52.079Z" },
+ { url = "https://files.pythonhosted.org/packages/72/83/9e58e6fdfa8710a5e6ec06c2401241b9ad48b71c0a7eb99570a1f1edb1d3/debugpy-1.8.15-cp313-cp313-win_amd64.whl", hash = "sha256:73c943776cb83e36baf95e8f7f8da765896fd94b05991e7bc162456d25500683", size = 5317720, upload-time = "2025-07-15T16:43:53.703Z" },
+ { url = "https://files.pythonhosted.org/packages/07/d5/98748d9860e767a1248b5e31ffa7ce8cb7006e97bf8abbf3d891d0a8ba4e/debugpy-1.8.15-py2.py3-none-any.whl", hash = "sha256:bce2e6c5ff4f2e00b98d45e7e01a49c7b489ff6df5f12d881c67d2f1ac635f3d", size = 5282697, upload-time = "2025-07-15T16:44:07.996Z" },
+]
+
+[[package]]
+name = "decorator"
+version = "5.2.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" },
+]
+
+[[package]]
+name = "defusedxml"
+version = "0.7.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" },
+]
+
+[[package]]
+name = "docutils"
+version = "0.21.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" },
+]
+
+[[package]]
+name = "executing"
+version = "2.2.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693, upload-time = "2025-01-22T15:41:29.403Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702, upload-time = "2025-01-22T15:41:25.929Z" },
+]
+
+[[package]]
+name = "fastjsonschema"
+version = "2.21.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939, upload-time = "2024-12-02T10:55:15.133Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924, upload-time = "2024-12-02T10:55:07.599Z" },
+]
+
+[[package]]
+name = "fonttools"
+version = "4.59.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/8a/27/ec3c723bfdf86f34c5c82bf6305df3e0f0d8ea798d2d3a7cb0c0a866d286/fonttools-4.59.0.tar.gz", hash = "sha256:be392ec3529e2f57faa28709d60723a763904f71a2b63aabe14fee6648fe3b14", size = 3532521, upload-time = "2025-07-16T12:04:54.613Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e2/77/b1c8af22f4265e951cd2e5535dbef8859efcef4fb8dee742d368c967cddb/fonttools-4.59.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f9b3a78f69dcbd803cf2fb3f972779875b244c1115481dfbdd567b2c22b31f6b", size = 2767562, upload-time = "2025-07-16T12:04:06.895Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/5a/aeb975699588176bb357e8b398dfd27e5d3a2230d92b81ab8cbb6187358d/fonttools-4.59.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:57bb7e26928573ee7c6504f54c05860d867fd35e675769f3ce01b52af38d48e2", size = 2335168, upload-time = "2025-07-16T12:04:08.695Z" },
+ { url = "https://files.pythonhosted.org/packages/54/97/c6101a7e60ae138c4ef75b22434373a0da50a707dad523dd19a4889315bf/fonttools-4.59.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4536f2695fe5c1ffb528d84a35a7d3967e5558d2af58b4775e7ab1449d65767b", size = 4909850, upload-time = "2025-07-16T12:04:10.761Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/6c/fa4d18d641054f7bff878cbea14aa9433f292b9057cb1700d8e91a4d5f4f/fonttools-4.59.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:885bde7d26e5b40e15c47bd5def48b38cbd50830a65f98122a8fb90962af7cd1", size = 4955131, upload-time = "2025-07-16T12:04:12.846Z" },
+ { url = "https://files.pythonhosted.org/packages/20/5c/331947fc1377deb928a69bde49f9003364f5115e5cbe351eea99e39412a2/fonttools-4.59.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6801aeddb6acb2c42eafa45bc1cb98ba236871ae6f33f31e984670b749a8e58e", size = 4899667, upload-time = "2025-07-16T12:04:14.558Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/46/b66469dfa26b8ff0baa7654b2cc7851206c6d57fe3abdabbaab22079a119/fonttools-4.59.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:31003b6a10f70742a63126b80863ab48175fb8272a18ca0846c0482968f0588e", size = 5051349, upload-time = "2025-07-16T12:04:16.388Z" },
+ { url = "https://files.pythonhosted.org/packages/2e/05/ebfb6b1f3a4328ab69787d106a7d92ccde77ce66e98659df0f9e3f28d93d/fonttools-4.59.0-cp312-cp312-win32.whl", hash = "sha256:fbce6dae41b692a5973d0f2158f782b9ad05babc2c2019a970a1094a23909b1b", size = 2201315, upload-time = "2025-07-16T12:04:18.557Z" },
+ { url = "https://files.pythonhosted.org/packages/09/45/d2bdc9ea20bbadec1016fd0db45696d573d7a26d95ab5174ffcb6d74340b/fonttools-4.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:332bfe685d1ac58ca8d62b8d6c71c2e52a6c64bc218dc8f7825c9ea51385aa01", size = 2249408, upload-time = "2025-07-16T12:04:20.489Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/bb/390990e7c457d377b00890d9f96a3ca13ae2517efafb6609c1756e213ba4/fonttools-4.59.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:78813b49d749e1bb4db1c57f2d4d7e6db22c253cb0a86ad819f5dc197710d4b2", size = 2758704, upload-time = "2025-07-16T12:04:22.217Z" },
+ { url = "https://files.pythonhosted.org/packages/df/6f/d730d9fcc9b410a11597092bd2eb9ca53e5438c6cb90e4b3047ce1b723e9/fonttools-4.59.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:401b1941ce37e78b8fd119b419b617277c65ae9417742a63282257434fd68ea2", size = 2330764, upload-time = "2025-07-16T12:04:23.985Z" },
+ { url = "https://files.pythonhosted.org/packages/75/b4/b96bb66f6f8cc4669de44a158099b249c8159231d254ab6b092909388be5/fonttools-4.59.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:efd7e6660674e234e29937bc1481dceb7e0336bfae75b856b4fb272b5093c5d4", size = 4890699, upload-time = "2025-07-16T12:04:25.664Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/57/7969af50b26408be12baa317c6147588db5b38af2759e6df94554dbc5fdb/fonttools-4.59.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51ab1ff33c19e336c02dee1e9fd1abd974a4ca3d8f7eef2a104d0816a241ce97", size = 4952934, upload-time = "2025-07-16T12:04:27.733Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/e2/dd968053b6cf1f46c904f5bd409b22341477c017d8201619a265e50762d3/fonttools-4.59.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a9bf8adc9e1f3012edc8f09b08336272aec0c55bc677422273e21280db748f7c", size = 4892319, upload-time = "2025-07-16T12:04:30.074Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/95/a59810d8eda09129f83467a4e58f84205dc6994ebaeb9815406363e07250/fonttools-4.59.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37e01c6ec0c98599778c2e688350d624fa4770fbd6144551bd5e032f1199171c", size = 5034753, upload-time = "2025-07-16T12:04:32.292Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/84/51a69ee89ff8d1fea0c6997e946657e25a3f08513de8435fe124929f3eef/fonttools-4.59.0-cp313-cp313-win32.whl", hash = "sha256:70d6b3ceaa9cc5a6ac52884f3b3d9544e8e231e95b23f138bdb78e6d4dc0eae3", size = 2199688, upload-time = "2025-07-16T12:04:34.444Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/ee/f626cd372932d828508137a79b85167fdcf3adab2e3bed433f295c596c6a/fonttools-4.59.0-cp313-cp313-win_amd64.whl", hash = "sha256:26731739daa23b872643f0e4072d5939960237d540c35c14e6a06d47d71ca8fe", size = 2248560, upload-time = "2025-07-16T12:04:36.034Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/9c/df0ef2c51845a13043e5088f7bb988ca6cd5bb82d5d4203d6a158aa58cf2/fonttools-4.59.0-py3-none-any.whl", hash = "sha256:241313683afd3baacb32a6bd124d0bce7404bc5280e12e291bae1b9bba28711d", size = 1128050, upload-time = "2025-07-16T12:04:52.687Z" },
+]
+
+[[package]]
+name = "ghp-import"
+version = "2.1.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "python-dateutil" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" },
+]
+
+[[package]]
+name = "gopher-enrich"
+source = { editable = "." }
+dependencies = [
+ { name = "biopython" },
+ { name = "cloudpathlib", extra = ["s3"] },
+ { name = "numba" },
+ { name = "numpy" },
+ { name = "pandas" },
+ { name = "requests" },
+ { name = "scipy" },
+ { name = "seaborn" },
+ { name = "statsmodels" },
+ { name = "tqdm" },
+]
+
+[package.optional-dependencies]
+docs = [
+ { name = "ipykernel" },
+ { name = "nbsphinx" },
+ { name = "numpydoc" },
+ { name = "pydata-sphinx-theme" },
+ { name = "recommonmark" },
+ { name = "sphinx-argparse" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "ipykernel" },
+ { name = "mkdocs" },
+ { name = "mkdocs-jupyter" },
+ { name = "mkdocs-material" },
+ { name = "mkdocstrings", extra = ["python"] },
+ { name = "pytest" },
+ { name = "pytest-cov" },
+ { name = "python-markdown-math" },
+ { name = "ruff" },
+]
+
+[package.metadata]
+requires-dist = [
+ { name = "biopython" },
+ { name = "cloudpathlib", extras = ["s3"], specifier = ">=0.23.0" },
+ { name = "ipykernel", marker = "extra == 'docs'", specifier = ">=5.3.0" },
+ { name = "nbsphinx", marker = "extra == 'docs'", specifier = ">=0.7.1" },
+ { name = "numba" },
+ { name = "numpy", specifier = ">=2.0" },
+ { name = "numpydoc", marker = "extra == 'docs'", specifier = ">=1.0.0" },
+ { name = "pandas" },
+ { name = "pydata-sphinx-theme", marker = "extra == 'docs'", specifier = ">=0.4.3" },
+ { name = "recommonmark", marker = "extra == 'docs'", specifier = ">=0.5.0" },
+ { name = "requests" },
+ { name = "scipy", specifier = ">=1.7.1" },
+ { name = "seaborn" },
+ { name = "sphinx-argparse", marker = "extra == 'docs'", specifier = ">=0.2.5" },
+ { name = "statsmodels" },
+ { name = "tqdm", specifier = ">=4.67.1" },
+]
+provides-extras = ["docs"]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "ipykernel", specifier = ">=6.30.0" },
+ { name = "mkdocs", specifier = ">=1.6.1" },
+ { name = "mkdocs-jupyter", specifier = ">=0.25.1" },
+ { name = "mkdocs-material", specifier = ">=9.7.0" },
+ { name = "mkdocstrings", extras = ["python"], specifier = ">=1.0.0" },
+ { name = "pytest", specifier = ">=8.4.1" },
+ { name = "pytest-cov", specifier = ">=7.0.0" },
+ { name = "python-markdown-math", specifier = ">=0.9" },
+ { name = "ruff", specifier = ">=0.12.7" },
+]
+
+[[package]]
+name = "griffe"
+version = "1.15.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/0d/0c/3a471b6e31951dce2360477420d0a8d1e00dea6cf33b70f3e8c3ab6e28e1/griffe-1.15.0.tar.gz", hash = "sha256:7726e3afd6f298fbc3696e67958803e7ac843c1cfe59734b6251a40cdbfb5eea", size = 424112, upload-time = "2025-11-10T15:03:15.52Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9c/83/3b1d03d36f224edded98e9affd0467630fc09d766c0e56fb1498cbb04a9b/griffe-1.15.0-py3-none-any.whl", hash = "sha256:6f6762661949411031f5fcda9593f586e6ce8340f0ba88921a0f2ef7a81eb9a3", size = 150705, upload-time = "2025-11-10T15:03:13.549Z" },
+]
+
+[[package]]
+name = "idna"
+version = "3.10"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" },
+]
+
+[[package]]
+name = "imagesize"
+version = "1.4.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload-time = "2022-07-01T12:21:05.687Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload-time = "2022-07-01T12:21:02.467Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" },
+]
+
+[[package]]
+name = "ipykernel"
+version = "6.30.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "appnope", marker = "sys_platform == 'darwin'" },
+ { name = "comm" },
+ { name = "debugpy" },
+ { name = "ipython" },
+ { name = "jupyter-client" },
+ { name = "jupyter-core" },
+ { name = "matplotlib-inline" },
+ { name = "nest-asyncio" },
+ { name = "packaging" },
+ { name = "psutil" },
+ { name = "pyzmq" },
+ { name = "tornado" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/38/27/9e6e30ed92f2ac53d29f70b09da8b2dc456e256148e289678fa0e825f46a/ipykernel-6.30.0.tar.gz", hash = "sha256:b7b808ddb2d261aae2df3a26ff3ff810046e6de3dfbc6f7de8c98ea0a6cb632c", size = 165125, upload-time = "2025-07-21T10:36:09.259Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/1f/3d/00813c3d9b46e3dcd88bd4530e0a3c63c0509e5d8c9eff34723ea243ab04/ipykernel-6.30.0-py3-none-any.whl", hash = "sha256:fd2936e55c4a1c2ee8b1e5fa6a372b8eecc0ab1338750dee76f48fa5cca1301e", size = 117264, upload-time = "2025-07-21T10:36:06.854Z" },
+]
+
+[[package]]
+name = "ipython"
+version = "9.4.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "decorator" },
+ { name = "ipython-pygments-lexers" },
+ { name = "jedi" },
+ { name = "matplotlib-inline" },
+ { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
+ { name = "prompt-toolkit" },
+ { name = "pygments" },
+ { name = "stack-data" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338, upload-time = "2025-07-01T11:11:30.606Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021, upload-time = "2025-07-01T11:11:27.85Z" },
+]
+
+[[package]]
+name = "ipython-pygments-lexers"
+version = "1.1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" },
+]
+
+[[package]]
+name = "jedi"
+version = "0.19.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "parso" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" },
+]
+
+[[package]]
+name = "jinja2"
+version = "3.1.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markupsafe" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" },
+]
+
+[[package]]
+name = "jmespath"
+version = "1.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843, upload-time = "2022-06-17T18:00:12.224Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256, upload-time = "2022-06-17T18:00:10.251Z" },
+]
+
+[[package]]
+name = "jsonschema"
+version = "4.25.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "attrs" },
+ { name = "jsonschema-specifications" },
+ { name = "referencing" },
+ { name = "rpds-py" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d5/00/a297a868e9d0784450faa7365c2172a7d6110c763e30ba861867c32ae6a9/jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f", size = 356830, upload-time = "2025-07-18T15:39:45.11Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fe/54/c86cd8e011fe98803d7e382fd67c0df5ceab8d2b7ad8c5a81524f791551c/jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716", size = 89184, upload-time = "2025-07-18T15:39:42.956Z" },
+]
+
+[[package]]
+name = "jsonschema-specifications"
+version = "2025.4.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "referencing" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513, upload-time = "2025-04-23T12:34:07.418Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload-time = "2025-04-23T12:34:05.422Z" },
+]
+
+[[package]]
+name = "jupyter-client"
+version = "8.6.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jupyter-core" },
+ { name = "python-dateutil" },
+ { name = "pyzmq" },
+ { name = "tornado" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload-time = "2024-09-17T10:44:17.613Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload-time = "2024-09-17T10:44:15.218Z" },
+]
+
+[[package]]
+name = "jupyter-core"
+version = "5.8.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "platformdirs" },
+ { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923, upload-time = "2025-05-27T07:38:16.655Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880, upload-time = "2025-05-27T07:38:15.137Z" },
+]
+
+[[package]]
+name = "jupyterlab-pygments"
+version = "0.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" },
+]
+
+[[package]]
+name = "jupytext"
+version = "1.18.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "mdit-py-plugins" },
+ { name = "nbformat" },
+ { name = "packaging" },
+ { name = "pyyaml" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9b/5d/82a614a49493fa84b2019a3e03020a8b9927208ae177b81f7e0b30330c82/jupytext-1.18.1.tar.gz", hash = "sha256:5c0962ca8d222db45cbe1848b4805dbbe3ddb957603fc96651b6cd7fd403fafb", size = 4270997, upload-time = "2025-10-19T15:06:30.992Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/bd/0d/2d240e7098e0cafba4d25e9530e7596b1bb1bd4476e41b10346bcaaa36d6/jupytext-1.18.1-py3-none-any.whl", hash = "sha256:24f999400726a1c658beae55e15fdd2a6255ab1a418697864cd779874e6011ab", size = 167143, upload-time = "2025-10-19T15:06:28.975Z" },
+]
+
+[[package]]
+name = "kiwisolver"
+version = "1.4.8"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538, upload-time = "2024-12-24T18:30:51.519Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152, upload-time = "2024-12-24T18:29:16.85Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555, upload-time = "2024-12-24T18:29:19.146Z" },
+ { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067, upload-time = "2024-12-24T18:29:20.096Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443, upload-time = "2024-12-24T18:29:22.843Z" },
+ { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728, upload-time = "2024-12-24T18:29:24.463Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388, upload-time = "2024-12-24T18:29:25.776Z" },
+ { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849, upload-time = "2024-12-24T18:29:27.202Z" },
+ { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533, upload-time = "2024-12-24T18:29:28.638Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898, upload-time = "2024-12-24T18:29:30.368Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605, upload-time = "2024-12-24T18:29:33.151Z" },
+ { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801, upload-time = "2024-12-24T18:29:34.584Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077, upload-time = "2024-12-24T18:29:36.138Z" },
+ { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410, upload-time = "2024-12-24T18:29:39.991Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853, upload-time = "2024-12-24T18:29:42.006Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424, upload-time = "2024-12-24T18:29:44.38Z" },
+ { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156, upload-time = "2024-12-24T18:29:45.368Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555, upload-time = "2024-12-24T18:29:46.37Z" },
+ { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071, upload-time = "2024-12-24T18:29:47.333Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053, upload-time = "2024-12-24T18:29:49.636Z" },
+ { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278, upload-time = "2024-12-24T18:29:51.164Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139, upload-time = "2024-12-24T18:29:52.594Z" },
+ { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517, upload-time = "2024-12-24T18:29:53.941Z" },
+ { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952, upload-time = "2024-12-24T18:29:56.523Z" },
+ { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132, upload-time = "2024-12-24T18:29:57.989Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997, upload-time = "2024-12-24T18:29:59.393Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060, upload-time = "2024-12-24T18:30:01.338Z" },
+ { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471, upload-time = "2024-12-24T18:30:04.574Z" },
+ { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793, upload-time = "2024-12-24T18:30:06.25Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855, upload-time = "2024-12-24T18:30:07.535Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430, upload-time = "2024-12-24T18:30:08.504Z" },
+ { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294, upload-time = "2024-12-24T18:30:09.508Z" },
+ { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736, upload-time = "2024-12-24T18:30:11.039Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194, upload-time = "2024-12-24T18:30:14.886Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942, upload-time = "2024-12-24T18:30:18.927Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341, upload-time = "2024-12-24T18:30:22.102Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455, upload-time = "2024-12-24T18:30:24.947Z" },
+ { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138, upload-time = "2024-12-24T18:30:26.286Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857, upload-time = "2024-12-24T18:30:28.86Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129, upload-time = "2024-12-24T18:30:30.34Z" },
+ { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538, upload-time = "2024-12-24T18:30:33.334Z" },
+ { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661, upload-time = "2024-12-24T18:30:34.939Z" },
+ { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710, upload-time = "2024-12-24T18:30:37.281Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213, upload-time = "2024-12-24T18:30:40.019Z" },
+]
+
+[[package]]
+name = "llvmlite"
+version = "0.44.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/89/6a/95a3d3610d5c75293d5dbbb2a76480d5d4eeba641557b69fe90af6c5b84e/llvmlite-0.44.0.tar.gz", hash = "sha256:07667d66a5d150abed9157ab6c0b9393c9356f229784a4385c02f99e94fc94d4", size = 171880, upload-time = "2025-01-20T11:14:41.342Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/15/86/e3c3195b92e6e492458f16d233e58a1a812aa2bfbef9bdd0fbafcec85c60/llvmlite-0.44.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:1d671a56acf725bf1b531d5ef76b86660a5ab8ef19bb6a46064a705c6ca80aad", size = 28132297, upload-time = "2025-01-20T11:13:32.57Z" },
+ { url = "https://files.pythonhosted.org/packages/d6/53/373b6b8be67b9221d12b24125fd0ec56b1078b660eeae266ec388a6ac9a0/llvmlite-0.44.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f79a728e0435493611c9f405168682bb75ffd1fbe6fc360733b850c80a026db", size = 26201105, upload-time = "2025-01-20T11:13:38.744Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/da/8341fd3056419441286c8e26bf436923021005ece0bff5f41906476ae514/llvmlite-0.44.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0143a5ef336da14deaa8ec26c5449ad5b6a2b564df82fcef4be040b9cacfea9", size = 42361901, upload-time = "2025-01-20T11:13:46.711Z" },
+ { url = "https://files.pythonhosted.org/packages/53/ad/d79349dc07b8a395a99153d7ce8b01d6fcdc9f8231355a5df55ded649b61/llvmlite-0.44.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d752f89e31b66db6f8da06df8b39f9b91e78c5feea1bf9e8c1fba1d1c24c065d", size = 41184247, upload-time = "2025-01-20T11:13:56.159Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/3b/a9a17366af80127bd09decbe2a54d8974b6d8b274b39bf47fbaedeec6307/llvmlite-0.44.0-cp312-cp312-win_amd64.whl", hash = "sha256:eae7e2d4ca8f88f89d315b48c6b741dcb925d6a1042da694aa16ab3dd4cbd3a1", size = 30332380, upload-time = "2025-01-20T11:14:02.442Z" },
+ { url = "https://files.pythonhosted.org/packages/89/24/4c0ca705a717514c2092b18476e7a12c74d34d875e05e4d742618ebbf449/llvmlite-0.44.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:319bddd44e5f71ae2689859b7203080716448a3cd1128fb144fe5c055219d516", size = 28132306, upload-time = "2025-01-20T11:14:09.035Z" },
+ { url = "https://files.pythonhosted.org/packages/01/cf/1dd5a60ba6aee7122ab9243fd614abcf22f36b0437cbbe1ccf1e3391461c/llvmlite-0.44.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c58867118bad04a0bb22a2e0068c693719658105e40009ffe95c7000fcde88e", size = 26201090, upload-time = "2025-01-20T11:14:15.401Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/1b/656f5a357de7135a3777bd735cc7c9b8f23b4d37465505bd0eaf4be9befe/llvmlite-0.44.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46224058b13c96af1365290bdfebe9a6264ae62fb79b2b55693deed11657a8bf", size = 42361904, upload-time = "2025-01-20T11:14:22.949Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/e1/12c5f20cb9168fb3464a34310411d5ad86e4163c8ff2d14a2b57e5cc6bac/llvmlite-0.44.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0097052c32bf721a4efc03bd109d335dfa57d9bffb3d4c24cc680711b8b4fc", size = 41184245, upload-time = "2025-01-20T11:14:31.731Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/81/e66fc86539293282fd9cb7c9417438e897f369e79ffb62e1ae5e5154d4dd/llvmlite-0.44.0-cp313-cp313-win_amd64.whl", hash = "sha256:2fb7c4f2fb86cbae6dca3db9ab203eeea0e22d73b99bc2341cdf9de93612e930", size = 30331193, upload-time = "2025-01-20T11:14:38.578Z" },
+]
+
+[[package]]
+name = "markdown"
+version = "3.10"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/7d/ab/7dd27d9d863b3376fcf23a5a13cb5d024aed1db46f963f1b5735ae43b3be/markdown-3.10.tar.gz", hash = "sha256:37062d4f2aa4b2b6b32aefb80faa300f82cc790cb949a35b8caede34f2b68c0e", size = 364931, upload-time = "2025-11-03T19:51:15.007Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/70/81/54e3ce63502cd085a0c556652a4e1b919c45a446bd1e5300e10c44c8c521/markdown-3.10-py3-none-any.whl", hash = "sha256:b5b99d6951e2e4948d939255596523444c0e677c669700b1d17aa4a8a464cb7c", size = 107678, upload-time = "2025-11-03T19:51:13.887Z" },
+]
+
+[[package]]
+name = "markdown-it-py"
+version = "4.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mdurl" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" },
+]
+
+[[package]]
+name = "markupsafe"
+version = "3.0.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload-time = "2024-10-18T15:21:17.133Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload-time = "2024-10-18T15:21:18.064Z" },
+ { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload-time = "2024-10-18T15:21:18.859Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload-time = "2024-10-18T15:21:19.671Z" },
+ { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" },
+ { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" },
+ { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" },
+ { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" },
+ { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" },
+ { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" },
+ { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" },
+ { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" },
+ { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" },
+ { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" },
+ { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" },
+]
+
+[[package]]
+name = "matplotlib"
+version = "3.10.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "contourpy" },
+ { name = "cycler" },
+ { name = "fonttools" },
+ { name = "kiwisolver" },
+ { name = "numpy" },
+ { name = "packaging" },
+ { name = "pillow" },
+ { name = "pyparsing" },
+ { name = "python-dateutil" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/43/91/f2939bb60b7ebf12478b030e0d7f340247390f402b3b189616aad790c366/matplotlib-3.10.5.tar.gz", hash = "sha256:352ed6ccfb7998a00881692f38b4ca083c691d3e275b4145423704c34c909076", size = 34804044, upload-time = "2025-07-31T18:09:33.805Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/66/1e/c6f6bcd882d589410b475ca1fc22e34e34c82adff519caf18f3e6dd9d682/matplotlib-3.10.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:00b6feadc28a08bd3c65b2894f56cf3c94fc8f7adcbc6ab4516ae1e8ed8f62e2", size = 8253056, upload-time = "2025-07-31T18:08:05.385Z" },
+ { url = "https://files.pythonhosted.org/packages/53/e6/d6f7d1b59413f233793dda14419776f5f443bcccb2dfc84b09f09fe05dbe/matplotlib-3.10.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee98a5c5344dc7f48dc261b6ba5d9900c008fc12beb3fa6ebda81273602cc389", size = 8110131, upload-time = "2025-07-31T18:08:07.293Z" },
+ { url = "https://files.pythonhosted.org/packages/66/2b/bed8a45e74957549197a2ac2e1259671cd80b55ed9e1fe2b5c94d88a9202/matplotlib-3.10.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a17e57e33de901d221a07af32c08870ed4528db0b6059dce7d7e65c1122d4bea", size = 8669603, upload-time = "2025-07-31T18:08:09.064Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/a7/315e9435b10d057f5e52dfc603cd353167ae28bb1a4e033d41540c0067a4/matplotlib-3.10.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97b9d6443419085950ee4a5b1ee08c363e5c43d7176e55513479e53669e88468", size = 9508127, upload-time = "2025-07-31T18:08:10.845Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/d9/edcbb1f02ca99165365d2768d517898c22c6040187e2ae2ce7294437c413/matplotlib-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ceefe5d40807d29a66ae916c6a3915d60ef9f028ce1927b84e727be91d884369", size = 9566926, upload-time = "2025-07-31T18:08:13.186Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/d9/6dd924ad5616c97b7308e6320cf392c466237a82a2040381163b7500510a/matplotlib-3.10.5-cp312-cp312-win_amd64.whl", hash = "sha256:c04cba0f93d40e45b3c187c6c52c17f24535b27d545f757a2fffebc06c12b98b", size = 8107599, upload-time = "2025-07-31T18:08:15.116Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/f3/522dc319a50f7b0279fbe74f86f7a3506ce414bc23172098e8d2bdf21894/matplotlib-3.10.5-cp312-cp312-win_arm64.whl", hash = "sha256:a41bcb6e2c8e79dc99c5511ae6f7787d2fb52efd3d805fff06d5d4f667db16b2", size = 7978173, upload-time = "2025-07-31T18:08:21.518Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/05/4f3c1f396075f108515e45cb8d334aff011a922350e502a7472e24c52d77/matplotlib-3.10.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:354204db3f7d5caaa10e5de74549ef6a05a4550fdd1c8f831ab9bca81efd39ed", size = 8253586, upload-time = "2025-07-31T18:08:23.107Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/2c/e084415775aac7016c3719fe7006cdb462582c6c99ac142f27303c56e243/matplotlib-3.10.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b072aac0c3ad563a2b3318124756cb6112157017f7431626600ecbe890df57a1", size = 8110715, upload-time = "2025-07-31T18:08:24.675Z" },
+ { url = "https://files.pythonhosted.org/packages/52/1b/233e3094b749df16e3e6cd5a44849fd33852e692ad009cf7de00cf58ddf6/matplotlib-3.10.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d52fd5b684d541b5a51fb276b2b97b010c75bee9aa392f96b4a07aeb491e33c7", size = 8669397, upload-time = "2025-07-31T18:08:26.778Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/ec/03f9e003a798f907d9f772eed9b7c6a9775d5bd00648b643ebfb88e25414/matplotlib-3.10.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee7a09ae2f4676276f5a65bd9f2bd91b4f9fbaedf49f40267ce3f9b448de501f", size = 9508646, upload-time = "2025-07-31T18:08:28.848Z" },
+ { url = "https://files.pythonhosted.org/packages/91/e7/c051a7a386680c28487bca27d23b02d84f63e3d2a9b4d2fc478e6a42e37e/matplotlib-3.10.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ba6c3c9c067b83481d647af88b4e441d532acdb5ef22178a14935b0b881188f4", size = 9567424, upload-time = "2025-07-31T18:08:30.726Z" },
+ { url = "https://files.pythonhosted.org/packages/36/c2/24302e93ff431b8f4173ee1dd88976c8d80483cadbc5d3d777cef47b3a1c/matplotlib-3.10.5-cp313-cp313-win_amd64.whl", hash = "sha256:07442d2692c9bd1cceaa4afb4bbe5b57b98a7599de4dabfcca92d3eea70f9ebe", size = 8107809, upload-time = "2025-07-31T18:08:33.928Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/33/423ec6a668d375dad825197557ed8fbdb74d62b432c1ed8235465945475f/matplotlib-3.10.5-cp313-cp313-win_arm64.whl", hash = "sha256:48fe6d47380b68a37ccfcc94f009530e84d41f71f5dae7eda7c4a5a84aa0a674", size = 7978078, upload-time = "2025-07-31T18:08:36.764Z" },
+ { url = "https://files.pythonhosted.org/packages/51/17/521fc16ec766455c7bb52cc046550cf7652f6765ca8650ff120aa2d197b6/matplotlib-3.10.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b80eb8621331449fc519541a7461987f10afa4f9cfd91afcd2276ebe19bd56c", size = 8295590, upload-time = "2025-07-31T18:08:38.521Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/12/23c28b2c21114c63999bae129fce7fd34515641c517ae48ce7b7dcd33458/matplotlib-3.10.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:47a388908e469d6ca2a6015858fa924e0e8a2345a37125948d8e93a91c47933e", size = 8158518, upload-time = "2025-07-31T18:08:40.195Z" },
+ { url = "https://files.pythonhosted.org/packages/81/f8/aae4eb25e8e7190759f3cb91cbeaa344128159ac92bb6b409e24f8711f78/matplotlib-3.10.5-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8b6b49167d208358983ce26e43aa4196073b4702858670f2eb111f9a10652b4b", size = 8691815, upload-time = "2025-07-31T18:08:42.238Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/ba/450c39ebdd486bd33a359fc17365ade46c6a96bf637bbb0df7824de2886c/matplotlib-3.10.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a8da0453a7fd8e3da114234ba70c5ba9ef0e98f190309ddfde0f089accd46ea", size = 9522814, upload-time = "2025-07-31T18:08:44.914Z" },
+ { url = "https://files.pythonhosted.org/packages/89/11/9c66f6a990e27bb9aa023f7988d2d5809cb98aa39c09cbf20fba75a542ef/matplotlib-3.10.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52c6573dfcb7726a9907b482cd5b92e6b5499b284ffacb04ffbfe06b3e568124", size = 9573917, upload-time = "2025-07-31T18:08:47.038Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/69/8b49394de92569419e5e05e82e83df9b749a0ff550d07631ea96ed2eb35a/matplotlib-3.10.5-cp313-cp313t-win_amd64.whl", hash = "sha256:a23193db2e9d64ece69cac0c8231849db7dd77ce59c7b89948cf9d0ce655a3ce", size = 8181034, upload-time = "2025-07-31T18:08:48.943Z" },
+ { url = "https://files.pythonhosted.org/packages/47/23/82dc435bb98a2fc5c20dffcac8f0b083935ac28286413ed8835df40d0baa/matplotlib-3.10.5-cp313-cp313t-win_arm64.whl", hash = "sha256:56da3b102cf6da2776fef3e71cd96fcf22103a13594a18ac9a9b31314e0be154", size = 8023337, upload-time = "2025-07-31T18:08:50.791Z" },
+]
+
+[[package]]
+name = "matplotlib-inline"
+version = "0.1.7"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload-time = "2024-04-15T13:44:44.803Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload-time = "2024-04-15T13:44:43.265Z" },
+]
+
+[[package]]
+name = "mdit-py-plugins"
+version = "0.5.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown-it-py" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" },
+]
+
+[[package]]
+name = "mdurl"
+version = "0.1.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
+]
+
+[[package]]
+name = "mergedeep"
+version = "1.3.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" },
+]
+
+[[package]]
+name = "mistune"
+version = "3.1.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/c4/79/bda47f7dd7c3c55770478d6d02c9960c430b0cf1773b72366ff89126ea31/mistune-3.1.3.tar.gz", hash = "sha256:a7035c21782b2becb6be62f8f25d3df81ccb4d6fa477a6525b15af06539f02a0", size = 94347, upload-time = "2025-03-19T14:27:24.955Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/01/4d/23c4e4f09da849e127e9f123241946c23c1e30f45a88366879e064211815/mistune-3.1.3-py3-none-any.whl", hash = "sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9", size = 53410, upload-time = "2025-03-19T14:27:23.451Z" },
+]
+
+[[package]]
+name = "mkdocs"
+version = "1.6.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "click" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "ghp-import" },
+ { name = "jinja2" },
+ { name = "markdown" },
+ { name = "markupsafe" },
+ { name = "mergedeep" },
+ { name = "mkdocs-get-deps" },
+ { name = "packaging" },
+ { name = "pathspec" },
+ { name = "pyyaml" },
+ { name = "pyyaml-env-tag" },
+ { name = "watchdog" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" },
+]
+
+[[package]]
+name = "mkdocs-autorefs"
+version = "1.4.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown" },
+ { name = "markupsafe" },
+ { name = "mkdocs" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/51/fa/9124cd63d822e2bcbea1450ae68cdc3faf3655c69b455f3a7ed36ce6c628/mkdocs_autorefs-1.4.3.tar.gz", hash = "sha256:beee715b254455c4aa93b6ef3c67579c399ca092259cc41b7d9342573ff1fc75", size = 55425, upload-time = "2025-08-26T14:23:17.223Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9f/4d/7123b6fa2278000688ebd338e2a06d16870aaf9eceae6ba047ea05f92df1/mkdocs_autorefs-1.4.3-py3-none-any.whl", hash = "sha256:469d85eb3114801d08e9cc55d102b3ba65917a869b893403b8987b601cf55dc9", size = 25034, upload-time = "2025-08-26T14:23:15.906Z" },
+]
+
+[[package]]
+name = "mkdocs-get-deps"
+version = "0.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "mergedeep" },
+ { name = "platformdirs" },
+ { name = "pyyaml" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/98/f5/ed29cd50067784976f25ed0ed6fcd3c2ce9eb90650aa3b2796ddf7b6870b/mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c", size = 10239, upload-time = "2023-11-20T17:51:09.981Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9f/d4/029f984e8d3f3b6b726bd33cafc473b75e9e44c0f7e80a5b29abc466bdea/mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134", size = 9521, upload-time = "2023-11-20T17:51:08.587Z" },
+]
+
+[[package]]
+name = "mkdocs-jupyter"
+version = "0.25.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "ipykernel" },
+ { name = "jupytext" },
+ { name = "mkdocs" },
+ { name = "mkdocs-material" },
+ { name = "nbconvert" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/6c/23/6ffb8d2fd2117aa860a04c6fe2510b21bc3c3c085907ffdd851caba53152/mkdocs_jupyter-0.25.1.tar.gz", hash = "sha256:0e9272ff4947e0ec683c92423a4bfb42a26477c103ab1a6ab8277e2dcc8f7afe", size = 1626747, upload-time = "2024-10-15T14:56:32.373Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/08/37/5f1fd5c3f6954b3256f8126275e62af493b96fb6aef6c0dbc4ee326032ad/mkdocs_jupyter-0.25.1-py3-none-any.whl", hash = "sha256:3f679a857609885d322880e72533ef5255561bbfdb13cfee2a1e92ef4d4ad8d8", size = 1456197, upload-time = "2024-10-15T14:56:29.854Z" },
+]
+
+[[package]]
+name = "mkdocs-material"
+version = "9.7.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "babel" },
+ { name = "backrefs" },
+ { name = "colorama" },
+ { name = "jinja2" },
+ { name = "markdown" },
+ { name = "mkdocs" },
+ { name = "mkdocs-material-extensions" },
+ { name = "paginate" },
+ { name = "pygments" },
+ { name = "pymdown-extensions" },
+ { name = "requests" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/9c/3b/111b84cd6ff28d9e955b5f799ef217a17bc1684ac346af333e6100e413cb/mkdocs_material-9.7.0.tar.gz", hash = "sha256:602b359844e906ee402b7ed9640340cf8a474420d02d8891451733b6b02314ec", size = 4094546, upload-time = "2025-11-11T08:49:09.73Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/04/87/eefe8d5e764f4cf50ed91b943f8e8f96b5efd65489d8303b7a36e2e79834/mkdocs_material-9.7.0-py3-none-any.whl", hash = "sha256:da2866ea53601125ff5baa8aa06404c6e07af3c5ce3d5de95e3b52b80b442887", size = 9283770, upload-time = "2025-11-11T08:49:06.26Z" },
+]
+
+[[package]]
+name = "mkdocs-material-extensions"
+version = "1.3.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" },
+]
+
+[[package]]
+name = "mkdocstrings"
+version = "1.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jinja2" },
+ { name = "markdown" },
+ { name = "markupsafe" },
+ { name = "mkdocs" },
+ { name = "mkdocs-autorefs" },
+ { name = "pymdown-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e5/13/10bbf9d56565fd91b91e6f5a8cd9b9d8a2b101c4e8ad6eeafa35a706301d/mkdocstrings-1.0.0.tar.gz", hash = "sha256:351a006dbb27aefce241ade110d3cd040c1145b7a3eb5fd5ac23f03ed67f401a", size = 101086, upload-time = "2025-11-27T15:39:40.534Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ec/fc/80aa31b79133634721cf7855d37b76ea49773599214896f2ff10be03de2a/mkdocstrings-1.0.0-py3-none-any.whl", hash = "sha256:4c50eb960bff6e05dfc631f6bc00dfabffbcb29c5ff25f676d64daae05ed82fa", size = 35135, upload-time = "2025-11-27T15:39:39.301Z" },
+]
+
+[package.optional-dependencies]
+python = [
+ { name = "mkdocstrings-python" },
+]
+
+[[package]]
+name = "mkdocstrings-python"
+version = "2.0.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "griffe" },
+ { name = "mkdocs-autorefs" },
+ { name = "mkdocstrings" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/24/75/d30af27a2906f00eb90143470272376d728521997800f5dce5b340ba35bc/mkdocstrings_python-2.0.1.tar.gz", hash = "sha256:843a562221e6a471fefdd4b45cc6c22d2607ccbad632879234fa9692e9cf7732", size = 199345, upload-time = "2025-12-03T14:26:11.755Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/81/06/c5f8deba7d2cbdfa7967a716ae801aa9ca5f734b8f54fd473ef77a088dbe/mkdocstrings_python-2.0.1-py3-none-any.whl", hash = "sha256:66ecff45c5f8b71bf174e11d49afc845c2dfc7fc0ab17a86b6b337e0f24d8d90", size = 105055, upload-time = "2025-12-03T14:26:10.184Z" },
+]
+
+[[package]]
+name = "nbclient"
+version = "0.10.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "jupyter-client" },
+ { name = "jupyter-core" },
+ { name = "nbformat" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424, upload-time = "2024-12-19T10:32:27.164Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434, upload-time = "2024-12-19T10:32:24.139Z" },
+]
+
+[[package]]
+name = "nbconvert"
+version = "7.16.6"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "beautifulsoup4" },
+ { name = "bleach", extra = ["css"] },
+ { name = "defusedxml" },
+ { name = "jinja2" },
+ { name = "jupyter-core" },
+ { name = "jupyterlab-pygments" },
+ { name = "markupsafe" },
+ { name = "mistune" },
+ { name = "nbclient" },
+ { name = "nbformat" },
+ { name = "packaging" },
+ { name = "pandocfilters" },
+ { name = "pygments" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582", size = 857715, upload-time = "2025-01-28T09:29:14.724Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b", size = 258525, upload-time = "2025-01-28T09:29:12.551Z" },
+]
+
+[[package]]
+name = "nbformat"
+version = "5.10.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "fastjsonschema" },
+ { name = "jsonschema" },
+ { name = "jupyter-core" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" },
+]
+
+[[package]]
+name = "nbsphinx"
+version = "0.9.7"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "docutils" },
+ { name = "jinja2" },
+ { name = "nbconvert" },
+ { name = "nbformat" },
+ { name = "sphinx" },
+ { name = "traitlets" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/1e/84/b1856b7651ac34e965aa567a158714c7f3bd42a1b1ce76bf423ffb99872c/nbsphinx-0.9.7.tar.gz", hash = "sha256:abd298a686d55fa894ef697c51d44f24e53aa312dadae38e82920f250a5456fe", size = 180479, upload-time = "2025-03-03T19:46:08.069Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/49/2d/8c8e635bcc6757573d311bb3c5445426382f280da32b8cd6d82d501ef4a4/nbsphinx-0.9.7-py3-none-any.whl", hash = "sha256:7292c3767fea29e405c60743eee5393682a83982ab202ff98f5eb2db02629da8", size = 31660, upload-time = "2025-03-03T19:46:06.581Z" },
+]
+
+[[package]]
+name = "nest-asyncio"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" },
+]
+
+[[package]]
+name = "numba"
+version = "0.61.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "llvmlite" },
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/1c/a0/e21f57604304aa03ebb8e098429222722ad99176a4f979d34af1d1ee80da/numba-0.61.2.tar.gz", hash = "sha256:8750ee147940a6637b80ecf7f95062185ad8726c8c28a2295b8ec1160a196f7d", size = 2820615, upload-time = "2025-04-09T02:58:07.659Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b4/a0/c6b7b9c615cfa3b98c4c63f4316e3f6b3bbe2387740277006551784218cd/numba-0.61.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:34fba9406078bac7ab052efbf0d13939426c753ad72946baaa5bf9ae0ebb8dd2", size = 2776626, upload-time = "2025-04-09T02:57:51.857Z" },
+ { url = "https://files.pythonhosted.org/packages/92/4a/fe4e3c2ecad72d88f5f8cd04e7f7cff49e718398a2fac02d2947480a00ca/numba-0.61.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ddce10009bc097b080fc96876d14c051cc0c7679e99de3e0af59014dab7dfe8", size = 2779287, upload-time = "2025-04-09T02:57:53.658Z" },
+ { url = "https://files.pythonhosted.org/packages/9a/2d/e518df036feab381c23a624dac47f8445ac55686ec7f11083655eb707da3/numba-0.61.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b1bb509d01f23d70325d3a5a0e237cbc9544dd50e50588bc581ba860c213546", size = 3885928, upload-time = "2025-04-09T02:57:55.206Z" },
+ { url = "https://files.pythonhosted.org/packages/10/0f/23cced68ead67b75d77cfcca3df4991d1855c897ee0ff3fe25a56ed82108/numba-0.61.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48a53a3de8f8793526cbe330f2a39fe9a6638efcbf11bd63f3d2f9757ae345cd", size = 3577115, upload-time = "2025-04-09T02:57:56.818Z" },
+ { url = "https://files.pythonhosted.org/packages/68/1d/ddb3e704c5a8fb90142bf9dc195c27db02a08a99f037395503bfbc1d14b3/numba-0.61.2-cp312-cp312-win_amd64.whl", hash = "sha256:97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18", size = 2831929, upload-time = "2025-04-09T02:57:58.45Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/f3/0fe4c1b1f2569e8a18ad90c159298d862f96c3964392a20d74fc628aee44/numba-0.61.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:3a10a8fc9afac40b1eac55717cece1b8b1ac0b946f5065c89e00bde646b5b154", size = 2771785, upload-time = "2025-04-09T02:57:59.96Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/71/91b277d712e46bd5059f8a5866862ed1116091a7cb03bd2704ba8ebe015f/numba-0.61.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d3bcada3c9afba3bed413fba45845f2fb9cd0d2b27dd58a1be90257e293d140", size = 2773289, upload-time = "2025-04-09T02:58:01.435Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/e0/5ea04e7ad2c39288c0f0f9e8d47638ad70f28e275d092733b5817cf243c9/numba-0.61.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdbca73ad81fa196bd53dc12e3aaf1564ae036e0c125f237c7644fe64a4928ab", size = 3893918, upload-time = "2025-04-09T02:58:02.933Z" },
+ { url = "https://files.pythonhosted.org/packages/17/58/064f4dcb7d7e9412f16ecf80ed753f92297e39f399c905389688cf950b81/numba-0.61.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f154aaea625fb32cfbe3b80c5456d514d416fcdf79733dd69c0df3a11348e9e", size = 3584056, upload-time = "2025-04-09T02:58:04.538Z" },
+ { url = "https://files.pythonhosted.org/packages/af/a4/6d3a0f2d3989e62a18749e1e9913d5fa4910bbb3e3311a035baea6caf26d/numba-0.61.2-cp313-cp313-win_amd64.whl", hash = "sha256:59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7", size = 2831846, upload-time = "2025-04-09T02:58:06.125Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.6"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" },
+ { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" },
+ { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" },
+ { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" },
+ { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" },
+ { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" },
+ { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" },
+ { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" },
+ { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" },
+ { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" },
+ { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" },
+ { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" },
+ { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" },
+ { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" },
+ { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" },
+ { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" },
+ { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" },
+ { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" },
+]
+
+[[package]]
+name = "numpydoc"
+version = "1.9.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "sphinx" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/2f/19/7721093e25804cc82c7c1cdab0cce6b9343451828fc2ce249cee10646db5/numpydoc-1.9.0.tar.gz", hash = "sha256:5fec64908fe041acc4b3afc2a32c49aab1540cf581876f5563d68bb129e27c5b", size = 91451, upload-time = "2025-06-24T12:22:55.283Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/26/62/5783d8924fca72529defb2c7dbe2070d49224d2dba03a85b20b37adb24d8/numpydoc-1.9.0-py3-none-any.whl", hash = "sha256:8a2983b2d62bfd0a8c470c7caa25e7e0c3d163875cdec12a8a1034020a9d1135", size = 64871, upload-time = "2025-06-24T12:22:53.701Z" },
+]
+
+[[package]]
+name = "packaging"
+version = "25.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
+]
+
+[[package]]
+name = "paginate"
+version = "0.5.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" },
+]
+
+[[package]]
+name = "pandas"
+version = "2.3.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "python-dateutil" },
+ { name = "pytz" },
+ { name = "tzdata" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493, upload-time = "2025-07-07T19:20:04.079Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/46/de/b8445e0f5d217a99fe0eeb2f4988070908979bec3587c0633e5428ab596c/pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3", size = 11588172, upload-time = "2025-07-07T19:18:52.054Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/e0/801cdb3564e65a5ac041ab99ea6f1d802a6c325bb6e58c79c06a3f1cd010/pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232", size = 10717365, upload-time = "2025-07-07T19:18:54.785Z" },
+ { url = "https://files.pythonhosted.org/packages/51/a5/c76a8311833c24ae61a376dbf360eb1b1c9247a5d9c1e8b356563b31b80c/pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e", size = 11280411, upload-time = "2025-07-07T19:18:57.045Z" },
+ { url = "https://files.pythonhosted.org/packages/da/01/e383018feba0a1ead6cf5fe8728e5d767fee02f06a3d800e82c489e5daaf/pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4", size = 11988013, upload-time = "2025-07-07T19:18:59.771Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/14/cec7760d7c9507f11c97d64f29022e12a6cc4fc03ac694535e89f88ad2ec/pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8", size = 12767210, upload-time = "2025-07-07T19:19:02.944Z" },
+ { url = "https://files.pythonhosted.org/packages/50/b9/6e2d2c6728ed29fb3d4d4d302504fb66f1a543e37eb2e43f352a86365cdf/pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679", size = 13440571, upload-time = "2025-07-07T19:19:06.82Z" },
+ { url = "https://files.pythonhosted.org/packages/80/a5/3a92893e7399a691bad7664d977cb5e7c81cf666c81f89ea76ba2bff483d/pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8", size = 10987601, upload-time = "2025-07-07T19:19:09.589Z" },
+ { url = "https://files.pythonhosted.org/packages/32/ed/ff0a67a2c5505e1854e6715586ac6693dd860fbf52ef9f81edee200266e7/pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22", size = 11531393, upload-time = "2025-07-07T19:19:12.245Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/db/d8f24a7cc9fb0972adab0cc80b6817e8bef888cfd0024eeb5a21c0bb5c4a/pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a", size = 10668750, upload-time = "2025-07-07T19:19:14.612Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/b0/80f6ec783313f1e2356b28b4fd8d2148c378370045da918c73145e6aab50/pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928", size = 11342004, upload-time = "2025-07-07T19:19:16.857Z" },
+ { url = "https://files.pythonhosted.org/packages/e9/e2/20a317688435470872885e7fc8f95109ae9683dec7c50be29b56911515a5/pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9", size = 12050869, upload-time = "2025-07-07T19:19:19.265Z" },
+ { url = "https://files.pythonhosted.org/packages/55/79/20d746b0a96c67203a5bee5fb4e00ac49c3e8009a39e1f78de264ecc5729/pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12", size = 12750218, upload-time = "2025-07-07T19:19:21.547Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/0f/145c8b41e48dbf03dd18fdd7f24f8ba95b8254a97a3379048378f33e7838/pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb", size = 13416763, upload-time = "2025-07-07T19:19:23.939Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/c0/54415af59db5cdd86a3d3bf79863e8cc3fa9ed265f0745254061ac09d5f2/pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956", size = 10987482, upload-time = "2025-07-07T19:19:42.699Z" },
+ { url = "https://files.pythonhosted.org/packages/48/64/2fd2e400073a1230e13b8cd604c9bc95d9e3b962e5d44088ead2e8f0cfec/pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a", size = 12029159, upload-time = "2025-07-07T19:19:26.362Z" },
+ { url = "https://files.pythonhosted.org/packages/d8/0a/d84fd79b0293b7ef88c760d7dca69828d867c89b6d9bc52d6a27e4d87316/pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9", size = 11393287, upload-time = "2025-07-07T19:19:29.157Z" },
+ { url = "https://files.pythonhosted.org/packages/50/ae/ff885d2b6e88f3c7520bb74ba319268b42f05d7e583b5dded9837da2723f/pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275", size = 11309381, upload-time = "2025-07-07T19:19:31.436Z" },
+ { url = "https://files.pythonhosted.org/packages/85/86/1fa345fc17caf5d7780d2699985c03dbe186c68fee00b526813939062bb0/pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab", size = 11883998, upload-time = "2025-07-07T19:19:34.267Z" },
+ { url = "https://files.pythonhosted.org/packages/81/aa/e58541a49b5e6310d89474333e994ee57fea97c8aaa8fc7f00b873059bbf/pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96", size = 12704705, upload-time = "2025-07-07T19:19:36.856Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/f9/07086f5b0f2a19872554abeea7658200824f5835c58a106fa8f2ae96a46c/pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444", size = 13189044, upload-time = "2025-07-07T19:19:39.999Z" },
+]
+
+[[package]]
+name = "pandocfilters"
+version = "1.5.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" },
+]
+
+[[package]]
+name = "parso"
+version = "0.8.4"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609, upload-time = "2024-04-05T09:43:55.897Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload-time = "2024-04-05T09:43:53.299Z" },
+]
+
+[[package]]
+name = "pathspec"
+version = "0.12.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" },
+]
+
+[[package]]
+name = "patsy"
+version = "1.0.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d1/81/74f6a65b848ffd16c18f920620ce999fe45fe27f01ab3911260ce4ed85e4/patsy-1.0.1.tar.gz", hash = "sha256:e786a9391eec818c054e359b737bbce692f051aee4c661f4141cc88fb459c0c4", size = 396010, upload-time = "2024-11-12T14:10:54.642Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/87/2b/b50d3d08ea0fc419c183a84210571eba005328efa62b6b98bc28e9ead32a/patsy-1.0.1-py2.py3-none-any.whl", hash = "sha256:751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c", size = 232923, upload-time = "2024-11-12T14:10:52.85Z" },
+]
+
+[[package]]
+name = "pexpect"
+version = "4.9.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "ptyprocess" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" },
+]
+
+[[package]]
+name = "pillow"
+version = "11.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload-time = "2025-07-01T09:14:17.648Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload-time = "2025-07-01T09:14:19.828Z" },
+ { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload-time = "2025-07-03T13:10:04.448Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload-time = "2025-07-03T13:10:10.391Z" },
+ { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload-time = "2025-07-01T09:14:21.63Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload-time = "2025-07-01T09:14:23.321Z" },
+ { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload-time = "2025-07-01T09:14:25.237Z" },
+ { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload-time = "2025-07-01T09:14:27.053Z" },
+ { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload-time = "2025-07-01T09:14:30.104Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload-time = "2025-07-01T09:14:31.899Z" },
+ { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload-time = "2025-07-01T09:14:33.709Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" },
+ { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" },
+ { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" },
+ { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" },
+ { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" },
+ { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" },
+ { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" },
+ { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" },
+ { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" },
+ { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" },
+ { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" },
+ { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" },
+ { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" },
+]
+
+[[package]]
+name = "platformdirs"
+version = "4.3.8"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" },
+]
+
+[[package]]
+name = "pluggy"
+version = "1.6.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
+]
+
+[[package]]
+name = "prompt-toolkit"
+version = "3.0.51"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "wcwidth" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940, upload-time = "2025-04-15T09:18:47.731Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810, upload-time = "2025-04-15T09:18:44.753Z" },
+]
+
+[[package]]
+name = "psutil"
+version = "7.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003, upload-time = "2025-02-13T21:54:07.946Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051, upload-time = "2025-02-13T21:54:12.36Z" },
+ { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535, upload-time = "2025-02-13T21:54:16.07Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004, upload-time = "2025-02-13T21:54:18.662Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986, upload-time = "2025-02-13T21:54:21.811Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544, upload-time = "2025-02-13T21:54:24.68Z" },
+ { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053, upload-time = "2025-02-13T21:54:34.31Z" },
+ { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885, upload-time = "2025-02-13T21:54:37.486Z" },
+]
+
+[[package]]
+name = "ptyprocess"
+version = "0.7.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" },
+]
+
+[[package]]
+name = "pure-eval"
+version = "0.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" },
+]
+
+[[package]]
+name = "pycparser"
+version = "2.22"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload-time = "2024-03-30T13:22:22.564Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload-time = "2024-03-30T13:22:20.476Z" },
+]
+
+[[package]]
+name = "pydata-sphinx-theme"
+version = "0.16.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "accessible-pygments" },
+ { name = "babel" },
+ { name = "beautifulsoup4" },
+ { name = "docutils" },
+ { name = "pygments" },
+ { name = "sphinx" },
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/00/20/bb50f9de3a6de69e6abd6b087b52fa2418a0418b19597601605f855ad044/pydata_sphinx_theme-0.16.1.tar.gz", hash = "sha256:a08b7f0b7f70387219dc659bff0893a7554d5eb39b59d3b8ef37b8401b7642d7", size = 2412693, upload-time = "2024-12-17T10:53:39.537Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e2/0d/8ba33fa83a7dcde13eb3c1c2a0c1cc29950a048bfed6d9b0d8b6bd710b4c/pydata_sphinx_theme-0.16.1-py3-none-any.whl", hash = "sha256:225331e8ac4b32682c18fcac5a57a6f717c4e632cea5dd0e247b55155faeccde", size = 6723264, upload-time = "2024-12-17T10:53:35.645Z" },
+]
+
+[[package]]
+name = "pygments"
+version = "2.19.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" },
+]
+
+[[package]]
+name = "pymdown-extensions"
+version = "10.18"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown" },
+ { name = "pyyaml" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/d4/95/e4fa281e3f13b3d9c4aaebb21ef44879840325fa418276dd921209a5e9f9/pymdown_extensions-10.18.tar.gz", hash = "sha256:20252abe6367354b24191431617a072ee6be9f68c5afcc74ea5573508a61f9e5", size = 847697, upload-time = "2025-12-07T17:22:12.857Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/46/a4/aa2bada4a2fd648f40f19affa55d2c01dc7ff5ea9cffd3dfdeb6114951db/pymdown_extensions-10.18-py3-none-any.whl", hash = "sha256:090bca72be43f7d3186374e23c782899dbef9dc153ef24c59dcd3c346f9ffcae", size = 266703, upload-time = "2025-12-07T17:22:11.22Z" },
+]
+
+[[package]]
+name = "pyparsing"
+version = "3.2.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload-time = "2025-03-25T05:01:28.114Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload-time = "2025-03-25T05:01:24.908Z" },
+]
+
+[[package]]
+name = "pytest"
+version = "8.4.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714, upload-time = "2025-06-18T05:48:06.109Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474, upload-time = "2025-06-18T05:48:03.955Z" },
+]
+
+[[package]]
+name = "pytest-cov"
+version = "7.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "coverage" },
+ { name = "pluggy" },
+ { name = "pytest" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" },
+]
+
+[[package]]
+name = "python-dateutil"
+version = "2.9.0.post0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "six" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" },
+]
+
+[[package]]
+name = "python-markdown-math"
+version = "0.9"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "markdown" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/4c/68/fbea05ec6fb318bdcf56ea47596605614554f51d77bfd14f6fb481139ad8/python_markdown_math-0.9.tar.gz", hash = "sha256:567395553dc4941e79b3789a1096dcabb3fda9539d150d558ef3507948b264a3", size = 8680, upload-time = "2025-04-10T10:10:31.84Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/eb/68/ecf3535c40845de2efd8ac2d092dd5fca0868219fa3684d9e58ef7abeece/python_markdown_math-0.9-py3-none-any.whl", hash = "sha256:ac9932df517a5c0f6d01c56e7a44d065eca4a420893ac45f7a6937c67cb41e86", size = 6046, upload-time = "2025-04-10T10:10:30.318Z" },
+]
+
+[[package]]
+name = "pytz"
+version = "2025.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" },
+]
+
+[[package]]
+name = "pywin32"
+version = "311"
+source = { registry = "https://pypi.org/simple" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" },
+ { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" },
+]
+
+[[package]]
+name = "pyyaml"
+version = "6.0.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" },
+ { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" },
+ { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" },
+ { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" },
+ { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" },
+ { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" },
+ { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" },
+]
+
+[[package]]
+name = "pyyaml-env-tag"
+version = "1.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pyyaml" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" },
+]
+
+[[package]]
+name = "pyzmq"
+version = "27.0.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "cffi", marker = "implementation_name == 'pypy'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f1/06/50a4e9648b3e8b992bef8eb632e457307553a89d294103213cfd47b3da69/pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf", size = 280478, upload-time = "2025-06-13T14:09:07.087Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/93/a7/9ad68f55b8834ede477842214feba6a4c786d936c022a67625497aacf61d/pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52", size = 1305438, upload-time = "2025-06-13T14:07:31.676Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/ee/26aa0f98665a22bc90ebe12dced1de5f3eaca05363b717f6fb229b3421b3/pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3", size = 895095, upload-time = "2025-06-13T14:07:33.104Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/85/c57e7ab216ecd8aa4cc7e3b83b06cc4e9cf45c87b0afc095f10cd5ce87c1/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152", size = 651826, upload-time = "2025-06-13T14:07:34.831Z" },
+ { url = "https://files.pythonhosted.org/packages/69/9a/9ea7e230feda9400fb0ae0d61d7d6ddda635e718d941c44eeab22a179d34/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22", size = 839750, upload-time = "2025-06-13T14:07:36.553Z" },
+ { url = "https://files.pythonhosted.org/packages/08/66/4cebfbe71f3dfbd417011daca267539f62ed0fbc68105357b68bbb1a25b7/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371", size = 1641357, upload-time = "2025-06-13T14:07:38.21Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/f6/b0f62578c08d2471c791287149cb8c2aaea414ae98c6e995c7dbe008adfb/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d", size = 2020281, upload-time = "2025-06-13T14:07:39.599Z" },
+ { url = "https://files.pythonhosted.org/packages/37/b9/4f670b15c7498495da9159edc374ec09c88a86d9cd5a47d892f69df23450/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be", size = 1877110, upload-time = "2025-06-13T14:07:41.027Z" },
+ { url = "https://files.pythonhosted.org/packages/66/31/9dee25c226295b740609f0d46db2fe972b23b6f5cf786360980524a3ba92/pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4", size = 559297, upload-time = "2025-06-13T14:07:42.533Z" },
+ { url = "https://files.pythonhosted.org/packages/9b/12/52da5509800f7ff2d287b2f2b4e636e7ea0f001181cba6964ff6c1537778/pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371", size = 619203, upload-time = "2025-06-13T14:07:43.843Z" },
+ { url = "https://files.pythonhosted.org/packages/93/6d/7f2e53b19d1edb1eb4f09ec7c3a1f945ca0aac272099eab757d15699202b/pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e", size = 551927, upload-time = "2025-06-13T14:07:45.51Z" },
+ { url = "https://files.pythonhosted.org/packages/19/62/876b27c4ff777db4ceba1c69ea90d3c825bb4f8d5e7cd987ce5802e33c55/pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688", size = 1340826, upload-time = "2025-06-13T14:07:46.881Z" },
+ { url = "https://files.pythonhosted.org/packages/43/69/58ef8f4f59d3bcd505260c73bee87b008850f45edca40ddaba54273c35f4/pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38", size = 897283, upload-time = "2025-06-13T14:07:49.562Z" },
+ { url = "https://files.pythonhosted.org/packages/43/15/93a0d0396700a60475ad3c5d42c5f1c308d3570bc94626b86c71ef9953e0/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a", size = 660567, upload-time = "2025-06-13T14:07:51.364Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/b3/fe055513e498ca32f64509abae19b9c9eb4d7c829e02bd8997dd51b029eb/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9", size = 847681, upload-time = "2025-06-13T14:07:52.77Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/4f/ff15300b00b5b602191f3df06bbc8dd4164e805fdd65bb77ffbb9c5facdc/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d", size = 1650148, upload-time = "2025-06-13T14:07:54.178Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/6f/84bdfff2a224a6f26a24249a342e5906993c50b0761e311e81b39aef52a7/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44", size = 2023768, upload-time = "2025-06-13T14:07:55.714Z" },
+ { url = "https://files.pythonhosted.org/packages/64/39/dc2db178c26a42228c5ac94a9cc595030458aa64c8d796a7727947afbf55/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef", size = 1885199, upload-time = "2025-06-13T14:07:57.166Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/21/dae7b06a1f8cdee5d8e7a63d99c5d129c401acc40410bef2cbf42025e26f/pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad", size = 575439, upload-time = "2025-06-13T14:07:58.959Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/bc/1709dc55f0970cf4cb8259e435e6773f9946f41a045c2cb90e870b7072da/pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f", size = 639933, upload-time = "2025-06-13T14:08:00.777Z" },
+]
+
+[[package]]
+name = "recommonmark"
+version = "0.7.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "commonmark" },
+ { name = "docutils" },
+ { name = "sphinx" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/1c/00/3dd2bdc4184b0ce754b5b446325abf45c2e0a347e022292ddc44670f628c/recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67", size = 34444, upload-time = "2020-12-17T19:24:56.523Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c6/77/ed589c75db5d02a77a1d5d2d9abc63f29676467d396c64277f98b50b79c2/recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f", size = 10214, upload-time = "2020-12-17T19:24:55.137Z" },
+]
+
+[[package]]
+name = "referencing"
+version = "0.36.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "attrs" },
+ { name = "rpds-py" },
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" },
+]
+
+[[package]]
+name = "requests"
+version = "2.32.4"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "idna" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" },
+]
+
+[[package]]
+name = "rpds-py"
+version = "0.26.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385, upload-time = "2025-07-01T15:57:13.958Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933, upload-time = "2025-07-01T15:54:15.734Z" },
+ { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447, upload-time = "2025-07-01T15:54:16.922Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711, upload-time = "2025-07-01T15:54:18.101Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865, upload-time = "2025-07-01T15:54:19.295Z" },
+ { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763, upload-time = "2025-07-01T15:54:20.858Z" },
+ { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651, upload-time = "2025-07-01T15:54:22.508Z" },
+ { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079, upload-time = "2025-07-01T15:54:23.987Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379, upload-time = "2025-07-01T15:54:25.073Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033, upload-time = "2025-07-01T15:54:26.225Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639, upload-time = "2025-07-01T15:54:27.424Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105, upload-time = "2025-07-01T15:54:29.93Z" },
+ { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272, upload-time = "2025-07-01T15:54:31.128Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995, upload-time = "2025-07-01T15:54:32.195Z" },
+ { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198, upload-time = "2025-07-01T15:54:33.271Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917, upload-time = "2025-07-01T15:54:34.755Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073, upload-time = "2025-07-01T15:54:36.292Z" },
+ { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214, upload-time = "2025-07-01T15:54:37.469Z" },
+ { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113, upload-time = "2025-07-01T15:54:38.954Z" },
+ { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189, upload-time = "2025-07-01T15:54:40.57Z" },
+ { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998, upload-time = "2025-07-01T15:54:43.025Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903, upload-time = "2025-07-01T15:54:44.752Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785, upload-time = "2025-07-01T15:54:46.043Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329, upload-time = "2025-07-01T15:54:47.64Z" },
+ { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875, upload-time = "2025-07-01T15:54:48.9Z" },
+ { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636, upload-time = "2025-07-01T15:54:50.619Z" },
+ { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663, upload-time = "2025-07-01T15:54:52.023Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428, upload-time = "2025-07-01T15:54:53.692Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571, upload-time = "2025-07-01T15:54:54.822Z" },
+ { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475, upload-time = "2025-07-01T15:54:56.228Z" },
+ { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692, upload-time = "2025-07-01T15:54:58.561Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415, upload-time = "2025-07-01T15:54:59.751Z" },
+ { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783, upload-time = "2025-07-01T15:55:00.898Z" },
+ { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844, upload-time = "2025-07-01T15:55:02.201Z" },
+ { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105, upload-time = "2025-07-01T15:55:03.698Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440, upload-time = "2025-07-01T15:55:05.398Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759, upload-time = "2025-07-01T15:55:08.316Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032, upload-time = "2025-07-01T15:55:09.52Z" },
+ { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416, upload-time = "2025-07-01T15:55:11.216Z" },
+ { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049, upload-time = "2025-07-01T15:55:13.004Z" },
+ { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428, upload-time = "2025-07-01T15:55:14.486Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524, upload-time = "2025-07-01T15:55:15.745Z" },
+]
+
+[[package]]
+name = "ruff"
+version = "0.12.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/a1/81/0bd3594fa0f690466e41bd033bdcdf86cba8288345ac77ad4afbe5ec743a/ruff-0.12.7.tar.gz", hash = "sha256:1fc3193f238bc2d7968772c82831a4ff69252f673be371fb49663f0068b7ec71", size = 5197814, upload-time = "2025-07-29T22:32:35.877Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e1/d2/6cb35e9c85e7a91e8d22ab32ae07ac39cc34a71f1009a6f9e4a2a019e602/ruff-0.12.7-py3-none-linux_armv6l.whl", hash = "sha256:76e4f31529899b8c434c3c1dede98c4483b89590e15fb49f2d46183801565303", size = 11852189, upload-time = "2025-07-29T22:31:41.281Z" },
+ { url = "https://files.pythonhosted.org/packages/63/5b/a4136b9921aa84638f1a6be7fb086f8cad0fde538ba76bda3682f2599a2f/ruff-0.12.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:789b7a03e72507c54fb3ba6209e4bb36517b90f1a3569ea17084e3fd295500fb", size = 12519389, upload-time = "2025-07-29T22:31:54.265Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/c9/3e24a8472484269b6b1821794141f879c54645a111ded4b6f58f9ab0705f/ruff-0.12.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2e1c2a3b8626339bb6369116e7030a4cf194ea48f49b64bb505732a7fce4f4e3", size = 11743384, upload-time = "2025-07-29T22:31:59.575Z" },
+ { url = "https://files.pythonhosted.org/packages/26/7c/458dd25deeb3452c43eaee853c0b17a1e84169f8021a26d500ead77964fd/ruff-0.12.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32dec41817623d388e645612ec70d5757a6d9c035f3744a52c7b195a57e03860", size = 11943759, upload-time = "2025-07-29T22:32:01.95Z" },
+ { url = "https://files.pythonhosted.org/packages/7f/8b/658798472ef260ca050e400ab96ef7e85c366c39cf3dfbef4d0a46a528b6/ruff-0.12.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47ef751f722053a5df5fa48d412dbb54d41ab9b17875c6840a58ec63ff0c247c", size = 11654028, upload-time = "2025-07-29T22:32:04.367Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/86/9c2336f13b2a3326d06d39178fd3448dcc7025f82514d1b15816fe42bfe8/ruff-0.12.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a828a5fc25a3efd3e1ff7b241fd392686c9386f20e5ac90aa9234a5faa12c423", size = 13225209, upload-time = "2025-07-29T22:32:06.952Z" },
+ { url = "https://files.pythonhosted.org/packages/76/69/df73f65f53d6c463b19b6b312fd2391dc36425d926ec237a7ed028a90fc1/ruff-0.12.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5726f59b171111fa6a69d82aef48f00b56598b03a22f0f4170664ff4d8298efb", size = 14182353, upload-time = "2025-07-29T22:32:10.053Z" },
+ { url = "https://files.pythonhosted.org/packages/58/1e/de6cda406d99fea84b66811c189b5ea139814b98125b052424b55d28a41c/ruff-0.12.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74e6f5c04c4dd4aba223f4fe6e7104f79e0eebf7d307e4f9b18c18362124bccd", size = 13631555, upload-time = "2025-07-29T22:32:12.644Z" },
+ { url = "https://files.pythonhosted.org/packages/6f/ae/625d46d5164a6cc9261945a5e89df24457dc8262539ace3ac36c40f0b51e/ruff-0.12.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d0bfe4e77fba61bf2ccadf8cf005d6133e3ce08793bbe870dd1c734f2699a3e", size = 12667556, upload-time = "2025-07-29T22:32:15.312Z" },
+ { url = "https://files.pythonhosted.org/packages/55/bf/9cb1ea5e3066779e42ade8d0cd3d3b0582a5720a814ae1586f85014656b6/ruff-0.12.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06bfb01e1623bf7f59ea749a841da56f8f653d641bfd046edee32ede7ff6c606", size = 12939784, upload-time = "2025-07-29T22:32:17.69Z" },
+ { url = "https://files.pythonhosted.org/packages/55/7f/7ead2663be5627c04be83754c4f3096603bf5e99ed856c7cd29618c691bd/ruff-0.12.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e41df94a957d50083fd09b916d6e89e497246698c3f3d5c681c8b3e7b9bb4ac8", size = 11771356, upload-time = "2025-07-29T22:32:20.134Z" },
+ { url = "https://files.pythonhosted.org/packages/17/40/a95352ea16edf78cd3a938085dccc55df692a4d8ba1b3af7accbe2c806b0/ruff-0.12.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4000623300563c709458d0ce170c3d0d788c23a058912f28bbadc6f905d67afa", size = 11612124, upload-time = "2025-07-29T22:32:22.645Z" },
+ { url = "https://files.pythonhosted.org/packages/4d/74/633b04871c669e23b8917877e812376827c06df866e1677f15abfadc95cb/ruff-0.12.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:69ffe0e5f9b2cf2b8e289a3f8945b402a1b19eff24ec389f45f23c42a3dd6fb5", size = 12479945, upload-time = "2025-07-29T22:32:24.765Z" },
+ { url = "https://files.pythonhosted.org/packages/be/34/c3ef2d7799c9778b835a76189c6f53c179d3bdebc8c65288c29032e03613/ruff-0.12.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a07a5c8ffa2611a52732bdc67bf88e243abd84fe2d7f6daef3826b59abbfeda4", size = 12998677, upload-time = "2025-07-29T22:32:27.022Z" },
+ { url = "https://files.pythonhosted.org/packages/77/ab/aca2e756ad7b09b3d662a41773f3edcbd262872a4fc81f920dc1ffa44541/ruff-0.12.7-py3-none-win32.whl", hash = "sha256:c928f1b2ec59fb77dfdf70e0419408898b63998789cc98197e15f560b9e77f77", size = 11756687, upload-time = "2025-07-29T22:32:29.381Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/71/26d45a5042bc71db22ddd8252ca9d01e9ca454f230e2996bb04f16d72799/ruff-0.12.7-py3-none-win_amd64.whl", hash = "sha256:9c18f3d707ee9edf89da76131956aba1270c6348bfee8f6c647de841eac7194f", size = 12912365, upload-time = "2025-07-29T22:32:31.517Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/9b/0b8aa09817b63e78d94b4977f18b1fcaead3165a5ee49251c5d5c245bb2d/ruff-0.12.7-py3-none-win_arm64.whl", hash = "sha256:dfce05101dbd11833a0776716d5d1578641b7fddb537fe7fa956ab85d1769b69", size = 11982083, upload-time = "2025-07-29T22:32:33.881Z" },
+]
+
+[[package]]
+name = "s3transfer"
+version = "0.16.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "botocore" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/05/04/74127fc843314818edfa81b5540e26dd537353b123a4edc563109d8f17dd/s3transfer-0.16.0.tar.gz", hash = "sha256:8e990f13268025792229cd52fa10cb7163744bf56e719e0b9cb925ab79abf920", size = 153827, upload-time = "2025-12-01T02:30:59.114Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fc/51/727abb13f44c1fcf6d145979e1535a35794db0f6e450a0cb46aa24732fe2/s3transfer-0.16.0-py3-none-any.whl", hash = "sha256:18e25d66fed509e3868dc1572b3f427ff947dd2c56f844a5bf09481ad3f3b2fe", size = 86830, upload-time = "2025-12-01T02:30:57.729Z" },
+]
+
+[[package]]
+name = "scipy"
+version = "1.16.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/f5/4a/b927028464795439faec8eaf0b03b011005c487bb2d07409f28bf30879c4/scipy-1.16.1.tar.gz", hash = "sha256:44c76f9e8b6e8e488a586190ab38016e4ed2f8a038af7cd3defa903c0a2238b3", size = 30580861, upload-time = "2025-07-27T16:33:30.834Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f8/d9/ec4864f5896232133f51382b54a08de91a9d1af7a76dfa372894026dfee2/scipy-1.16.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81b433bbeaf35728dad619afc002db9b189e45eebe2cd676effe1fb93fef2b9c", size = 36575194, upload-time = "2025-07-27T16:27:41.321Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/6d/40e81ecfb688e9d25d34a847dca361982a6addf8e31f0957b1a54fbfa994/scipy-1.16.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:886cc81fdb4c6903a3bb0464047c25a6d1016fef77bb97949817d0c0d79f9e04", size = 28594590, upload-time = "2025-07-27T16:27:49.204Z" },
+ { url = "https://files.pythonhosted.org/packages/0e/37/9f65178edfcc629377ce9a64fc09baebea18c80a9e57ae09a52edf84880b/scipy-1.16.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:15240c3aac087a522b4eaedb09f0ad061753c5eebf1ea430859e5bf8640d5919", size = 20866458, upload-time = "2025-07-27T16:27:54.98Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/7b/749a66766871ea4cb1d1ea10f27004db63023074c22abed51f22f09770e0/scipy-1.16.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f81a25805f3659b48126b5053d9e823d3215e4a63730b5e1671852a1705921", size = 23539318, upload-time = "2025-07-27T16:28:01.604Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/db/8d4afec60eb833a666434d4541a3151eedbf2494ea6d4d468cbe877f00cd/scipy-1.16.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c62eea7f607f122069b9bad3f99489ddca1a5173bef8a0c75555d7488b6f725", size = 33292899, upload-time = "2025-07-27T16:28:09.147Z" },
+ { url = "https://files.pythonhosted.org/packages/51/1e/79023ca3bbb13a015d7d2757ecca3b81293c663694c35d6541b4dca53e98/scipy-1.16.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f965bbf3235b01c776115ab18f092a95aa74c271a52577bcb0563e85738fd618", size = 35162637, upload-time = "2025-07-27T16:28:17.535Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/49/0648665f9c29fdaca4c679182eb972935b3b4f5ace41d323c32352f29816/scipy-1.16.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f006e323874ffd0b0b816d8c6a8e7f9a73d55ab3b8c3f72b752b226d0e3ac83d", size = 35490507, upload-time = "2025-07-27T16:28:25.705Z" },
+ { url = "https://files.pythonhosted.org/packages/62/8f/66cbb9d6bbb18d8c658f774904f42a92078707a7c71e5347e8bf2f52bb89/scipy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8fd15fc5085ab4cca74cb91fe0a4263b1f32e4420761ddae531ad60934c2119", size = 37923998, upload-time = "2025-07-27T16:28:34.339Z" },
+ { url = "https://files.pythonhosted.org/packages/14/c3/61f273ae550fbf1667675701112e380881905e28448c080b23b5a181df7c/scipy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7b8013c6c066609577d910d1a2a077021727af07b6fab0ee22c2f901f22352a", size = 38508060, upload-time = "2025-07-27T16:28:43.242Z" },
+ { url = "https://files.pythonhosted.org/packages/93/0b/b5c99382b839854a71ca9482c684e3472badc62620287cbbdab499b75ce6/scipy-1.16.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5451606823a5e73dfa621a89948096c6528e2896e40b39248295d3a0138d594f", size = 36533717, upload-time = "2025-07-27T16:28:51.706Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/e5/69ab2771062c91e23e07c12e7d5033a6b9b80b0903ee709c3c36b3eb520c/scipy-1.16.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:89728678c5ca5abd610aee148c199ac1afb16e19844401ca97d43dc548a354eb", size = 28570009, upload-time = "2025-07-27T16:28:57.017Z" },
+ { url = "https://files.pythonhosted.org/packages/f4/69/bd75dbfdd3cf524f4d753484d723594aed62cfaac510123e91a6686d520b/scipy-1.16.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e756d688cb03fd07de0fffad475649b03cb89bee696c98ce508b17c11a03f95c", size = 20841942, upload-time = "2025-07-27T16:29:01.152Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/74/add181c87663f178ba7d6144b370243a87af8476664d5435e57d599e6874/scipy-1.16.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5aa2687b9935da3ed89c5dbed5234576589dd28d0bf7cd237501ccfbdf1ad608", size = 23498507, upload-time = "2025-07-27T16:29:05.202Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/74/ece2e582a0d9550cee33e2e416cc96737dce423a994d12bbe59716f47ff1/scipy-1.16.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0851f6a1e537fe9399f35986897e395a1aa61c574b178c0d456be5b1a0f5ca1f", size = 33286040, upload-time = "2025-07-27T16:29:10.201Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/82/08e4076df538fb56caa1d489588d880ec7c52d8273a606bb54d660528f7c/scipy-1.16.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fedc2cbd1baed37474b1924c331b97bdff611d762c196fac1a9b71e67b813b1b", size = 35176096, upload-time = "2025-07-27T16:29:17.091Z" },
+ { url = "https://files.pythonhosted.org/packages/fa/79/cd710aab8c921375711a8321c6be696e705a120e3011a643efbbcdeeabcc/scipy-1.16.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2ef500e72f9623a6735769e4b93e9dcb158d40752cdbb077f305487e3e2d1f45", size = 35490328, upload-time = "2025-07-27T16:29:22.928Z" },
+ { url = "https://files.pythonhosted.org/packages/71/73/e9cc3d35ee4526d784520d4494a3e1ca969b071fb5ae5910c036a375ceec/scipy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:978d8311674b05a8f7ff2ea6c6bce5d8b45a0cb09d4c5793e0318f448613ea65", size = 37939921, upload-time = "2025-07-27T16:29:29.108Z" },
+ { url = "https://files.pythonhosted.org/packages/21/12/c0efd2941f01940119b5305c375ae5c0fcb7ec193f806bd8f158b73a1782/scipy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:81929ed0fa7a5713fcdd8b2e6f73697d3b4c4816d090dd34ff937c20fa90e8ab", size = 38479462, upload-time = "2025-07-27T16:30:24.078Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/19/c3d08b675260046a991040e1ea5d65f91f40c7df1045fffff412dcfc6765/scipy-1.16.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:bcc12db731858abda693cecdb3bdc9e6d4bd200213f49d224fe22df82687bdd6", size = 36938832, upload-time = "2025-07-27T16:29:35.057Z" },
+ { url = "https://files.pythonhosted.org/packages/81/f2/ce53db652c033a414a5b34598dba6b95f3d38153a2417c5a3883da429029/scipy-1.16.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:744d977daa4becb9fc59135e75c069f8d301a87d64f88f1e602a9ecf51e77b27", size = 29093084, upload-time = "2025-07-27T16:29:40.201Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/ae/7a10ff04a7dc15f9057d05b33737ade244e4bd195caa3f7cc04d77b9e214/scipy-1.16.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:dc54f76ac18073bcecffb98d93f03ed6b81a92ef91b5d3b135dcc81d55a724c7", size = 21365098, upload-time = "2025-07-27T16:29:44.295Z" },
+ { url = "https://files.pythonhosted.org/packages/36/ac/029ff710959932ad3c2a98721b20b405f05f752f07344622fd61a47c5197/scipy-1.16.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:367d567ee9fc1e9e2047d31f39d9d6a7a04e0710c86e701e053f237d14a9b4f6", size = 23896858, upload-time = "2025-07-27T16:29:48.784Z" },
+ { url = "https://files.pythonhosted.org/packages/71/13/d1ef77b6bd7898720e1f0b6b3743cb945f6c3cafa7718eaac8841035ab60/scipy-1.16.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4cf5785e44e19dcd32a0e4807555e1e9a9b8d475c6afff3d21c3c543a6aa84f4", size = 33438311, upload-time = "2025-07-27T16:29:54.164Z" },
+ { url = "https://files.pythonhosted.org/packages/2d/e0/e64a6821ffbb00b4c5b05169f1c1fddb4800e9307efe3db3788995a82a2c/scipy-1.16.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3d0b80fb26d3e13a794c71d4b837e2a589d839fd574a6bbb4ee1288c213ad4a3", size = 35279542, upload-time = "2025-07-27T16:30:00.249Z" },
+ { url = "https://files.pythonhosted.org/packages/57/59/0dc3c8b43e118f1e4ee2b798dcc96ac21bb20014e5f1f7a8e85cc0653bdb/scipy-1.16.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8503517c44c18d1030d666cb70aaac1cc8913608816e06742498833b128488b7", size = 35667665, upload-time = "2025-07-27T16:30:05.916Z" },
+ { url = "https://files.pythonhosted.org/packages/45/5f/844ee26e34e2f3f9f8febb9343748e72daeaec64fe0c70e9bf1ff84ec955/scipy-1.16.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:30cc4bb81c41831ecfd6dc450baf48ffd80ef5aed0f5cf3ea775740e80f16ecc", size = 38045210, upload-time = "2025-07-27T16:30:11.655Z" },
+ { url = "https://files.pythonhosted.org/packages/8d/d7/210f2b45290f444f1de64bc7353aa598ece9f0e90c384b4a156f9b1a5063/scipy-1.16.1-cp313-cp313t-win_amd64.whl", hash = "sha256:c24fa02f7ed23ae514460a22c57eca8f530dbfa50b1cfdbf4f37c05b5309cc39", size = 38593661, upload-time = "2025-07-27T16:30:17.825Z" },
+]
+
+[[package]]
+name = "seaborn"
+version = "0.13.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "matplotlib" },
+ { name = "numpy" },
+ { name = "pandas" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/86/59/a451d7420a77ab0b98f7affa3a1d78a313d2f7281a57afb1a34bae8ab412/seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7", size = 1457696, upload-time = "2024-01-25T13:21:52.551Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", size = 294914, upload-time = "2024-01-25T13:21:49.598Z" },
+]
+
+[[package]]
+name = "six"
+version = "1.17.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" },
+]
+
+[[package]]
+name = "snowballstemmer"
+version = "3.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload-time = "2025-05-09T16:34:51.843Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" },
+]
+
+[[package]]
+name = "soupsieve"
+version = "2.7"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload-time = "2025-04-20T18:50:08.518Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload-time = "2025-04-20T18:50:07.196Z" },
+]
+
+[[package]]
+name = "sphinx"
+version = "8.1.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "alabaster" },
+ { name = "babel" },
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "docutils" },
+ { name = "imagesize" },
+ { name = "jinja2" },
+ { name = "packaging" },
+ { name = "pygments" },
+ { name = "requests" },
+ { name = "snowballstemmer" },
+ { name = "sphinxcontrib-applehelp" },
+ { name = "sphinxcontrib-devhelp" },
+ { name = "sphinxcontrib-htmlhelp" },
+ { name = "sphinxcontrib-jsmath" },
+ { name = "sphinxcontrib-qthelp" },
+ { name = "sphinxcontrib-serializinghtml" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload-time = "2024-10-13T20:27:13.93Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125, upload-time = "2024-10-13T20:27:10.448Z" },
+]
+
+[[package]]
+name = "sphinx-argparse"
+version = "0.5.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "docutils" },
+ { name = "sphinx" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/3b/21/a8c64e6633652111e6e4f89703182a53cbc3ed67233523e47472101358b6/sphinx_argparse-0.5.2.tar.gz", hash = "sha256:e5352f8fa894b6fb6fda0498ba28a9f8d435971ef4bbc1a6c9c6414e7644f032", size = 27838, upload-time = "2024-07-17T12:08:08.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e5/43/9f0e9bfb3ce02cbf7747aa2185c48a9d6e42ba95736a5e8f511a5054d976/sphinx_argparse-0.5.2-py3-none-any.whl", hash = "sha256:d771b906c36d26dee669dbdbb5605c558d9440247a5608b810f7fa6e26ab1fd3", size = 12547, upload-time = "2024-07-17T12:08:06.307Z" },
+]
+
+[[package]]
+name = "sphinxcontrib-applehelp"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" },
+]
+
+[[package]]
+name = "sphinxcontrib-devhelp"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" },
+]
+
+[[package]]
+name = "sphinxcontrib-htmlhelp"
+version = "2.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" },
+]
+
+[[package]]
+name = "sphinxcontrib-jsmath"
+version = "1.0.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" },
+]
+
+[[package]]
+name = "sphinxcontrib-qthelp"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" },
+]
+
+[[package]]
+name = "sphinxcontrib-serializinghtml"
+version = "2.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" },
+]
+
+[[package]]
+name = "stack-data"
+version = "0.6.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "asttokens" },
+ { name = "executing" },
+ { name = "pure-eval" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" },
+]
+
+[[package]]
+name = "statsmodels"
+version = "0.14.5"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "numpy" },
+ { name = "packaging" },
+ { name = "pandas" },
+ { name = "patsy" },
+ { name = "scipy" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/64/cc/8c1bf59bf8203dea1bf2ea811cfe667d7bcc6909c83d8afb02b08e30f50b/statsmodels-0.14.5.tar.gz", hash = "sha256:de260e58cccfd2ceddf835b55a357233d6ca853a1aa4f90f7553a52cc71c6ddf", size = 20525016, upload-time = "2025-07-07T12:14:23.195Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5f/a5/fcc4f5f16355660ce7a1742e28a43e3a9391b492fc4ff29fdd6893e81c05/statsmodels-0.14.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:37e7364a39f9aa3b51d15a208c2868b90aadb8412f868530f5cba9197cb00eaa", size = 10042891, upload-time = "2025-07-07T12:13:41.671Z" },
+ { url = "https://files.pythonhosted.org/packages/1c/6f/db0cf5efa48277ac6218d9b981c8fd5e63c4c43e0d9d65015fdc38eed0ef/statsmodels-0.14.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4263d7f4d0f1d5ac6eb4db22e1ee34264a14d634b9332c975c9d9109b6b46e12", size = 9698912, upload-time = "2025-07-07T12:07:54.674Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/93/4ddc3bc4a59c51e6a57c49df1b889882c40d9e141e855b3517f6a8de3232/statsmodels-0.14.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:86224f6e36f38486e471e75759d241fe2912d8bc25ab157d54ee074c6aedbf45", size = 10237801, upload-time = "2025-07-07T14:23:12.593Z" },
+ { url = "https://files.pythonhosted.org/packages/66/de/dc6bf2f6e8c8eb4c5815560ebdbdf2d69a767bc0f65fde34bc086cf5b36d/statsmodels-0.14.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c3dd760a6fa80cd5e0371685c697bb9c2c0e6e1f394d975e596a1e6d0bbb9372", size = 10424154, upload-time = "2025-07-07T14:23:25.365Z" },
+ { url = "https://files.pythonhosted.org/packages/16/4f/2d5a8d14bebdf2b03b3ea89b8c6a2c837bb406ba5b7a41add8bd303bce29/statsmodels-0.14.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6264fb00e02f858b86bd01ef2dc05055a71d4a0cc7551b9976b07b0f0e6cf24f", size = 10652915, upload-time = "2025-07-07T14:23:39.337Z" },
+ { url = "https://files.pythonhosted.org/packages/df/4c/2feda3a9f0e17444a84ba5398ada6a4d2e1b8f832760048f04e2b8ea0c41/statsmodels-0.14.5-cp312-cp312-win_amd64.whl", hash = "sha256:b2ed065bfbaf8bb214c7201656df840457c2c8c65e1689e3eb09dc7440f9c61c", size = 9611236, upload-time = "2025-07-07T12:08:06.794Z" },
+ { url = "https://files.pythonhosted.org/packages/84/fd/4c374108cf108b3130240a5b45847a61f70ddf973429044a81a05189b046/statsmodels-0.14.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:906263134dd1a640e55ecb01fda4a9be7b9e08558dba9e4c4943a486fdb0c9c8", size = 10013958, upload-time = "2025-07-07T14:35:01.04Z" },
+ { url = "https://files.pythonhosted.org/packages/5a/36/bf3d7f0e36acd3ba9ec0babd79ace25506b6872780cbd710fb7cd31f0fa2/statsmodels-0.14.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9118f76344f77cffbb3a9cbcff8682b325be5eed54a4b3253e09da77a74263d3", size = 9674243, upload-time = "2025-07-07T12:08:22.571Z" },
+ { url = "https://files.pythonhosted.org/packages/90/ce/a55a6f37b5277683ceccd965a5828b24672bbc427db6b3969ae0b0fc29fb/statsmodels-0.14.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9dc4ee159070557c9a6c000625d85f653de437772fe7086857cff68f501afe45", size = 10219521, upload-time = "2025-07-07T14:23:52.646Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/48/973da1ee8bc0743519759e74c3615b39acdc3faf00e0a0710f8c856d8c9d/statsmodels-0.14.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a085d47c8ef5387279a991633883d0e700de2b0acc812d7032d165888627bef", size = 10453538, upload-time = "2025-07-07T14:24:06.959Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/d6/18903fb707afd31cf1edaec5201964dbdacb2bfae9a22558274647a7c88f/statsmodels-0.14.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9f866b2ebb2904b47c342d00def83c526ef2eb1df6a9a3c94ba5fe63d0005aec", size = 10681584, upload-time = "2025-07-07T14:24:21.038Z" },
+ { url = "https://files.pythonhosted.org/packages/44/d6/80df1bbbfcdc50bff4152f43274420fa9856d56e234d160d6206eb1f5827/statsmodels-0.14.5-cp313-cp313-win_amd64.whl", hash = "sha256:2a06bca03b7a492f88c8106103ab75f1a5ced25de90103a89f3a287518017939", size = 9604641, upload-time = "2025-07-07T12:08:36.23Z" },
+]
+
+[[package]]
+name = "tinycss2"
+version = "1.4.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "webencodings" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085, upload-time = "2024-10-24T14:58:29.895Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" },
+]
+
+[[package]]
+name = "tornado"
+version = "6.5.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934, upload-time = "2025-05-22T18:15:38.788Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948, upload-time = "2025-05-22T18:15:20.862Z" },
+ { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112, upload-time = "2025-05-22T18:15:22.591Z" },
+ { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672, upload-time = "2025-05-22T18:15:24.027Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019, upload-time = "2025-05-22T18:15:25.735Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252, upload-time = "2025-05-22T18:15:27.499Z" },
+ { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930, upload-time = "2025-05-22T18:15:29.299Z" },
+ { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351, upload-time = "2025-05-22T18:15:31.038Z" },
+ { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328, upload-time = "2025-05-22T18:15:32.426Z" },
+ { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396, upload-time = "2025-05-22T18:15:34.205Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840, upload-time = "2025-05-22T18:15:36.1Z" },
+ { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596, upload-time = "2025-05-22T18:15:37.433Z" },
+]
+
+[[package]]
+name = "tqdm"
+version = "4.67.1"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" },
+]
+
+[[package]]
+name = "traitlets"
+version = "5.14.3"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.14.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" },
+]
+
+[[package]]
+name = "tzdata"
+version = "2025.2"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" },
+]
+
+[[package]]
+name = "urllib3"
+version = "2.5.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" },
+]
+
+[[package]]
+name = "watchdog"
+version = "6.0.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" },
+ { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" },
+ { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" },
+ { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" },
+ { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" },
+ { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" },
+ { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" },
+ { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" },
+ { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" },
+ { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" },
+ { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" },
+]
+
+[[package]]
+name = "wcwidth"
+version = "0.2.13"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload-time = "2024-01-06T02:10:57.829Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload-time = "2024-01-06T02:10:55.763Z" },
+]
+
+[[package]]
+name = "webencodings"
+version = "0.5.1"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" },
+]