diff --git a/.gitignore b/.gitignore
index 6d971b6..d8b5c97 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,3 +44,5 @@ __pycache__/
# Numpy debug files
numpy-*.log
*.npz
+
+sandbox
diff --git a/Makefile b/Makefile
deleted file mode 100644
index aa50726..0000000
--- a/Makefile
+++ /dev/null
@@ -1,58 +0,0 @@
-sources = src tests scripts
-
-.PHONY: .poetry ## Check that PDM is installed
-.poetry:
- @poetry -V || echo 'Please install PDM: https://python-poetry.org/docs/#installation'
-
-.PHONY: .pre-commit ## Check that pre-commit is installed
-.pre-commit:
- @pre-commit -V || echo 'Please install pre-commit: https://pre-commit.com/'
-
-.PHONY: install ## Install the package, dependencies, and pre-commit for local development
-install: .poetry .pre-commit
- poetry install
- pre-commit install --install-hooks
-
-.PHONY: update ## Update all libraries and export the requirements
-update:
- poetry update
- poetry export -o requirements-docs.txt --only=docs --without-hashes
- echo "-e ." | cat - requirements-docs.txt > temp && mv temp requirements-docs.txt
-
-
-.PHONY: lint ## Lint python source files
-lint: .poetry
- poetry run ruff check $(sources)
- poetry run ruff format --check $(sources)
-
-.PHONY: clean ## Clear local caches and build artifacts
-clean:
- rm -rf `find . -name __pycache__`
- rm -f `find . -type f -name '*.py[co]'`
- rm -f `find . -type f -name '*~'`
- rm -f `find . -type f -name '.*~'`
- rm -rf .cache
- rm -rf .pytest_cache
- rm -rf .ruff_cache
- rm -rf htmlcov
- rm -rf *.egg-info
- rm -f .coverage
- rm -f .coverage.*
- rm -rf build
- rm -rf dist
- rm -rf site
- rm -rf docs/_build
- rm -rf docs/.changelog.md docs/.version.md docs/.tmp_schema_mappings.html
- rm -rf fastapi/test.db
- rm -rf coverage.xml
-
-.PHONY: docs ## Generate the docs
-docs:
- poetry run mkdocs build --strict
-
-.PHONY: help ## Display this message
-help:
- @grep -E \
- '^.PHONY: .*?## .*$$' $(MAKEFILE_LIST) | \
- sort | \
- awk 'BEGIN {FS = ".PHONY: |## "}; {printf "\033[36m%-19s\033[0m %s\n", $$2, $$3}'
diff --git a/README.md b/README.md
index 1e0b0d9..eb524d2 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,9 @@
-
+
# libeq
-
-
`libeq` is a Python library for the solution of thermodynamic equilibrium. It is the core routine of [PyES](https://www.github.com/Kastakin/PyES), a frontend for the calculation of species distribution and simulation of titration curves.
## Installation
@@ -24,4 +22,5 @@ For more detailed information about `libeq` and its usage, please refer to the p
This library is based on the work of many research groups on the topic, in particular the works of Prof. Sammartano's research group from the University of Messina and the Prof. Carrayrou from the University of Strasbourg.
-The code has been heavily inspired by the works of Prof. Blasco from the University of Valencia.
+The code has been heavily inspired by the works of [Prof. Blasco](https://github.com/salvadorblasco)
+from the [University of Valencia](https://www.uv.es/).
diff --git a/notebooks/Zn-EDTA b/notebooks/Zn-EDTA
deleted file mode 100644
index 487f3d9..0000000
--- a/notebooks/Zn-EDTA
+++ /dev/null
@@ -1,216 +0,0 @@
-Zn-EDTA
-100 3 16 0 1 0 0
-Zn
-EDTA
-H
-25 1.7 12
-0.1 0.5 1.25 0.084 0.126 0 -0.062 0 0 0 0 0 0 0 0
-2 -4 1
--13.78 (0.1) 0 0 0 0 0 -1 0 0 0 0 0
--8.96 (0.1) 0 0 0 1 0 -1 0 0 0 0 0
--17.82 (0.1) 0 0 0 1 0 -2 0 0 0 0 0
--28.05 (0.1) 0 0 0 1 0 -3 0 0 0 0 0
--40.41 (0.1) 0 0 0 1 0 -4 0 0 0 0 0
--7.9 (0.0) 0 0 0 2 0 -1 0 0 0 0 0
--57.53 (0.0) 0 0 0 2 0 -6 0 0 0 0 0
-10.15 (0.1) 0 0 0 0 1 1 0 0 0 0 0
-16.30 (0.1) 0 0 0 0 1 2 0 0 0 0 0
-19.02 (0.1) 0 0 0 0 1 3 0 0 0 0 0
-21.04 (0.1) 0 0 0 0 1 4 0 0 0 0 0
-22.39 (0.1) 0 0 0 0 1 5 0 0 0 0 0
-22.46 (0.1) 0 0 0 0 1 6 -1 0 0 0 0
-16.40 (0.1) 0 0 0 1 1 0 1 0 0 0 0
-19.60 (0.1) 0 0 0 1 1 1 1 0 0 0 0
-4.61 (0.1) 0 0 0 1 1 -1 1 0 0 0 0
-Tit 1
-1 0
-0.001944 0 0
-0.001988 0 1
-0.028132 -0.2009 1
-0.184 0.2009 0.092
-50. 0.003
-402.10 0.2 0.65 -89.55 59.13 0 0 0 0
-0.0100 305.9 0
-0.0150 305.9 0
-0.0200 305.9 0
-0.0250 305.8 0
-0.1830 305.0 0
-0.3390 304.2 0
-0.5377 303.3 0
-0.7387 302.3 0
-0.9390 301.3 0
-1.1382 300.2 0
-1.3362 299.1 0
-1.5352 298.0 0
-1.7342 296.9 0
-1.9317 295.6 0
-2.1285 294.4 0
-2.3255 293.2 0
-2.5230 291.8 0
-2.7182 290.4 0
-2.9127 288.9 0
-3.1070 287.4 0
-3.3012 285.8 0
-3.4937 284.0 0
-3.6845 282.3 0
-3.8757 280.5 0
-4.0657 278.5 0
-4.2535 276.3 0
-4.4392 274.1 0
-4.6250 271.7 0
-4.8080 269.0 0
-4.9880 266.0 0
-5.1652 262.9 0
-5.3397 259.6 0
-5.5125 255.7 0
-5.6790 251.4 0
-5.8397 246.5 0
-5.9940 241.1 0
-6.1425 234.8 0
-6.2810 227.7 0
-6.4077 219.7 0
-6.5227 210.8 0
-6.6270 200.6 0
-6.7132 189.3 0
-6.7772 177.8 0
-6.8227 166.4 0
-6.8530 155.2 0
-6.8697 146.6 0
-6.8835 136.7 0
-6.8930 127.9 0
-6.9022 115.9 0
-6.9090 105.4 0
-6.9167 88.0 0
-6.9222 69.3 0
-6.9275 48.2 0
-6.9330 20.4 0
-6.9382 -19.7 0
-6.9432 -84.4 0
-6.9482 -108.8 0
-6.9532 -121.6 0
-6.9647 -141.6 0
-6.9792 -157.7 0
-6.9985 -175.7 0
-7.0202 -187.8 0
-7.0520 -200.0 0
-7.0937 -211.0 0
-7.1482 -220.7 0
-7.2185 -229.9 0
-7.3035 -237.7 0
-7.4067 -244.7 0
-7.5247 -251.0 0
-7.6552 -256.5 0
-7.7972 -261.2 0
-7.9502 -265.4 0
-8.1100 -269.6 0
-8.2715 -273.0 0
-8.4412 -276.0 0
-8.6160 -278.7 0
-8.7950 -281.3 0
-8.9760 -283.7 0
-9.1590 -285.8 0
-9.3447 -287.7 0
-9.5335 -289.6 0
-9.7230 -291.4 0
-9.9135 -293.0 0
-10.1052 -294.5 0
-10.2997 -295.9 0
-10.4937 -297.2 0
-10.6902 -298.4 0
-10.8870 -299.7 0
-11.0837 -300.9 1
-Tit 3
-1 0
-0.002005 0 0
-0.002047 0 1
-0.028250 -0.2009 1
-0.184 0.2009 0.092
-50. 0.003
-399.14 0.2 0.58 -14.94 59.16 0 0 0 0
-0.0100 302.8 0
-0.0150 302.9 0
-0.0200 302.9 0
-0.0250 302.8 0
-0.1740 302.0 0
-0.3165 301.5 0
-0.5190 300.6 0
-0.7197 299.6 0
-0.9192 298.5 0
-1.1180 297.6 0
-1.3187 296.6 0
-1.5180 295.4 0
-1.7160 294.2 0
-1.9132 293.1 0
-2.1122 291.9 0
-2.3097 290.6 0
-2.5057 289.2 0
-2.7007 288.0 0
-2.8972 286.5 0
-3.0920 285.0 0
-3.2852 283.4 0
-3.4777 281.8 0
-3.6707 280.1 0
-3.8617 278.1 0
-4.0507 276.2 0
-4.2390 274.2 0
-4.4270 271.9 0
-4.6120 269.4 0
-4.7945 266.8 0
-4.9752 264.1 0
-5.1547 260.8 0
-5.3280 257.5 0
-5.5007 253.7 0
-5.6677 249.4 0
-5.8292 244.6 0
-5.9847 239.4 0
-6.1352 233.3 0
-6.2750 226.3 0
-6.4037 218.5 0
-6.5212 209.7 0
-6.6262 199.9 0
-6.7172 188.6 0
-6.7862 177.1 0
-6.8360 165.1 0
-6.8657 155.2 0
-6.8875 144.9 0
-6.9015 135.4 0
-6.9112 127.2 0
-6.9222 114.4 0
-6.9292 103.6 0
-6.9357 89.9 0
-6.9415 72.1 0
-6.9467 50.7 0
-6.9520 26.7 0
-6.9577 -7.8 0
-6.9627 -78.8 0
-6.9677 -113.7 0
-6.9727 -127.0 0
-6.9777 -136.7 0
-6.9912 -155.8 0
-7.0077 -171.3 0
-7.0295 -185.3 0
-7.0580 -197.7 0
-7.0957 -209.3 0
-7.1447 -219.5 0
-7.2082 -228.8 0
-7.2880 -237.0 0
-7.3847 -244.5 0
-7.4962 -251.2 0
-7.6212 -256.9 0
-7.7587 -262.0 0
-7.9070 -266.5 0
-8.0625 -270.6 0
-8.2242 -274.1 0
-8.3927 -277.3 0
-8.5662 -280.2 0
-8.7427 -282.9 0
-8.9217 -285.3 0
-9.1042 -287.4 0
-9.2902 -289.5 0
-9.4772 -291.4 0
-9.6655 -293.3 0
-9.8550 -294.8 0
-10.0480 -296.5 0
-10.2402 -297.9 0
-10.4345 -299.2 0
-10.6300 -300.6 1
diff --git a/notebooks/computed_field_hierarcy.ipynb b/notebooks/computed_field_hierarcy.ipynb
deleted file mode 100644
index 4f1ec43..0000000
--- a/notebooks/computed_field_hierarcy.ipynb
+++ /dev/null
@@ -1,70 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "from pydantic import BaseModel, computed_field\n",
- "from functools import cached_property\n",
- "\n",
- "\n",
- "class Foo(BaseModel):\n",
- " a: int\n",
- " b: int\n",
- "\n",
- " @computed_field\n",
- " @cached_property\n",
- " def d(self) -> int:\n",
- " return self.c * 2\n",
- "\n",
- " @computed_field\n",
- " @cached_property\n",
- " def c(self) -> int:\n",
- " return self.a + self.b"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "6"
- ]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "Foo(a=1, b=2).d"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "libeq-8i_JZAyh-py3.12",
- "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.12.1"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/notebooks/cu_gly_solid.json b/notebooks/cu_gly_solid.json
deleted file mode 100644
index 3aea02e..0000000
--- a/notebooks/cu_gly_solid.json
+++ /dev/null
@@ -1,223 +0,0 @@
-{
- "check": "PyES project file --- DO NOT MODIFY THIS LINE!",
- "nc": 3,
- "ns": 12,
- "np": 1,
- "emode": true,
- "imode": 1,
- "ris": 0.0,
- "a": 0.5,
- "b": 1.5,
- "c0": 0.1,
- "c1": 0.23,
- "d0": 0.0,
- "d1": -0.1,
- "e0": 0.0,
- "e1": 0.0,
- "dmode": 0,
- "v0": 25.0,
- "initv": 25.0,
- "vinc": 0.1,
- "nop": 50.0,
- "c0back": 0.0,
- "ctback": 0.0,
- "ind_comp": 2,
- "initialLog": 2.0,
- "finalLog": 12.0,
- "logInc": 0.1,
- "cback": 0.0,
- "compModel": {
- "Name": { "0": "Cu", "1": "gly", "2": "H" },
- "Charge": { "0": 2, "1": -1, "2": 1 }
- },
- "concModel": {
- "C0": { "Cu": 0.001, "gly": 0.002, "H": 0.001 },
- "CT": { "Cu": 0.0, "gly": 0.0, "H": -0.01 },
- "Sigma C0": { "Cu": 1e-5, "gly": 2e-5, "H": 0.0 },
- "Sigma CT": { "Cu": 0.0, "gly": 0.0, "H": 0.0 }
- },
- "speciesModel": {
- "Ignored": {
- "0": false,
- "1": false,
- "2": false,
- "3": false,
- "4": false,
- "5": false,
- "6": false,
- "7": false,
- "8": false,
- "9": false,
- "10": false,
- "11": false
- },
- "Name": {
- "0": "(gly)(H)",
- "1": "(gly)(H)2",
- "2": "(Cu)(OH)",
- "3": "(Cu)(OH)2",
- "4": "(Cu)(OH)3",
- "5": "(Cu)(OH)4",
- "6": "(Cu)2(OH)",
- "7": "(Cu)2(OH)2",
- "8": "(Cu)3(OH)4",
- "9": "(Cu)(gly)",
- "10": "(Cu)(gly)2",
- "11": "(OH)"
- },
- "LogB": {
- "0": 9.65,
- "1": 12.09,
- "2": -8.19,
- "3": -16.54,
- "4": -26.9,
- "5": -39.86,
- "6": -6.26,
- "7": -10.67,
- "8": -21.58,
- "9": 8.31,
- "10": 15.23,
- "11": -13.79
- },
- "Sigma": {
- "0": 0.01,
- "1": 0.03,
- "2": 0.16,
- "3": 0.2,
- "4": 0.09,
- "5": 0.18,
- "6": 0.12,
- "7": 0.07,
- "8": 0.2,
- "9": 0.02,
- "10": 0.05,
- "11": 0.02
- },
- "Ref. Ionic Str.": {
- "0": 0.0,
- "1": 0.0,
- "2": 0.0,
- "3": 0.0,
- "4": 0.0,
- "5": 0.0,
- "6": 0.0,
- "7": 0.0,
- "8": 0.0,
- "9": 0.0,
- "10": 0.0,
- "11": 0.0
- },
- "CGF": {
- "0": 0.0,
- "1": 0.0,
- "2": 0.0,
- "3": 0.0,
- "4": 0.0,
- "5": 0.0,
- "6": 0.0,
- "7": 0.0,
- "8": 0.0,
- "9": 0.0,
- "10": 0.0,
- "11": 0.0
- },
- "DGF": {
- "0": 0.0,
- "1": 0.0,
- "2": 0.0,
- "3": 0.0,
- "4": 0.0,
- "5": 0.0,
- "6": 0.0,
- "7": 0.0,
- "8": 0.0,
- "9": 0.0,
- "10": 0.0,
- "11": 0.0
- },
- "EGF": {
- "0": 0.0,
- "1": 0.0,
- "2": 0.0,
- "3": 0.0,
- "4": 0.0,
- "5": 0.0,
- "6": 0.0,
- "7": 0.0,
- "8": 0.0,
- "9": 0.0,
- "10": 0.0,
- "11": 0.0
- },
- "Cu": {
- "0": 0,
- "1": 0,
- "2": 1,
- "3": 1,
- "4": 1,
- "5": 1,
- "6": 2,
- "7": 2,
- "8": 3,
- "9": 1,
- "10": 1,
- "11": 0
- },
- "gly": {
- "0": 1,
- "1": 1,
- "2": 0,
- "3": 0,
- "4": 0,
- "5": 0,
- "6": 0,
- "7": 0,
- "8": 0,
- "9": 1,
- "10": 2,
- "11": 0
- },
- "H": {
- "0": 1,
- "1": 2,
- "2": -1,
- "3": -2,
- "4": -3,
- "5": -4,
- "6": -1,
- "7": -2,
- "8": -4,
- "9": 0,
- "10": 0,
- "11": -1
- },
- "Ref. Comp.": {
- "0": "gly",
- "1": "gly",
- "2": "Cu",
- "3": "Cu",
- "4": "Cu",
- "5": "Cu",
- "6": "Cu",
- "7": "Cu",
- "8": "Cu",
- "9": "Cu",
- "10": "Cu",
- "11": "H"
- }
- },
- "solidSpeciesModel": {
- "Ignored": { "0": false },
- "Name": { "0": "(Cu)(OH)2" },
- "LogKs": { "0": 8.91 },
- "Sigma": { "0": 0.05 },
- "Ref. Ionic Str.": { "0": 1.0 },
- "CGF": { "0": 0.0 },
- "DGF": { "0": 0.0 },
- "EGF": { "0": 0.0 },
- "Cu": { "0": 1 },
- "gly": { "0": 0 },
- "H": { "0": -2 },
- "Ref. Comp.": { "0": "Cu" }
- }
-}
diff --git a/notebooks/multidimensinal_matrix.ipynb b/notebooks/multidimensinal_matrix.ipynb
deleted file mode 100644
index b8e6f7e..0000000
--- a/notebooks/multidimensinal_matrix.ipynb
+++ /dev/null
@@ -1,278 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "from libeq.data_structure import SolverData\n",
- "from libeq.solver import species_concentration\n",
- "\n",
- "# Create SolverData object\n",
- "solver_data = SolverData.load_from_bstac(\n",
- " \"/Users/lorenzo/Coding/libeq/notebooks/Zn-EDTA\"\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(89, 3)"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "stoichiometry = solver_data.stoichiometry\n",
- "c = solver_data.c0\n",
- "log_beta = solver_data.log_beta\n",
- "solid_stoichiometry = solver_data.solid_stoichiometry\n",
- "full_stoichiometry = np.concatenate((np.eye(solver_data.nc), stoichiometry), axis=1)\n",
- "c = np.repeat(c[np.newaxis, :], 89, axis=0)\n",
- "c.shape"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13],\n",
- " [4.42533526e+12, 7.17372840e+12, 1.57122621e+13]])"
- ]
- },
- "execution_count": 8,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "c1 = c\n",
- "c2 = species_concentration(c, log_beta, stoichiometry, solid_stoichiometry)\n",
- "\n",
- "c1 + np.sum(c2[:, np.newaxis, :] * stoichiometry[np.newaxis, ...], axis=2) - c"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "ename": "ValueError",
- "evalue": "operands could not be broadcast together with shapes (89,3) (3,16) ",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
- "Cell \u001b[0;32mIn[3], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m (\u001b[43mspecies_concentration\u001b[49m\u001b[43m(\u001b[49m\u001b[43mc\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mlog_beta\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstoichiometry\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msolid_stoichiometry\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfull\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m[:,np\u001b[38;5;241m.\u001b[39mnewaxis,:] \u001b[38;5;241m*\u001b[39m full_stoichiometry)\u001b[38;5;241m.\u001b[39msum(axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m2\u001b[39m)\n",
- "File \u001b[0;32m~/Coding/libeq/src/libeq/species_conc.py:60\u001b[0m, in \u001b[0;36mspecies_concentration\u001b[0;34m(concentration, log_beta, stoichiometry, solid_stoichiometry, full, logc)\u001b[0m\n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 58\u001b[0m _c \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mlog10(concentration)\n\u001b[0;32m---> 60\u001b[0m cext \u001b[38;5;241m=\u001b[39m log_beta \u001b[38;5;241m+\u001b[39m (\u001b[43m_c\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mstoichiometry\u001b[49m)\u001b[38;5;241m.\u001b[39msum(axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m)\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m solid_stoichiometry\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m0\u001b[39m:\n\u001b[1;32m 63\u001b[0m cext \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39mconcatenate((cext, solid_stoichiometry \u001b[38;5;241m@\u001b[39m concentration[nc:]), axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m)\n",
- "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (89,3) (3,16) "
- ]
- }
- ],
- "source": [
- "(\n",
- " species_concentration(c, log_beta, stoichiometry, solid_stoichiometry, full=True)[\n",
- " :, np.newaxis, :\n",
- " ]\n",
- " * full_stoichiometry\n",
- ").sum(axis=2)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 65,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Your 2D array\n",
- "arr = np.arange(32).reshape(2, 16)\n",
- "\n",
- "# Create a diagonal matrix from the rows of the array using broadcasting\n",
- "diag_matrices = np.einsum(\"ij,jk->ijk\", arr, np.eye(arr.shape[1]))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 61,
- "metadata": {},
- "outputs": [],
- "source": [
- "F = np.array([[1, 2, 3], [4, 5, 6]])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 62,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[[ 96., 42., -113.],\n",
- " [ 42., 100., 216.],\n",
- " [-113., 216., 1339.]],\n",
- "\n",
- " [[ 352., 90., -497.],\n",
- " [ 90., 260., 552.],\n",
- " [-497., 552., 3931.]]])"
- ]
- },
- "execution_count": 62,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "J = stoichiometry @ diag_matrices @ stoichiometry.T\n",
- "\n",
- "diagonal_indices = np.diag_indices(J.shape[1])\n",
- "J[:, diagonal_indices[0], diagonal_indices[1]] += arr[:, :3]\n",
- "J"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 64,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[ 0.00481414, -0.02771813, 0.00263713],\n",
- " [-0.00749229, -0.01622185, -0.00019568]])"
- ]
- },
- "execution_count": 64,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "dx = np.linalg.solve(J, -F)"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "libeq-8i_JZAyh-py3.12",
- "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.12.1"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/notebooks/pyes_import.ipynb b/notebooks/pyes_import.ipynb
deleted file mode 100644
index b73cb9a..0000000
--- a/notebooks/pyes_import.ipynb
+++ /dev/null
@@ -1,314 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "from libeq.data_structure import SolverData\n",
- "from libeq import EqSolver\n",
- "from libeq.utils import species_concentration\n",
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "\n",
- "# Create SolverData object\n",
- "solver_data = SolverData.load_from_pyes(\n",
- " \"/Users/lorenzo/Coding/libeq/notebooks/cu_gly_solid.json\"\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "solver_data.distribution_opts.initial_log = 2\n",
- "solver_data.distribution_opts.final_log = 12\n",
- "solver_data.ionic_strength_dependence = False"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "result, log_beta, log_ks, saturation_index, total_concentration = EqSolver(\n",
- " solver_data, mode=\"titration\"\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91],\n",
- " [8.91]])"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "log_ks"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "solution = species_concentration(\n",
- " result, log_beta=log_beta, stoichiometry=solver_data.stoichiometry, full=True\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[6.38332276e-04],\n",
- " [5.98286832e-04],\n",
- " [5.60202698e-04],\n",
- " [5.24039877e-04],\n",
- " [4.89718246e-04],\n",
- " [4.57127262e-04],\n",
- " [4.26136889e-04],\n",
- " [3.96607926e-04],\n",
- " [3.68400507e-04],\n",
- " [3.41380305e-04],\n",
- " [3.15422476e-04],\n",
- " [2.90413760e-04],\n",
- " [2.66253218e-04],\n",
- " [2.42852083e-04],\n",
- " [2.20133106e-04],\n",
- " [1.98029704e-04],\n",
- " [1.76485152e-04],\n",
- " [1.55452055e-04],\n",
- " [1.34892485e-04],\n",
- " [1.14779550e-04],\n",
- " [9.51025520e-05],\n",
- " [7.58825777e-05],\n",
- " [5.72259135e-05],\n",
- " [3.91139884e-05],\n",
- " [2.24566188e-05],\n",
- " [1.29858492e-05],\n",
- " [2.22574309e-05],\n",
- " [3.83210814e-05],\n",
- " [5.54479528e-05],\n",
- " [7.27991899e-05],\n",
- " [9.01714764e-05],\n",
- " [1.07493804e-04],\n",
- " [1.24735673e-04],\n",
- " [1.41882258e-04],\n",
- " [1.58925812e-04],\n",
- " [1.75862154e-04],\n",
- " [1.92689060e-04],\n",
- " [2.09405440e-04],\n",
- " [2.26010905e-04],\n",
- " [2.42505503e-04],\n",
- " [2.58889579e-04],\n",
- " [2.75163668e-04],\n",
- " [2.91328442e-04],\n",
- " [3.07384663e-04],\n",
- " [3.23333159e-04],\n",
- " [3.39174801e-04],\n",
- " [3.54910492e-04],\n",
- " [3.70541155e-04],\n",
- " [3.86067726e-04],\n",
- " [4.01491148e-04]])"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "charges = np.concatenate((solver_data.charges, solver_data.species_charges))\n",
- "only_soluble = np.concatenate(\n",
- " (\n",
- " solution[:, :3],\n",
- " solution[:, -12:],\n",
- " ),\n",
- " axis=1,\n",
- ")\n",
- "\n",
- "ionic_strength = 0.5 * (only_soluble * (charges**2)).sum(axis=1, keepdims=True)\n",
- "\n",
- "ionic_strength"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[ 1.00000000e-03, 2.00000000e-03, 1.00000000e-03],\n",
- " [ 9.96015936e-04, 1.99203187e-03, 9.56175299e-04],\n",
- " [ 9.92063492e-04, 1.98412698e-03, 9.12698413e-04],\n",
- " [ 9.88142292e-04, 1.97628458e-03, 8.69565217e-04],\n",
- " [ 9.84251969e-04, 1.96850394e-03, 8.26771654e-04],\n",
- " [ 9.80392157e-04, 1.96078431e-03, 7.84313725e-04],\n",
- " [ 9.76562500e-04, 1.95312500e-03, 7.42187500e-04],\n",
- " [ 9.72762646e-04, 1.94552529e-03, 7.00389105e-04],\n",
- " [ 9.68992248e-04, 1.93798450e-03, 6.58914729e-04],\n",
- " [ 9.65250965e-04, 1.93050193e-03, 6.17760618e-04],\n",
- " [ 9.61538462e-04, 1.92307692e-03, 5.76923077e-04],\n",
- " [ 9.57854406e-04, 1.91570881e-03, 5.36398467e-04],\n",
- " [ 9.54198473e-04, 1.90839695e-03, 4.96183206e-04],\n",
- " [ 9.50570342e-04, 1.90114068e-03, 4.56273764e-04],\n",
- " [ 9.46969697e-04, 1.89393939e-03, 4.16666667e-04],\n",
- " [ 9.43396226e-04, 1.88679245e-03, 3.77358491e-04],\n",
- " [ 9.39849624e-04, 1.87969925e-03, 3.38345865e-04],\n",
- " [ 9.36329588e-04, 1.87265918e-03, 2.99625468e-04],\n",
- " [ 9.32835821e-04, 1.86567164e-03, 2.61194030e-04],\n",
- " [ 9.29368030e-04, 1.85873606e-03, 2.23048327e-04],\n",
- " [ 9.25925926e-04, 1.85185185e-03, 1.85185185e-04],\n",
- " [ 9.22509225e-04, 1.84501845e-03, 1.47601476e-04],\n",
- " [ 9.19117647e-04, 1.83823529e-03, 1.10294118e-04],\n",
- " [ 9.15750916e-04, 1.83150183e-03, 7.32600733e-05],\n",
- " [ 9.12408759e-04, 1.82481752e-03, 3.64963504e-05],\n",
- " [ 9.09090909e-04, 1.81818182e-03, 0.00000000e+00],\n",
- " [ 9.05797101e-04, 1.81159420e-03, -3.62318841e-05],\n",
- " [ 9.02527076e-04, 1.80505415e-03, -7.22021661e-05],\n",
- " [ 8.99280576e-04, 1.79856115e-03, -1.07913669e-04],\n",
- " [ 8.96057348e-04, 1.79211470e-03, -1.43369176e-04],\n",
- " [ 8.92857143e-04, 1.78571429e-03, -1.78571429e-04],\n",
- " [ 8.89679715e-04, 1.77935943e-03, -2.13523132e-04],\n",
- " [ 8.86524823e-04, 1.77304965e-03, -2.48226950e-04],\n",
- " [ 8.83392226e-04, 1.76678445e-03, -2.82685512e-04],\n",
- " [ 8.80281690e-04, 1.76056338e-03, -3.16901408e-04],\n",
- " [ 8.77192982e-04, 1.75438596e-03, -3.50877193e-04],\n",
- " [ 8.74125874e-04, 1.74825175e-03, -3.84615385e-04],\n",
- " [ 8.71080139e-04, 1.74216028e-03, -4.18118467e-04],\n",
- " [ 8.68055556e-04, 1.73611111e-03, -4.51388889e-04],\n",
- " [ 8.65051903e-04, 1.73010381e-03, -4.84429066e-04],\n",
- " [ 8.62068966e-04, 1.72413793e-03, -5.17241379e-04],\n",
- " [ 8.59106529e-04, 1.71821306e-03, -5.49828179e-04],\n",
- " [ 8.56164384e-04, 1.71232877e-03, -5.82191781e-04],\n",
- " [ 8.53242321e-04, 1.70648464e-03, -6.14334471e-04],\n",
- " [ 8.50340136e-04, 1.70068027e-03, -6.46258503e-04],\n",
- " [ 8.47457627e-04, 1.69491525e-03, -6.77966102e-04],\n",
- " [ 8.44594595e-04, 1.68918919e-03, -7.09459459e-04],\n",
- " [ 8.41750842e-04, 1.68350168e-03, -7.40740741e-04],\n",
- " [ 8.38926174e-04, 1.67785235e-03, -7.71812081e-04],\n",
- " [ 8.36120401e-04, 1.67224080e-03, -8.02675585e-04]])"
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "total_concentration"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.plot(solution);"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "libeq-8i_JZAyh-py3.12",
- "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.12.1"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/notebooks/solid_dist.ipynb b/notebooks/solid_dist.ipynb
deleted file mode 100644
index 82cca17..0000000
--- a/notebooks/solid_dist.ipynb
+++ /dev/null
@@ -1,233 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "from libeq.data_structure import SolverData\n",
- "from libeq import EqSolver\n",
- "from libeq.utils import species_concentration\n",
- "import numpy as np\n",
- "\n",
- "# Create SolverData object\n",
- "solver_data = SolverData.load_from_pyes(\n",
- " \"/Users/lorenzo/Coding/libeq/notebooks/urine_a.json\"\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "solver_data.ionic_strength_dependence = False"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "result, log_beta, log_ks, saturation_index, total_concentration = EqSolver(\n",
- " solver_data, mode=\"distribution\"\n",
- ")\n",
- "solution = species_concentration(\n",
- " result, log_beta=log_beta, stoichiometry=solver_data.stoichiometry, full=True\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[1.00000000e+00, 1.53341541e-14],\n",
- " [1.00000000e+00, 1.68971516e-14],\n",
- " [1.00000000e+00, 1.86125560e-14],\n",
- " [1.00000000e+00, 2.04941528e-14],\n",
- " [1.00000000e+00, 2.25568503e-14],\n",
- " [1.00000000e+00, 2.48167632e-14],\n",
- " [1.00000000e+00, 2.72913040e-14],\n",
- " [1.00000000e+00, 2.99992828e-14],\n",
- " [1.00000000e+00, 3.29610173e-14],\n",
- " [1.00000000e+00, 3.61984538e-14],\n",
- " [1.00000000e+00, 3.97353019e-14],\n",
- " [1.00000000e+00, 4.35971840e-14],\n",
- " [1.00000000e+00, 4.78118022e-14],\n",
- " [1.00000000e+00, 5.24091239e-14],\n",
- " [1.00000000e+00, 5.74215887e-14],\n",
- " [1.00000000e+00, 6.28843375e-14],\n",
- " [1.00000000e+00, 6.88354654e-14],\n",
- " [1.00000000e+00, 7.53162982e-14],\n",
- " [1.00000000e+00, 8.23716931e-14],\n",
- " [1.00000000e+00, 9.00503612e-14],\n",
- " [1.00000000e+00, 9.84052087e-14],\n",
- " [1.00000000e+00, 1.07493693e-13],\n",
- " [1.00000000e+00, 1.17378185e-13],\n",
- " [1.00000000e+00, 1.28126336e-13],\n",
- " [1.00000000e+00, 1.39811419e-13],\n",
- " [1.00000000e+00, 1.52512659e-13],\n",
- " [1.00000000e+00, 1.66315504e-13],\n",
- " [1.00000000e+00, 1.81311839e-13],\n",
- " [1.00000000e+00, 1.97600103e-13],\n",
- " [1.00000000e+00, 2.15285290e-13],\n",
- " [1.00000000e+00, 2.34478797e-13],\n",
- " [1.00000000e+00, 2.55298087e-13],\n",
- " [1.00000000e+00, 2.77866125e-13],\n",
- " [1.00000000e+00, 3.02310560e-13],\n",
- " [1.00000000e+00, 3.28762592e-13],\n",
- " [1.00000000e+00, 3.57355507e-13],\n",
- " [1.00000000e+00, 3.88222838e-13],\n",
- " [1.00000000e+00, 4.21496114e-13],\n",
- " [1.00000000e+00, 4.57302200e-13],\n",
- " [1.00000000e+00, 4.95760200e-13],\n",
- " [1.00000000e+00, 5.36977956e-13],\n",
- " [1.00000000e+00, 5.81048166e-13],\n",
- " [1.00000000e+00, 6.28044187e-13],\n",
- " [1.00000000e+00, 6.78015619e-13],\n",
- " [1.00000000e+00, 7.30983785e-13],\n",
- " [1.00000000e+00, 7.86937267e-13],\n",
- " [1.00000000e+00, 8.45827688e-13],\n",
- " [1.00000000e+00, 9.07565933e-13],\n",
- " [1.00000000e+00, 9.72019051e-13],\n",
- " [1.00000000e+00, 1.03900804e-12],\n",
- " [1.00000000e+00, 1.10830676e-12],\n",
- " [1.00000000e+00, 1.17964207e-12],\n",
- " [1.00000000e+00, 1.25269547e-12],\n",
- " [1.00000000e+00, 1.32710611e-12],\n",
- " [1.00000000e+00, 1.40247529e-12],\n",
- " [1.00000000e+00, 1.47837235e-12],\n",
- " [1.00000000e+00, 1.55434160e-12],\n",
- " [1.00000000e+00, 1.62991024e-12],\n",
- " [1.00000000e+00, 1.70459678e-12],\n",
- " [1.00000000e+00, 1.77791961e-12],\n",
- " [1.00000000e+00, 1.84940540e-12],\n",
- " [1.00000000e+00, 1.91859699e-12],\n",
- " [1.00000000e+00, 1.98506025e-12],\n",
- " [1.00000000e+00, 2.04838996e-12],\n",
- " [1.00000000e+00, 2.10821429e-12],\n",
- " [1.00000000e+00, 2.16419795e-12],\n",
- " [1.00000000e+00, 2.21604388e-12],\n",
- " [1.00000000e+00, 2.26349377e-12],\n",
- " [1.00000000e+00, 2.30632739e-12],\n",
- " [1.00000000e+00, 2.34436094e-12],\n",
- " [1.00000000e+00, 2.37744485e-12],\n",
- " [1.00000000e+00, 2.40546103e-12],\n",
- " [1.00000000e+00, 2.42832003e-12],\n",
- " [1.00000000e+00, 2.44595814e-12],\n",
- " [1.00000000e+00, 2.45833482e-12],\n",
- " [1.00000000e+00, 2.46543054e-12],\n",
- " [1.00000000e+00, 2.46724508e-12],\n",
- " [1.00000000e+00, 2.46379647e-12],\n",
- " [1.00000000e+00, 2.45512063e-12],\n",
- " [1.00000000e+00, 2.44127153e-12],\n",
- " [1.00000000e+00, 2.42232198e-12],\n",
- " [1.00000000e+00, 2.39836487e-12],\n",
- " [1.00000000e+00, 2.36951482e-12],\n",
- " [1.00000000e+00, 2.33590991e-12],\n",
- " [1.00000000e+00, 2.29771351e-12],\n",
- " [1.00000000e+00, 2.25511592e-12],\n",
- " [1.00000000e+00, 2.20833562e-12],\n",
- " [1.00000000e+00, 2.15762001e-12],\n",
- " [1.00000000e+00, 2.10324545e-12],\n",
- " [1.00000000e+00, 2.04551643e-12],\n",
- " [1.00000000e+00, 1.98476395e-12],\n",
- " [1.00000000e+00, 1.92134288e-12],\n",
- " [1.00000000e+00, 1.85562848e-12],\n",
- " [1.00000000e+00, 1.78801210e-12],\n",
- " [1.00000000e+00, 1.71889618e-12],\n",
- " [1.00000000e+00, 1.64868876e-12],\n",
- " [1.00000000e+00, 1.57779769e-12],\n",
- " [1.00000000e+00, 1.50662476e-12],\n",
- " [1.00000000e+00, 1.43555987e-12],\n",
- " [1.00000000e+00, 1.36497570e-12],\n",
- " [1.00000000e+00, 1.29522270e-12]])"
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "saturation_index"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([9.02901176e-04, 1.32535924e-03, 6.54296282e-02, 3.29648519e-02,\n",
- " 1.30581592e-02, 6.82000000e-02, 2.23882220e-13, 2.02372768e-03,\n",
- " 7.85184037e-06, 1.96951722e-05, 1.00000000e-04, 1.06225307e-04,\n",
- " 0.00000000e+00, 9.77281337e-06, 6.60723274e-03, 7.24468664e-05,\n",
- " 4.95417635e-04, 1.01151298e-03, 7.32776379e-05, 1.88087434e-05,\n",
- " 4.79304692e-05, 2.19084514e-05, 3.60832022e-05, 3.60832022e-05,\n",
- " 1.23238361e-04, 4.90620752e-06, 8.44345837e-07, 9.39772193e-07,\n",
- " 1.90920877e-05, 9.13804771e-07, 4.07380278e-06, 1.22093738e-05,\n",
- " 4.16998251e-06, 1.66882543e-06, 1.14879290e-06, 7.33938760e-05,\n",
- " 8.23492833e-07, 2.43029965e-10, 1.38788415e-04, 1.66860375e-06,\n",
- " 7.45337917e-13, 3.76525209e-06, 1.30555165e-13, 1.22481567e-06,\n",
- " 5.22481279e-14, 8.82879769e-07, 7.27431815e-05, 1.19807963e-04,\n",
- " 3.32603278e-04, 2.31314683e-04, 2.19803211e-04, 1.65958691e-10])"
- ]
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "solution[0]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [],
- "source": [
- "charges = np.concatenate((solver_data.charges, solver_data.species_charges))\n",
- "only_soluble = np.concatenate(\n",
- " (\n",
- " solution[:, :3],\n",
- " solution[:, -12:],\n",
- " ),\n",
- " axis=1,\n",
- ")"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "libeq-8i_JZAyh-py3.12",
- "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.12.1"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/notebooks/test_bstac_import.ipynb b/notebooks/test_bstac_import.ipynb
deleted file mode 100644
index f17cbc3..0000000
--- a/notebooks/test_bstac_import.ipynb
+++ /dev/null
@@ -1,266 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "from typing import Any\n",
- "\n",
- "\n",
- "def parse_titration(lines, jw, nc) -> list[dict[str, Any]]:\n",
- " tot_lenght = len(lines)\n",
- " sections = [\n",
- " (lambda line: line.strip(), 1, \"titration_name\"), # NAMET\n",
- " (\n",
- " lambda line: [int(part) for part in line.split()],\n",
- " 1,\n",
- " \"titration_comp_settings\",\n",
- " ), # JP,NCET\n",
- " (\n",
- " lambda line: [\n",
- " float(part) if i != 2 else int(part)\n",
- " for i, part in enumerate(line.split())\n",
- " ],\n",
- " \"NC\",\n",
- " \"components_concentrations\",\n",
- " ), # CO,CTT,LOK\n",
- " (\n",
- " lambda line: [float(part) for _, part in enumerate(line.split())],\n",
- " 1,\n",
- " \"background_params\",\n",
- " ), # COI,CTI,IREFT\n",
- " (\n",
- " lambda line: [float(part) for _, part in enumerate(line.split())],\n",
- " 1,\n",
- " \"v_params\",\n",
- " ), # VO,SIGMAV\n",
- " (\n",
- " lambda line: [\n",
- " float(part) if i < 5 else int(part)\n",
- " for i, part in enumerate(line.split())\n",
- " ],\n",
- " 1,\n",
- " \"potential_params\",\n",
- " ), # E0,SIGMAE,JA,JB,SLOPE,LOK1,LOK2,LOK3,LOK4\n",
- " (\n",
- " lambda line: [\n",
- " float(part) if i != 3 else int(part)\n",
- " for i, part in enumerate(\n",
- " map(lambda x: x.replace(\"(\", \"\").replace(\")\", \"\"), line.split())\n",
- " )\n",
- " ],\n",
- " \"until_end\",\n",
- " \"titration_values\",\n",
- " ), # V,E,(SIGMA),IND\n",
- " ]\n",
- " line_counter = 0\n",
- " titrations = []\n",
- " while True:\n",
- " titration = {}\n",
- " for process_func, repeat, name in sections:\n",
- " if isinstance(repeat, int):\n",
- " for _ in range(repeat):\n",
- " titration[name] = process_func(lines[line_counter])\n",
- " line_counter += 1\n",
- " elif repeat == \"NC\":\n",
- " for _ in range(nc):\n",
- " parsed_line = process_func(lines[line_counter])\n",
- " titration.setdefault(name, []).append(parsed_line)\n",
- " parsed_line = {\n",
- " k: v\n",
- " for k, v in zip(\n",
- " [\"C0\", \"CTT\", \"LOK\"],\n",
- " parsed_line,\n",
- " )\n",
- " }\n",
- " line_counter += 1\n",
- "\n",
- " elif repeat == \"until_end\":\n",
- " while True:\n",
- " parsed_line = process_func(lines[line_counter])\n",
- " titration.setdefault(\"volume\", []).append(parsed_line[0])\n",
- " titration.setdefault(\"potential\", []).append(parsed_line[1])\n",
- " if jw == 2:\n",
- " titration.setdefault(\"sigma\", []).append(parsed_line[2])\n",
- " line_counter += 1\n",
- " if parsed_line[-1] == 1:\n",
- " break\n",
- "\n",
- " titrations.append(titration)\n",
- " if line_counter == tot_lenght:\n",
- " break\n",
- "\n",
- " return titrations\n",
- "\n",
- "\n",
- "def parse_model(lines, icd, nc) -> list[dict[str, Any]]:\n",
- " species = []\n",
- " sections = [\n",
- " lambda line: [\n",
- " int(part) if i > 2 else float(part)\n",
- " for i, part in enumerate(\n",
- " map(lambda x: x.replace(\"(\", \"\").replace(\")\", \"\"), line.split())\n",
- " )\n",
- " ], # BLOG,IX(NC times),KEY,NKA,IKA(NKA times) (ICD=0)\n",
- " lambda line: [\n",
- " int(part) if i > 4 else float(part)\n",
- " for i, part in enumerate(\n",
- " map(lambda x: x.replace(\"(\", \"\").replace(\")\", \"\"), line.split())\n",
- " )\n",
- " ],\n",
- " # BLOG,(IB),C,D,E,IX(1...NC),KEY,KEYC,KEYD,KEYE,NKA,IKA(1...NKA) (ICD=1/2)\n",
- " ]\n",
- "\n",
- " if icd == 0:\n",
- " process_func = sections[1]\n",
- " model_columns = (\n",
- " [\n",
- " \"BLOG\",\n",
- " ]\n",
- " + [f\"IX{i}\" for i in range(1, nc + 1)]\n",
- " + [\n",
- " \"KEY\",\n",
- " \"NKA\",\n",
- " ]\n",
- " + [f\"IKA{i}\" for i in range(1, 10)]\n",
- " )\n",
- " else:\n",
- " process_func = sections[0]\n",
- " model_columns = (\n",
- " [\n",
- " \"BLOG\",\n",
- " \"IB\",\n",
- " \"C\",\n",
- " \"D\",\n",
- " \"E\",\n",
- " ]\n",
- " + [f\"IX{i}\" for i in range(1, nc + 1)]\n",
- " + [\n",
- " \"KEY\",\n",
- " \"KEYC\",\n",
- " \"KEYD\",\n",
- " \"KEYE\",\n",
- " \"NKA\",\n",
- " ]\n",
- " + [f\"IKA{i}\" for i in range(1, 10)]\n",
- " )\n",
- "\n",
- " for line in lines:\n",
- " parsed_line = process_func(line)\n",
- " parsed_line = {\n",
- " k: v\n",
- " for k, v in zip(\n",
- " model_columns,\n",
- " parsed_line,\n",
- " )\n",
- " }\n",
- " species.append(parsed_line)\n",
- "\n",
- " return species\n",
- "\n",
- "\n",
- "def parse_file(filename):\n",
- " # Define the list of tuples\n",
- " sections = [\n",
- " (lambda line: line.strip(), 1, \"file_name\"), # TITLE\n",
- " (\n",
- " lambda line: [int(part) for part in line.split()],\n",
- " 1,\n",
- " [\"MAXIT\", \"NC\", \"NS\", \"JW\", \"ICD\", \"WESP\", \"SHLIM\"],\n",
- " ), # MAXIT,NC,NS,JW,ICD,WESP,SHLIM\n",
- " (lambda line: line.strip(), \"NC\", \"comp_name\"), # COMP\n",
- " (\n",
- " lambda line: [float(part) for part in line.split()],\n",
- " 1,\n",
- " [\"TEMP\", \"PHI\", \"PHF\"],\n",
- " ), # TEMP,PHI,PHF\n",
- " (\n",
- " lambda line: [\n",
- " float(part) if i < 9 else int(part)\n",
- " for i, part in enumerate(line.split())\n",
- " ],\n",
- " \"ICD\",\n",
- " [\"IREF\", \"AT\", \"BT\", \"c0\", \"c1\", \"d0\", \"d1\", \"e0\", \"e1\", \"KCD\"],\n",
- " ), # IREF,AT,BT,c0,c1,d0,d1,e0,e1,KCD(1...6)\n",
- " (\n",
- " lambda line: [float(part) for part in line.split()],\n",
- " 1,\n",
- " \"charges\",\n",
- " ), # Z(1...NC)\n",
- " (\n",
- " parse_model,\n",
- " \"NS\",\n",
- " \"species\",\n",
- " ), # BLOG,(IB),C,D,E,IX(1...NC),KEY,KEYC,KEYD,KEYE,NKA,IKA(1...NKA)\n",
- " (parse_titration, \"end_of_file\", \"titrations\"),\n",
- " ]\n",
- "\n",
- " with open(filename, \"r\") as file:\n",
- " lines = file.readlines()\n",
- "\n",
- " result = {}\n",
- " line_counter = 0\n",
- "\n",
- " for process_func, repeat, name in sections:\n",
- " if isinstance(repeat, int):\n",
- " for _ in range(repeat):\n",
- " if isinstance(name, str):\n",
- " result[name] = process_func(lines[line_counter])\n",
- " elif isinstance(name, list):\n",
- " for field_name, data in zip(\n",
- " name, process_func(lines[line_counter])\n",
- " ):\n",
- " result[field_name] = data\n",
- " line_counter += 1\n",
- " elif repeat == \"NC\":\n",
- " nc = result[\"NC\"] # Get the value of NC from the data\n",
- " for _ in range(nc):\n",
- " result.setdefault(name, []).append(process_func(lines[line_counter]))\n",
- " line_counter += 1\n",
- " elif repeat == \"ICD\":\n",
- " icd = result[\"ICD\"] # Get the value of ICD from the data\n",
- " if icd > 0:\n",
- " for field_name, data in zip(name, process_func(lines[line_counter])):\n",
- " result[field_name] = data\n",
- " line_counter += 1\n",
- " else:\n",
- " result[name] = []\n",
- " elif repeat == \"NS\":\n",
- " ns = result[\"NS\"] # Get the value of NS from the data\n",
- " parsed_section = process_func(\n",
- " lines[line_counter : line_counter + ns], icd, nc\n",
- " )\n",
- " result[name] = parsed_section\n",
- " line_counter += ns\n",
- " elif repeat == \"end_of_file\":\n",
- " parsed_section = process_func(lines[line_counter:], result[\"JW\"], nc)\n",
- " result[name] = parsed_section\n",
- "\n",
- " return result"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "libeq-8i_JZAyh-py3.12",
- "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.12.1"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/notebooks/test_errors.ipynb b/notebooks/test_errors.ipynb
deleted file mode 100644
index 94f4373..0000000
--- a/notebooks/test_errors.ipynb
+++ /dev/null
@@ -1,222 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "from libeq import SolverData, species_concentration, uncertanties, EqSolver\n",
- "import numpy as np\n",
- "\n",
- "# Create SolverData object\n",
- "solver_data = SolverData.load_from_pyes(\n",
- " \"/Users/lorenzo/Coding/libeq/notebooks/cu_gly_solid.json\"\n",
- ")\n",
- "solver_data.ionic_strength_dependence = True\n",
- "result, log_beta, log_ks, saturation_index, total_concentration = EqSolver(\n",
- " solver_data, mode=\"distribution\"\n",
- ")\n",
- "concentrations = species_concentration(\n",
- " result, log_beta, solver_data.stoichiometry, full=True\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[9.97955732e-04, 1.40923092e-11, 1.00000000e-02, ...,\n",
- " 2.04339382e-06, 2.02232087e-10, 1.91739309e-12],\n",
- " [9.96941165e-04, 2.06765655e-11, 7.94328235e-03, ...,\n",
- " 3.05753568e-06, 4.48532967e-10, 2.38995819e-12],\n",
- " [9.95483218e-04, 3.00180058e-11, 6.30957344e-03, ...,\n",
- " 4.51473523e-06, 9.70312122e-10, 2.98211580e-12],\n",
- " ...,\n",
- " [1.38644914e-15, 1.97681311e-03, 1.58489319e-12, ...,\n",
- " 4.03793775e-10, 5.64442781e-06, 1.20172749e-02],\n",
- " [8.88607131e-16, 1.98369203e-03, 1.25892541e-12, ...,\n",
- " 2.51978173e-10, 3.48224793e-06, 1.53501041e-02],\n",
- " [5.70501524e-16, 1.98840663e-03, 1.00000000e-12, ...,\n",
- " 1.56851813e-10, 2.13746348e-06, 1.96343107e-02]])"
- ]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "concentrations"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(array([[9.98058111e-06, 7.32645597e-13, 0.00000000e+00, ...,\n",
- " 1.43029001e-07, 3.14233150e-11, 8.82992150e-14],\n",
- " [9.97155827e-06, 1.01182775e-12, 0.00000000e+00, ...,\n",
- " 2.06947596e-07, 6.78809858e-11, 1.10061642e-13],\n",
- " [9.95919088e-06, 1.37102137e-12, 0.00000000e+00, ...,\n",
- " 2.94636431e-07, 1.42805591e-10, 1.37331508e-13],\n",
- " ...,\n",
- " [1.59620856e-16, 1.97418527e-05, 0.00000000e+00, ...,\n",
- " 4.99896719e-11, 9.15602971e-07, 5.53415959e-04],\n",
- " [1.02304677e-16, 1.98009732e-05, 0.00000000e+00, ...,\n",
- " 3.12525535e-11, 5.67297267e-07, 7.06898418e-04],\n",
- " [6.56814152e-17, 1.98543718e-05, 0.00000000e+00, ...,\n",
- " 1.94765881e-11, 3.49147471e-07, 9.04193425e-04]]),\n",
- " array([[0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [0.00000000e+00],\n",
- " [1.65522164e-05],\n",
- " [1.61178605e-05],\n",
- " [1.58240556e-05],\n",
- " [1.56279806e-05],\n",
- " [1.54989168e-05],\n",
- " [1.54155867e-05],\n",
- " [1.53636632e-05],\n",
- " [1.53337563e-05],\n",
- " [1.53199205e-05],\n",
- " [1.53186117e-05],\n",
- " [1.53279963e-05],\n",
- " [1.53475209e-05],\n",
- " [1.53776762e-05],\n",
- " [1.54199091e-05],\n",
- " [1.54766591e-05],\n",
- " [1.55515090e-05],\n",
- " [1.56494547e-05],\n",
- " [1.57773091e-05],\n",
- " [1.59442545e-05],\n",
- " [1.61625526e-05],\n",
- " [1.64483822e-05],\n",
- " [1.68226992e-05],\n",
- " [1.73120537e-05],\n",
- " [1.79478589e-05],\n",
- " [1.87656033e-05],\n",
- " [1.98001150e-05],\n",
- " [2.10775583e-05],\n",
- " [2.26024443e-05],\n",
- " [2.43395655e-05],\n",
- " [2.61923175e-05],\n",
- " [2.79819874e-05],\n",
- " [2.94380340e-05],\n",
- " [3.02167457e-05],\n",
- " [2.99696127e-05],\n",
- " [2.84696444e-05],\n",
- " [2.57595464e-05],\n",
- " [2.22271480e-05],\n",
- " [1.85131039e-05],\n",
- " [1.52657092e-05],\n",
- " [1.28856040e-05],\n",
- " [1.14157268e-05],\n",
- " [1.06369137e-05],\n",
- " [1.02705256e-05],\n",
- " [1.01115544e-05],\n",
- " [1.00460365e-05],\n",
- " [1.00199885e-05],\n",
- " [1.00101425e-05]]))"
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "uncertanties(\n",
- " concentrations,\n",
- " solver_data.stoichiometry,\n",
- " solver_data.solid_stoichiometry,\n",
- " log_beta,\n",
- " log_ks,\n",
- " solver_data.log_beta_sigma,\n",
- " solver_data.log_ks_sigma,\n",
- " np.tile(solver_data.distribution_opts.c0_sigma, (concentrations.shape[0], 1)),\n",
- " solver_data.distribution_opts.independent_component,\n",
- ")"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "libeq-8i_JZAyh-py3.12",
- "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.12.1"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/notebooks/test_io.ipynb b/notebooks/test_io.ipynb
deleted file mode 100644
index 4745ba6..0000000
--- a/notebooks/test_io.ipynb
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "from libeq.data_structure import SolverData\n",
- "\n",
- "# Create SolverData object\n",
- "h6l_data = SolverData.load_from_bstac(\"/Users/lorenzo/Downloads/qb64pe/H6L\")\n",
- "# h6l_data.potentiometry_options.px_range = [1.7,0]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "data = h6l_data.to_pyes(format=\"json\")\n",
- "\n",
- "with open(\n",
- " \"libeq_h6l.json\",\n",
- " \"w\",\n",
- ") as out_file:\n",
- " out_file.write(data)"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "libeq-8i_JZAyh-py3.12",
- "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.12.1"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/notebooks/test_potentiometry.ipynb b/notebooks/test_potentiometry.ipynb
deleted file mode 100644
index 1633d17..0000000
--- a/notebooks/test_potentiometry.ipynb
+++ /dev/null
@@ -1,408 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "from libeq.data_structure import SolverData\n",
- "from libeq.optimizers import PotentiometryOptimizer\n",
- "import numpy as np\n",
- "\n",
- "# Create SolverData object\n",
- "h6l_data = SolverData.load_from_bstac(\"/Users/lorenzo/Downloads/qb64pe/H6L\")\n",
- "# h6l_data.potentiometry_options.px_range = [1.7,0]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "calculated\n",
- "[0.0, 0.0]\n",
- "1\n",
- "59.16857248724665\n",
- "0.15 0.005\n",
- "1\n",
- "59.16857248724665\n",
- "0.15 0.005\n",
- "1\n",
- "59.16857248724665\n",
- "0.15 0.005\n",
- "1\n",
- "59.16857248724665\n",
- "0.15 0.005\n",
- "1\n",
- "59.16857248724665\n",
- "0.15 0.005\n",
- "1\n",
- "59.16857248724665\n",
- "0.15 0.005\n"
- ]
- }
- ],
- "source": [
- "print(h6l_data.potentiometry_opts.weights)\n",
- "print(h6l_data.potentiometry_opts.px_range)\n",
- "for t in h6l_data.potentiometry_opts.titrations:\n",
- " print(t.electro_active_compoment)\n",
- " print(t.slope)\n",
- " print(t.e0_sigma, t.v0_sigma)\n",
- " # t.slope=(25 + 273.15) / 11.6048 * 2.303"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "constants, concentrations, b_error, cor_matrix, cov_matrix, return_extra = (\n",
- " PotentiometryOptimizer(h6l_data)\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Constants:\n",
- "10.009949268841277 0.0032915045872157237\n",
- "18.013508815748896 0.004592013813940182\n",
- "24.01647574853225 0.005588411929865904\n",
- "28.01884725126332 0.006510533120991051\n",
- "31.01983378459971 0.006752431177731802\n",
- "33.0256790305685 0.010041961686094789\n",
- "--------------------\n",
- "Concentrations:\n",
- "[[1.75803873e-22 4.38439193e-03 3.87338468e-12 ... 6.78442690e-04\n",
- " 2.98132327e-03 1.32484077e-03]\n",
- " [2.63820325e-22 4.04562301e-03 4.19773086e-12 ... 7.38069304e-04\n",
- " 2.99274068e-03 1.22715591e-03]\n",
- " [4.02499675e-22 3.71896031e-03 4.56644737e-12 ... 8.04079447e-04\n",
- " 2.99714006e-03 1.12972783e-03]\n",
- " ...\n",
- " [2.91455491e-03 2.21509601e-12 7.66668191e-03 ... 7.32807177e-22\n",
- " 1.62692976e-30 3.65263776e-40]\n",
- " [2.90285943e-03 2.08231434e-12 8.15555853e-03 ... 5.69978430e-22\n",
- " 1.18957340e-30 2.51063039e-40]\n",
- " [2.88471872e-03 1.91243697e-12 8.87999805e-03 ... 4.02994614e-22\n",
- " 7.72454494e-31 1.49728778e-40]]\n",
- "--------------------\n",
- "Correlation matrix:\n",
- "[[1. 0.6163679 0.51708922 0.44251069 0.42761103 0.28666258]\n",
- " [0.6163679 1. 0.758754 0.65926421 0.62997496 0.42880189]\n",
- " [0.51708922 0.758754 1. 0.80746803 0.81497541 0.51459288]\n",
- " [0.44251069 0.65926421 0.80746803 1. 0.71807925 0.71460492]\n",
- " [0.42761103 0.62997496 0.81497541 0.71807925 1. 0.29746219]\n",
- " [0.28666258 0.42880189 0.51459288 0.71460492 0.29746219 1. ]]\n",
- "--------------------\n"
- ]
- }
- ],
- "source": [
- "print(\"Constants:\")\n",
- "for b, e in zip(constants, b_error):\n",
- " print(b, e)\n",
- "print(\"-\" * 20)\n",
- "\n",
- "print(\"Concentrations:\")\n",
- "print(concentrations)\n",
- "print(\"-\" * 20)\n",
- "\n",
- "\n",
- "print(\"Correlation matrix:\")\n",
- "print(cor_matrix)\n",
- "print(\"-\" * 20)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[array([ 265.6, 263.5, 261.4, 259.1, 256.7, 254.2, 251.6, 248.8,\n",
- " 245.9, 242.9, 239.7, 236.3, 232.8, 229.1, 225.2, 221.1,\n",
- " 216.9, 212.4, 207.8, 203. , 197.9, 192.7, 187.2, 181.5,\n",
- " 175.5, 169.2, 162.4, 155. , 146.7, 137.1, 125.6, 112.2,\n",
- " 98. , 84.9, 73.6, 63.6, 54.2, 45.1, 35.7, 25.5,\n",
- " 14. , 0.6, -14. , -27.9, -40.1, -50.6, -60.2, -69.4,\n",
- " -78.6, -88.4, -99.2, -111.6, -125.6, -139.7, -152.3, -163. ,\n",
- " -172.5, -181.1, -189.3, -197.2, -205.1, -212.9, -220.4, -227.5,\n",
- " -234. , -239.7, -244.8, -249.2, -253. , -256.5, -259.5, -262.3,\n",
- " -264.8, -267.1, -269.1, -271. , -272.9, -274.5, -276. , -277.5,\n",
- " -280.2, -283.7, -285.8, -287.6, -289.4, -290.2, -292.5, -294.6,\n",
- " -296.5]),\n",
- " array([ 265.2, 263.2, 261. , 258.7, 256.3, 253.8, 251.2, 248.4,\n",
- " 245.5, 242.5, 239.3, 235.9, 232.4, 228.6, 224.8, 220.7,\n",
- " 216.4, 212. , 207.4, 202.5, 197.5, 192.2, 186.7, 181. ,\n",
- " 175. , 168.6, 161.9, 154.5, 146.1, 136.5, 125. , 111.5,\n",
- " 97.3, 84.2, 72.9, 62.8, 53.4, 44.2, 34.8, 24.6,\n",
- " 13. , -0.4, -15. , -29. , -41.1, -51.7, -61.3, -70.5,\n",
- " -79.8, -89.6, -100.4, -112.9, -126.9, -141. , -153.6, -164.3,\n",
- " -173.8, -182.5, -190.7, -198.7, -206.6, -214.3, -221.9, -229. ,\n",
- " -235.5, -241.3, -246.3, -250.7, -254.6, -258. , -261.1, -263.8,\n",
- " -266.3, -268.6, -270.7, -272.6, -274.5, -276.1, -277.7, -279.1,\n",
- " -281.8, -283.1, -285.3, -288.4, -289.3, -290.2, -292.7, -295.6]),\n",
- " array([ 248.8, 246.4, 243.8, 241.1, 238.1, 234.9, 231.5, 227.8,\n",
- " 223.8, 219.5, 214.8, 209.7, 204.2, 198.2, 191.7, 184.6,\n",
- " 176.9, 168.5, 159.1, 148.1, 134.5, 116.8, 96.6, 78.5,\n",
- " 63.5, 50. , 36.4, 21.3, 2.9, -18.2, -37.2, -52.7,\n",
- " -66.3, -79.7, -94.4, -111.8, -131.9, -150.3, -164.9, -177. ,\n",
- " -187.5, -197.2, -206. , -214.1, -221.2, -227.5, -232.9, -237.7,\n",
- " -241.8, -245.4, -248.6, -251.5, -254.2, -256.5, -258.7, -260.7,\n",
- " -262.6, -264.3, -265.9, -267.5, -268.9, -270.3, -271.5, -272.7,\n",
- " -273.9, -276. , -278. , -280.7, -283.1, -285.3, -287.2, -290.1,\n",
- " -292.3, -294.6]),\n",
- " array([ 248.7, 246.3, 243.7, 241. , 238. , 234.8, 231.4, 227.7,\n",
- " 223.7, 219.3, 214.7, 209.6, 204. , 198. , 191.5, 184.5,\n",
- " 176.8, 168.4, 158.9, 147.9, 134.3, 116.6, 96.4, 78.3,\n",
- " 63.3, 49.7, 36.2, 21.1, 2.7, -18.5, -37.5, -53. ,\n",
- " -66.6, -80. , -94.7, -112.2, -132.2, -150.7, -165.3, -177.4,\n",
- " -187.9, -197.6, -206.4, -214.5, -221.6, -227.9, -233.4, -238.1,\n",
- " -242.2, -245.8, -249. , -251.9, -254.6, -257. , -259.2, -261.2,\n",
- " -263. , -264.7, -266.4, -267.9, -269.3, -270.7, -272. , -273.2,\n",
- " -274.3, -275.4, -276.5, -277.5, -278.5, -279.4, -280.3, -282.8,\n",
- " -285. , -287. , -288.9, -290.6, -292.7, -294.2]),\n",
- " array([ 261.6, 259.8, 257.9, 255.9, 253.8, 251.6, 249.4, 247. ,\n",
- " 244.4, 241.8, 239.1, 236.2, 233.2, 230. , 226.7, 223.2,\n",
- " 219.5, 215.7, 211.7, 207.6, 203.2, 198.6, 193.9, 189. ,\n",
- " 183.9, 178.5, 172.8, 166.8, 160.4, 153.3, 145.4, 136.3,\n",
- " 125.5, 113. , 99.7, 87.3, 76.3, 66.6, 57.7, 49. ,\n",
- " 40.4, 31.3, 21.3, 10. , -3. , -16.8, -29.5, -40.8,\n",
- " -50.6, -59.6, -68.2, -76.9, -85.9, -95.6, -106.7, -119.3,\n",
- " -132.6, -145.2, -156.2, -165.7, -174.2, -182. , -189.5, -196.7,\n",
- " -203.8, -210.7, -217.3, -223.6, -229.4, -234.6, -239.4, -243.5,\n",
- " -247.2, -250.6, -253.6, -256.3, -258.8, -261. , -263.1, -265. ,\n",
- " -266.8, -268.5, -270.1, -273. , -275.5, -277.8, -278.9, -281.8,\n",
- " -283.6, -285.3, -287.5, -288.2]),\n",
- " array([ 261.7, 259.9, 258. , 256. , 253.9, 251.8, 249.5, 247.1,\n",
- " 244.6, 242. , 239.3, 236.4, 233.4, 230.2, 226.9, 223.4,\n",
- " 219.7, 215.9, 211.9, 207.8, 203.4, 198.9, 194.1, 189.2,\n",
- " 184.1, 178.7, 173. , 167.1, 160.6, 153.6, 145.7, 136.6,\n",
- " 125.8, 113.3, 100. , 87.6, 76.6, 66.9, 58. , 49.4,\n",
- " 40.8, 31.7, 21.7, 10.4, -2.6, -16.3, -29.1, -40.3,\n",
- " -50.1, -59.1, -67.7, -76.4, -85.4, -95.1, -106.2, -118.7,\n",
- " -132.1, -144.7, -155.6, -165.1, -173.6, -181.4, -188.9, -196.1,\n",
- " -203.1, -210.1, -216.7, -222.9, -228.7, -234. , -238.7, -242.9,\n",
- " -246.6, -249.9, -252.9, -255.6, -258.1, -260.3, -262.4, -264.4,\n",
- " -266.1, -269.4, -270.9, -272.3, -274.8, -276. , -278.2, -279.3,\n",
- " -281.2, -283.8, -285.3, -287.5])]"
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "return_extra[\"read_potential\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[array([ 265.50028032, 263.43425177, 261.27120975, 259.00420323,\n",
- " 256.62598179, 254.129081 , 251.50593489, 248.74901065,\n",
- " 245.85095361, 242.80472192, 239.60368401, 236.24165089,\n",
- " 232.71282592, 229.01167949, 225.13279228, 221.07074784,\n",
- " 216.82017033, 212.37596827, 207.73373014, 202.89001246,\n",
- " 197.84200579, 192.58588132, 187.11317038, 181.40484687,\n",
- " 175.42309367, 169.10052931, 162.32557539, 154.92079385,\n",
- " 146.61000362, 136.97967163, 125.51380819, 112.05549253,\n",
- " 97.8433178 , 84.79985547, 73.46895595, 63.40711778,\n",
- " 54.04712057, 44.89411023, 35.48465547, 25.310728 ,\n",
- " 13.77765165, 0.41698778, -14.19605951, -28.12524018,\n",
- " -40.23979018, -50.79712596, -60.39996502, -69.58533298,\n",
- " -78.82315247, -88.59027891, -99.43480457, -111.91095321,\n",
- " -125.98744621, -140.15966202, -152.74347276, -163.51755048,\n",
- " -172.97492621, -181.60605568, -189.76651446, -197.6918768 ,\n",
- " -205.5081128 , -213.2192852 , -220.69949241, -227.73898215,\n",
- " -234.14913708, -239.84473181, -244.84444019, -249.22461382,\n",
- " -253.0777683 , -256.49095688, -259.5383622 , -262.28061763,\n",
- " -264.76652033, -267.0352376 , -269.11832515, -271.04138118,\n",
- " -272.82534308, -274.48748577, -276.04218654, -277.50151177,\n",
- " -280.17335984, -282.94400221, -285.74401593, -287.63451457,\n",
- " -289.37454788, -290.19471275, -292.48139624, -294.54338697,\n",
- " -296.41766633]),\n",
- " array([ 265.50028032, 263.43425177, 261.27120975, 259.00420323,\n",
- " 256.62598179, 254.129081 , 251.50593489, 248.74901065,\n",
- " 245.85095361, 242.80472192, 239.60368401, 236.24165089,\n",
- " 232.71282592, 229.01167949, 225.13279228, 221.07074784,\n",
- " 216.82017033, 212.37596827, 207.73373014, 202.89001246,\n",
- " 197.84200579, 192.58588132, 187.11317038, 181.40484687,\n",
- " 175.42309367, 169.10052931, 162.32557539, 154.92079385,\n",
- " 146.61000362, 136.97967163, 125.51380819, 112.05549253,\n",
- " 97.8433178 , 84.79985547, 73.46895595, 63.40711778,\n",
- " 54.04712057, 44.89411023, 35.48465547, 25.310728 ,\n",
- " 13.77765165, 0.41698778, -14.19605951, -28.12524018,\n",
- " -40.23979018, -50.79712596, -60.39996502, -69.58533298,\n",
- " -78.82315247, -88.59027891, -99.43480457, -111.91095321,\n",
- " -125.98744621, -140.15966202, -152.74347276, -163.51755048,\n",
- " -172.97492621, -181.60605568, -189.76651446, -197.6918768 ,\n",
- " -205.5081128 , -213.2192852 , -220.69949241, -227.73898215,\n",
- " -234.14913708, -239.84473181, -244.84444019, -249.22461382,\n",
- " -253.0777683 , -256.49095688, -259.5383622 , -262.28061763,\n",
- " -264.76652033, -267.0352376 , -269.11832515, -271.04138118,\n",
- " -272.82534308, -274.48748577, -276.04218654, -277.50151177,\n",
- " -280.17335984, -281.4020513 , -283.67740188, -286.70953796,\n",
- " -287.63451457, -288.5219541 , -290.98462674, -293.87854118]),\n",
- " array([ 248.78301917, 246.35608508, 243.7694141 , 241.00562662,\n",
- " 238.04522447, 234.8663822 , 231.44473946, 227.75321196,\n",
- " 223.76186621, 219.43795885, 214.74632763, 209.65038639,\n",
- " 204.11383919, 198.10249694, 191.58381128, 184.51916931,\n",
- " 176.84221934, 168.41653912, 158.9632606 , 147.93464344,\n",
- " 134.30835733, 116.7208201 , 96.43194946, 78.3639244 ,\n",
- " 63.35696292, 49.82632973, 36.2736509 , 21.16885431,\n",
- " 2.76614392, -18.40711658, -37.36220396, -52.82914369,\n",
- " -66.49530993, -79.92564429, -94.58549728, -112.07795432,\n",
- " -132.28026856, -150.70463546, -165.34312995, -177.39716199,\n",
- " -187.93957862, -197.51352868, -206.30255974, -214.2862519 ,\n",
- " -221.39393942, -227.61452605, -233.01593205, -237.70909998,\n",
- " -241.81117947, -245.4266356 , -248.64188891, -251.5261962 ,\n",
- " -254.13448809, -256.51035288, -258.68858168, -260.69717793,\n",
- " -262.55889473, -264.29239801, -265.91314546, -267.43405346,\n",
- " -268.86600665, -270.21825035, -271.49869555, -272.71415798,\n",
- " -273.87054716, -276.02608831, -277.99951475, -280.67527012,\n",
- " -283.06921896, -285.23198973, -287.20181751, -290.13350423,\n",
- " -292.21963063, -294.56503443]),\n",
- " array([ 248.78301917, 246.35608508, 243.7694141 , 241.00562662,\n",
- " 238.04522447, 234.8663822 , 231.44473946, 227.75321196,\n",
- " 223.76186621, 219.43795885, 214.74632763, 209.65038639,\n",
- " 204.11383919, 198.10249694, 191.58381128, 184.51916931,\n",
- " 176.84221934, 168.41653912, 158.9632606 , 147.93464344,\n",
- " 134.30835733, 116.7208201 , 96.43194946, 78.3639244 ,\n",
- " 63.35696292, 49.82632973, 36.2736509 , 21.16885431,\n",
- " 2.76614392, -18.40711658, -37.36220396, -52.82914369,\n",
- " -66.49530993, -79.92564429, -94.58549728, -112.07795432,\n",
- " -132.28026856, -150.70463546, -165.34312995, -177.39716199,\n",
- " -187.93957862, -197.51352868, -206.30255974, -214.2862519 ,\n",
- " -221.39393942, -227.61452605, -233.01593205, -237.70909998,\n",
- " -241.81117947, -245.4266356 , -248.64188891, -251.5261962 ,\n",
- " -254.13448809, -256.51035288, -258.68858168, -260.69717793,\n",
- " -262.55889473, -264.29239801, -265.91314546, -267.43405346,\n",
- " -268.86600665, -270.21825035, -271.49869555, -272.71415798,\n",
- " -273.87054716, -274.97301725, -276.02608831, -277.03374458,\n",
- " -277.99951475, -278.9265379 , -279.81761815, -282.2991227 ,\n",
- " -284.53418503, -286.56467397, -288.42272034, -290.13350423,\n",
- " -292.21963063, -293.65848037]),\n",
- " array([ 261.52438642, 259.70026478, 257.79681497, 255.80867016,\n",
- " 253.73018307, 251.55545523, 249.27837771, 246.89268231,\n",
- " 244.39200011, 241.76992147, 239.0200499 , 236.13604055,\n",
- " 233.11161642, 229.94056097, 226.61669653, 223.13387219,\n",
- " 219.48599721, 215.66715838, 211.67183889, 207.4951971 ,\n",
- " 203.13325978, 198.58274911, 193.84014759, 188.89958649,\n",
- " 183.74926653, 178.36630566, 172.70993932, 166.71262588,\n",
- " 160.26773732, 153.21138779, 145.29614011, 136.16456311,\n",
- " 125.39134022, 112.85550164, 99.53616452, 87.08277414,\n",
- " 76.14398243, 66.44104669, 57.5013201 , 48.89815162,\n",
- " 40.24805876, 31.15854957, 21.17688008, 9.80394174,\n",
- " -3.18157607, -16.91795039, -29.7399488 , -40.93587417,\n",
- " -50.79275541, -59.81124021, -68.4355887 , -77.05423089,\n",
- " -86.05284595, -95.86525088, -106.96677707, -119.60066873,\n",
- " -133.03937833, -145.67551753, -156.67022082, -166.20180654,\n",
- " -174.70303503, -182.53661587, -189.95812551, -197.13188523,\n",
- " -204.14005195, -210.98222957, -217.58123893, -223.81415367,\n",
- " -229.56601193, -234.77375253, -239.43477251, -243.58859859,\n",
- " -247.29377887, -250.61190928, -253.59969114, -256.30615933,\n",
- " -258.77247915, -261.032772 , -263.11521989, -265.04313374,\n",
- " -266.83587694, -268.50962526, -270.07797754, -272.9428196 ,\n",
- " -275.503773 , -277.81532667, -278.89091402, -281.84653856,\n",
- " -283.62364274, -285.2705227 , -287.53203255, -288.23684575]),\n",
- " array([ 261.52438642, 259.70026478, 257.79681497, 255.80867016,\n",
- " 253.73018307, 251.55545523, 249.27837771, 246.89268231,\n",
- " 244.39200011, 241.76992147, 239.0200499 , 236.13604055,\n",
- " 233.11161642, 229.94056097, 226.61669653, 223.13387219,\n",
- " 219.48599721, 215.66715838, 211.67183889, 207.4951971 ,\n",
- " 203.13325978, 198.58274911, 193.84014759, 188.89958649,\n",
- " 183.74926653, 178.36630566, 172.70993932, 166.71262588,\n",
- " 160.26773732, 153.21138779, 145.29614011, 136.16456311,\n",
- " 125.39134022, 112.85550164, 99.53616452, 87.08277414,\n",
- " 76.14398243, 66.44104669, 57.5013201 , 48.89815162,\n",
- " 40.24805876, 31.15854957, 21.17688008, 9.80394174,\n",
- " -3.18157607, -16.91795039, -29.7399488 , -40.93587417,\n",
- " -50.79275541, -59.81124021, -68.4355887 , -77.05423089,\n",
- " -86.05284595, -95.86525088, -106.96677707, -119.60066873,\n",
- " -133.03937833, -145.67551753, -156.67022082, -166.20180654,\n",
- " -174.70303503, -182.53661587, -189.95812551, -197.13188523,\n",
- " -204.14005195, -210.98222957, -217.58123893, -223.81415367,\n",
- " -229.56601193, -234.77375253, -239.43477251, -243.58859859,\n",
- " -247.29377887, -250.61190928, -253.59969114, -256.30615933,\n",
- " -258.77247915, -261.032772 , -263.11521989, -265.04313374,\n",
- " -266.83587694, -270.07797754, -271.55244157, -272.9428196 ,\n",
- " -275.503773 , -276.68788245, -278.89091402, -279.91888115,\n",
- " -281.84653856, -284.46224993, -286.05041891, -288.23684575])]"
- ]
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "return_extra[\"calculated_potential\"]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([0.00329091, 0.00459119, 0.00558741, 0.00650936, 0.00675121,\n",
- " 0.01004015])"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "np.sqrt(np.diag(cov_matrix)) / 2.303"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "libeq-8i_JZAyh-py3.12",
- "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.12.1"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/notebooks/try_data.ipynb b/notebooks/try_data.ipynb
deleted file mode 100644
index 1d0fd41..0000000
--- a/notebooks/try_data.ipynb
+++ /dev/null
@@ -1,118 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {},
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "from libeq import SolverData, species_concentration\n",
- "\n",
- "# Create SolverData object\n",
- "solver_data = SolverData.load_from_pyes(\n",
- " \"/Users/lorenzo/Coding/libeq/notebooks/cu_gly_solid.json\"\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [],
- "source": [
- "stoichiometry = solver_data.stoichiometry\n",
- "nc = solver_data.nc\n",
- "concentration = species_concentration(\n",
- " np.array([[1e-3, 1e-3, 1e-3]]),\n",
- " log_beta=solver_data.log_beta,\n",
- " stoichiometry=stoichiometry,\n",
- " full=True,\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[[ 1.69844783e+06, 3.39669148e+06, -7.64120021e-09],\n",
- " [ 3.39669148e+06, 6.79887589e+06, 6.92737346e+03],\n",
- " [-7.64120021e-09, 6.92737346e+03, 9.38791200e+03]]])"
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# libeq\n",
- "J = np.zeros((concentration.shape[0], nc, nc))\n",
- "diagonals = np.einsum(\n",
- " \"ij,jk->ijk\", concentration[:, nc:], np.eye(concentration.shape[1] - nc)\n",
- ")\n",
- "# Compute Jacobian for soluble components only\n",
- "J[:, :nc, :nc] = stoichiometry @ diagonals @ stoichiometry.T\n",
- "J[:, range(nc), range(nc)] += concentration[:, :nc]\n",
- "\n",
- "J"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "ename": "KeyboardInterrupt",
- "evalue": "",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
- "Cell \u001b[0;32mIn[6], line 7\u001b[0m\n\u001b[1;32m 5\u001b[0m d[j \u001b[38;5;241m==\u001b[39m k] \u001b[38;5;241m=\u001b[39m (concentration[\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m, :nc])\u001b[38;5;241m.\u001b[39mflat\n\u001b[1;32m 6\u001b[0m A \u001b[38;5;241m=\u001b[39m d \u001b[38;5;241m+\u001b[39m stoichiometry \u001b[38;5;241m@\u001b[39m diagonals \u001b[38;5;241m@\u001b[39m stoichiometry\u001b[38;5;241m.\u001b[39mT\n\u001b[0;32m----> 7\u001b[0m B \u001b[38;5;241m=\u001b[39m \u001b[43mstoichiometry\u001b[49m[np\u001b[38;5;241m.\u001b[39mnewaxis, \u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m] \u001b[38;5;241m*\u001b[39m \\\n\u001b[1;32m 8\u001b[0m concentration[\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m, nc:, np\u001b[38;5;241m.\u001b[39mnewaxis]\n",
- "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/libeq-8i_JZAyh-py3.12/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_frame.py:988\u001b[0m, in \u001b[0;36mPyDBFrame.trace_dispatch\u001b[0;34m(self, frame, event, arg)\u001b[0m\n\u001b[1;32m 986\u001b[0m \u001b[38;5;66;03m# if thread has a suspend flag, we suspend with a busy wait\u001b[39;00m\n\u001b[1;32m 987\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m info\u001b[38;5;241m.\u001b[39mpydev_state \u001b[38;5;241m==\u001b[39m STATE_SUSPEND:\n\u001b[0;32m--> 988\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdo_wait_suspend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mthread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mframe\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mevent\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43marg\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 989\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtrace_dispatch\n\u001b[1;32m 990\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n",
- "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/libeq-8i_JZAyh-py3.12/lib/python3.12/site-packages/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_frame.py:165\u001b[0m, in \u001b[0;36mPyDBFrame.do_wait_suspend\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdo_wait_suspend\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 165\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_args\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdo_wait_suspend\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
- "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/libeq-8i_JZAyh-py3.12/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd.py:2070\u001b[0m, in \u001b[0;36mPyDB.do_wait_suspend\u001b[0;34m(self, thread, frame, event, arg, exception_type)\u001b[0m\n\u001b[1;32m 2067\u001b[0m from_this_thread\u001b[38;5;241m.\u001b[39mappend(frame_custom_thread_id)\n\u001b[1;32m 2069\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_threads_suspended_single_notification\u001b[38;5;241m.\u001b[39mnotify_thread_suspended(thread_id, thread, stop_reason):\n\u001b[0;32m-> 2070\u001b[0m keep_suspended \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_do_wait_suspend\u001b[49m\u001b[43m(\u001b[49m\u001b[43mthread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mframe\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mevent\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43marg\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msuspend_type\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfrom_this_thread\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mframes_tracker\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2072\u001b[0m frames_list \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 2074\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m keep_suspended:\n\u001b[1;32m 2075\u001b[0m \u001b[38;5;66;03m# This means that we should pause again after a set next statement.\u001b[39;00m\n",
- "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/libeq-8i_JZAyh-py3.12/lib/python3.12/site-packages/debugpy/_vendored/pydevd/pydevd.py:2106\u001b[0m, in \u001b[0;36mPyDB._do_wait_suspend\u001b[0;34m(self, thread, frame, event, arg, suspend_type, from_this_thread, frames_tracker)\u001b[0m\n\u001b[1;32m 2103\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_call_input_hook()\n\u001b[1;32m 2105\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprocess_internal_commands()\n\u001b[0;32m-> 2106\u001b[0m \u001b[43mtime\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msleep\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m0.01\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2108\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcancel_async_evaluation(get_current_thread_id(thread), \u001b[38;5;28mstr\u001b[39m(\u001b[38;5;28mid\u001b[39m(frame)))\n\u001b[1;32m 2110\u001b[0m \u001b[38;5;66;03m# process any stepping instructions\u001b[39;00m\n",
- "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
- ]
- }
- ],
- "source": [
- "# apes\n",
- "\n",
- "d = np.zeros((concentration.shape[0], nc, nc))\n",
- "_, j, k = np.indices(d.shape)\n",
- "d[j == k] = (concentration[..., :nc]).flat\n",
- "A = d + stoichiometry @ diagonals @ stoichiometry.T\n",
- "B = stoichiometry[np.newaxis, ...] * concentration[..., nc:, np.newaxis]"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "libeq-8i_JZAyh-py3.12",
- "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.12.1"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/notebooks/try_distribution.ipynb b/notebooks/try_distribution.ipynb
deleted file mode 100644
index ca0db1a..0000000
--- a/notebooks/try_distribution.ipynb
+++ /dev/null
@@ -1,184 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "ename": "ValidationError",
- "evalue": "4 validation errors for SolverData\nv_add\n Extra inputs are not permitted [type=extra_forbidden, input_value=array([1.00000e-02, 1.500...08870e+01, 1.10837e+01]), input_type=ndarray]\n For further information visit https://errors.pydantic.dev/2.7/v/extra_forbidden\nc0\n Extra inputs are not permitted [type=extra_forbidden, input_value=array([0.001944, 0.001988, 0.028132]), input_type=ndarray]\n For further information visit https://errors.pydantic.dev/2.7/v/extra_forbidden\nct\n Extra inputs are not permitted [type=extra_forbidden, input_value=array([ 0. , 0. , -0.2009]), input_type=ndarray]\n For further information visit https://errors.pydantic.dev/2.7/v/extra_forbidden\nv0\n Extra inputs are not permitted [type=extra_forbidden, input_value=50.0, input_type=float]\n For further information visit https://errors.pydantic.dev/2.7/v/extra_forbidden",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mValidationError\u001b[0m Traceback (most recent call last)",
- "Cell \u001b[0;32mIn[2], line 10\u001b[0m\n\u001b[1;32m 7\u001b[0m get_ipython()\u001b[38;5;241m.\u001b[39mrun_line_magic(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mload_ext\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpyinstrument\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# Create SolverData object\u001b[39;00m\n\u001b[0;32m---> 10\u001b[0m solver_data \u001b[38;5;241m=\u001b[39m \u001b[43mSolverData\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mload_from_bstac\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 11\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m/Users/lorenzo/Coding/libeq/notebooks/Zn-EDTA\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\n\u001b[1;32m 12\u001b[0m \u001b[43m)\u001b[49m\n\u001b[1;32m 13\u001b[0m solver_data\u001b[38;5;241m.\u001b[39mdistribution_opts\u001b[38;5;241m.\u001b[39minitial_log \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m2\u001b[39m\n\u001b[1;32m 14\u001b[0m solver_data\u001b[38;5;241m.\u001b[39mdistribution_opts\u001b[38;5;241m.\u001b[39mfinal_log \u001b[38;5;241m=\u001b[39m \u001b[38;5;241m12\u001b[39m\n",
- "File \u001b[0;32m~/Coding/libeq/src/libeq/data_structure.py:199\u001b[0m, in \u001b[0;36mSolverData.load_from_bstac\u001b[0;34m(cls, file_path)\u001b[0m\n\u001b[1;32m 190\u001b[0m data[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mreference_ionic_str_solids\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m np\u001b[38;5;241m.\u001b[39marray(\n\u001b[1;32m 191\u001b[0m [\n\u001b[1;32m 192\u001b[0m parsed_data[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIREF\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 193\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m _ \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(data[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msolid_stoichiometry\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39mshape[\u001b[38;5;241m1\u001b[39m])\n\u001b[1;32m 194\u001b[0m ]\n\u001b[1;32m 195\u001b[0m )\n\u001b[1;32m 196\u001b[0m data[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdbh_params\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 197\u001b[0m parsed_data[i] \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m [\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mAT\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mBT\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mc0\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mc1\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124md0\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124md1\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124me0\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124me1\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 198\u001b[0m ]\n\u001b[0;32m--> 199\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mcls\u001b[39;49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mdata\u001b[49m\u001b[43m)\u001b[49m\n",
- "File \u001b[0;32m~/Library/Caches/pypoetry/virtualenvs/libeq-8i_JZAyh-py3.12/lib/python3.12/site-packages/pydantic/main.py:176\u001b[0m, in \u001b[0;36mBaseModel.__init__\u001b[0;34m(self, **data)\u001b[0m\n\u001b[1;32m 174\u001b[0m \u001b[38;5;66;03m# `__tracebackhide__` tells pytest and some other tools to omit this function from tracebacks\u001b[39;00m\n\u001b[1;32m 175\u001b[0m __tracebackhide__ \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[0;32m--> 176\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m__pydantic_validator__\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mvalidate_python\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mself_instance\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m)\u001b[49m\n",
- "\u001b[0;31mValidationError\u001b[0m: 4 validation errors for SolverData\nv_add\n Extra inputs are not permitted [type=extra_forbidden, input_value=array([1.00000e-02, 1.500...08870e+01, 1.10837e+01]), input_type=ndarray]\n For further information visit https://errors.pydantic.dev/2.7/v/extra_forbidden\nc0\n Extra inputs are not permitted [type=extra_forbidden, input_value=array([0.001944, 0.001988, 0.028132]), input_type=ndarray]\n For further information visit https://errors.pydantic.dev/2.7/v/extra_forbidden\nct\n Extra inputs are not permitted [type=extra_forbidden, input_value=array([ 0. , 0. , -0.2009]), input_type=ndarray]\n For further information visit https://errors.pydantic.dev/2.7/v/extra_forbidden\nv0\n Extra inputs are not permitted [type=extra_forbidden, input_value=50.0, input_type=float]\n For further information visit https://errors.pydantic.dev/2.7/v/extra_forbidden"
- ]
- }
- ],
- "source": [
- "from libeq.data_structure import SolverData\n",
- "from libeq import EqSolver\n",
- "from libeq.utils import species_concentration\n",
- "import numpy as np\n",
- "import matplotlib.pyplot as plt\n",
- "\n",
- "%load_ext pyinstrument\n",
- "\n",
- "# Create SolverData object\n",
- "solver_data = SolverData.load_from_bstac(\n",
- " \"/Users/lorenzo/Coding/libeq/notebooks/Zn-EDTA\"\n",
- ")\n",
- "solver_data.distribution_opts.initial_log = 2\n",
- "solver_data.distribution_opts.final_log = 12\n",
- "solver_data.distribution_opts.log_increments = 0.1\n",
- "solver_data.distribution_opts.independent_component = 2"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(0,)"
- ]
- },
- "execution_count": 2,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "solver_data.log_ks.shape"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {},
- "outputs": [],
- "source": [
- "independent_component_concentration = 10 ** -np.arange(\n",
- " solver_data.distribution_opts.initial_log,\n",
- " (\n",
- " solver_data.distribution_opts.final_log\n",
- " + solver_data.distribution_opts.log_increments\n",
- " ),\n",
- " solver_data.distribution_opts.log_increments,\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Ionic strength dependence is not implemented for distribution mode!\n",
- " No ionic strength dependence will be considered.\n",
- "Done no solids\n"
- ]
- }
- ],
- "source": [
- "solution, log_beta = EqSolver(solver_data, mode=\"distribution\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {},
- "outputs": [],
- "source": [
- "libeq_solution = np.insert(solution, 2, independent_component_concentration, axis=1)\n",
- "pyes_solution = np.array([[1.906259e-03, 4.941995e-21, 1.000000e-01]])\n",
- "log_beta = solver_data.log_beta"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [],
- "source": [
- "final_c = species_concentration(\n",
- " libeq_solution,\n",
- " log_beta,\n",
- " solver_data.stoichiometry,\n",
- " solver_data.solid_stoichiometry,\n",
- " full=True,\n",
- ")\n",
- "\n",
- "pyes_final_c = species_concentration(\n",
- " pyes_solution,\n",
- " log_beta,\n",
- " solver_data.stoichiometry,\n",
- " solver_data.solid_stoichiometry,\n",
- " full=True,\n",
- ")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABm8AAANXCAYAAADTsct+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzde3zP9f//8ft759nJYWctc8xpciZy+sSQhFKIQkSHT5JDDini45yihI+aU9QiHZxSUWqaSPLRENI2wpw229gY2+v3h+/ePy/vjW323ha36+XyutTr8Xq+no/n6/1+bRfvPd7P58tiGIYhAAAAAAAAAAAAlAgOxT0AAAAAAAAAAAAA/H8UbwAAAAAAAAAAAEoQijcAAAAAAAAAAAAlCMUbAAAAAAAAAACAEoTiDQAAAAAAAAAAQAlC8QYAAAAAAAAAAKAEoXgDAAAAAAAAAABQglC8AQAAAAAAAAAAKEEo3gAAAAAAAAAAAJQgFG8AAACAf7glS5bIYrEoLi6uuIdyQzNnzlSlSpXk6OiounXrFvdwCsRisWjChAnFPYwcnT9/XgMHDlRgYKAsFouGDh1a3ENCCZH9O2Lnzp3FPRQAAADkEcUbAAAA2M3hw4c1ePBgVapUSW5ubvL29lbz5s01Z84cpaenF/fwCl10dLQmTJigc+fO2aX/KVOm6IsvvrBL3/b2zTff6JVXXlHz5s21ePFiTZkypbiHdNuZMmWKlixZoueee04ffvihnnzySbvfkzmZMGGCLBaLAgIClJaWZnM8NDRUDz30UJGN5/jx45owYYJ2795dZDmvFxcXJ4vFYt0cHBxUtmxZdezYUdu2bSu2cQEAAKDkciruAQAAAOD2tH79ej322GNydXXVU089pdq1aysjI0Nbt27VyJEjtXfvXi1cuLC4h1mooqOj9cYbb6hfv34qXbp0ofc/ZcoUde/eXV27djXFn3zySfXs2VOurq6FnrOwfPfdd3JwcFBERIRcXFyKezgFlp6eLienkvkx6rvvvlPTpk01fvx4a+zNN9+06z15I6dOndL8+fM1fPjwIs17vePHj+uNN95QaGhosc/46tWrlx588EFlZmbq4MGDmjdvntq0aaNffvlFYWFhxTo2AAAAlCwl81MHAAAA/tFiY2PVs2dPVahQQd99952CgoKsx1544QX9+eefWr9+fTGOsPhlZWUpIyNDbm5ut9yXo6OjHB0dC2FU9nPq1Cm5u7v/ows3kgrl/bKXU6dOqWbNmkWSKy0tTaVKlbphm7p162rmzJl6/vnn5e7uXiTjKunq16+vPn36WPdbtGihjh07av78+Zo3b14xjgwAAAAlDcumAQAAoNDNmDFD58+fV0REhKlwk61KlSp66aWXrPtXrlzRpEmTVLlyZbm6uio0NFRjx47VpUuXTOdlL7e0detWNW7cWG5ubqpUqZKWLVtmk+PcuXMaOnSoQkJC5OrqqipVqmj69OnKysqytsleyujNN9/UwoULrfkbNWqkX375xabPP/74Q48//rj8/Pzk7u6ue+65R6+++qqkq0tFjRw5UpJUsWJF6/JI2c+hsVgs+ve//60VK1aoVq1acnV11caNGyVdnR3RrFkzlStXTu7u7mrQoIE+/fRTU26LxaILFy5o6dKl1r779esnKfdn3sybN8+aKzg4WC+88ILN8lmtW7dW7dq1tW/fPrVp00alSpVS+fLlNWPGDJvrz0le3juLxaLFixfrwoUL1rEvWbIk1z4PHTqkRx99VIGBgXJzc9Ndd92lnj17Kjk52dRn9ut5zz33yM3NTQ0aNNCPP/5o09+xY8f09NNPKyAgQK6urqpVq5YWLVpk0+7ixYuaMGGCqlWrJjc3NwUFBemRRx7R4cOHTXmvf+ZNXvt/9913VatWLZUqVUplypRRw4YN9dFHH93o5VVGRoZef/11NWjQQD4+PvLw8FCLFi30/fffW9ts2bJFFotFsbGxWr9+ven+uNE9KUnLly9XgwYN5O7urrJly6pnz546evSoaQzZ98ivv/6qli1bqlSpUho7duwNxy1Jr7/+uk6ePKn58+fftG1WVpZmz56tWrVqyc3NTQEBARo8eLCSkpKsbYYNG6Zy5crJMAxr7MUXX5TFYtE777xjjZ08eVIWi0Xz58/Xli1b1KhRI0lS//79c7z/Vq1aZX0NfH191adPHx07dsw0vn79+snT01PHjh1T165d5enpKT8/P40YMUKZmZk3vb7ctGjRQpJM95gkLV68WP/617/k7+8vV1dX1axZM8fXMft34jfffKO6devKzc1NNWvW1GeffZZjvkuXLmnYsGHy8/OTh4eHunXrptOnT5va7Ny5U+3bt5evr6/c3d1VsWJFPf3006Y2Fy5c0PDhw62/X++55x69+eab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1KFDBz388MM6cOCA5s2bp0aNGqlPnz75uvbc2OO9++677/Tvf/9bjz32mKpVq6YrV67oww8/tBZKrlW7dm21b99eQ4YMkaurq+bNmydJpmXIpk2bpu+//15NmjTRM888o5o1ayoxMVG7du3Spk2blJiYKEl66qmntGzZMg0bNkw7duxQixYtdOHCBW3atEnPP/+8unTpkuN489p/eHi4AgMD1bx5cwUEBGj//v2aO3euOnXqZPPskGs99NBD+uyzz9StWzd16tRJsbGxWrBggWrWrKnz58/f9PXM7Z6sXLmy/vOf/2jMmDGKi4tT165d5eXlpdjYWH3++ecaNGiQRowYcdP+82P8+PE53hOtWrXS4MGDNXXqVO3evVvh4eFydnbWoUOHtGrVKs2ZM0fdu3e3tm/RooUiIyMVFhZmfWZL/fr15eHhoYMHD9o876Zy5coqXbq0FixYIC8vL3l4eKhJkyaqWLGipk+frv79+6tVq1bq1auXTp48qTlz5ig0NDTH5/PYw0svvaTZs2dr2rRpioyMVHh4uFxcXNS5c2cNHjxY58+f1/vvvy9/f3+dOHHC5vxq1appwIAB+uWXXxQQEKBFixbp5MmTuRZ7bmTp0qWaN2+eunXrpsqVKys1NVXvv/++vL29rcXazp07q02bNnr11VcVFxene++9V998842+/PJLDR06VJUrV77l1wQAAACSDAAAAMBODh48aDzzzDNGaGio4eLiYnh5eRnNmzc33n33XePixYvWdpcvXzbeeOMNo2LFioazs7MREhJijBkzxtTGMAyjQoUKRqdOnWzytGrVymjVqpUplpqaaowZM8aoUqWK4eLiYvj6+hrNmjUz3nzzTSMjI8MwDMOIjY01JBkzZ8606VOSMX78eFMsJibG6Natm1G6dGnDzc3NuOeee4zXXnvN1GbSpElG+fLlDQcHB0OSERsba+3vhRdeyPF1ioiIMKpWrWq4uroa1atXNxYvXmyMHz/euP6f63/88YfRsmVLw93d3ZBk9O3b1zAMw1i8eLEpV7a5c+ca1atXN5ydnY2AgADjueeeM5KSkmxeu1q1atmMqW/fvkaFChVyHO+18vre9e3b1/Dw8Lhpf3/99Zfx9NNPG5UrVzbc3NyMsmXLGm3atDE2bdpkapf9ei5fvtz62tWrV8/4/vvvbfo8efKk8cILLxghISGGs7OzERgYaDzwwAPGwoULTe3S0tKMV1991XotgYGBRvfu3Y3Dhw+b8l5/X+Sl///+979Gy5YtjXLlyhmurq5G5cqVjZEjRxrJyck3fD2ysrKMKVOmGBUqVLBe47p163J8f3L7+cjtnjQMw1i9erVx//33Gx4eHoaHh4dRvXp144UXXjAOHDhgbZPbPZKb7Hv39OnTNsdatWplSMpxnAsXLjQaNGhguLu7G15eXkZYWJjxyiuvGMePHze1e++99wxJxnPPPWeKt23b1pBkbN682abvL7/80qhZs6bh5ORkSDIWL15sPfbJJ58Y9erVM1xdXY2yZcsavXv3Nv7++2/T+bndvzn9nObkRr9rDMMw+vXrZzg6Ohp//vmnYRiGsWbNGqNOnTqGm5ubERoaakyfPt1YtGiRzfuX/Z5//fXXRp06day/Q1atWmXqP/t3xC+//GKKf//994Yk68/Nrl27jF69ehl333234erqavj7+xsPPfSQsXPnTtN5qampxssvv2wEBwcbzs7ORtWqVY2ZM2caWVlZpna5/d6rUKGC9fcXAAAAcmYxDJ4SCAAAAOCfxWKx6IUXXshxmTPgThEaGqratWtr3bp1xT0UAAAAFDKeeQMAAAAAAAAAAFCCULwBAAAAAAAAAAAoQSjeAAAAAAAAAAAAlCA88wYAAAAAAAAAAKAEYeYNAAAAAAAAAABACULxBgAAAAAAAAAAoARxKu4B3M6ysrJ0/PhxeXl5yWKxFPdwAAAAAAAAAABAMTIMQ6mpqQoODpaDQ+7zayje2NHx48cVEhJS3MMAAAAAAAAAAAAlyNGjR3XXXXflepzijR15eXlJuvomeHt7F/NoAAAAAAAAAABAcUpJSVFISIi1fpAbijd2lL1Umre3N8UbAAAAAAAAAAAgSTd91EruC6oBAAAAAAAAAACgyFG8AQAAAAAAAAAAKEEo3gAAAAAAAAAAAJQgPPMGAAAAQJ4ZhqErV64oMzOzuIeCO4Cjo6OcnJxuuh44AAAAcLuheAMAAAAgTzIyMnTixAmlpaUV91BwBylVqpSCgoLk4uJS3EMBAAAAigzFGwAAAAA3lZWVpdjYWDk6Oio4OFguLi7MhoBdGYahjIwMnT59WrGxsapataocHFj5GwAAAHcGijcAAAAAbiojI0NZWVkKCQlRqVKlins4uEO4u7vL2dlZ8fHxysjIkJubW3EPCQAAACgSfG0JAAAAQJ4x8wFFjXsOAAAAdyL+FQwAAAAAAAAAAFCCULwBAAAAAAAAAAAoQXjmDQAAAIAilZllaEdsok6lXpS/l5saVywrRwdLcQ8LAAAAAEoMijcAAAAAiszGmBN6Y+0+nUi+aI0F+bhpfOea6lA7qNDzbdmyRW3atMn1eOvWrfX9998Xel4AAAAAuBUsmwYAAACgSGyMOaHnlu8yFW4kKSH5op5bvksbY04Ues5mzZrpxIkTNtt///tfWSwWPf/884WeEwAAAABuFcUbAAAAAHaXmWXojbX7ZORwLDv2xtp9yszKqUXBubi4KDAw0LQlJSVpxIgRGjt2rB577DFt2bJFFotFmzdvVsOGDVWqVCk1a9ZMBw4cKNSxAAAAAEBeUbwBAAAAYHc7YhNtZtxcy5B0IvmidsQm2nUc586dU5cuXdS6dWtNmjTJdOzVV1/VrFmztHPnTjk5Oenpp5+261gAAAAAIDc88wYAAACA3Z1Kzb1wU5B2BZGVlaUnnnhCTk5OWrFihSwWi+n45MmT1apVK0nS6NGj1alTJ128eFFubm52GxMAAAAA5ISZNwAAAADszt8rbwWQvLYriLFjx2rbtm368ssv5eXlZXO8Tp061v8PCgqSJJ06dcpu4wEAAACA3FC8AQAAAGB3jSuWVZCPmyy5HLdICvJxU+OKZe2SPzIyUm+++aYiIyNVtWrVHNs4Ozv///H836ycrKwsu4wHAAAAAG6E4g0AAAAAu3N0sGh855qSZFPAyd4f37mmHB1yK+8U3O7duzVgwABNmzZN7du3L/T+AQAAAKCw8cwbAAAAAEWiQ+0gze9TX2+s3acTyf//2TaBPm4a37mmOtQOKvScZ86cUdeuXdW6dWv16dNHCQkJpuOOjo6FnhMAAAAAbhXFGwAAAABFpkPtILWrGagdsYk6lXpR/l5Xl0qzx4wbSVq/fr3i4+MVHx9vfY7NtSpUqKAlS5bYJTcAAAAAFBTFGwAAAABFytHBovsqlyuSXH379lXfvn1v2s4wDNN+3bp1bWIAAAAAUFR45g0AAAAAAAAAAEAJQvEGAAAAAAAAAACgBKF4AwAAAAAAAAAAUIJQvAEAAAAAAAAAAChBKN4AAAAAAAAAAACUIE7FPQAAAAAAAAAAAHB7MDIzlbbzV105fVpOfn4q1bCBLI6OxT2sfxyKNwAAAAAAAAAA4JalfPONTk6ZqisJCdaYU2CgAsaOkXd4eDGO7J+HZdMAAAAAAAAAAMAtSfnmGx17aaipcCNJV06e1LGXhirlm2+KaWT/TBRvAAAAAAAAAABAgRmZmTo5ZapkGDkcvBo7OWWqjMzMIh7ZPxfFGwAAAABFKytTio2Sfv/06n+z+AAHAAAA/JOl7fzVZsaNiWHoSkKC0nb+WnSD+oejeAMAAACg6OxbI82uLS19SFo94Op/Z9e+GreTfv36yWKx2GwdOnSQJIWGhlpj7u7uCg0N1eOPP67vvvvO2seECRNy7OPaLdvHH38sR0dHvfDCC3a7JgAAAKAkuXL6dKG2A8UbAAAAAEVl3xpp5VNSynFzPOXE1bgdCzgdOnTQiRMnTNvHH39sPT5x4kSdOHFCBw4c0LJly1S6dGm1bdtWkydPliSNGDHCdO5dd91lPSd7yxYREaFXXnlFH3/8sS5evGi3awIAAABKCic/v0JtB8mpuAcAAAAA4A6QlSltHCUphzWwZUiySBtHS9U7SQ6OhZ7e1dVVgYGBuR738vKyHr/77rvVsmVLBQUF6fXXX1f37t11zz33yNPT09re0dHRdE622NhYRUdHa/Xq1fr+++/12Wef6Yknnij06wEAAABKklING8gpMFBXTp7M+bk3FoucAgJUqmGDoh/cPxQzbwAAAADYX3y07YwbE0NKOXa1XQnx0ksvyTAMffnll3k+Z/HixerUqZN8fHzUp08fRURE2HGEAAAAQMlgcXRUwNgx/7djue7g1f2AsWNkcSz8L2rdrijeAAAAALC/8ycLt10+rVu3Tp6enqZtypQpNzynbNmy8vf3V1xcXJ5yZGVlacmSJerTp48kqWfPntq6datiY2NvdfgAAABAiecdHq7yc2bLKSDAFHcKCFD5ObPlHR5eTCP7Z2LZNAAAAAD25xlw8zb5aZdPbdq00fz5802xsmXL3vQ8wzBkuf6bg7n49ttvdeHCBT344IOSJF9fX7Vr106LFi3SpEmT8j9oAAAA4B/GOzxcXg88oLSdv+rK6dNy8vNTqYYNmHFTABRvAAAAANhfhWaSd7CUckI5P/fGcvV4hWZ2Se/h4aEqVark65yzZ8/q9OnTqlixYp7aR0REKDExUe7u7tZYVlaW9uzZozfeeEMODix8AAAAgNufxdFRHk0aF/cw/vH49AAAAADA/hwcpQ7T/2/n+pks/7ffYdrVdiXEnDlz5ODgoK5du9607dmzZ/Xll18qMjJSu3fvtm6//fabkpKS9M0339h/wAAAAABuG8y8AQAAAFA0aj4sPb5M2jhKSjn+/+PewVcLNzUftlvqS5cuKSEhwRRzcnKSr6+vJCk1NVUJCQm6fPmyYmNjtXz5cn3wwQeaOnVqnmbsfPjhhypXrpwef/xxm2XWHnzwQUVERKhDhw6Fd0EAAAAAbmsUbwAAAAAUnZoPS9U7SfHR0vmTV59xU6GZ3WfcbNy4UUFBQabYPffcoz/++EOS9Prrr+v111+Xi4uLAgMD1bRpU23evFlt2rTJU/+LFi1St27dcnw+zqOPPqonn3xSZ86csRaLAAAAAOBGLIZh5LTgNApBSkqKfHx8lJycLG9v7+IeDgAAAFBgFy9eVGxsrCpWrCg3N7fiHg7uINx7AAAAuJ3ktW7AM28AAAAAAAAAAABKEIo3AAAAAAAAAAAAJQjFGwAAAAAAAAAAgBKE4g0AAAAAAAAAAEAJQvEGAAAAAAAAAACgBKF4AwAAAAAAAAAAUIJQvAEAAAAAAAAAAChBKN4AAAAAAAAAAACUIBRvAAAAAAAAAAAAShCn4h4AAAAAgDtLZlamdp3apdNpp+VXyk/1/evL0cGxuIcFAAAAACUGxRsAAAAARWZT/CZN2zFNJ9NOWmMBpQI0uvFota3Q1i45+/Xrp3PnzumLL74wxbds2aI2bdooKSlJpUuXtktuAAAAACgIlk0DAAAAUCQ2xW/SsC3DTIUbSTqVdkrDtgzTpvhNxTQyAAAAAChZKN4AAAAAsLvMrExN2zFNhgybY9mx6TumKzMrs6iHBgAAAAAlDsUbAAAAAHa369Qumxk31zJkKCEtQbtO7SrCUQEAAABAycQzbwAAAADY3em004XaLr/WrVsnT09PUywzk1k+AAAAAEomijcAAAAA7M6vlF+htsuvNm3aaP78+abY9u3b1adPH7vkAwAAAIBbQfEGAAAAgN3V96+vgFIBOpV2Ksfn3lhkUUCpANX3r2+X/B4eHqpSpYop9vfff9slFwAAAADcKp55AwAAAMDuHB0cNbrxaElXCzXXyt4f1XiUHB0ci3xsAAAAAFDSULwBAAAAUCTaVmirt1q/Jf9S/qZ4QKkAvdX6LbWt0LaYRgYAAAAAJQvLpgEAAAAoMm0rtFWbkDbadWqXTqedll8pP9X3r8+MGwAAAAC4BsUbAAAAAEXK0cFRjQIbFVm+JUuW5Bhv3bq1DMP2+TsAAAAAUNxYNg0AAAAAAAAAAKAEoXgDAAAAAAAAAABQglC8AQAAAAAAAAAAKEEo3gAAAAAAAAAAAJQgFG8AAAAAAAAAAABKEIo3AAAAAAAAAAAAJQjFGwAAAAAAAAAAgBKE4g0AAAAAAAAAAEAJQvEGAAAAAAAAAACgBKF4AwAAAKBIGZmZurB9h5LXrdeF7TtkZGbaPefZs2fl7++vuLg4u/SfkZGh0NBQ7dy50y79AwAAALizULwBAAAAUGRSvvlGfz7QVkf69tXxESN0pG9f/flAW6V8841d806ePFldunRRaGioNbZ06VI1atRIpUqVkpeXl1q1aqV169aZztuyZYssFovOnTtn02doaKhmz54tSXJxcdGIESM0atQoO14FAAAAgDsFxRsAAAAARSLlm2907KWhupKQYIpfOXlSx14aarcCTlpamiIiIjRgwABrbMSIERo8eLB69OihPXv2aMeOHbr//vvVpUsXzZ07t0B5evfura1bt2rv3r2FNXQAAAAAdyiKNwAAAADszsjM1MkpUyXDyOHg1djJKVPtsoTahg0b5OrqqqZNm0qSfv75Z82aNUszZ87UiBEjVKVKFdWoUUOTJ0/W0KFDNWzYMB09ejTfecqUKaPmzZsrMjKysC8BAAAAwB2G4g0AAAAAu0vb+avNjBsTw9CVhASl7fy10HNHRUWpQYMG1v2PP/5Ynp6eGjx4sE3b4cOH6/Lly1q9enWBcjVu3FhRUVEFHisAAAAASJJTcQ8AAAAAwO3vyunThdouP+Lj4xUcHGzdP3jwoCpXriwXFxebtsHBwfL29tbBgwdN8bvuusumbVpaWo7nx8fHF8KoAQAAANzJKN4AAAAAsDsnP79CbZcf6enpcnNzM8WMnJZvu4GoqCh5eXmZYq1bt7Zp5+7unmNRBwAAAADyg+INAAAAALsr1bCBnAIDdeXkyZyfe2OxyCkgQKUaNrA9dot8fX2VlJRk3a9WrZq2bt2qjIwMm9k3x48fV0pKiqpVq2aKV6xYUaVLlzbFnJxsP04lJibKzw4FKAAAAAB3Fp55AwAAAMDuLI6OChg75v92LNcdvLofMHaMLI6OhZ67Xr162rdvn3W/Z8+eOn/+vP773//atH3zzTfl7OysRx99tEC5YmJiVK9evQKPFQAAAAAkijcAAAAAioh3eLjKz5ktp4AAU9wpIEDl58yWd3i4XfK2b99ee/futc6+ue+++/TSSy9p5MiRmjVrlg4fPqw//vhD48aN05w5czRr1iyFhIQUKFdUVJTC7XQdAAAAAO4cLJsGAAAAoMh4h4fL64EHlLbzV105fVpOfn4q1bCBXWbcZAsLC1P9+vW1cuVKDR48WJI0e/Zs1alTR/PmzdO4cePk6Oio+vXr64svvlDnzp0LlGfbtm1KTk5W9+7dC3P4AAAAAO5AFiO/T+pEnqWkpMjHx0fJycny9vYu7uEAAAAABXbx4kXFxsaqYsWKcnNzK+7h5Nv69es1cuRIxcTEyMHBPgsQ9OjRQ/fee6/Gjh1rl/7vVP/0ew8AAAC4Vl7rBsy8AQAAAHDb69Spkw4dOqRjx44VeEm0G8nIyFBYWJhefvnlQu8bAAAAwJ2H4g0AAACAO8LQoUPt1reLi4vGjRtnt/4BAAAA3Fnss14AAAAAAAAAAAAACoTiDQAAAAAAAAAAQAlC8QYAAAAAAAAAAKAEoXgDAAAAAAAAAABQglC8AQAAAAAAAAAAKEEo3gAAAAAAAAAAAJQgFG8AAAAAAAAAAABKEIo3AAAAAIpUVpahYweSdPCXBB07kKSsLMPuOc+ePSt/f3/FxcUVWp8ZGRkKDQ3Vzp07czxWpUoVRUdHF1q+nDRt2lSrV6+2aw4AAAAARa/YizfvvfeeQkND5ebmpiZNmmjHjh03bL9q1SpVr15dbm5uCgsL04YNG0zHP/vsM4WHh6tcuXKyWCzavXu3TR+tW7eWxWIxbc8++6ypzZEjR9SpUyeVKlVK/v7+GjlypK5cuXLL1wsAAADcyQ7/dkrLxkbri7d/07cR+/TF279p2dhoHf7tlF3zTp48WV26dFFoaGiOnweu3X744Yc89eni4qIRI0Zo1KhRNscWLFigihUrqlmzZqb4unXr1KpVK3l5ealUqVJq1KiRlixZYmoTFxd3w88yQ4cOte6PGzdOo0ePVlZWVp7GDAAAAOCfoViLN5988omGDRum8ePHa9euXbr33nvVvn17nTqV8we36Oho9erVSwMGDNBvv/2mrl27qmvXroqJibG2uXDhgu6//35Nnz79hrmfeeYZnThxwrrNmDHDeiwzM1OdOnVSRkaGoqOjtXTpUi1ZskSvv/564Vw4AAAAcAc6/NspbfxvjC6cu2SKXzh3SRv/G2O3Ak5aWpoiIiI0YMAASVe/8HXtZ4ETJ04oPj5etWvXVsOGDdWkSZM89927d29t3bpVe/futcYMw9DcuXOt+bK9++676tKli5o3b67t27drz5496tmzp5599lmNGDGiQNfWsWNHpaam6quvvirQ+QAAAABKpmIt3rz11lt65pln1L9/f9WsWVMLFixQqVKltGjRohzbz5kzRx06dNDIkSNVo0YNTZo0SfXr19fcuXOtbZ588km9/vrratu27Q1zlypVSoGBgdbN29vbeuybb77Rvn37tHz5ctWtW1cdO3bUpEmT9N577ykjI6NwLh4AAAC4g2RlGYr65NAN22xdecguS6ht2LBBrq6uatq0qSSpbNmyps8CgYGBmjRpks6cOaPPP/9cbm5ukq7OchkyZIheeeUV6zkTJkww9V2mTBk1b95ckZGR1tivv/6qw4cPq1OnTtbY0aNHNXz4cA0dOlRTpkxRzZo1VaVKFQ0fPlwzZ87UrFmztH379nxfm6Ojox588EFTfgAAAAD/fMVWvMnIyNCvv/5qKrI4ODiobdu22rZtW47nbNu2zaYo0759+1zb38iKFSvk6+ur2rVra8yYMUpLSzPlCQsLU0BAgClPSkqK6Rt117t06ZJSUlJMGwAAAADpxKFzNjNurnc+6ZJOHDpX6LmjoqLUoEGDXI/PmzdPy5Yt0+rVq3XXXXeZji1dulQeHh7avn27ZsyYoYkTJ+rbb781tWncuLGioqJM+apVqyYvLy9r7NNPP9Xly5dznGEzePBgeXp66uOPPy7Q9V2fHwAAAMA/n1NxJT5z5owyMzNNBRJJCggI0B9//JHjOQkJCTm2T0hIyFfuJ554QhUqVFBwcLD27NmjUaNG6cCBA/rss89umCf7WG6mTp2qN954I19jAQAAAO4EF1JuXLjJb7v8iI+PV3BwcI7HfvzxRw0dOlTz5s2zeT6NJNWpU0fjx4+XJFWtWlVz587V5s2b1a5dO2ub4OBgxcfH3zDfwYMH5ePjo6CgIJscLi4uqlSpkg4ePGiKN2vWTA4O5u/bpaenq27duqZYcHCwjh49qqysLJv2AAAAAP6Ziq14U5wGDRpk/f+wsDAFBQXpgQce0OHDh1W5cuUC9ztmzBgNGzbMup+SkqKQkJBbGisAAABwO/Dwdi3UdvmRnp5uXQrtWkeOHFH37t01aNAgDRw4MMdz69SpY9oPCgqyeUanu7u7aSZ/bvny65NPPlGNGjVMsd69e9u0c3d3V1ZWli5duiR3d/dbzgsAAACg+BXb17J8fX3l6OiokydPmuInT55UYGBgjucEBgbmq31eZT+Q9M8//7xhnuxjuXF1dZW3t7dpAwAAACAFVS0tj9I3Lsx4lnFVUNXShZ7b19dXSUlJplh6erq6deumWrVqafbs2bme6+zsbNq3WCzKysoyxRITE+Xn53fDfNWqVVNycrKOHz9ukyMjI0OHDx9WtWrVTPGQkBBVqVLFtOVUnElMTJSHhweFGwAAAOA2UmzFGxcXFzVo0ECbN2+2xrKysrR582bdd999OZ5z3333mdpL0rfffptr+7zavXu3JFmXMLjvvvv0+++/m75R9+2338rb21s1a9a8pVwAAADAncjBwaIWParesM39j1eVg4Ol0HPXq1dP+/btM8UGDhyoxMRErVq1Sk5Ot7YgQUxMjOrVq2fK98cff8gwDGvs0UcflbOzs2bNmmVz/oIFC3ThwgX16tWrUPIDAAAA+Ocr1mXThg0bpr59+6phw4Zq3LixZs+erQsXLqh///6SpKeeekrly5fX1KlTJUkvvfSSWrVqpVmzZqlTp06KjIzUzp07tXDhQmufiYmJOnLkiPUbbQcOHJB0dcZMYGCgDh8+rI8++kgPPvigypUrpz179ujll19Wy5YtrUsihIeHq2bNmnryySc1Y8YMJSQkaNy4cXrhhRfk6lr4yzgAAAAAd4LK9fzVYXBtRX1ySBfO/f9n23iWcdX9j1dV5Xr+dsnbvn17jRkzRklJSSpTpoxmzpypVatWae3atbpy5YrNcy19fHzyNYslKipKkyZNsu63adNG58+f1969e1W7dm1J0t13360ZM2Zo+PDhcnNz05NPPilnZ2d9+eWXGjt2rIYPH25dESC/oqKiFB4eXqBzAQAAAJRMxVq86dGjh06fPq3XX39dCQkJqlu3rjZu3KiAgABJV9egvvaBm82aNdNHH32kcePGaezYsapataq++OIL6wciSVqzZo21+CNJPXv2lCSNHz9eEyZMkIuLizZt2mQtFIWEhOjRRx/VuHHjrOc4Ojpq3bp1eu6553TffffJw8NDffv21cSJE+39kgAAAAC3tcr1/FXxXj+dOHROF1IuycP76lJp9phxky0sLEz169fXypUrNXjwYM2bN0+XL19Whw4dcmy/ePFi9evXL099b9u2TcnJyerevbs1Vq5cOXXr1k0rVqywfhFNkoYOHapKlSrpzTff1Jw5c5SZmalatWpp/vz5ps8w+XHs2DFFR0dr+fLlBTofAAAAQMlkMa6dy49ClZKSIh8fHyUnJ/P8GwAAAPyjXbx4UbGxsapYsaLc3NyKezj5tn79eo0cOVIxMTGmL4jdqh49eujee+/V2LFjTfE9e/aoXbt2Onz4sDw9PQst3/VGjRqlpKQk02oEt5t/+r0HAAAAXCuvdYNinXkDAAAAAEWhU6dOOnTokI4dO6aQkJBC6TMjI0NhYWF6+eWXbY7VqVNH06dPV2xsrMLCwgolX078/f01bNgwu/UPAAAAoHgw88aOmHkDAACA2wWzH1BcuPcAAABwO8lr3aDw1gsAAAAAAAAAAADALaN4AwAAAAAAAAAAUIJQvAEAAAAAAAAAAChBKN4AAAAAAAAAAACUIBRvAAAAAAAAAAAAShCKNwAAAAAAAAAAACUIxRsAAAAAAAAAAIAShOINAAAAgCKVlZWpo3v3aP9PP+jo3j3Kysq0e86zZ8/K399fcXFxhdZnRkaGQkNDtXPnzhyPValSRdHR0YWWLydNmzbV6tWr7ZoDAAAAQNGjeAMAAACgyBzaHq33XxiglRPHasM7M7Vy4li9/8IAHdpu3yLH5MmT1aVLF4WGhqp169ayWCy5bj/88EOe+nRxcdGIESM0atQom2MLFixQxYoV1axZM1N83bp1atWqlby8vFSqVCk1atRIS5YsMbWJi4uTxWLR7t27bfpt3bq1hg4dat0fN26cRo8eraysrBuO9f3331eLFi1UpkwZlSlTRm3bttWOHTvydJ0AAAAAih7FGwAAAABF4tD2aK15a4rOJ54xxc8nntGat6bYrYCTlpamiIgIDRgwQJL02Wef6cSJE6YtPj5etWvXVsOGDdWkSZM89927d29t3bpVe/futcYMw9DcuXOt+bK9++676tKli5o3b67t27drz5496tmzp5599lmNGDGiQNfWsWNHpaam6quvvrphuy1btqhXr176/vvvtW3bNoWEhCg8PFzHjh0rUF4AAAAA9uVU3AMAAAAAcPvLysrUd0sW3rDN90sXqnKjJnJwcCzU3Bs2bJCrq6uaNm0qSSpbtqxNm2eeeUZnzpzRL7/8Ijc3N0lXZ7nUqVNHbm5u+uCDD+Ti4qJnn31WEyZMsJ5XpkwZNW/eXJGRkZo0aZIk6ddff9Xhw4fVqVMna7ujR49q+PDhGjp0qKZMmWKNDx8+XC4uLhoyZIgee+yxfBWOJMnR0VEPPvigIiMjTfmut2LFCtP+Bx98oNWrV2vz5s166qmn8pUTAAAAgP0x8wYAAACA3R3bv9dmxs31Us+e0bH9e2/YpiCioqLUoEGDXI/PmzdPy5Yt0+rVq3XXXXeZji1dulQeHh7avn27ZsyYoYkTJ+rbb781tWncuLGioqJM+apVqyYvLy9r7NNPP9Xly5dznGEzePBgeXp66uOPPy7Q9V2fPy/S0tJ0+fLlHAtZAAAAAIofM28AAAAA2N35c0mF2i4/4uPjFRwcnOOxH3/8UUOHDtW8efNsnk8jSXXq1NH48eMlSVWrVtXcuXO1efNmtWvXztomODhY8fHxN8x38OBB+fj4KCgoyCaHi4uLKlWqpIMHD5rizZo1k4OD+ft26enpqlu3rikWHByso0ePKisry6Z9bkaNGqXg4GC1bds2T+0BAAAAFC2KNwAAAADszrN0mUJtlx/p6enWpdCudeTIEXXv3l2DBg3SwIEDczy3Tp06pv2goCCdOnXKFHN3d1daWtpN8+XXJ598oho1aphivXv3tmnn7u6urKwsXbp0SadPn1bNmjWtx8aOHauxY8ea2k+bNk2RkZHasmVLoYwTAAAAQOGjeAMAAADA7srXqCXPsr43XDrNq5yvyteoVei5fX19lZRkntGTnp6ubt26qVatWpo9e3au5zo7O5v2LRaLsrKyTLHExET5+fmZ8v3++++mNtWqVVNycrKOHz9uMysnIyNDhw8fVps2bUzxkJAQValSxRRzd3e3GWNiYqI8PDzk7u6u4OBg7d6923rs+mXR3nzzTU2bNk2bNm2yKUwBAAAAKDl45g0AAAAAu3NwcNS/+g26YZs2fQfJwcGx0HPXq1dP+/btM8UGDhyoxMRErVq1Sk5Ot/adtpiYGNWrV8+U748//pBhGNbYo48+KmdnZ82aNcvm/AULFujChQvq1avXLed3cnJSlSpVrNu1xZsZM2Zo0qRJ2rhxoxo2bFigXAAAAACKBsUbAAAAAEWiapNmenjYWHmW9TXFvcr56uFhY1W1ie0zZwpD+/bttXfvXuvsm5kzZ2rVqlVasGCBrly5ooSEBNOWnp6er/6joqIUHh5u3W/Tpo3Onz+vvXv3WmN33323ZsyYodmzZ+vVV1/VH3/8ocOHD+utt97SK6+8ouHDh6tJkyYFur7r8+dk+vTpeu2117Ro0SKFhoZar/X8+fMFygkAAADAvlg2DQAAAECRqdqkmSo3aqJj+/fq/LkkeZYuo/I1atllxk22sLAw1a9fXytXrtTgwYM1b948Xb58WR06dMix/eLFi9WvX7889b1t2zYlJyere/fu1li5cuXUrVs3rVixQlOnTrXGhw4dqkqVKunNN9/UnDlzlJmZqVq1amn+/Pnq379/ga7t2LFjio6O1vLly2/Ybv78+crIyDCNU5LGjx+vCRMmFCg3AAAAAPuxGNfO5UehSklJkY+Pj5KTk+Xt7V3cwwEAAAAK7OLFi4qNjVXFihX/kQ+5X79+vUaOHKmYmBg5OBTeAgQ9evTQvffeq7Fjx5rie/bsUbt27XT48GF5enoWWr7rjRo1SklJSVq4cKHdchS3f/q9BwAAAFwrr3UDZt4AAAAAuO116tRJhw4d0rFjxxQSElIofWZkZCgsLEwvv/yyzbE6depo+vTpio2NVVhYWKHky4m/v7+GDRtmt/4BAAAAFA9m3tgRM28AAABwu2D2A4oL9x4AAABuJ3mtGxTeegEAAAAAAAAAAAC4ZRRvAAAAAAAAAAAAShCKNwAAAAAAAAAAACUIxRsAAAAAAAAAAIAShOINAAAAAAAAAABACULxBgAAAAAAAAAAoASheAMAAAAAAAAAAFCCULwBAAAAUKSMLEMXD59T2u5Tunj4nIwsw+45z549K39/f8XFxRVanxkZGQoNDdXOnTtzPFalShVFR0cXWr6cNG3aVKtXr7ZrDgAAAABFj+INAAAAgCKTHnNGCdN36Mz7vysx8oDOvP+7EqbvUHrMGbvmnTx5srp06aLQ0FC1bt1aFosl1+2HH37IU58uLi4aMWKERo0aZXNswYIFqlixopo1a2aKr1u3Tq1atZKXl5dKlSqlRo0aacmSJaY2cXFxslgs2r17t02/rVu31tChQ63748aN0+jRo5WVlXXDsX722Wdq2LChSpcuLQ8PD9WtW1cffvhhnq4TAAAAQNGjeAMAAACgSKTHnNHZ5fuVmZxhimcmZ+js8v12K+CkpaUpIiJCAwYMkHS1kHHixAnTFh8fr9q1a6thw4Zq0qRJnvvu3bu3tm7dqr1791pjhmFo7ty51nzZ3n33XXXp0kXNmzfX9u3btWfPHvXs2VPPPvusRowYUaBr69ixo1JTU/XVV1/dsF3ZsmX16quvatu2bdqzZ4/69++v/v376+uvvy5QXgAAAAD25VTcAwAAAABw+zOyDJ1be/iGbc6t/UtuNcvJ4mAp1NwbNmyQq6urmjZtKulqIeN6zzzzjM6cOaNffvlFbm5ukq7OcqlTp47c3Nz0wQcfyMXFRc8++6wmTJhgPa9MmTJq3ry5IiMjNWnSJEnSr7/+qsOHD6tTp07WdkePHtXw4cM1dOhQTZkyxRofPny4XFxcNGTIED322GP5KhxJkqOjox588EFFRkaa8l2vdevWpv2XXnpJS5cu1datW9W+fft85QQAAABgf8y8AQAAAGB3l2KTbWbcXC8z+ZIuxSYXeu6oqCg1aNAg1+Pz5s3TsmXLtHr1at11112mY0uXLpWHh4e2b9+uGTNmaOLEifr2229NbRo3bqyoqChTvmrVqsnLy8sa+/TTT3X58uUcZ9gMHjxYnp6e+vjjjwt0fdfnvxnDMLR582YdOHBALVu2LFBOAAAAAPbFzBsAAAAAdpeVeuPCTX7b5Ud8fLyCg4NzPPbjjz9q6NChmjdvns3zaSSpTp06Gj9+vCSpatWqmjt3rjZv3qx27dpZ2wQHBys+Pv6G+Q4ePCgfHx8FBQXZ5HBxcVGlSpV08OBBU7xZs2ZycDB/3y49PV1169Y1xYKDg3X06FFlZWXZtL9WcnKyypcvr0uXLsnR0VHz5s0zXQcAAACAkoPiDQAAAAC7c/ByKdR2+ZGenm5dCu1aR44cUffu3TVo0CANHDgwx3Pr1Klj2g8KCtKpU6dMMXd3d6Wlpd00X3598sknqlGjhinWu3dvm3bu7u7KysrSpUuXdPr0adWsWdN6bOzYsRo7dqwkycvLS7t379b58+e1efNmDRs2TJUqVbJZUg0AAABA8aN4AwAAAMDuXCv6yNHH5YZLpzn6uMq1ok+h5/b19VVSUpIplp6erm7duqlWrVqaPXt2ruc6Ozub9i0Wi7KyskyxxMRE+fn5mfL9/vvvpjbVqlVTcnKyjh8/bjMrJyMjQ4cPH1abNm1M8ZCQEFWpUsUUc3d3txljYmKiPDw85O7uruDgYO3evdt67Nrn+zg4OFj7q1u3rvbv36+pU6dSvAEAAABKIJ55AwAAAMDuLA4Wle5c+YZtSneuJIuDpdBz16tXT/v27TPFBg4cqMTERK1atUpOTrf2nbaYmBjVq1fPlO+PP/6QYRjW2KOPPipnZ2fNmjXL5vwFCxbowoUL6tWr1y3nd3JyUpUqVazbtcWb62XP1gEAAABQ8jDzBgAAAECRcK/tq3J9aujc2sOmGTiOPq4q3bmS3Gv72iVv+/btNWbMGCUlJalMmTKaOXOmVq1apbVr1+rKlStKSEgwtffx8clxhktuoqKiNGnSJOt+mzZtdP78ee3du1e1a9eWJN19992aMWOGhg8fLjc3Nz355JNydnbWl19+qbFjx2r48OFq0qRJga4vKipK4eHhN2wzdepUNWzYUJUrV9alS5e0YcMGffjhh5o/f36BcgIAAACwL4o3AAAAAIqMe21fudUsp0uxycpKzZCDl4tcK/rYZcZNtrCwMNWvX18rV67U4MGDNW/ePF2+fFkdOnTIsf3ixYvVr1+/PPW9bds2JScnq3v37tZYuXLl1K1bN61YsUJTp061xocOHapKlSrpzTff1Jw5c5SZmalatWpp/vz56t+/f4Gu7dixY4qOjtby5ctv2O7ChQt6/vnn9ffff8vd3V3Vq1fX8uXL1aNHjwLlBQAAAGBfFuPaufwoVCkpKfLx8VFycrK8vb2LezgAAABAgV28eFGxsbGqWLGi3Nzcins4+bZ+/XqNHDlSMTExcnAovNWje/TooXvvvVdjx441xffs2aN27drp8OHD8vT0LLR81xs1apSSkpK0cOFCu+Uobv/0ew8AAAC4Vl7rBsy8AQAAAHDb69Spkw4dOqRjx44pJCSkUPrMyMhQWFiYXn75ZZtjderU0fTp0xUbG6uwsLBCyZcTf39/DRs2zG79AwAAACgezLyxI2beAAAA4HbB7AcUF+49AAAA3E7yWjcovPUCAAAAAAAAAAAAcMso3gAAAAAAAAAAAJQgFG8AAAAAAAAAAABKEIo3AAAAAAAAAAAAJQjFGwAAAAAAAAAAgBKE4g0AAAAAAAAAAEAJQvEGAAAAAAAAAACgBKF4AwAAAKBIZWVlKTY2Vr///rtiY2OVlZVl95xnz56Vv7+/4uLiCq3PjIwMhYaGaufOnTkeq1KliqKjowstX06aNm2q1atX2zUHAAAAgKJH8QYAAABAkdm3b59mz56tpUuXavXq1Vq6dKlmz56tffv22TXv5MmT1aVLF4WGhqp169ayWCy5bj/88EOe+nRxcdGIESM0atQom2MLFixQxYoV1axZM1N83bp1atWqlby8vFSqVCk1atRIS5YsMbWJi4uTxWLR7t27bfpt3bq1hg4dat0fN26cRo8ena8CWGRkpCwWi7p27ZrncwAAAAAULYo3AAAAAIrEvn37tHLlSqWkpJjiKSkpWrlypd0KOGlpaYqIiNCAAQMkSZ999plOnDhh2uLj41W7dm01bNhQTZo0yXPfvXv31tatW7V3715rzDAMzZ0715ov27vvvqsuXbqoefPm2r59u/bs2aOePXvq2Wef1YgRIwp0bR07dlRqaqq++uqrPLWPi4vTiBEj1KJFiwLlAwAAAFA0KN4AAAAAsLusrCxt3Ljxhm02btxolyXUNmzYIFdXVzVt2lSSVLZsWQUGBpq2SZMm6cyZM/r888/l5uYm6eoslyFDhuiVV16xnjNhwgRT32XKlFHz5s0VGRlpjf366686fPiwOnXqZI0dPXpUw4cP19ChQzVlyhTVrFlTVapU0fDhwzVz5kzNmjVL27dvz/e1OTo66sEHHzTlz01mZqZ69+6tN954Q5UqVcp3LgAAAABFh+INAAAAALuLj4+3mXFzvZSUFMXHxxd67qioKDVo0CDX4/PmzdOyZcu0evVq3XXXXaZjS5culYeHh7Zv364ZM2Zo4sSJ+vbbb01tGjdurKioKFO+atWqycvLyxr79NNPdfny5Rxn2AwePFienp76+OOPC3R91+fPzcSJE+Xv728zIwgAAABAyeNU3AMAAAAAcPs7f/58obbLj/j4eAUHB+d47Mcff9TQoUM1b948m+fTSFKdOnU0fvx4SVLVqlU1d+5cbd68We3atbO2CQ4ONhWdcsp38OBB+fj4KCgoyCaHi4uLKlWqpIMHD5rizZo1k4OD+ft26enpqlu3rikWHByso0ePKisry6Z9tq1btyoiIiLH5+gAAAAAKHko3gAAAACwO09Pz0Jtlx/p6enWpdCudeTIEXXv3l2DBg3SwIEDczy3Tp06pv2goCCdOnXKFHN3d1daWtpN8+XXJ598oho1aphivXv3tmnn7u6urKwsXbp0SadP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Xtu2bVNISIjCw8N17Ngxa5sjR45o3bp16tevnzVmGIZ69uypiRMn6qWXXtL+/fu1ZcsWhYSEqHXr1taCTH71799fK1asUGJi4g3bHT58WPfff7+qV6+uLVu2aM+ePXrttdfk5uZWoLwAAAAACq5YizeffPKJhg0bpvHjx2vXrl2699571b59e506dSrH9tHR0erVq5cGDBig3377TV27dlXXrl0VExNjbXPhwgXdf//9mj59eo59HD9+XMePH9ebb76pmJgYLVmyRBs3brR+kLvW4sWLTR/ounbtWijXDQAAANxpMg1D4w4dU04LpGXHXjt0zC5LqG3YsEGurq5q2rSpJKls2bIKDAw0bZMmTdKZM2f0+eefW4sVrVu31pAhQ/TKK69Yz5kwYYKp7zJlyqh58+amL3qtWLFCzz//vOrWravq1avrgw8+UFZWljZv3mxts3LlSt17770qX768Kfbpp59q2bJlGjhwoCpWrKh7771XCxcu1MMPP6yBAwfqwoUL+b7+WrVqKTg4WJ9//vkN27366qt68MEHNWPGDNWrV0+VK1fWww8/LH9//3znBAAAAHBrirV489Zbb+mZZ55R//79VbNmTS1YsEClSpXSokWLcmw/Z84cdejQQSNHjlSNGjU0adIk1a9fX3PnzrW2efLJJ/X666+rbdu2OfZRu3ZtrV69Wp07d1blypX1r3/9S5MnT9batWt15coVU9vSpUubPtDd7Btnly5dUkpKimkDAAAAIP187rzNjJtrGZKOX7qsn8+dL/TcUVFRatCgQa7H582bp2XLlmn16tW66667TMeWLl0qDw8Pbd++XTNmzNDEiRP17bffmto0btxYUVFRufaflpamy5cvq2zZsqYxNWzY0NTuo48+UrVq1dS5c2ebPoYPH66zZ8/a5M6rm40xKytL69evV7Vq1dS+fXv5+/urSZMmBZ7tAwAAAODWFFvxJiMjQ7/++qupyOLg4KC2bdtq27ZtOZ6zbds2m6JM+/btc22fV8nJyfL29paTk5Mp/sILL8jX11eNGzfWokWLZNzkW4BTp06Vj4+PdQsJCbmlcQEAAAC3i1MZV27eKB/t8iM+Pl7BwcE5Hvvxxx81dOhQvffee2rWrJnN8Tp16mj8+PGqWrWqnnrqKTVs2NA0g0aSgoODFR8fn2v+UaNGKTg42PRZJqcxHTx4UDVq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+fv7Ky4uzu65CqJp06ZavXp1jsdatmypjz76KN99jh49Wi+++OKtDg0AAABAMaB4AwAAAKDIbIw5ofunf6de7/+slyJ3q9f7P+v+6d9pY8wJu+adPHmyunTpotDQUMXFxcliseS4/fzzz5KkJUuWWGOOjo4qU6aMmjRpookTJyo5Odnab279ZG8TJkywtq1evbpcXV2VkJBgM75x48Zp9OjRysrKMsXXrFmjkydPqmfPntZYaGioZs+ebdPHhAkTVLduXev+iBEjtHTpUv31118FfNUAAAAAFBeKNwAAAACKxMaYE3pu+S6dSL5oiickX9Rzy3fZrYCTlpamiIgIDRgwwBTftGmTTpw4YdoaNGhgPe7t7a0TJ07o77//VnR0tAYNGqRly5apbt26On78uCSZzp09e7b1nOxtxIgRkqStW7cqPT1d3bt319KlS23G2LFjR6Wmpuqrr74yxd955x31799fDg75/+jm6+ur9u3ba/78+fk+FwAAAEDxongDAAAAwO4yswy9sXafclogLTv2xtp9dllCbcOGDXJ1dVXTpk1N8XLlyikwMNC0OTs7W49bLBYFBgYqKChINWrU0IABAxQdHa3z58/rlVdekSTTuT4+PtZzsjdPT09JUkREhJ544gk9+eSTWrRokc0YHR0d9eCDDyoyMtIaO336tL777jt17ty5wNfeuXNnU58AAAAA/hko3gAAAACwux2xiTYzbq5lSDqRfFE7YhMLPXdUVJRpRs2t8Pf3V+/evbVmzRplZmbm6ZzU1FStWrVKffr0Ubt27ZScnKyoqCibdo0bNzbFt27dqlKlSqlGjRoFHm/jxo31999/l9hn/QAAAADIGcUbAAAAAHZ3KjX3wk1B2uVHfHy8goODbeLNmjWTp6enacuL6tWrKzU1VWfPns1T+8jISFWtWlW1atWSo6OjevbsqYiICJt2wcHBOnr0qPW5N/Hx8QoICMhxybRRo0bZjH3KlCk59pndFwAAAIB/DqfiHgAAAACA25+/l1uhtsuP9PR0ubnZ9vvJJ58UaFaLYVxd2s1iseSp/aJFi9SnTx/rfp8+fdSqVSu9++678vLyssbd3d2VlZWlS5cuyd3dPddxS9LIkSPVr18/U+ydd97Rjz/+aIq5u7tLuvrcHwAAAAD/HBRvAAAAANhd44plFeTjpoTkizk+98YiKdDHTY0r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PXscj9TUVJet03JychQXF+dUt9lsrjTAcUdOTo4aNWqkrl27Vtpnz549atGiBcENAAAAUIe4Fd64Izc3V/fee6/b/Rs3bqyEhARt2bLF0Waz2bRlyxb169evwjH9+vVz6i9JH3zwQaX9K5KQkKBGjRo5neebb77RkSNHHOfp16+fvvrqK+Xn5zvNExYWpi5durg9F84zBhg1LXGaJLkEOOXPpyZOlTHAWOu1AQAAoPa0j4vS4N93U5PmziFB0xZBGvz7bmofF1Uj86akpGjv3r0uIciJEydkNpudHufOnXMct9vtMpvNOnbsmPbv368VK1aof//+Cg8P17x58y47788//6x//vOfGjlypLp16+b0GDt2rHbs2OF0T83MzEwlJyc7nsfFxSkiIkKffvpplV97ZmambrjhBsdqnnfffVf/+Mc/lJOTo2+//VbLli3TnDlzNG7cuCrPAQAAAMD73No2raakpqbq/vvvV69evZSYmKjFixfr7NmzGj16tCTpvvvu0xVXXKG5c+dKksaPH6+bbrpJCxcu1JAhQ5Senq7du3frlVdecZzz5MmTOnLkiH788UdJ54MZ6fyKmejoaIWHh2vMmDFKTU1Vy5YtFRYWpnHjxqlfv37q27evJCk5OVldunTRvffeqwULFshsNuvJJ5/UY489xq/RqiipXZIW3bxI83bOU17RL6uaTKEmTU2cqqR2ST6sDgAAALWlfVyUYq+N1LEDp3XWUqImYee3SquJFTflunfvrvj4eK1du1a///3vHe1JSa6fQcvv4ymd3wa5devWMhgMCgsL0zXXXKP7779f48ePd2uV/TvvvKMTJ07ojjvucDnWuXNnde7cWWlpaVq0aJGOHj2qbdu26bXXXnP0MRqNGj16tF5//XX9+te/rspLV3p6umbNmuV43qhRIy1dulQTJ06U3W5Xhw4dtGjRosvesxQAAABA7TLYy++2WU1ffPGF4uPjZbVaPRr30ksv6bnnnpPZbFbPnj21ZMkS9enTR5J08803KyYmRqtWrXL0X7dunZ588kkdPnxYHTt21IIFC3Tbbbc5jq9atcoR/lzo6aefdly0nDt3TpMmTdK//vUvlZSUKCUlRS+//LLTlmi5ubl69NFHtXXrVjVp0kT333+/5s2bp8BA9/Mui8Wi8PBwFRYWsoXa/1htVmXnZ6ugqECRoZGKj4pnxQ0AAIAfOHfunA4dOqTY2FgFBwf7uhyPvffee5oyZYpycnLc2u6stk2dOlWnTp1y+mGaJJnNZnXt2lXZ2dlq166dR+d8//33NWnSJH355ZceXcfUNf7+twcAAABcyN3cwOfhTX1GeAMAAID6oj58gb548WLdeeedatu2ra9LcbFw4UKNGjVKJpPJ5dj69evVqlUr3XDDDR6d880331Tbtm0dP47zV/Xhbw8AAAAo525u4PbPr5YsWXLJ40ePHnW/OgAAAACoZRMmTPB1CZWaNGlSpceGDRtWpXMOHz68itUAAAAA8DW3w5vnn3/+sn1+9atfVasYAAAAAAAAAACAhs7t8ObQoUM1WQcAAAAAAAAAAAAkuX2nzvvuu09vvfWWzp49W5P1AAAAAAAAAAAANGhuhzcdOnTQnDlzFBERoVtvvVXLli3jPjcAAAAAAAAAAABe5nZ4M3PmTGVlZenAgQMaOnSo1q9fr/bt2yshIUGzZ8/Wnj17arBMAAAAAAAAAACAhsHt8KbclVdeqT/84Q/atGmTCgoKNHXqVH3zzTe65ZZb1K5dO/3xj3/U3r17a6JWAAAAAAAAAACAes/j8OZCzZo101133aXXX39dBQUFWrFihYxGo7Zv3+6t+gAAAAAAAAAAABqUaoU3FzIajRo4cKBeeOEFjR071lunBQAAAFDP2GxWfb/3S+3/9L/6fu+XstmsNT7niRMnFBUVpcOHD9f4XFXRt29fvfXWWxUeu/HGG/XGG294fM5p06Zp3Lhx1S0NAAAAgA+4Fd7ExcUpPj7erQcAAAAAVObAjm36+2NjtHb2DG1Y8pzWzp6hvz82Rgd2bKvReZ999lndfvvtiomJ0eHDh2UwGCp8fPbZZ5KkVatWOdqMRqNatGihPn36aPbs2SosLHSct7LzlD9mzZrl6NupUycFBQXJbDa71Pfkk09q2rRpstlsTu3vvPOO8vLyNGLECEdbTEyMFi9e7HKOWbNmqWfPno7nkydP1urVq/Xdd9+59F21apV69Oih4OBgRUVF6bHHHnP3rQQAAABQCwLd6TRs2LAaLgMAAABAfXdgxza9s2iOS/tPJ4/rnUVz9JvUGerYp7/X5y0qKlJaWpo2bdrk1J6RkaGuXbs6tbVq1crxz2FhYfrmm29kt9t1+vRpbdu2TXPnztXKlSv16aefqk2bNjp27Jij/5o1azRz5kx98803jramTZtKkj755BMVFxdr+PDhWr16taZOneo076233qqxY8fq/fff15AhQxztS5Ys0ejRoxUQ4PmmCREREUpJSdGyZcv03HPPOdoXLVqkhQsX6rnnnlOfPn109uzZOrsiCQAAAGio3Apvnn766ZquAwAAAEA9ZrNZ9eGqVy7Z56PVr6h97z4KCDB6de4NGzYoKChIffv2dWpv1aqVoqOjKx1nMBgcx1u3bq3OnTtr6NCh6tq1q5544gm99tprTuPDw8OdxlwoLS1Nv/vd73TTTTdp/PjxLuGN0WjUbbfdpvT0dEd4U1BQoA8//FAvvPBClV/70KFD9ac//ckR3pw6dUpPPvmk3n33XQ0cONDRr0ePHlWeAwAAAID3VfmeN1lZWXrttdf02muv6fPPP/dmTQAAAADqmaP79+qnk8cv2efMieM6un+v1+fOzMxUQkKCV84VFRWle+65R++8846sVvfu1XPmzBmtW7dOo0aN0qBBg1RYWKjMzEyXfomJiU7tn3zyiUJDQ9W5c+cq15uYmKgffvjBsbLmgw8+kM1m09GjR9W5c2ddeeWVuuuuu/T9999XeQ4AAAAA3udxeJOfn69bbrlFvXv31uOPP67HH39cCQkJGjhwoAoKCmqiRgAAAAB+7qfTp7zazxO5ublq06aNS3v//v3VtGlTp4c7OnXqpDNnzujEiRNu9U9PT1fHjh3VtWtXGY1GjRgxQmlpaS792rRpo++//95x35vc3FyZTKYKt0ybOnWqS+1z5rhuSVf+unNzcyVJ3333nWw2m+bMmaPFixfrzTff1MmTJzVo0CCVlpa69XoAAAAA1DyPw5tx48bpzJkz2rt3r06ePKmTJ08qJydHFotFjz/+eE3UCAAAAMDPNW3ewqv9PFFcXKzg4GCX9jVr1mjPnj1OD3fY7XZJ57dVc8eKFSs0atQox/NRo0Zp3bp1OnPmjFO/kJAQ2Ww2lZSUXLJuSZoyZYpL7Y888ohLv5CQEEnn7/sjSTabTT///LOWLFmilJQU9e3bV//617904MABffTRR269HgAAAAA1z6173lxo48aNysjIcFq636VLFy1dulTJycleLQ4AAABA/XBF565q2jLiklunNWsVoSs6d/X63BERETp1ynVFT9u2bdWhQwePz7d//36FhYWpVatWl+27b98+ffbZZ9q5c6fT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2Y6t23JycnTllVcqIiKi2nUCAAAA8B63rlIGDhyo3bt365NPPtGaNWv0+uuvKzc3V8XFxYqIiFBcXJzuu+8+3XPPPWrRokVN1wwAAADAD4V0i1CrUZ11+t2Dshb+sqrfGB6k5kOvUki3mgkQUlJSNH36dJ06dUotWrTQc889p3Xr1undd99VWVmZzGazU//w8HDHdmLuyMzM1DPPPON4PmDAAP3000/au3evunXr5tT39OnTLvM1a9ZMTZo0cTzPz8/XuXPndObMGWVlZWnBggU6fvy43n77bbfqSUtL0/Dhw13mbtu2raZPn66NGzdqyJAhjtqTk5Pdfq0AAAAAaodHPzG7/vrrdf3119dULQAAAADquZBuEQru0kolhwplO1OqgGaNFRQbXiMrbsp1795d8fHxWrt2rX7/+9/r5Zdf1s8//6zBgwdX2H/lypV64IEH3Dr39u3bVVhYqOHDhzvaWrVqpTvuuEOvv/665s6d69R/9OjRLueYO3eupk2b5nh+zTXXyGAwqGnTprrqqquUnJys1NRURUdHX7aerKwsffHFF/r73//uciw8PFwDBw5UWlqahgwZonPnzmn9+vXauHGjW68VAAAAQO0x2MvvfAmvs1gsCg8PV2FhocLCwnxdDgAAAFBl586d06FDhxQbG6vg4GBfl+Ox9957T1OmTFFOTo4CAty69adb7r77bl177bWaMWOGU/uXX36pQYMG6eDBg2ratKnX5vOmZcuW6d///rc2b97s61Iuyd//9gAAAIALuZsbeO+qBQAAAADqqCFDhujhhx/W0aNHvXbO0tJSde/eXRMnTnQ51qNHD82fP1+HDh3y2nze1qhRI7344ou+LgMAAABABVh5U4NYeQMAAID6gtUP8BX+9gAAAFCfsPIGAAAAAAAAAADADxHeAAAAAAAAAAAA1CGBVRlks9n07bffKj8/XzabzenYjTfe6JXCAAAAAAAAAAAAGiKPw5vPPvtMv/vd75Sbm6uLb5djMBhktVq9VhwAAAAAAAAAAEBD43F488gjj6hXr15677331Lp1axkMhpqoCwAAAAAAAAAAoEHyOLw5cOCA3nzzTXXo0KEm6gEAAAAAAAAAAGjQAjwd0KdPH3377bc1UQsAAAAAAAAAAECD53F4M27cOE2aNEmrVq1SVlaWvvzyS6cHAAAAAFyKzWbToUOH9NVXX+nQoUOy2Ww1PueJEycUFRWlw4cPe+2cpaWliomJ0e7duys81qFDB23bts1r83nbiBEjtHDhwgqP3XvvvZozZ47H51y+fLmGDh1a3dIAAACABs/j8ObOO+/U/v379eCDD6p3797q2bOn4uLiHP8LAAAAAJXZt2+fFi9erNWrV+utt97S6tWrtXjxYu3bt69G53322Wd1++23KyYmRjfffLMMBkOlj//+979unbNx48aaPHmypk6d6nJs+fLlio2NVf/+/R1tlc2Xnp4uSdq6daujLSAgQOHh4YqLi9MTTzyhY8eOOc4TExNzyfofeOABR9+UlBQZjUbt2rXLpcYnn3xSzz77rAoLC53av/jiC23YsEGPP/64o+3mm2/WhAkTXM6xatUqNW/e3PH8wQcfVHZ2tjIzMy/7/gEAAAConMf3vDl06FBN1AEAAACgntu3b5/Wrl3r0m6xWLR27Vrddddd6tKli9fnLSoqUlpamjZt2iRJevvtt1VaWurUp7S0VEOGDFFwcLD69Onj9rnvueceTZo0SXv37lXXrl0lSXa7XS+99JJmz57t0n/lypUaPHiwU9uF4YckffPNNwoLC5PFYlF2drYWLFigtLQ0bd26Vd27d9euXbtktVolSdu2bdOdd97pGCNJISEhkqQjR45o27Zt+uMf/6gVK1aod+/eTvN069ZN7du312uvvabHHnvM0f7iiy/qt7/9rZo2ber2+1CucePG+t3vfqclS5bohhtu8Hg8AAAAgPM8Dm/atWtXE3UAAAAAqMdsNps2btx4yT4bN25Up06dFBDg8QYBl7RhwwYFBQWpb9++kqSWLVu69HnooYd0/Phx7dq1S8HBwZLOrzbp0aOHgoOD9Y9//EONGzfWI488olmzZjnGtWjRQtddd53S09P1zDPPSJKysrJ08OBBDRkyxGWe5s2bKzo6+pL1RkVFOfpdffXVuv322xUXF6dHH31Un3zyiSIjIx19y19L+ZgLrVy5Ur/+9a/16KOPqm/fvlq0aJEj2Ck3dOhQpaenO8Ibq9WqN998U6+//vola7yUoUOHatCgQSouLnaZDwAAAIB7qnRVdPDgQY0bN05JSUlKSkrS448/roMHD3q7NgAAAAD1RG5uriwWyyX7WCwW5ebmen3uzMxMJSQkVHr85Zdf1quvvqq33npLV155pdOx1atXq0mTJtqx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H/+oFStWqHfv3k7zdOvWTe3bt9drr72mxx57zNH+4osv6re//a2aNm3qaPvss8+UlJSkpKQkvffeezKZTNq5c6cmTZqkLVu26KOPPlLjxo3dft8kKSIiQikpKVq2bJmee+45j8YCAAAA9Z3HK28mTpyooUOH6tSpUwoJCdFnn32m3NxcJSQk6K9//WtN1AgAAADAz9ntVv3fgdm6OLj531FJ0v8deKZGtlDbsGGDgoKC1LdvX0lSy5YtFR0d7fR45plndPz4cf373/9WcHCwJOnmm2/W448/rieeeMIxZtasWU7nbtGiha677jrH6hlJysrK0sGDBzVkyBCXWpo3b+4yd/l85aKiohQdHa2rr75aI0aM0KeffqrIyEg9+uijkqTIyEjH2JYtWzqNiY6OVnh4uKTzQdGvf/1rPfroo/rXv/6l4uJil3qGDh3qVLvVatWbb76poUOHOtrsdrvGjBmjzp076+2331ZiYqLatWun3/72t3r33Xe1fft2Pf/8827/+7jU/AAAAADO8zi82bNnjyZNmqSAgAAZjUaVlJSobdu2WrBggWbMmFETNQIAAADwc6dP71JJifkSPewqKTmm06ddt/eqrszMTCUkJFR6/OWXX9arr76qt956S1deeaXTsdWrV6tJkybasWOHFixYoNmzZ+uDDz5w6pOYmKjMzEyn+a6++mo1a9bMK/WHhITokUce0aeffqr8/Hy3xtjtdq1cuVKjRo1Sp06d1KFDB7355psu/RITE7Vz506VlJRIkr788ksVFhaqV69ejj579uzRvn37lJqaqoAA50vIa6+9VklJSfrXv/5VpdeWmJioH374wav3IgIAAADqA4/Dm0aNGjk+sEdFRenIkSOSpPDwcH3//fferQ74H6vNql3mXdrw3QbtMu+S1VbzN7UFAACA95SUuBc6uNvPE7m5uWrTpk2Fxz7++GNNmDBBS5cudbo/TbkePXro6aefVseOHXXfffepV69e2rJli1OfNm3aKDc31635Ro4cqaZNmzo9yq+pLqVTp06S5HbIkZGRoaKiIqWknN+GbtSoUUpLS3Pp16ZNG5WWlspsNjtqNxqNioqKcvT5v//7P0lS586dK5yrc+fOjj7lpk6d6vI658yZU+H85fMCAAAA+IXH97yJi4vTrl271LFjR910002aOXOmjh8/rn/+85/q1q1bTdSIBi4jN0Pzds5TXlGeo80UatK0xGlKapfkw8oAAADgrqCgqMt38qCfJ4qLi122JpPO3xNm+PDhevjhhzV27NgKx/bo0cPpeevWrV1Wv4SEhKioqOiy80nS888/r6Qk58+wlQU9F7Lbz28tZzAYLttXklasWKG7775bgYHnL/lGjhypKVOm6ODBg2rfvr1T7ZIc9RcXFysoKKjCecprcMeUKVP0wAMPOLUtWbJEH3/8sVPbxfMDAAAAOM/jlTdz5sxR69atJUnPPvusWrRooUcffVQFBQV65ZVXvF4gGraM3Aylbk11Cm4kKb8oX6lbU5WRm+GjygAAAOCJ5s17KygoWlJl4YNBQUGt1bx5b6/PHRERoVOnTjm1FRcX64477lDXrl21ePHiSsc2atTIuUqDQTabzant5MmTioyMvOR85aKjo9WhQwenR3nAcin79++XJMXExFy278mTJ/Xvf/9bL7/8sgIDAxUYGKgrrrhCZWVlWrFihUtfSY76IyIiVFRUpNLSUkefq6++2qmGimor71MuIiLC5XWW35/nUvMDAAAAOM+j8MZutysqKkr9+vWTdH7btI0bN8pisSgrK0vXXnttjRSJhslqs2reznmyV3BT2/K2+Tvns4UaAACAHzAYjLq648zyZxcflSRd3fEpGQxGr88dFxenffv2ObWNHTtWJ0+e1Lp169wKTy4lJydHcXFxTvN9/fXXHq1UuZTi4mK98soruvHGG90KOV5//XVdeeWV+uKLL7Rnzx7HY+HChVq1apWs1l8+P+fk5OjKK69URESEJKlnz56S5PR+9ezZU506ddLzzz/vElx98cUXysjI0MiRI6v02nJyctSoUSN17dq1SuMBAACA+srj8KZDhw7c2wa1Ijs/22XFzYXssstcZFZ2fnYtVgUAAICqiopKUfduSxUUZHJqDwqKVvduSxUVlVIj86akpGjv3r2O1TDPPfec1q1bp+XLl6usrExms9npUVxc7NH5MzMzlZyc7Hg+YMAA/fTTT9q7d69L39OnT7vMd/bsWac++fn5MpvNOnDggNLT03Xdddfp+PHjWrZsmVv1pKWlafjw4erWrZvTY8yYMTp+/Lg2btxYae2RkZGKj4/XJ5984mgzGAxKS0vTvn37dOedd2rnzp06cuSI1q1bp6FDh6pfv36aMGGCu2+Xk8zMTN1www2O7dMAAAAA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fACVSgWDweDuLRJRM9euXTtER0dLrvXu3RsXL150046IqKV57bXXMHPmTDzyyCPo168fHnvsMbz88stYuHChu7dGRC1QeHg4ACAnJ0dyPScnx3yPiKghmAo3mZmZ2Lp1K0/dyMTiDbmMKIp44YUXsG7dOvz222/o0qWLu7dERC3ImDFjcOrUKRw/ftz8X2xsLB599FEcP34cSqXS3VskomZuxIgROHPmjORaWloaIiMj3bQjImppysvLoVBI/5muVCphNBrdtCMiasm6dOmC8PBwbN++3XytpKQEhw4dwvDhw924MyJqSUyFm7Nnz2Lbtm0IDg5295aaDbZNI5eZOnUqVq9ejZ9++gl+fn7m/qkBAQHw8vJy8+6IqLnz8/OzmqHl4+OD4OBgztYiogbx8ssv49Zbb8WCBQswceJEHD58GCtXrsTKlSvdvTUiaiHuvfdevPvuu+jUqRP69OmDY8eOYenSpXjyySfdvTUiaqbKyspw7tw588cZGRk4fvw42rZti06dOmHatGn4+9//jqioKHTp0gVz5sxBREQEJkyY4L5NE1Gz4uj7TLt27fDHP/4RSUlJ+Pnnn2EwGMyvCbdt2xYeHh7u2nazIIiiKLp7E9Q6CIJg8/qXX36JJ554wrWbIaJWYdSoURg4cCCWLVvm7q0QUQvx888/Y9asWTh79iy6dOmC6dOn4+mnn3b3toiohSgtLcWcOXOwbt06aLVaREREYNKkSXjrrbf44gYROWXnzp0YPXq01fUpU6Zg1apVEEURc+fOxcqVK1FUVISRI0fik08+QY8ePdywWyJqjhx9n5k3b57d7ks7duzAqFGjGnl3zRuLN0RERERERERERERERE0IZ94QERERERERERERERE1ISzeEBERERERERERERERNSEs3hARERERERERERERETUhLN4QERERERERERERERE1ISzeEBERERERERERERERNSEs3hARERERERERERERETUhLN4QERERERERERERERE1ISzeEBERERERERERERERNSEs3hARERERkV2dO3fGsmXL3L0Np61fvx7du3eHUqnEtGnTZOfmzZuHgQMHNtq+3E3Or++JJ57AhAkT6vU8O3fuhCAIKCoqcrhu+/bt6N27NwwGQ72ez5GUlBR06NAB165da7TnICIiIiJqKCzeEBERERG1QPfeey/Gjx9v896ePXsgCAJOnjzp4l253rPPPos//vGPuHTpEubPn29zjSAIWL9+veTaq6++iu3bt5s/bohCRl3Z2ldL9frrr+PNN9+EUqms1+M4KjZGR0fjlltuwdKlS+v1HERERERErsDiDRERERFRC/TUU09h69atuHz5stW9L7/8ErGxsejfv78bduY6ZWVl0Gq1iI+PR0REBPz8/GRnfX19ERwcXOfnrKqqqnOmtdu7dy/S09Px0EMPNfpz/eUvf8Gnn34KvV7f6M9FRERERFQfLN4QEREREbVA99xzD0JDQ7Fq1SrJ9bKyMvzwww946qmnAAD/+9//0KdPH6jVanTu3Bnvv/++3ce8cOECBEHA8ePHzdeKioogCAJ27twJ4GabrM2bN2PQoEHw8vLCH/7wB2i1Wvz666/o3bs3/P398ec//xnl5eXmxzEajVi4cCG6dOkCLy8vDBgwAP/9738d/hoLCwvx+OOPIygoCN7e3rjzzjtx9uxZ8z5MxZo//OEPkj3W1LlzZwDAAw88AEEQzB/XbCs2b948fPXVV/jpp58gCIL5sUyfj++//x533HEHPD098e233yI/Px+TJk1C+/bt4e3tjX79+uG7776TPO+oUaPwt7/9Da+//jratm2L8PBwzJs3r9Z92TJjxgz06NED3t7e6Nq1K+bMmWNVRFq0aBE0Gg38/Pzw1FNPoaKiQnLfYDBg+vTpCAwMRHBwMF5//XWIoihZI+f36JdffkGPHj3g5eWF0aNH48KFC3b3bbJmzRqMHTsWnp6e5mumz/8XX3yBTp06wdfXF88//zwMBgOWLFmC8PBwhIWF4d1336318WsaO3YsCgoKsGvXrjrliIiIiIhcjcUbIiIiIqIWSKVS4fHHH8eqVaskL8L/8MMPMBgMmDRpEo4ePYqJEyfikUcewalTpzBv3jzMmTPHquDjjHnz5uGjjz7C/v37cenSJUycOBHLli3D6tWrsWnTJmzZsgUffvihef3ChQvx9ddfY8WKFTh9+jRefvllTJ482eGL7E888QQSExOxYcMGHDhwAKIo4q677kJVVRVuvfVWnDlzBkB1gSorKwu33nqr1WMcOXIEQPVppKysLPPHNb366quYOHEixo8fj6ysLKvHmjlzJl566SWkpqYiPj4eFRUVGDx4MDZt2oTk5GQ888wzeOyxx3D48GHJ43711Vfw8fHBoUOHsGTJErzzzjvYunWr7H2Z+Pn5YdWqVUhJScHy5cvx+eef45///Kf5/tq1azFv3jwsWLAAiYmJaNeuHT755BPJY7z//vtYtWoVvvjiC+zduxcFBQVYt26dZE1tv0eXLl3Cgw8+iHvvvRfHjx/H//3f/2HmzJl2922yZ88exMbGWl1PT0/Hr7/+ioSEBHz33Xf497//jbvvvhuXL1/Grl27sHjxYrz55ps4dOhQrc9h4uHhgYEDB2LPnj2yM0REREREbiESEREREVGLlJqaKgIQd+zYYb522223iZMnTxZFURT//Oc/i2PHjpVkXnvtNTE6Otr8cWRkpPjPf/5TFEVRzMjIEAGIx44dM98vLCyUPMeOHTtEAOK2bdvMaxYuXCgCENPT083Xnn32WTE+Pl4URVGsqKgQvb29xf3790v28tRTT4mTJk2y+WtLS0sTAYj79u0zX8vLyxO9vLzEtWvX2tybPQDEdevWSa7NnTtXHDBggPnjKVOmiPfff79kjenzsWzZMoePL4qiePfdd4uvvPKK+eM77rhDHDlypGTNkCFDxBkzZjjclxzvvfeeOHjwYPPHw4cPF59//nnJmmHDhkl+fe3atROXLFli/riqqkrs0KGD+dcs5/do1qxZkj87oiiKM2bMEAGIhYWFdvcbEBAgfv3115Jrc+fOFb29vcWSkhLztfj4eLFz586iwWAwX+vZs6e4cOFC88c1/7za88ADD4hPPPGEwzVERERERO6mclPNiIiIiIiIGlmvXr1w66234osvvsCoUaNw7tw57NmzB++88w4AIDU1Fffff78kM2LECCxbtgwGg6Few+NrztPRaDTmll41r5lOopw7dw7l5eUYO3as5DEqKysxaNAgm4+fmpoKlUqFYcOGma8FBwejZ8+eSE1NdXrfzrA8NWIwGLBgwQKsXbsWV65cQWVlJXQ6Hby9vSXrLGcOtWvXDlqtts7P//333+ODDz5Aeno6ysrKoNfr4e/vb76fmpqK5557TpIZPnw4duzYAQAoLi5GVlaW5HOpUqkQGxtrPrUl5/coNTVV8him56nN9evXJS3TTDp37iyZU6TRaKBUKqFQKCTX6vo58/LykrTsIyIiIiJqili8ISIiIiJqwZ566im8+OKL+Pjjj/Hll1+iW7duuOOOO5x6LNOL5mKNNmyWs1VM2rRpY/7/giBIPjZdMxqNAKrn8ADApk2b0L59e8k6tVrt1F5dycfHR/Lxe++9h+XLl2PZsmXo168ffHx8MG3aNFRWVkrWOfqcyHXgwAE8+uijePvttxEfH4+AgACsWbPG4ewiZzTm71FISAgKCwutrtv6/DTE56ygoADdunWr+0aJiIiIiFyIM2+IiIiIiFqwiRMnQqFQYPXq1fj666/x5JNPQhAEAEDv3r2xb98+yfp9+/ahR48eNk/dhIaGAgCysrLM144fP17vPUZHR0OtVuPixYvo3r275L+OHTvazPTu3Rt6vV4y7yQ/Px9nzpxBdHR0nZ6/TZs2MBgMDtd4eHjUusZk3759uP/++zF58mQMGDAAXbt2RVpaWp32JHdf+/fvR2RkJN544w3ExsYiKioKmZmZkjW9e/e2mgtz8OBB8/8PCAhAu3btJGv0ej2OHj1q/ljO71Hv3r2t5vrUfB57Bg0ahJSUlFrXNZTk5GS7J7qIiIiIiJoKnrwhIiIiImrBfH198fDDD2PWrFkoKSnBE088Yb73yiuvYMiQIZg/fz4efvhhHDhwAB999JHVMHsTLy8v3HLLLVi0aBG6dOkCrVaLN998s9579PPzw6uvvoqXX34ZRqMRI0eORHFxMfbt2wd/f39MmTLFKhMVFYX7778fTz/9ND777DP4+flh5syZaN++vVUruNp07twZ27dvx4gRI6BWqxEUFGRzzebNm3HmzBkEBwcjICDA7uNFRUXhv//9L/bv34+goCAsXboUOTk5dS4qydlXVFQULl68iDVr1mDIkCHYtGkT1q1bJ1nz0ksv4YknnkBsbCxGjBiBb7/9FqdPn5a0sXvppZewaNEiREVFoVevXli6dCmKiorM9+X8Hj333HN4//338dprr+H//u//cPToUaxatarWX2d8fDy++uqrOn1uHLly5YpVUTEyMhJBQUG4cOECrly5gri4uAZ7PiIiIiKixsCTN0RERERELdxTTz2FwsJCxMfHIyIiwnw9JiYGa9euxZo1a9C3b1+89dZbeOeddyQFHktffPEF9Ho9Bg8ejGnTpuHvf/97g+xx/vz5mDNnDhYuXIjevXtj/Pjx2LRpE7p06WI38+WXX2Lw4MG45557MHz4cIiiiF9++cWqtVZt3n//fWzduhUdO3a0eyLj6aefRs+ePREbG4vQ0FCrE0s1vfnmm4iJiUF8fDxGjRqF8PBwTJgwoU57kruv++67Dy+//DJeeOEFDBw4EPv378ecOXMkax5++GHMmTMHr7/+OgYPHozMzEz89a9/lax55ZVX8Nhjj2HKlCkYPnw4/Pz88MADD0jW1PZ71KlTJ/zvf//D+vXrMWDAAKxYsQILFiyo9df56KOP4vTp0zhz5kxdPj12/eMf/8CgQYMk/23atAkA8N1332HcuHGIjIxskOciIiIiImosglizYTURERERERGRi7322msoKSnBZ5991mjPUVlZiaioKKxevRojRoxotOchIiIiImoIPHlDREREREREbvXGG28gMjISRqOx0Z7j4sWLmD17Ngs3RERERNQs8OQNERERERERERERERFRE8KTN0RERERERERERERERE0IizdERERERERERERERERNCIs3RERERERERERERERETQiLN0RERERERERERERERE0IizdERERERERERERERERNCIs3RERERERERERERERETQiLN0RERERERERERERERE0IizdERERERERERERERERNCIs3RERERERERERERERETcj/Axl17j25GpBmAAAAAElFTkSuQmCC",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "fig, ax1 = plt.subplots(figsize=(20, 10))\n",
- "plt.plot(\n",
- " -np.log10(independent_component_concentration),\n",
- " final_c,\n",
- " \"o\",\n",
- ")\n",
- "plt.title(\"Conenctration of species after Newton-Raphson\")\n",
- "plt.ylabel(\"Concentration (mol/L)\")\n",
- "plt.xlabel(\"Volume of titrant added (mL)\")\n",
- "plt.legend(\n",
- " handles=ax1.lines,\n",
- " labels=solver_data.species_names,\n",
- ");"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "libeq-8i_JZAyh-py3.12",
- "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.12.1"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/notebooks/urine_a.json b/notebooks/urine_a.json
deleted file mode 100644
index 30ff9e3..0000000
--- a/notebooks/urine_a.json
+++ /dev/null
@@ -1,957 +0,0 @@
-{
- "check": "PyES project file --- DO NOT MODIFY THIS LINE!",
- "nc": 11,
- "ns": 39,
- "np": 2,
- "emode": false,
- "imode": 0,
- "ris": 0.16,
- "a": 0.5,
- "b": 1.5,
- "c0": 0.1,
- "c1": 0.23,
- "d0": 0.0,
- "d1": -0.1,
- "e0": 0.0,
- "e1": 0.0,
- "dmode": 1,
- "v0": 0.0,
- "initv": 0.0,
- "vinc": 0.0,
- "nop": 1.0,
- "c0back": 0.0,
- "ctback": 0.0,
- "ind_comp": 10,
- "initialLog": 4.0,
- "finalLog": 8.5,
- "logInc": 0.045,
- "cback": 0.0,
- "jacobian_mode": "Normal mode",
- "max_nr_iters": 200,
- "compModel": {
- "Name": {
- "0": "Ca",
- "1": "Mg",
- "2": "Na",
- "3": "K",
- "4": "NH4",
- "5": "Cl",
- "6": "PO4",
- "7": "SO4",
- "8": "Cit",
- "9": "ox",
- "10": "H"
- },
- "Charge": {
- "0": 2,
- "1": 2,
- "2": 1,
- "3": 1,
- "4": 1,
- "5": -1,
- "6": -3,
- "7": -2,
- "8": -3,
- "9": -2,
- "10": 1
- }
- },
- "concModel": {
- "C0": {
- "Ca": 0.00123,
- "Mg": 0.00167,
- "Na": 0.0659,
- "K": 0.0332,
- "NH4": 0.0133,
- "Cl": 0.0682,
- "PO4": 0.00691,
- "SO4": 0.003,
- "Cit": 0.00188,
- "ox": 0.000168,
- "H": 0.0
- },
- "CT": {
- "Ca": 0.0,
- "Mg": 0.0,
- "Na": 0.0,
- "K": 0.0,
- "NH4": 0.0,
- "Cl": 0.0,
- "PO4": 0.0,
- "SO4": 0.0,
- "Cit": 0.0,
- "ox": 0.0,
- "H": 0.0
- },
- "Sigma C0": {
- "Ca": 0.0,
- "Mg": 0.0,
- "Na": 0.0,
- "K": 0.0,
- "NH4": 0.0,
- "Cl": 0.0,
- "PO4": 0.0,
- "SO4": 0.0,
- "Cit": 0.0,
- "ox": 0.0,
- "H": 0.0
- },
- "Sigma CT": {
- "Ca": 0.0,
- "Mg": 0.0,
- "Na": 0.0,
- "K": 0.0,
- "NH4": 0.0,
- "Cl": 0.0,
- "PO4": 0.0,
- "SO4": 0.0,
- "Cit": 0.0,
- "ox": 0.0,
- "H": 0.0
- }
- },
- "speciesModel": {
- "Ignored": {
- "0": false,
- "1": false,
- "2": false,
- "3": false,
- "4": false,
- "5": false,
- "6": false,
- "7": false,
- "8": false,
- "9": false,
- "10": false,
- "11": false,
- "12": false,
- "13": false,
- "14": false,
- "15": false,
- "16": false,
- "17": false,
- "18": false,
- "19": false,
- "20": false,
- "21": false,
- "22": false,
- "23": false,
- "24": false,
- "25": false,
- "26": false,
- "27": false,
- "28": false,
- "29": false,
- "30": false,
- "31": false,
- "32": false,
- "33": false,
- "34": false,
- "35": false,
- "36": false,
- "37": false,
- "38": false
- },
- "Name": {
- "0": "(PO4)(H)",
- "1": "(PO4)(H)2",
- "2": "(PO4)(H)3",
- "3": "(Cit)(H)",
- "4": "(Cit)(H)2",
- "5": "(Cit)(H)3",
- "6": "(ox)(H)",
- "7": "(Ca)(Cit)(H)",
- "8": "(Ca)(Cit)",
- "9": "(Mg)(Cit)(H)",
- "10": "(Mg)(Cit)",
- "11": "(Na)(Cit)(H)",
- "12": "(Na)(Cit)",
- "13": "(Na)2(Cit)",
- "14": "(K)(Cit)",
- "15": "(NH4)(Cit)(H)",
- "16": "(NH4)(Cit)",
- "17": "(Ca)(ox)",
- "18": "(Mg)(ox)",
- "19": "(Na)(ox)",
- "20": "(K)(ox)",
- "21": "(NH4)(ox)",
- "22": "(Ca)(PO4)(H)2",
- "23": "(Ca)(PO4)(H)",
- "24": "(Ca)(PO4)",
- "25": "(Mg)(PO4)(H)2",
- "26": "(Mg)(PO4)(H)",
- "27": "(Mg)(PO4)",
- "28": "(Na)(PO4)(H)",
- "29": "(Na)(PO4)",
- "30": "(K)(PO4)(H)",
- "31": "(K)(PO4)",
- "32": "(NH4)(PO4)(H)",
- "33": "(Ca)(SO4)",
- "34": "(Mg)(SO4)",
- "35": "(Na)(SO4)",
- "36": "(K)(SO4)",
- "37": "(NH4)(SO4)",
- "38": "(OH)"
- },
- "LogB": {
- "0": 11.64,
- "1": 18.47,
- "2": 20.51,
- "3": 5.8,
- "4": 10.11,
- "5": 12.97,
- "6": 3.98,
- "7": 7.83,
- "8": 3.49,
- "9": 7.54,
- "10": 3.54,
- "11": 6.38,
- "12": 0.98,
- "13": 1.4,
- "14": 0.56,
- "15": 6.27,
- "16": 0.95,
- "17": 2.36,
- "18": 2.67,
- "19": 0.51,
- "20": 0.41,
- "21": 0.65,
- "22": 19.56,
- "23": 13.61,
- "24": 6.08,
- "25": 19.67,
- "26": 13.75,
- "27": 3.4,
- "28": 12.41,
- "29": 0.95,
- "30": 12.22,
- "31": 0.85,
- "32": 12.48,
- "33": 1.6,
- "34": 1.65,
- "35": 0.4,
- "36": 0.54,
- "37": 0.92,
- "38": -13.78
- },
- "Sigma": {
- "0": 0.0,
- "1": 0.0,
- "2": 0.0,
- "3": 0.0,
- "4": 0.0,
- "5": 0.0,
- "6": 0.0,
- "7": 0.0,
- "8": 0.0,
- "9": 0.0,
- "10": 0.0,
- "11": 0.0,
- "12": 0.0,
- "13": 0.0,
- "14": 0.0,
- "15": 0.0,
- "16": 0.0,
- "17": 0.0,
- "18": 0.0,
- "19": 0.0,
- "20": 0.0,
- "21": 0.0,
- "22": 0.0,
- "23": 0.0,
- "24": 0.0,
- "25": 0.0,
- "26": 0.0,
- "27": 0.0,
- "28": 0.0,
- "29": 0.0,
- "30": 0.0,
- "31": 0.0,
- "32": 0.0,
- "33": 0.0,
- "34": 0.0,
- "35": 0.0,
- "36": 0.0,
- "37": 0.0,
- "38": 0.0
- },
- "Ref. Ionic Str.": {
- "0": 0.16,
- "1": 0.16,
- "2": 0.16,
- "3": 0.16,
- "4": 0.16,
- "5": 0.16,
- "6": 0.16,
- "7": 0.16,
- "8": 0.16,
- "9": 0.16,
- "10": 0.16,
- "11": 0.16,
- "12": 0.16,
- "13": 0.16,
- "14": 0.16,
- "15": 0.16,
- "16": 0.16,
- "17": 0.16,
- "18": 0.16,
- "19": 0.16,
- "20": 0.16,
- "21": 0.16,
- "22": 0.16,
- "23": 0.16,
- "24": 0.16,
- "25": 0.16,
- "26": 0.16,
- "27": 0.16,
- "28": 0.16,
- "29": 0.16,
- "30": 0.16,
- "31": 0.16,
- "32": 0.16,
- "33": 0.16,
- "34": 0.16,
- "35": 0.16,
- "36": 0.16,
- "37": 0.16,
- "38": 0.16
- },
- "CGF": {
- "0": 0.0,
- "1": 0.0,
- "2": 0.0,
- "3": 0.0,
- "4": 0.0,
- "5": 0.0,
- "6": 0.0,
- "7": 0.0,
- "8": 0.0,
- "9": 0.0,
- "10": 0.0,
- "11": 0.0,
- "12": 0.0,
- "13": 0.0,
- "14": 0.0,
- "15": 0.0,
- "16": 0.0,
- "17": 0.0,
- "18": 0.0,
- "19": 0.0,
- "20": 0.0,
- "21": 0.0,
- "22": 0.0,
- "23": 0.0,
- "24": 0.0,
- "25": 0.0,
- "26": 0.0,
- "27": 0.0,
- "28": 0.0,
- "29": 0.0,
- "30": 0.0,
- "31": 0.0,
- "32": 0.0,
- "33": 0.0,
- "34": 0.0,
- "35": 0.0,
- "36": 0.0,
- "37": 0.0,
- "38": 0.0
- },
- "DGF": {
- "0": 0.0,
- "1": 0.0,
- "2": 0.0,
- "3": 0.0,
- "4": 0.0,
- "5": 0.0,
- "6": 0.0,
- "7": 0.0,
- "8": 0.0,
- "9": 0.0,
- "10": 0.0,
- "11": 0.0,
- "12": 0.0,
- "13": 0.0,
- "14": 0.0,
- "15": 0.0,
- "16": 0.0,
- "17": 0.0,
- "18": 0.0,
- "19": 0.0,
- "20": 0.0,
- "21": 0.0,
- "22": 0.0,
- "23": 0.0,
- "24": 0.0,
- "25": 0.0,
- "26": 0.0,
- "27": 0.0,
- "28": 0.0,
- "29": 0.0,
- "30": 0.0,
- "31": 0.0,
- "32": 0.0,
- "33": 0.0,
- "34": 0.0,
- "35": 0.0,
- "36": 0.0,
- "37": 0.0,
- "38": 0.0
- },
- "EGF": {
- "0": 0.0,
- "1": 0.0,
- "2": 0.0,
- "3": 0.0,
- "4": 0.0,
- "5": 0.0,
- "6": 0.0,
- "7": 0.0,
- "8": 0.0,
- "9": 0.0,
- "10": 0.0,
- "11": 0.0,
- "12": 0.0,
- "13": 0.0,
- "14": 0.0,
- "15": 0.0,
- "16": 0.0,
- "17": 0.0,
- "18": 0.0,
- "19": 0.0,
- "20": 0.0,
- "21": 0.0,
- "22": 0.0,
- "23": 0.0,
- "24": 0.0,
- "25": 0.0,
- "26": 0.0,
- "27": 0.0,
- "28": 0.0,
- "29": 0.0,
- "30": 0.0,
- "31": 0.0,
- "32": 0.0,
- "33": 0.0,
- "34": 0.0,
- "35": 0.0,
- "36": 0.0,
- "37": 0.0,
- "38": 0.0
- },
- "Ca": {
- "0": 0,
- "1": 0,
- "2": 0,
- "3": 0,
- "4": 0,
- "5": 0,
- "6": 0,
- "7": 1,
- "8": 1,
- "9": 0,
- "10": 0,
- "11": 0,
- "12": 0,
- "13": 0,
- "14": 0,
- "15": 0,
- "16": 0,
- "17": 1,
- "18": 0,
- "19": 0,
- "20": 0,
- "21": 0,
- "22": 1,
- "23": 1,
- "24": 1,
- "25": 0,
- "26": 0,
- "27": 0,
- "28": 0,
- "29": 0,
- "30": 0,
- "31": 0,
- "32": 0,
- "33": 1,
- "34": 0,
- "35": 0,
- "36": 0,
- "37": 0,
- "38": 0
- },
- "Mg": {
- "0": 0,
- "1": 0,
- "2": 0,
- "3": 0,
- "4": 0,
- "5": 0,
- "6": 0,
- "7": 0,
- "8": 0,
- "9": 1,
- "10": 1,
- "11": 0,
- "12": 0,
- "13": 0,
- "14": 0,
- "15": 0,
- "16": 0,
- "17": 0,
- "18": 1,
- "19": 0,
- "20": 0,
- "21": 0,
- "22": 0,
- "23": 0,
- "24": 0,
- "25": 1,
- "26": 1,
- "27": 1,
- "28": 0,
- "29": 0,
- "30": 0,
- "31": 0,
- "32": 0,
- "33": 0,
- "34": 1,
- "35": 0,
- "36": 0,
- "37": 0,
- "38": 0
- },
- "Na": {
- "0": 0,
- "1": 0,
- "2": 0,
- "3": 0,
- "4": 0,
- "5": 0,
- "6": 0,
- "7": 0,
- "8": 0,
- "9": 0,
- "10": 0,
- "11": 1,
- "12": 1,
- "13": 2,
- "14": 0,
- "15": 0,
- "16": 0,
- "17": 0,
- "18": 0,
- "19": 1,
- "20": 0,
- "21": 0,
- "22": 0,
- "23": 0,
- "24": 0,
- "25": 0,
- "26": 0,
- "27": 0,
- "28": 1,
- "29": 1,
- "30": 0,
- "31": 0,
- "32": 0,
- "33": 0,
- "34": 0,
- "35": 1,
- "36": 0,
- "37": 0,
- "38": 0
- },
- "K": {
- "0": 0,
- "1": 0,
- "2": 0,
- "3": 0,
- "4": 0,
- "5": 0,
- "6": 0,
- "7": 0,
- "8": 0,
- "9": 0,
- "10": 0,
- "11": 0,
- "12": 0,
- "13": 0,
- "14": 1,
- "15": 0,
- "16": 0,
- "17": 0,
- "18": 0,
- "19": 0,
- "20": 1,
- "21": 0,
- "22": 0,
- "23": 0,
- "24": 0,
- "25": 0,
- "26": 0,
- "27": 0,
- "28": 0,
- "29": 0,
- "30": 1,
- "31": 1,
- "32": 0,
- "33": 0,
- "34": 0,
- "35": 0,
- "36": 1,
- "37": 0,
- "38": 0
- },
- "NH4": {
- "0": 0,
- "1": 0,
- "2": 0,
- "3": 0,
- "4": 0,
- "5": 0,
- "6": 0,
- "7": 0,
- "8": 0,
- "9": 0,
- "10": 0,
- "11": 0,
- "12": 0,
- "13": 0,
- "14": 0,
- "15": 1,
- "16": 1,
- "17": 0,
- "18": 0,
- "19": 0,
- "20": 0,
- "21": 1,
- "22": 0,
- "23": 0,
- "24": 0,
- "25": 0,
- "26": 0,
- "27": 0,
- "28": 0,
- "29": 0,
- "30": 0,
- "31": 0,
- "32": 1,
- "33": 0,
- "34": 0,
- "35": 0,
- "36": 0,
- "37": 1,
- "38": 0
- },
- "Cl": {
- "0": 0,
- "1": 0,
- "2": 0,
- "3": 0,
- "4": 0,
- "5": 0,
- "6": 0,
- "7": 0,
- "8": 0,
- "9": 0,
- "10": 0,
- "11": 0,
- "12": 0,
- "13": 0,
- "14": 0,
- "15": 0,
- "16": 0,
- "17": 0,
- "18": 0,
- "19": 0,
- "20": 0,
- "21": 0,
- "22": 0,
- "23": 0,
- "24": 0,
- "25": 0,
- "26": 0,
- "27": 0,
- "28": 0,
- "29": 0,
- "30": 0,
- "31": 0,
- "32": 0,
- "33": 0,
- "34": 0,
- "35": 0,
- "36": 0,
- "37": 0,
- "38": 0
- },
- "PO4": {
- "0": 1,
- "1": 1,
- "2": 1,
- "3": 0,
- "4": 0,
- "5": 0,
- "6": 0,
- "7": 0,
- "8": 0,
- "9": 0,
- "10": 0,
- "11": 0,
- "12": 0,
- "13": 0,
- "14": 0,
- "15": 0,
- "16": 0,
- "17": 0,
- "18": 0,
- "19": 0,
- "20": 0,
- "21": 0,
- "22": 1,
- "23": 1,
- "24": 1,
- "25": 1,
- "26": 1,
- "27": 1,
- "28": 1,
- "29": 1,
- "30": 1,
- "31": 1,
- "32": 1,
- "33": 0,
- "34": 0,
- "35": 0,
- "36": 0,
- "37": 0,
- "38": 0
- },
- "SO4": {
- "0": 0,
- "1": 0,
- "2": 0,
- "3": 0,
- "4": 0,
- "5": 0,
- "6": 0,
- "7": 0,
- "8": 0,
- "9": 0,
- "10": 0,
- "11": 0,
- "12": 0,
- "13": 0,
- "14": 0,
- "15": 0,
- "16": 0,
- "17": 0,
- "18": 0,
- "19": 0,
- "20": 0,
- "21": 0,
- "22": 0,
- "23": 0,
- "24": 0,
- "25": 0,
- "26": 0,
- "27": 0,
- "28": 0,
- "29": 0,
- "30": 0,
- "31": 0,
- "32": 0,
- "33": 1,
- "34": 1,
- "35": 1,
- "36": 1,
- "37": 1,
- "38": 0
- },
- "Cit": {
- "0": 0,
- "1": 0,
- "2": 0,
- "3": 1,
- "4": 1,
- "5": 1,
- "6": 0,
- "7": 1,
- "8": 1,
- "9": 1,
- "10": 1,
- "11": 1,
- "12": 1,
- "13": 1,
- "14": 1,
- "15": 1,
- "16": 1,
- "17": 0,
- "18": 0,
- "19": 0,
- "20": 0,
- "21": 0,
- "22": 0,
- "23": 0,
- "24": 0,
- "25": 0,
- "26": 0,
- "27": 0,
- "28": 0,
- "29": 0,
- "30": 0,
- "31": 0,
- "32": 0,
- "33": 0,
- "34": 0,
- "35": 0,
- "36": 0,
- "37": 0,
- "38": 0
- },
- "ox": {
- "0": 0,
- "1": 0,
- "2": 0,
- "3": 0,
- "4": 0,
- "5": 0,
- "6": 1,
- "7": 0,
- "8": 0,
- "9": 0,
- "10": 0,
- "11": 0,
- "12": 0,
- "13": 0,
- "14": 0,
- "15": 0,
- "16": 0,
- "17": 1,
- "18": 1,
- "19": 1,
- "20": 1,
- "21": 1,
- "22": 0,
- "23": 0,
- "24": 0,
- "25": 0,
- "26": 0,
- "27": 0,
- "28": 0,
- "29": 0,
- "30": 0,
- "31": 0,
- "32": 0,
- "33": 0,
- "34": 0,
- "35": 0,
- "36": 0,
- "37": 0,
- "38": 0
- },
- "H": {
- "0": 1,
- "1": 2,
- "2": 3,
- "3": 1,
- "4": 2,
- "5": 3,
- "6": 1,
- "7": 1,
- "8": 0,
- "9": 1,
- "10": 0,
- "11": 1,
- "12": 0,
- "13": 0,
- "14": 0,
- "15": 1,
- "16": 0,
- "17": 0,
- "18": 0,
- "19": 0,
- "20": 0,
- "21": 0,
- "22": 2,
- "23": 1,
- "24": 0,
- "25": 2,
- "26": 1,
- "27": 0,
- "28": 1,
- "29": 0,
- "30": 1,
- "31": 0,
- "32": 1,
- "33": 0,
- "34": 0,
- "35": 0,
- "36": 0,
- "37": 0,
- "38": -1
- },
- "Ref. Comp.": {
- "0": "PO4",
- "1": "PO4",
- "2": "PO4",
- "3": "Cit",
- "4": "Cit",
- "5": "Cit",
- "6": "Ca",
- "7": "Ca",
- "8": "Ca",
- "9": "Mg",
- "10": "Mg",
- "11": "Na",
- "12": "Na",
- "13": "Na",
- "14": "K",
- "15": "NH4",
- "16": "NH4",
- "17": "Ca",
- "18": "Mg",
- "19": "Mg",
- "20": "K",
- "21": "NH4",
- "22": "Ca",
- "23": "Ca",
- "24": "Ca",
- "25": "Mg",
- "26": "Mg",
- "27": "Mg",
- "28": "Na",
- "29": "K",
- "30": "K",
- "31": "K",
- "32": "NH4",
- "33": "Ca",
- "34": "Mg",
- "35": "Na",
- "36": "K",
- "37": "NH4",
- "38": "H"
- }
- },
- "solidSpeciesModel": {
- "Ignored": { "0": false, "1": false },
- "Name": { "0": "(Ca)(ox)", "1": "(Ca)(PO4)(H)" },
- "LogKs": { "0": -7.75, "1": -5.88 },
- "Sigma": { "0": 0.0, "1": 0.0 },
- "Ref. Ionic Str.": { "0": 0.1, "1": 0.1 },
- "CGF": { "0": 0.0, "1": 0.0 },
- "DGF": { "0": 0.0, "1": 0.0 },
- "EGF": { "0": 0.0, "1": 0.0 },
- "Ca": { "0": 1, "1": 1 },
- "Mg": { "0": 0, "1": 0 },
- "Na": { "0": 0, "1": 0 },
- "K": { "0": 0, "1": 0 },
- "NH4": { "0": 0, "1": 0 },
- "Cl": { "0": 0, "1": 0 },
- "PO4": { "0": 0, "1": 1 },
- "SO4": { "0": 0, "1": 0 },
- "Cit": { "0": 0, "1": 0 },
- "ox": { "0": 1, "1": 0 },
- "H": { "0": 0, "1": 1 },
- "Ref. Comp.": { "0": "Ca", "1": "Ca" }
- }
-}
diff --git a/poetry.lock b/poetry.lock
deleted file mode 100644
index 11d8a24..0000000
--- a/poetry.lock
+++ /dev/null
@@ -1,2916 +0,0 @@
-# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand.
-
-[[package]]
-name = "annotated-types"
-version = "0.7.0"
-description = "Reusable constraint types to use with typing.Annotated"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"},
- {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"},
-]
-
-[[package]]
-name = "appnope"
-version = "0.1.4"
-description = "Disable App Nap on macOS >= 10.9"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"},
- {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"},
-]
-
-[[package]]
-name = "asttokens"
-version = "2.4.1"
-description = "Annotate AST trees with source code positions"
-optional = false
-python-versions = "*"
-files = [
- {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"},
- {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"},
-]
-
-[package.dependencies]
-six = ">=1.12.0"
-
-[package.extras]
-astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"]
-test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"]
-
-[[package]]
-name = "babel"
-version = "2.16.0"
-description = "Internationalization utilities"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"},
- {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"},
-]
-
-[package.extras]
-dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"]
-
-[[package]]
-name = "black"
-version = "24.10.0"
-description = "The uncompromising code formatter."
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "black-24.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812"},
- {file = "black-24.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea"},
- {file = "black-24.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f"},
- {file = "black-24.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e"},
- {file = "black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad"},
- {file = "black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50"},
- {file = "black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392"},
- {file = "black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175"},
- {file = "black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3"},
- {file = "black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65"},
- {file = "black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f"},
- {file = "black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8"},
- {file = "black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981"},
- {file = "black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b"},
- {file = "black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2"},
- {file = "black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b"},
- {file = "black-24.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd"},
- {file = "black-24.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f"},
- {file = "black-24.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800"},
- {file = "black-24.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7"},
- {file = "black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d"},
- {file = "black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875"},
-]
-
-[package.dependencies]
-click = ">=8.0.0"
-mypy-extensions = ">=0.4.3"
-packaging = ">=22.0"
-pathspec = ">=0.9.0"
-platformdirs = ">=2"
-tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
-typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""}
-
-[package.extras]
-colorama = ["colorama (>=0.4.3)"]
-d = ["aiohttp (>=3.10)"]
-jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
-uvloop = ["uvloop (>=0.15.2)"]
-
-[[package]]
-name = "certifi"
-version = "2024.8.30"
-description = "Python package for providing Mozilla's CA Bundle."
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"},
- {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"},
-]
-
-[[package]]
-name = "cffi"
-version = "1.17.1"
-description = "Foreign Function Interface for Python calling C code."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"},
- {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"},
- {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"},
- {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"},
- {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"},
- {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"},
- {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"},
- {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"},
- {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"},
- {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"},
- {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"},
- {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"},
- {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"},
- {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"},
- {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"},
- {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"},
- {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"},
- {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"},
- {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"},
- {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"},
- {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"},
- {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"},
- {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"},
- {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"},
- {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"},
- {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"},
- {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"},
- {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"},
- {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"},
- {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"},
- {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"},
- {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"},
- {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"},
- {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"},
- {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"},
- {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"},
- {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"},
- {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"},
- {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"},
- {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"},
- {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"},
- {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"},
- {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"},
-]
-
-[package.dependencies]
-pycparser = "*"
-
-[[package]]
-name = "charset-normalizer"
-version = "3.4.0"
-description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
-optional = false
-python-versions = ">=3.7.0"
-files = [
- {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"},
- {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"},
- {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"},
-]
-
-[[package]]
-name = "click"
-version = "8.1.7"
-description = "Composable command line interface toolkit"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
- {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
-
-[[package]]
-name = "colorama"
-version = "0.4.6"
-description = "Cross-platform colored terminal text."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
-files = [
- {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
- {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
-]
-
-[[package]]
-name = "comm"
-version = "0.2.2"
-description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"},
- {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"},
-]
-
-[package.dependencies]
-traitlets = ">=4"
-
-[package.extras]
-test = ["pytest"]
-
-[[package]]
-name = "compress-pickle"
-version = "2.1.0"
-description = "Standard pickle, wrapped with standard compression libraries"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "compress_pickle-2.1.0-py3-none-any.whl", hash = "sha256:598650da4686d9bd97bee185b61e74d7fe1872bb0c23909d5ed2d8793b4a8818"},
- {file = "compress_pickle-2.1.0.tar.gz", hash = "sha256:3e944ce0eeab5b6331324d62351c957d41c9327c8417d439843e88fe69b77991"},
-]
-
-[package.dependencies]
-lz4 = {version = "*", optional = true, markers = "extra == \"lz4\""}
-
-[package.extras]
-cloudpickle = ["cloudpickle"]
-dill = ["dill"]
-full = ["cloudpickle", "dill", "lz4"]
-lz4 = ["lz4"]
-
-[[package]]
-name = "contourpy"
-version = "1.3.0"
-description = "Python library for calculating contours of 2D quadrilateral grids"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "contourpy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:880ea32e5c774634f9fcd46504bf9f080a41ad855f4fef54f5380f5133d343c7"},
- {file = "contourpy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:76c905ef940a4474a6289c71d53122a4f77766eef23c03cd57016ce19d0f7b42"},
- {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92f8557cbb07415a4d6fa191f20fd9d2d9eb9c0b61d1b2f52a8926e43c6e9af7"},
- {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36f965570cff02b874773c49bfe85562b47030805d7d8360748f3eca570f4cab"},
- {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cacd81e2d4b6f89c9f8a5b69b86490152ff39afc58a95af002a398273e5ce589"},
- {file = "contourpy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69375194457ad0fad3a839b9e29aa0b0ed53bb54db1bfb6c3ae43d111c31ce41"},
- {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a52040312b1a858b5e31ef28c2e865376a386c60c0e248370bbea2d3f3b760d"},
- {file = "contourpy-1.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3faeb2998e4fcb256542e8a926d08da08977f7f5e62cf733f3c211c2a5586223"},
- {file = "contourpy-1.3.0-cp310-cp310-win32.whl", hash = "sha256:36e0cff201bcb17a0a8ecc7f454fe078437fa6bda730e695a92f2d9932bd507f"},
- {file = "contourpy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:87ddffef1dbe5e669b5c2440b643d3fdd8622a348fe1983fad7a0f0ccb1cd67b"},
- {file = "contourpy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fa4c02abe6c446ba70d96ece336e621efa4aecae43eaa9b030ae5fb92b309ad"},
- {file = "contourpy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:834e0cfe17ba12f79963861e0f908556b2cedd52e1f75e6578801febcc6a9f49"},
- {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbc4c3217eee163fa3984fd1567632b48d6dfd29216da3ded3d7b844a8014a66"},
- {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4865cd1d419e0c7a7bf6de1777b185eebdc51470800a9f42b9e9decf17762081"},
- {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:303c252947ab4b14c08afeb52375b26781ccd6a5ccd81abcdfc1fafd14cf93c1"},
- {file = "contourpy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637f674226be46f6ba372fd29d9523dd977a291f66ab2a74fbeb5530bb3f445d"},
- {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:76a896b2f195b57db25d6b44e7e03f221d32fe318d03ede41f8b4d9ba1bff53c"},
- {file = "contourpy-1.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e1fd23e9d01591bab45546c089ae89d926917a66dceb3abcf01f6105d927e2cb"},
- {file = "contourpy-1.3.0-cp311-cp311-win32.whl", hash = "sha256:d402880b84df3bec6eab53cd0cf802cae6a2ef9537e70cf75e91618a3801c20c"},
- {file = "contourpy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:6cb6cc968059db9c62cb35fbf70248f40994dfcd7aa10444bbf8b3faeb7c2d67"},
- {file = "contourpy-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:570ef7cf892f0afbe5b2ee410c507ce12e15a5fa91017a0009f79f7d93a1268f"},
- {file = "contourpy-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:da84c537cb8b97d153e9fb208c221c45605f73147bd4cadd23bdae915042aad6"},
- {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0be4d8425bfa755e0fd76ee1e019636ccc7c29f77a7c86b4328a9eb6a26d0639"},
- {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c0da700bf58f6e0b65312d0a5e695179a71d0163957fa381bb3c1f72972537c"},
- {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb8b141bb00fa977d9122636b16aa67d37fd40a3d8b52dd837e536d64b9a4d06"},
- {file = "contourpy-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3634b5385c6716c258d0419c46d05c8aa7dc8cb70326c9a4fb66b69ad2b52e09"},
- {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0dce35502151b6bd35027ac39ba6e5a44be13a68f55735c3612c568cac3805fd"},
- {file = "contourpy-1.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea348f053c645100612b333adc5983d87be69acdc6d77d3169c090d3b01dc35"},
- {file = "contourpy-1.3.0-cp312-cp312-win32.whl", hash = "sha256:90f73a5116ad1ba7174341ef3ea5c3150ddf20b024b98fb0c3b29034752c8aeb"},
- {file = "contourpy-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:b11b39aea6be6764f84360fce6c82211a9db32a7c7de8fa6dd5397cf1d079c3b"},
- {file = "contourpy-1.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3e1c7fa44aaae40a2247e2e8e0627f4bea3dd257014764aa644f319a5f8600e3"},
- {file = "contourpy-1.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:364174c2a76057feef647c802652f00953b575723062560498dc7930fc9b1cb7"},
- {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32b238b3b3b649e09ce9aaf51f0c261d38644bdfa35cbaf7b263457850957a84"},
- {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d51fca85f9f7ad0b65b4b9fe800406d0d77017d7270d31ec3fb1cc07358fdea0"},
- {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:732896af21716b29ab3e988d4ce14bc5133733b85956316fb0c56355f398099b"},
- {file = "contourpy-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d73f659398a0904e125280836ae6f88ba9b178b2fed6884f3b1f95b989d2c8da"},
- {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c6c7c2408b7048082932cf4e641fa3b8ca848259212f51c8c59c45aa7ac18f14"},
- {file = "contourpy-1.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f317576606de89da6b7e0861cf6061f6146ead3528acabff9236458a6ba467f8"},
- {file = "contourpy-1.3.0-cp313-cp313-win32.whl", hash = "sha256:31cd3a85dbdf1fc002280c65caa7e2b5f65e4a973fcdf70dd2fdcb9868069294"},
- {file = "contourpy-1.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4553c421929ec95fb07b3aaca0fae668b2eb5a5203d1217ca7c34c063c53d087"},
- {file = "contourpy-1.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:345af746d7766821d05d72cb8f3845dfd08dd137101a2cb9b24de277d716def8"},
- {file = "contourpy-1.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3bb3808858a9dc68f6f03d319acd5f1b8a337e6cdda197f02f4b8ff67ad2057b"},
- {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:420d39daa61aab1221567b42eecb01112908b2cab7f1b4106a52caaec8d36973"},
- {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d63ee447261e963af02642ffcb864e5a2ee4cbfd78080657a9880b8b1868e18"},
- {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:167d6c890815e1dac9536dca00828b445d5d0df4d6a8c6adb4a7ec3166812fa8"},
- {file = "contourpy-1.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:710a26b3dc80c0e4febf04555de66f5fd17e9cf7170a7b08000601a10570bda6"},
- {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:75ee7cb1a14c617f34a51d11fa7524173e56551646828353c4af859c56b766e2"},
- {file = "contourpy-1.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:33c92cdae89ec5135d036e7218e69b0bb2851206077251f04a6c4e0e21f03927"},
- {file = "contourpy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a11077e395f67ffc2c44ec2418cfebed032cd6da3022a94fc227b6faf8e2acb8"},
- {file = "contourpy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e8134301d7e204c88ed7ab50028ba06c683000040ede1d617298611f9dc6240c"},
- {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e12968fdfd5bb45ffdf6192a590bd8ddd3ba9e58360b29683c6bb71a7b41edca"},
- {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fd2a0fc506eccaaa7595b7e1418951f213cf8255be2600f1ea1b61e46a60c55f"},
- {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4cfb5c62ce023dfc410d6059c936dcf96442ba40814aefbfa575425a3a7f19dc"},
- {file = "contourpy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68a32389b06b82c2fdd68276148d7b9275b5f5cf13e5417e4252f6d1a34f72a2"},
- {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:94e848a6b83da10898cbf1311a815f770acc9b6a3f2d646f330d57eb4e87592e"},
- {file = "contourpy-1.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d78ab28a03c854a873787a0a42254a0ccb3cb133c672f645c9f9c8f3ae9d0800"},
- {file = "contourpy-1.3.0-cp39-cp39-win32.whl", hash = "sha256:81cb5ed4952aae6014bc9d0421dec7c5835c9c8c31cdf51910b708f548cf58e5"},
- {file = "contourpy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:14e262f67bd7e6eb6880bc564dcda30b15e351a594657e55b7eec94b6ef72843"},
- {file = "contourpy-1.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fe41b41505a5a33aeaed2a613dccaeaa74e0e3ead6dd6fd3a118fb471644fd6c"},
- {file = "contourpy-1.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eca7e17a65f72a5133bdbec9ecf22401c62bcf4821361ef7811faee695799779"},
- {file = "contourpy-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1ec4dc6bf570f5b22ed0d7efba0dfa9c5b9e0431aeea7581aa217542d9e809a4"},
- {file = "contourpy-1.3.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:00ccd0dbaad6d804ab259820fa7cb0b8036bda0686ef844d24125d8287178ce0"},
- {file = "contourpy-1.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ca947601224119117f7c19c9cdf6b3ab54c5726ef1d906aa4a69dfb6dd58102"},
- {file = "contourpy-1.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ec93afeb848a0845a18989da3beca3eec2c0f852322efe21af1931147d12cb"},
- {file = "contourpy-1.3.0.tar.gz", hash = "sha256:7ffa0db17717a8ffb127efd0c95a4362d996b892c2904db72428d5b52e1938a4"},
-]
-
-[package.dependencies]
-numpy = ">=1.23"
-
-[package.extras]
-bokeh = ["bokeh", "selenium"]
-docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"]
-mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.11.1)", "types-Pillow"]
-test = ["Pillow", "contourpy[test-no-images]", "matplotlib"]
-test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"]
-
-[[package]]
-name = "cycler"
-version = "0.12.1"
-description = "Composable style cycles"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"},
- {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"},
-]
-
-[package.extras]
-docs = ["ipython", "matplotlib", "numpydoc", "sphinx"]
-tests = ["pytest", "pytest-cov", "pytest-xdist"]
-
-[[package]]
-name = "debugpy"
-version = "1.8.8"
-description = "An implementation of the Debug Adapter Protocol for Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "debugpy-1.8.8-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e59b1607c51b71545cb3496876544f7186a7a27c00b436a62f285603cc68d1c6"},
- {file = "debugpy-1.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6531d952b565b7cb2fbd1ef5df3d333cf160b44f37547a4e7cf73666aca5d8d"},
- {file = "debugpy-1.8.8-cp310-cp310-win32.whl", hash = "sha256:b01f4a5e5c5fb1d34f4ccba99a20ed01eabc45a4684f4948b5db17a319dfb23f"},
- {file = "debugpy-1.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:535f4fb1c024ddca5913bb0eb17880c8f24ba28aa2c225059db145ee557035e9"},
- {file = "debugpy-1.8.8-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:c399023146e40ae373753a58d1be0a98bf6397fadc737b97ad612886b53df318"},
- {file = "debugpy-1.8.8-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09cc7b162586ea2171eea055985da2702b0723f6f907a423c9b2da5996ad67ba"},
- {file = "debugpy-1.8.8-cp311-cp311-win32.whl", hash = "sha256:eea8821d998ebeb02f0625dd0d76839ddde8cbf8152ebbe289dd7acf2cdc6b98"},
- {file = "debugpy-1.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:d4483836da2a533f4b1454dffc9f668096ac0433de855f0c22cdce8c9f7e10c4"},
- {file = "debugpy-1.8.8-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:0cc94186340be87b9ac5a707184ec8f36547fb66636d1029ff4f1cc020e53996"},
- {file = "debugpy-1.8.8-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64674e95916e53c2e9540a056e5f489e0ad4872645399d778f7c598eacb7b7f9"},
- {file = "debugpy-1.8.8-cp312-cp312-win32.whl", hash = "sha256:5c6e885dbf12015aed73770f29dec7023cb310d0dc2ba8bfbeb5c8e43f80edc9"},
- {file = "debugpy-1.8.8-cp312-cp312-win_amd64.whl", hash = "sha256:19ffbd84e757a6ca0113574d1bf5a2298b3947320a3e9d7d8dc3377f02d9f864"},
- {file = "debugpy-1.8.8-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:705cd123a773d184860ed8dae99becd879dfec361098edbefb5fc0d3683eb804"},
- {file = "debugpy-1.8.8-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890fd16803f50aa9cb1a9b9b25b5ec321656dd6b78157c74283de241993d086f"},
- {file = "debugpy-1.8.8-cp313-cp313-win32.whl", hash = "sha256:90244598214bbe704aa47556ec591d2f9869ff9e042e301a2859c57106649add"},
- {file = "debugpy-1.8.8-cp313-cp313-win_amd64.whl", hash = "sha256:4b93e4832fd4a759a0c465c967214ed0c8a6e8914bced63a28ddb0dd8c5f078b"},
- {file = "debugpy-1.8.8-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:143ef07940aeb8e7316de48f5ed9447644da5203726fca378f3a6952a50a9eae"},
- {file = "debugpy-1.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f95651bdcbfd3b27a408869a53fbefcc2bcae13b694daee5f1365b1b83a00113"},
- {file = "debugpy-1.8.8-cp38-cp38-win32.whl", hash = "sha256:26b461123a030e82602a750fb24d7801776aa81cd78404e54ab60e8b5fecdad5"},
- {file = "debugpy-1.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:f3cbf1833e644a3100eadb6120f25be8a532035e8245584c4f7532937edc652a"},
- {file = "debugpy-1.8.8-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:53709d4ec586b525724819dc6af1a7703502f7e06f34ded7157f7b1f963bb854"},
- {file = "debugpy-1.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a9c013077a3a0000e83d97cf9cc9328d2b0bbb31f56b0e99ea3662d29d7a6a2"},
- {file = "debugpy-1.8.8-cp39-cp39-win32.whl", hash = "sha256:ffe94dd5e9a6739a75f0b85316dc185560db3e97afa6b215628d1b6a17561cb2"},
- {file = "debugpy-1.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5c0e5a38c7f9b481bf31277d2f74d2109292179081f11108e668195ef926c0f9"},
- {file = "debugpy-1.8.8-py2.py3-none-any.whl", hash = "sha256:ec684553aba5b4066d4de510859922419febc710df7bba04fe9e7ef3de15d34f"},
- {file = "debugpy-1.8.8.zip", hash = "sha256:e6355385db85cbd666be703a96ab7351bc9e6c61d694893206f8001e22aee091"},
-]
-
-[[package]]
-name = "decorator"
-version = "5.1.1"
-description = "Decorators for Humans"
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"},
- {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"},
-]
-
-[[package]]
-name = "exceptiongroup"
-version = "1.2.2"
-description = "Backport of PEP 654 (exception groups)"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"},
- {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"},
-]
-
-[package.extras]
-test = ["pytest (>=6)"]
-
-[[package]]
-name = "executing"
-version = "2.1.0"
-description = "Get the currently executing AST node of a frame, and other information"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"},
- {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"},
-]
-
-[package.extras]
-tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"]
-
-[[package]]
-name = "fieldz"
-version = "0.1.0"
-description = "Utilities for providing compatibility with many dataclass-like libraries"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "fieldz-0.1.0-py3-none-any.whl", hash = "sha256:0825a45396877769b107ce016e63f6fedbe625a0ace3e56fe2f9d6d61c7ea8df"},
- {file = "fieldz-0.1.0.tar.gz", hash = "sha256:ee3352534bc5d04ee8e1cafa5f59add2c11bea0fc2ecefe18454ccfdc7e21fb2"},
-]
-
-[package.dependencies]
-typing-extensions = "*"
-
-[package.extras]
-dev = ["black", "hatch", "ipython", "mypy", "pdbpp", "rich", "ruff"]
-test = ["annotated-types", "attrs", "dataclassy", "msgspec", "pydantic", "pytest", "pytest-cov"]
-
-[[package]]
-name = "fonttools"
-version = "4.54.1"
-description = "Tools to manipulate font files"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"},
- {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"},
- {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"},
- {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"},
- {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"},
- {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"},
- {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"},
- {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"},
- {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"},
- {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"},
- {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"},
- {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"},
- {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"},
- {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"},
- {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"},
- {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"},
- {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"},
- {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"},
- {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"},
- {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"},
- {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"},
- {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"},
- {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"},
- {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"},
- {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"},
- {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"},
- {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"},
- {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"},
- {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"},
- {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"},
- {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"},
- {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"},
- {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"},
- {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"},
- {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"},
- {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"},
- {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"},
- {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"},
- {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"},
- {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"},
- {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"},
- {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"},
- {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"},
- {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"},
- {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"},
- {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"},
- {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"},
- {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"},
-]
-
-[package.extras]
-all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"]
-graphite = ["lz4 (>=1.7.4.2)"]
-interpolatable = ["munkres", "pycairo", "scipy"]
-lxml = ["lxml (>=4.0)"]
-pathops = ["skia-pathops (>=0.5.0)"]
-plot = ["matplotlib"]
-repacker = ["uharfbuzz (>=0.23.0)"]
-symfont = ["sympy"]
-type1 = ["xattr"]
-ufo = ["fs (>=2.2.0,<3)"]
-unicode = ["unicodedata2 (>=15.1.0)"]
-woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"]
-
-[[package]]
-name = "ghp-import"
-version = "2.1.0"
-description = "Copy your docs directly to the gh-pages branch."
-optional = false
-python-versions = "*"
-files = [
- {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"},
- {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"},
-]
-
-[package.dependencies]
-python-dateutil = ">=2.8.1"
-
-[package.extras]
-dev = ["flake8", "markdown", "twine", "wheel"]
-
-[[package]]
-name = "griffe"
-version = "1.5.1"
-description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API."
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "griffe-1.5.1-py3-none-any.whl", hash = "sha256:ad6a7980f8c424c9102160aafa3bcdf799df0e75f7829d75af9ee5aef656f860"},
- {file = "griffe-1.5.1.tar.gz", hash = "sha256:72964f93e08c553257706d6cd2c42d1c172213feb48b2be386f243380b405d4b"},
-]
-
-[package.dependencies]
-colorama = ">=0.4"
-
-[[package]]
-name = "griffe-fieldz"
-version = "0.1.2"
-description = "Griffe extension adding support for data-class like things (pydantic, attrs, etc...)"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "griffe_fieldz-0.1.2-py3-none-any.whl", hash = "sha256:2528af30f5a1ff91c3a34e73225e3d173b80c28b3ba019bcadfde119b6344d98"},
- {file = "griffe_fieldz-0.1.2.tar.gz", hash = "sha256:7a109c0f3fc38cce2107f1ae6270045f937406587bd6c20a1d1e7565c9d8c57d"},
-]
-
-[package.dependencies]
-fieldz = ">=0.0.2"
-griffe = ">=0.35"
-
-[package.extras]
-dev = ["black", "ipython", "mypy", "pdbpp", "pre-commit", "rich", "ruff"]
-test = ["pytest", "pytest-cov"]
-
-[[package]]
-name = "idna"
-version = "3.10"
-description = "Internationalized Domain Names in Applications (IDNA)"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
- {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
-]
-
-[package.extras]
-all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
-
-[[package]]
-name = "importlib-metadata"
-version = "8.5.0"
-description = "Read metadata from Python packages"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"},
- {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"},
-]
-
-[package.dependencies]
-zipp = ">=3.20"
-
-[package.extras]
-check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
-cover = ["pytest-cov"]
-doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-enabler = ["pytest-enabler (>=2.2)"]
-perf = ["ipython"]
-test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"]
-type = ["pytest-mypy"]
-
-[[package]]
-name = "importlib-resources"
-version = "6.4.5"
-description = "Read resources from Python packages"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"},
- {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"},
-]
-
-[package.dependencies]
-zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""}
-
-[package.extras]
-check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
-cover = ["pytest-cov"]
-doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-enabler = ["pytest-enabler (>=2.2)"]
-test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"]
-type = ["pytest-mypy"]
-
-[[package]]
-name = "iniconfig"
-version = "2.0.0"
-description = "brain-dead simple config-ini parsing"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
- {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
-]
-
-[[package]]
-name = "inline-snapshot"
-version = "0.8.2"
-description = "golden master/snapshot/approval testing library which puts the values right into your source code"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "inline_snapshot-0.8.2-py3-none-any.whl", hash = "sha256:df365176dc04e8054c699981a834e4c4482cb42c34cb3378515e3f65d49a70df"},
- {file = "inline_snapshot-0.8.2.tar.gz", hash = "sha256:b20515b7bf01675b0f6adaadfd6277ef4456cd797c0735582b07f949a908c2f7"},
-]
-
-[package.dependencies]
-asttokens = ">=2.0.5"
-black = ">=23.3.0"
-click = ">=8.1.4"
-executing = ">=2.0.0"
-toml = ">=0.10.2"
-types-toml = ">=0.10.8.7"
-
-[[package]]
-name = "ipykernel"
-version = "6.29.5"
-description = "IPython Kernel for Jupyter"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"},
- {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"},
-]
-
-[package.dependencies]
-appnope = {version = "*", markers = "platform_system == \"Darwin\""}
-comm = ">=0.1.1"
-debugpy = ">=1.6.5"
-ipython = ">=7.23.1"
-jupyter-client = ">=6.1.12"
-jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
-matplotlib-inline = ">=0.1"
-nest-asyncio = "*"
-packaging = "*"
-psutil = "*"
-pyzmq = ">=24"
-tornado = ">=6.1"
-traitlets = ">=5.4.0"
-
-[package.extras]
-cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"]
-docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"]
-pyqt5 = ["pyqt5"]
-pyside6 = ["pyside6"]
-test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"]
-
-[[package]]
-name = "ipython"
-version = "8.18.1"
-description = "IPython: Productive Interactive Computing"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"},
- {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-decorator = "*"
-exceptiongroup = {version = "*", markers = "python_version < \"3.11\""}
-jedi = ">=0.16"
-matplotlib-inline = "*"
-pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""}
-prompt-toolkit = ">=3.0.41,<3.1.0"
-pygments = ">=2.4.0"
-stack-data = "*"
-traitlets = ">=5"
-typing-extensions = {version = "*", markers = "python_version < \"3.10\""}
-
-[package.extras]
-all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"]
-black = ["black"]
-doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"]
-kernel = ["ipykernel"]
-nbconvert = ["nbconvert"]
-nbformat = ["nbformat"]
-notebook = ["ipywidgets", "notebook"]
-parallel = ["ipyparallel"]
-qtconsole = ["qtconsole"]
-test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"]
-test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"]
-
-[[package]]
-name = "jedi"
-version = "0.19.2"
-description = "An autocompletion tool for Python that can be used for text editors."
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"},
- {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"},
-]
-
-[package.dependencies]
-parso = ">=0.8.4,<0.9.0"
-
-[package.extras]
-docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"]
-qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"]
-testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"]
-
-[[package]]
-name = "jinja2"
-version = "3.1.4"
-description = "A very fast and expressive template engine."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"},
- {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"},
-]
-
-[package.dependencies]
-MarkupSafe = ">=2.0"
-
-[package.extras]
-i18n = ["Babel (>=2.7)"]
-
-[[package]]
-name = "jupyter-client"
-version = "8.6.3"
-description = "Jupyter protocol implementation and client libraries"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"},
- {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"},
-]
-
-[package.dependencies]
-importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""}
-jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0"
-python-dateutil = ">=2.8.2"
-pyzmq = ">=23.0"
-tornado = ">=6.2"
-traitlets = ">=5.3"
-
-[package.extras]
-docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"]
-test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"]
-
-[[package]]
-name = "jupyter-core"
-version = "5.7.2"
-description = "Jupyter core package. A base package on which Jupyter projects rely."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"},
- {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"},
-]
-
-[package.dependencies]
-platformdirs = ">=2.5"
-pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""}
-traitlets = ">=5.3"
-
-[package.extras]
-docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"]
-test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"]
-
-[[package]]
-name = "kiwisolver"
-version = "1.4.7"
-description = "A fast implementation of the Cassowary constraint solver"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"},
- {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"},
- {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"},
- {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"},
- {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"},
- {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"},
- {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"},
- {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"},
- {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"},
- {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"},
- {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"},
- {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"},
- {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"},
- {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"},
- {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"},
- {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"},
- {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"},
- {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"},
- {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"},
- {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"},
- {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"},
- {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"},
- {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"},
- {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"},
- {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"},
- {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"},
- {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"},
- {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"},
- {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"},
- {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"},
- {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"},
- {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"},
- {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"},
- {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"},
- {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"},
- {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"},
- {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"},
- {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"},
- {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"},
- {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"},
- {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"},
- {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"},
- {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"},
- {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"},
- {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"},
- {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"},
- {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"},
- {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"},
- {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"},
- {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"},
- {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"},
- {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"},
- {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"},
- {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"},
- {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"},
- {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"},
- {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"},
- {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"},
- {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"},
- {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"},
- {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"},
- {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"},
- {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"},
- {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"},
- {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"},
- {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"},
- {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"},
- {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"},
- {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"},
- {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"},
- {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"},
- {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"},
- {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"},
- {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"},
- {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"},
- {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"},
- {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"},
- {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"},
- {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"},
- {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"},
- {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"},
- {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"},
- {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"},
- {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"},
- {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"},
- {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"},
- {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"},
- {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"},
- {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"},
- {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"},
- {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"},
- {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"},
- {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"},
- {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"},
- {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"},
- {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"},
- {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"},
- {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"},
- {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"},
- {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"},
- {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"},
- {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"},
- {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"},
- {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"},
- {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"},
- {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"},
- {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"},
- {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"},
- {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"},
- {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"},
- {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"},
- {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"},
- {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"},
- {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"},
-]
-
-[[package]]
-name = "lz4"
-version = "4.3.3"
-description = "LZ4 Bindings for Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "lz4-4.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b891880c187e96339474af2a3b2bfb11a8e4732ff5034be919aa9029484cd201"},
- {file = "lz4-4.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:222a7e35137d7539c9c33bb53fcbb26510c5748779364014235afc62b0ec797f"},
- {file = "lz4-4.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f76176492ff082657ada0d0f10c794b6da5800249ef1692b35cf49b1e93e8ef7"},
- {file = "lz4-4.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1d18718f9d78182c6b60f568c9a9cec8a7204d7cb6fad4e511a2ef279e4cb05"},
- {file = "lz4-4.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cdc60e21ec70266947a48839b437d46025076eb4b12c76bd47f8e5eb8a75dcc"},
- {file = "lz4-4.3.3-cp310-cp310-win32.whl", hash = "sha256:c81703b12475da73a5d66618856d04b1307e43428a7e59d98cfe5a5d608a74c6"},
- {file = "lz4-4.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:43cf03059c0f941b772c8aeb42a0813d68d7081c009542301637e5782f8a33e2"},
- {file = "lz4-4.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:30e8c20b8857adef7be045c65f47ab1e2c4fabba86a9fa9a997d7674a31ea6b6"},
- {file = "lz4-4.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2f7b1839f795315e480fb87d9bc60b186a98e3e5d17203c6e757611ef7dcef61"},
- {file = "lz4-4.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edfd858985c23523f4e5a7526ca6ee65ff930207a7ec8a8f57a01eae506aaee7"},
- {file = "lz4-4.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e9c410b11a31dbdc94c05ac3c480cb4b222460faf9231f12538d0074e56c563"},
- {file = "lz4-4.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2507ee9c99dbddd191c86f0e0c8b724c76d26b0602db9ea23232304382e1f21"},
- {file = "lz4-4.3.3-cp311-cp311-win32.whl", hash = "sha256:f180904f33bdd1e92967923a43c22899e303906d19b2cf8bb547db6653ea6e7d"},
- {file = "lz4-4.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:b14d948e6dce389f9a7afc666d60dd1e35fa2138a8ec5306d30cd2e30d36b40c"},
- {file = "lz4-4.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e36cd7b9d4d920d3bfc2369840da506fa68258f7bb176b8743189793c055e43d"},
- {file = "lz4-4.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:31ea4be9d0059c00b2572d700bf2c1bc82f241f2c3282034a759c9a4d6ca4dc2"},
- {file = "lz4-4.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33c9a6fd20767ccaf70649982f8f3eeb0884035c150c0b818ea660152cf3c809"},
- {file = "lz4-4.3.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca8fccc15e3add173da91be8f34121578dc777711ffd98d399be35487c934bf"},
- {file = "lz4-4.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d84b479ddf39fe3ea05387f10b779155fc0990125f4fb35d636114e1c63a2e"},
- {file = "lz4-4.3.3-cp312-cp312-win32.whl", hash = "sha256:337cb94488a1b060ef1685187d6ad4ba8bc61d26d631d7ba909ee984ea736be1"},
- {file = "lz4-4.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:5d35533bf2cee56f38ced91f766cd0038b6abf46f438a80d50c52750088be93f"},
- {file = "lz4-4.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:363ab65bf31338eb364062a15f302fc0fab0a49426051429866d71c793c23394"},
- {file = "lz4-4.3.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a136e44a16fc98b1abc404fbabf7f1fada2bdab6a7e970974fb81cf55b636d0"},
- {file = "lz4-4.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abc197e4aca8b63f5ae200af03eb95fb4b5055a8f990079b5bdf042f568469dd"},
- {file = "lz4-4.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56f4fe9c6327adb97406f27a66420b22ce02d71a5c365c48d6b656b4aaeb7775"},
- {file = "lz4-4.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f0e822cd7644995d9ba248cb4b67859701748a93e2ab7fc9bc18c599a52e4604"},
- {file = "lz4-4.3.3-cp38-cp38-win32.whl", hash = "sha256:24b3206de56b7a537eda3a8123c644a2b7bf111f0af53bc14bed90ce5562d1aa"},
- {file = "lz4-4.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:b47839b53956e2737229d70714f1d75f33e8ac26e52c267f0197b3189ca6de24"},
- {file = "lz4-4.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6756212507405f270b66b3ff7f564618de0606395c0fe10a7ae2ffcbbe0b1fba"},
- {file = "lz4-4.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee9ff50557a942d187ec85462bb0960207e7ec5b19b3b48949263993771c6205"},
- {file = "lz4-4.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b901c7784caac9a1ded4555258207d9e9697e746cc8532129f150ffe1f6ba0d"},
- {file = "lz4-4.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d9ec061b9eca86e4dcc003d93334b95d53909afd5a32c6e4f222157b50c071"},
- {file = "lz4-4.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4c7bf687303ca47d69f9f0133274958fd672efaa33fb5bcde467862d6c621f0"},
- {file = "lz4-4.3.3-cp39-cp39-win32.whl", hash = "sha256:054b4631a355606e99a42396f5db4d22046a3397ffc3269a348ec41eaebd69d2"},
- {file = "lz4-4.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:eac9af361e0d98335a02ff12fb56caeb7ea1196cf1a49dbf6f17828a131da807"},
- {file = "lz4-4.3.3.tar.gz", hash = "sha256:01fe674ef2889dbb9899d8a67361e0c4a2c833af5aeb37dd505727cf5d2a131e"},
-]
-
-[package.extras]
-docs = ["sphinx (>=1.6.0)", "sphinx-bootstrap-theme"]
-flake8 = ["flake8"]
-tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"]
-
-[[package]]
-name = "markdown"
-version = "3.7"
-description = "Python implementation of John Gruber's Markdown."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"},
- {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"},
-]
-
-[package.dependencies]
-importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""}
-
-[package.extras]
-docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"]
-testing = ["coverage", "pyyaml"]
-
-[[package]]
-name = "markdown-katex"
-version = "202112.1034"
-description = "katex extension for Python Markdown"
-optional = false
-python-versions = ">=2.7"
-files = [
- {file = "markdown-katex-202112.1034.tar.gz", hash = "sha256:27892f4cdd6763816f00e4187d0475500697c090aba16630ec4803a6564bf810"},
- {file = "markdown_katex-202112.1034-py2.py3-none-any.whl", hash = "sha256:9ccc5b4b37db7592cc3ea113d763fafe9ffd1b1587e2c217d6145e44a10b4f6d"},
-]
-
-[package.dependencies]
-Markdown = {version = ">=3.0", markers = "python_version >= \"3.6\""}
-pathlib2 = "*"
-setuptools = "*"
-
-[[package]]
-name = "markupsafe"
-version = "3.0.2"
-description = "Safely add untrusted strings to HTML/XML markup."
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"},
- {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
-]
-
-[[package]]
-name = "matplotlib"
-version = "3.9.2"
-description = "Python plotting package"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "matplotlib-3.9.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9d78bbc0cbc891ad55b4f39a48c22182e9bdaea7fc0e5dbd364f49f729ca1bbb"},
- {file = "matplotlib-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c375cc72229614632c87355366bdf2570c2dac01ac66b8ad048d2dabadf2d0d4"},
- {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d94ff717eb2bd0b58fe66380bd8b14ac35f48a98e7c6765117fe67fb7684e64"},
- {file = "matplotlib-3.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab68d50c06938ef28681073327795c5db99bb4666214d2d5f880ed11aeaded66"},
- {file = "matplotlib-3.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:65aacf95b62272d568044531e41de26285d54aec8cb859031f511f84bd8b495a"},
- {file = "matplotlib-3.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:3fd595f34aa8a55b7fc8bf9ebea8aa665a84c82d275190a61118d33fbc82ccae"},
- {file = "matplotlib-3.9.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8dd059447824eec055e829258ab092b56bb0579fc3164fa09c64f3acd478772"},
- {file = "matplotlib-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c797dac8bb9c7a3fd3382b16fe8f215b4cf0f22adccea36f1545a6d7be310b41"},
- {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d719465db13267bcef19ea8954a971db03b9f48b4647e3860e4bc8e6ed86610f"},
- {file = "matplotlib-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8912ef7c2362f7193b5819d17dae8629b34a95c58603d781329712ada83f9447"},
- {file = "matplotlib-3.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7741f26a58a240f43bee74965c4882b6c93df3e7eb3de160126d8c8f53a6ae6e"},
- {file = "matplotlib-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:ae82a14dab96fbfad7965403c643cafe6515e386de723e498cf3eeb1e0b70cc7"},
- {file = "matplotlib-3.9.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac43031375a65c3196bee99f6001e7fa5bdfb00ddf43379d3c0609bdca042df9"},
- {file = "matplotlib-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be0fc24a5e4531ae4d8e858a1a548c1fe33b176bb13eff7f9d0d38ce5112a27d"},
- {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf81de2926c2db243c9b2cbc3917619a0fc85796c6ba4e58f541df814bbf83c7"},
- {file = "matplotlib-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ee45bc4245533111ced13f1f2cace1e7f89d1c793390392a80c139d6cf0e6c"},
- {file = "matplotlib-3.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:306c8dfc73239f0e72ac50e5a9cf19cc4e8e331dd0c54f5e69ca8758550f1e1e"},
- {file = "matplotlib-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:5413401594cfaff0052f9d8b1aafc6d305b4bd7c4331dccd18f561ff7e1d3bd3"},
- {file = "matplotlib-3.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:18128cc08f0d3cfff10b76baa2f296fc28c4607368a8402de61bb3f2eb33c7d9"},
- {file = "matplotlib-3.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4876d7d40219e8ae8bb70f9263bcbe5714415acfdf781086601211335e24f8aa"},
- {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9f07a80deab4bb0b82858a9e9ad53d1382fd122be8cde11080f4e7dfedb38b"},
- {file = "matplotlib-3.9.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7c0410f181a531ec4e93bbc27692f2c71a15c2da16766f5ba9761e7ae518413"},
- {file = "matplotlib-3.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:909645cce2dc28b735674ce0931a4ac94e12f5b13f6bb0b5a5e65e7cea2c192b"},
- {file = "matplotlib-3.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:f32c7410c7f246838a77d6d1eff0c0f87f3cb0e7c4247aebea71a6d5a68cab49"},
- {file = "matplotlib-3.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:37e51dd1c2db16ede9cfd7b5cabdfc818b2c6397c83f8b10e0e797501c963a03"},
- {file = "matplotlib-3.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b82c5045cebcecd8496a4d694d43f9cc84aeeb49fe2133e036b207abe73f4d30"},
- {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f053c40f94bc51bc03832a41b4f153d83f2062d88c72b5e79997072594e97e51"},
- {file = "matplotlib-3.9.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbe196377a8248972f5cede786d4c5508ed5f5ca4a1e09b44bda889958b33f8c"},
- {file = "matplotlib-3.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5816b1e1fe8c192cbc013f8f3e3368ac56fbecf02fb41b8f8559303f24c5015e"},
- {file = "matplotlib-3.9.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:cef2a73d06601437be399908cf13aee74e86932a5ccc6ccdf173408ebc5f6bb2"},
- {file = "matplotlib-3.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e0830e188029c14e891fadd99702fd90d317df294c3298aad682739c5533721a"},
- {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03ba9c1299c920964e8d3857ba27173b4dbb51ca4bab47ffc2c2ba0eb5e2cbc5"},
- {file = "matplotlib-3.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd93b91ab47a3616b4d3c42b52f8363b88ca021e340804c6ab2536344fad9ca"},
- {file = "matplotlib-3.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6d1ce5ed2aefcdce11904fc5bbea7d9c21fff3d5f543841edf3dea84451a09ea"},
- {file = "matplotlib-3.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:b2696efdc08648536efd4e1601b5fd491fd47f4db97a5fbfd175549a7365c1b2"},
- {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:d52a3b618cb1cbb769ce2ee1dcdb333c3ab6e823944e9a2d36e37253815f9556"},
- {file = "matplotlib-3.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:039082812cacd6c6bec8e17a9c1e6baca230d4116d522e81e1f63a74d01d2e21"},
- {file = "matplotlib-3.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6758baae2ed64f2331d4fd19be38b7b4eae3ecec210049a26b6a4f3ae1c85dcc"},
- {file = "matplotlib-3.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:050598c2b29e0b9832cde72bcf97627bf00262adbc4a54e2b856426bb2ef0697"},
- {file = "matplotlib-3.9.2.tar.gz", hash = "sha256:96ab43906269ca64a6366934106fa01534454a69e471b7bf3d79083981aaab92"},
-]
-
-[package.dependencies]
-contourpy = ">=1.0.1"
-cycler = ">=0.10"
-fonttools = ">=4.22.0"
-importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""}
-kiwisolver = ">=1.3.1"
-numpy = ">=1.23"
-packaging = ">=20.0"
-pillow = ">=8"
-pyparsing = ">=2.3.1"
-python-dateutil = ">=2.7"
-
-[package.extras]
-dev = ["meson-python (>=0.13.1)", "numpy (>=1.25)", "pybind11 (>=2.6)", "setuptools (>=64)", "setuptools_scm (>=7)"]
-
-[[package]]
-name = "matplotlib-inline"
-version = "0.1.7"
-description = "Inline Matplotlib backend for Jupyter"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"},
- {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"},
-]
-
-[package.dependencies]
-traitlets = "*"
-
-[[package]]
-name = "mergedeep"
-version = "1.3.4"
-description = "A deep merge function for 🐍."
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"},
- {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"},
-]
-
-[[package]]
-name = "mkdocs"
-version = "1.6.1"
-description = "Project documentation with Markdown."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"},
- {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"},
-]
-
-[package.dependencies]
-click = ">=7.0"
-colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""}
-ghp-import = ">=1.0"
-importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""}
-jinja2 = ">=2.11.1"
-markdown = ">=3.3.6"
-markupsafe = ">=2.0.1"
-mergedeep = ">=1.3.4"
-mkdocs-get-deps = ">=0.2.0"
-packaging = ">=20.5"
-pathspec = ">=0.11.1"
-pyyaml = ">=5.1"
-pyyaml-env-tag = ">=0.1"
-watchdog = ">=2.0"
-
-[package.extras]
-i18n = ["babel (>=2.9.0)"]
-min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"]
-
-[[package]]
-name = "mkdocs-autorefs"
-version = "1.2.0"
-description = "Automatically link across pages in MkDocs."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "mkdocs_autorefs-1.2.0-py3-none-any.whl", hash = "sha256:d588754ae89bd0ced0c70c06f58566a4ee43471eeeee5202427da7de9ef85a2f"},
- {file = "mkdocs_autorefs-1.2.0.tar.gz", hash = "sha256:a86b93abff653521bda71cf3fc5596342b7a23982093915cb74273f67522190f"},
-]
-
-[package.dependencies]
-Markdown = ">=3.3"
-markupsafe = ">=2.0.1"
-mkdocs = ">=1.1"
-
-[[package]]
-name = "mkdocs-gen-files"
-version = "0.5.0"
-description = "MkDocs plugin to programmatically generate documentation pages during the build"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "mkdocs_gen_files-0.5.0-py3-none-any.whl", hash = "sha256:7ac060096f3f40bd19039e7277dd3050be9a453c8ac578645844d4d91d7978ea"},
- {file = "mkdocs_gen_files-0.5.0.tar.gz", hash = "sha256:4c7cf256b5d67062a788f6b1d035e157fc1a9498c2399be9af5257d4ff4d19bc"},
-]
-
-[package.dependencies]
-mkdocs = ">=1.0.3"
-
-[[package]]
-name = "mkdocs-get-deps"
-version = "0.2.0"
-description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"},
- {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"},
-]
-
-[package.dependencies]
-importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""}
-mergedeep = ">=1.3.4"
-platformdirs = ">=2.2.0"
-pyyaml = ">=5.1"
-
-[[package]]
-name = "mkdocs-glightbox"
-version = "0.3.7"
-description = "MkDocs plugin supports image lightbox with GLightbox."
-optional = false
-python-versions = "*"
-files = [
- {file = "mkdocs-glightbox-0.3.7.tar.gz", hash = "sha256:4e890140a97dd4ad128cb92174384bd0ac33adec3304bbd2b7c48d0847685c4f"},
- {file = "mkdocs_glightbox-0.3.7-py3-none-any.whl", hash = "sha256:9659631a9829d93d8fb0ce3a20a10261c258605ba4dc87a3b7b5d847b93a276d"},
-]
-
-[[package]]
-name = "mkdocs-literate-nav"
-version = "0.6.1"
-description = "MkDocs plugin to specify the navigation in Markdown instead of YAML"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "mkdocs_literate_nav-0.6.1-py3-none-any.whl", hash = "sha256:e70bdc4a07050d32da79c0b697bd88e9a104cf3294282e9cb20eec94c6b0f401"},
- {file = "mkdocs_literate_nav-0.6.1.tar.gz", hash = "sha256:78a7ab6d878371728acb0cdc6235c9b0ffc6e83c997b037f4a5c6ff7cef7d759"},
-]
-
-[package.dependencies]
-mkdocs = ">=1.0.3"
-
-[[package]]
-name = "mkdocs-material"
-version = "9.5.44"
-description = "Documentation that simply works"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "mkdocs_material-9.5.44-py3-none-any.whl", hash = "sha256:47015f9c167d58a5ff5e682da37441fc4d66a1c79334bfc08d774763cacf69ca"},
- {file = "mkdocs_material-9.5.44.tar.gz", hash = "sha256:f3a6c968e524166b3f3ed1fb97d3ed3e0091183b0545cedf7156a2a6804c56c0"},
-]
-
-[package.dependencies]
-babel = ">=2.10,<3.0"
-colorama = ">=0.4,<1.0"
-jinja2 = ">=3.0,<4.0"
-markdown = ">=3.2,<4.0"
-mkdocs = ">=1.6,<2.0"
-mkdocs-material-extensions = ">=1.3,<2.0"
-paginate = ">=0.5,<1.0"
-pygments = ">=2.16,<3.0"
-pymdown-extensions = ">=10.2,<11.0"
-regex = ">=2022.4"
-requests = ">=2.26,<3.0"
-
-[package.extras]
-git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"]
-imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.0)"]
-recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"]
-
-[[package]]
-name = "mkdocs-material-extensions"
-version = "1.3.1"
-description = "Extension pack for Python Markdown and MkDocs Material."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"},
- {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"},
-]
-
-[[package]]
-name = "mkdocs-section-index"
-version = "0.3.9"
-description = "MkDocs plugin to allow clickable sections that lead to an index page"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "mkdocs_section_index-0.3.9-py3-none-any.whl", hash = "sha256:5e5eb288e8d7984d36c11ead5533f376fdf23498f44e903929d72845b24dfe34"},
- {file = "mkdocs_section_index-0.3.9.tar.gz", hash = "sha256:b66128d19108beceb08b226ee1ba0981840d14baf8a652b6c59e650f3f92e4f8"},
-]
-
-[package.dependencies]
-mkdocs = ">=1.2"
-
-[[package]]
-name = "mkdocstrings"
-version = "0.24.3"
-description = "Automatic documentation from sources, for MkDocs."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "mkdocstrings-0.24.3-py3-none-any.whl", hash = "sha256:5c9cf2a32958cd161d5428699b79c8b0988856b0d4a8c5baf8395fc1bf4087c3"},
- {file = "mkdocstrings-0.24.3.tar.gz", hash = "sha256:f327b234eb8d2551a306735436e157d0a22d45f79963c60a8b585d5f7a94c1d2"},
-]
-
-[package.dependencies]
-click = ">=7.0"
-importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""}
-Jinja2 = ">=2.11.1"
-Markdown = ">=3.3"
-MarkupSafe = ">=1.1"
-mkdocs = ">=1.4"
-mkdocs-autorefs = ">=0.3.1"
-mkdocstrings-python = {version = ">=0.5.2", optional = true, markers = "extra == \"python\""}
-platformdirs = ">=2.2.0"
-pymdown-extensions = ">=6.3"
-typing-extensions = {version = ">=4.1", markers = "python_version < \"3.10\""}
-
-[package.extras]
-crystal = ["mkdocstrings-crystal (>=0.3.4)"]
-python = ["mkdocstrings-python (>=0.5.2)"]
-python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"]
-
-[[package]]
-name = "mkdocstrings-python"
-version = "1.10.0"
-description = "A Python handler for mkdocstrings."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "mkdocstrings_python-1.10.0-py3-none-any.whl", hash = "sha256:ba833fbd9d178a4b9d5cb2553a4df06e51dc1f51e41559a4d2398c16a6f69ecc"},
- {file = "mkdocstrings_python-1.10.0.tar.gz", hash = "sha256:71678fac657d4d2bb301eed4e4d2d91499c095fd1f8a90fa76422a87a5693828"},
-]
-
-[package.dependencies]
-griffe = ">=0.44"
-mkdocstrings = ">=0.24.2"
-
-[[package]]
-name = "mypy-extensions"
-version = "1.0.0"
-description = "Type system extensions for programs checked with the mypy type checker."
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
- {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
-]
-
-[[package]]
-name = "nest-asyncio"
-version = "1.6.0"
-description = "Patch asyncio to allow nested event loops"
-optional = false
-python-versions = ">=3.5"
-files = [
- {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"},
- {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"},
-]
-
-[[package]]
-name = "numpy"
-version = "1.26.4"
-description = "Fundamental package for array computing in Python"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"},
- {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"},
- {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"},
- {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"},
- {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"},
- {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"},
- {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"},
- {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"},
- {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"},
- {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"},
- {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"},
- {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"},
- {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"},
- {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"},
- {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"},
- {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"},
- {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"},
- {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"},
- {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"},
- {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"},
- {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"},
- {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"},
- {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"},
- {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"},
- {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"},
- {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"},
- {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"},
- {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"},
- {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"},
- {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"},
- {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"},
- {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"},
- {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"},
- {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"},
- {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"},
- {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"},
-]
-
-[[package]]
-name = "packaging"
-version = "24.2"
-description = "Core utilities for Python packages"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
- {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
-]
-
-[[package]]
-name = "paginate"
-version = "0.5.7"
-description = "Divides large result sets into pages for easier browsing"
-optional = false
-python-versions = "*"
-files = [
- {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"},
- {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"},
-]
-
-[package.extras]
-dev = ["pytest", "tox"]
-lint = ["black"]
-
-[[package]]
-name = "pandas"
-version = "2.2.3"
-description = "Powerful data structures for data analysis, time series, and statistics"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5"},
- {file = "pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348"},
- {file = "pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed"},
- {file = "pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57"},
- {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42"},
- {file = "pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f"},
- {file = "pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645"},
- {file = "pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039"},
- {file = "pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd"},
- {file = "pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698"},
- {file = "pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc"},
- {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3"},
- {file = "pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32"},
- {file = "pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5"},
- {file = "pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9"},
- {file = "pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4"},
- {file = "pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3"},
- {file = "pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319"},
- {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8"},
- {file = "pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a"},
- {file = "pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13"},
- {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"},
- {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"},
- {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"},
- {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"},
- {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"},
- {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"},
- {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"},
- {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"},
- {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"},
- {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"},
- {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"},
- {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"},
- {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"},
- {file = "pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39"},
- {file = "pandas-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30"},
- {file = "pandas-2.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c"},
- {file = "pandas-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c"},
- {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea"},
- {file = "pandas-2.2.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761"},
- {file = "pandas-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e"},
- {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"},
-]
-
-[package.dependencies]
-numpy = [
- {version = ">=1.22.4", markers = "python_version < \"3.11\""},
- {version = ">=1.23.2", markers = "python_version == \"3.11\""},
- {version = ">=1.26.0", markers = "python_version >= \"3.12\""},
-]
-python-dateutil = ">=2.8.2"
-pytz = ">=2020.1"
-tzdata = ">=2022.7"
-
-[package.extras]
-all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"]
-aws = ["s3fs (>=2022.11.0)"]
-clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"]
-compression = ["zstandard (>=0.19.0)"]
-computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"]
-consortium-standard = ["dataframe-api-compat (>=0.1.7)"]
-excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"]
-feather = ["pyarrow (>=10.0.1)"]
-fss = ["fsspec (>=2022.11.0)"]
-gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"]
-hdf5 = ["tables (>=3.8.0)"]
-html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"]
-mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"]
-output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"]
-parquet = ["pyarrow (>=10.0.1)"]
-performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"]
-plot = ["matplotlib (>=3.6.3)"]
-postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"]
-pyarrow = ["pyarrow (>=10.0.1)"]
-spss = ["pyreadstat (>=1.2.0)"]
-sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"]
-test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"]
-xml = ["lxml (>=4.9.2)"]
-
-[[package]]
-name = "parso"
-version = "0.8.4"
-description = "A Python Parser"
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"},
- {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"},
-]
-
-[package.extras]
-qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"]
-testing = ["docopt", "pytest"]
-
-[[package]]
-name = "pathlib2"
-version = "2.3.7.post1"
-description = "Object-oriented filesystem paths"
-optional = false
-python-versions = "*"
-files = [
- {file = "pathlib2-2.3.7.post1-py2.py3-none-any.whl", hash = "sha256:5266a0fd000452f1b3467d782f079a4343c63aaa119221fbdc4e39577489ca5b"},
- {file = "pathlib2-2.3.7.post1.tar.gz", hash = "sha256:9fe0edad898b83c0c3e199c842b27ed216645d2e177757b2dd67384d4113c641"},
-]
-
-[package.dependencies]
-six = "*"
-
-[[package]]
-name = "pathspec"
-version = "0.12.1"
-description = "Utility library for gitignore style pattern matching of file paths."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
- {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
-]
-
-[[package]]
-name = "pexpect"
-version = "4.9.0"
-description = "Pexpect allows easy control of interactive console applications."
-optional = false
-python-versions = "*"
-files = [
- {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"},
- {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"},
-]
-
-[package.dependencies]
-ptyprocess = ">=0.5"
-
-[[package]]
-name = "pillow"
-version = "11.0.0"
-description = "Python Imaging Library (Fork)"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "pillow-11.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947"},
- {file = "pillow-11.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba"},
- {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086"},
- {file = "pillow-11.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9"},
- {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488"},
- {file = "pillow-11.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f"},
- {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb"},
- {file = "pillow-11.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97"},
- {file = "pillow-11.0.0-cp310-cp310-win32.whl", hash = "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50"},
- {file = "pillow-11.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c"},
- {file = "pillow-11.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1"},
- {file = "pillow-11.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc"},
- {file = "pillow-11.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a"},
- {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3"},
- {file = "pillow-11.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5"},
- {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b"},
- {file = "pillow-11.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa"},
- {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306"},
- {file = "pillow-11.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9"},
- {file = "pillow-11.0.0-cp311-cp311-win32.whl", hash = "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5"},
- {file = "pillow-11.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291"},
- {file = "pillow-11.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9"},
- {file = "pillow-11.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923"},
- {file = "pillow-11.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903"},
- {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4"},
- {file = "pillow-11.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f"},
- {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"},
- {file = "pillow-11.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7"},
- {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6"},
- {file = "pillow-11.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc"},
- {file = "pillow-11.0.0-cp312-cp312-win32.whl", hash = "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6"},
- {file = "pillow-11.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47"},
- {file = "pillow-11.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25"},
- {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"},
- {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"},
- {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"},
- {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"},
- {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"},
- {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"},
- {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"},
- {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"},
- {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"},
- {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"},
- {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"},
- {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"},
- {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"},
- {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"},
- {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"},
- {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"},
- {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"},
- {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"},
- {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"},
- {file = "pillow-11.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba"},
- {file = "pillow-11.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a"},
- {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916"},
- {file = "pillow-11.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d"},
- {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7"},
- {file = "pillow-11.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e"},
- {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f"},
- {file = "pillow-11.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae"},
- {file = "pillow-11.0.0-cp39-cp39-win32.whl", hash = "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4"},
- {file = "pillow-11.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd"},
- {file = "pillow-11.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd"},
- {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2"},
- {file = "pillow-11.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2"},
- {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b"},
- {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2"},
- {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830"},
- {file = "pillow-11.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734"},
- {file = "pillow-11.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316"},
- {file = "pillow-11.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06"},
- {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273"},
- {file = "pillow-11.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790"},
- {file = "pillow-11.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944"},
- {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"},
-]
-
-[package.extras]
-docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"]
-fpx = ["olefile"]
-mic = ["olefile"]
-tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
-typing = ["typing-extensions"]
-xmp = ["defusedxml"]
-
-[[package]]
-name = "platformdirs"
-version = "4.3.6"
-description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"},
- {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"},
-]
-
-[package.extras]
-docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"]
-test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"]
-type = ["mypy (>=1.11.2)"]
-
-[[package]]
-name = "pluggy"
-version = "1.5.0"
-description = "plugin and hook calling mechanisms for python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"},
- {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"},
-]
-
-[package.extras]
-dev = ["pre-commit", "tox"]
-testing = ["pytest", "pytest-benchmark"]
-
-[[package]]
-name = "prompt-toolkit"
-version = "3.0.48"
-description = "Library for building powerful interactive command lines in Python"
-optional = false
-python-versions = ">=3.7.0"
-files = [
- {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"},
- {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"},
-]
-
-[package.dependencies]
-wcwidth = "*"
-
-[[package]]
-name = "psutil"
-version = "6.1.0"
-description = "Cross-platform lib for process and system monitoring in Python."
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
-files = [
- {file = "psutil-6.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0"},
- {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942"},
- {file = "psutil-6.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047"},
- {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76"},
- {file = "psutil-6.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc"},
- {file = "psutil-6.1.0-cp27-none-win32.whl", hash = "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e"},
- {file = "psutil-6.1.0-cp27-none-win_amd64.whl", hash = "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85"},
- {file = "psutil-6.1.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688"},
- {file = "psutil-6.1.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e"},
- {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38"},
- {file = "psutil-6.1.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b"},
- {file = "psutil-6.1.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a"},
- {file = "psutil-6.1.0-cp36-cp36m-win32.whl", hash = "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca"},
- {file = "psutil-6.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747"},
- {file = "psutil-6.1.0-cp37-abi3-win32.whl", hash = "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e"},
- {file = "psutil-6.1.0-cp37-abi3-win_amd64.whl", hash = "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be"},
- {file = "psutil-6.1.0.tar.gz", hash = "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a"},
-]
-
-[package.extras]
-dev = ["black", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest-cov", "requests", "rstcheck", "ruff", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "wheel"]
-test = ["pytest", "pytest-xdist", "setuptools"]
-
-[[package]]
-name = "ptyprocess"
-version = "0.7.0"
-description = "Run a subprocess in a pseudo terminal"
-optional = false
-python-versions = "*"
-files = [
- {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"},
- {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"},
-]
-
-[[package]]
-name = "pure-eval"
-version = "0.2.3"
-description = "Safely evaluate AST nodes without side effects"
-optional = false
-python-versions = "*"
-files = [
- {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"},
- {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"},
-]
-
-[package.extras]
-tests = ["pytest"]
-
-[[package]]
-name = "pycparser"
-version = "2.22"
-description = "C parser in Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"},
- {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"},
-]
-
-[[package]]
-name = "pydantic"
-version = "2.9.2"
-description = "Data validation using Python type hints"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12"},
- {file = "pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f"},
-]
-
-[package.dependencies]
-annotated-types = ">=0.6.0"
-pydantic-core = "2.23.4"
-typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""}
-
-[package.extras]
-email = ["email-validator (>=2.0.0)"]
-timezone = ["tzdata"]
-
-[[package]]
-name = "pydantic-core"
-version = "2.23.4"
-description = "Core functionality for Pydantic validation and serialization"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pydantic_core-2.23.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10bd51f823d891193d4717448fab065733958bdb6a6b351967bd349d48d5c9b"},
- {file = "pydantic_core-2.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4fc714bdbfb534f94034efaa6eadd74e5b93c8fa6315565a222f7b6f42ca1166"},
- {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63e46b3169866bd62849936de036f901a9356e36376079b05efa83caeaa02ceb"},
- {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed1a53de42fbe34853ba90513cea21673481cd81ed1be739f7f2efb931b24916"},
- {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cfdd16ab5e59fc31b5e906d1a3f666571abc367598e3e02c83403acabc092e07"},
- {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255a8ef062cbf6674450e668482456abac99a5583bbafb73f9ad469540a3a232"},
- {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a7cd62e831afe623fbb7aabbb4fe583212115b3ef38a9f6b71869ba644624a2"},
- {file = "pydantic_core-2.23.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f09e2ff1f17c2b51f2bc76d1cc33da96298f0a036a137f5440ab3ec5360b624f"},
- {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e38e63e6f3d1cec5a27e0afe90a085af8b6806ee208b33030e65b6516353f1a3"},
- {file = "pydantic_core-2.23.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0dbd8dbed2085ed23b5c04afa29d8fd2771674223135dc9bc937f3c09284d071"},
- {file = "pydantic_core-2.23.4-cp310-none-win32.whl", hash = "sha256:6531b7ca5f951d663c339002e91aaebda765ec7d61b7d1e3991051906ddde119"},
- {file = "pydantic_core-2.23.4-cp310-none-win_amd64.whl", hash = "sha256:7c9129eb40958b3d4500fa2467e6a83356b3b61bfff1b414c7361d9220f9ae8f"},
- {file = "pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8"},
- {file = "pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d"},
- {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e"},
- {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607"},
- {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd"},
- {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea"},
- {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e"},
- {file = "pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b"},
- {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0"},
- {file = "pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64"},
- {file = "pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f"},
- {file = "pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3"},
- {file = "pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231"},
- {file = "pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee"},
- {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87"},
- {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8"},
- {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327"},
- {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2"},
- {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36"},
- {file = "pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126"},
- {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e"},
- {file = "pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24"},
- {file = "pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84"},
- {file = "pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9"},
- {file = "pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc"},
- {file = "pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd"},
- {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05"},
- {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d"},
- {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510"},
- {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6"},
- {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b"},
- {file = "pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327"},
- {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6"},
- {file = "pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f"},
- {file = "pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769"},
- {file = "pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5"},
- {file = "pydantic_core-2.23.4-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d4488a93b071c04dc20f5cecc3631fc78b9789dd72483ba15d423b5b3689b555"},
- {file = "pydantic_core-2.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:81965a16b675b35e1d09dd14df53f190f9129c0202356ed44ab2728b1c905658"},
- {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffa2ebd4c8530079140dd2d7f794a9d9a73cbb8e9d59ffe24c63436efa8f271"},
- {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61817945f2fe7d166e75fbfb28004034b48e44878177fc54d81688e7b85a3665"},
- {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29d2c342c4bc01b88402d60189f3df065fb0dda3654744d5a165a5288a657368"},
- {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e11661ce0fd30a6790e8bcdf263b9ec5988e95e63cf901972107efc49218b13"},
- {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d18368b137c6295db49ce7218b1a9ba15c5bc254c96d7c9f9e924a9bc7825ad"},
- {file = "pydantic_core-2.23.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec4e55f79b1c4ffb2eecd8a0cfba9955a2588497d96851f4c8f99aa4a1d39b12"},
- {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:374a5e5049eda9e0a44c696c7ade3ff355f06b1fe0bb945ea3cac2bc336478a2"},
- {file = "pydantic_core-2.23.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5c364564d17da23db1106787675fc7af45f2f7b58b4173bfdd105564e132e6fb"},
- {file = "pydantic_core-2.23.4-cp38-none-win32.whl", hash = "sha256:d7a80d21d613eec45e3d41eb22f8f94ddc758a6c4720842dc74c0581f54993d6"},
- {file = "pydantic_core-2.23.4-cp38-none-win_amd64.whl", hash = "sha256:5f5ff8d839f4566a474a969508fe1c5e59c31c80d9e140566f9a37bba7b8d556"},
- {file = "pydantic_core-2.23.4-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a4fa4fc04dff799089689f4fd502ce7d59de529fc2f40a2c8836886c03e0175a"},
- {file = "pydantic_core-2.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a7df63886be5e270da67e0966cf4afbae86069501d35c8c1b3b6c168f42cb36"},
- {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcedcd19a557e182628afa1d553c3895a9f825b936415d0dbd3cd0bbcfd29b4b"},
- {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f54b118ce5de9ac21c363d9b3caa6c800341e8c47a508787e5868c6b79c9323"},
- {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d2f57d3e1379a9525c5ab067b27dbb8a0642fb5d454e17a9ac434f9ce523e3"},
- {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:de6d1d1b9e5101508cb37ab0d972357cac5235f5c6533d1071964c47139257df"},
- {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1278e0d324f6908e872730c9102b0112477a7f7cf88b308e4fc36ce1bdb6d58c"},
- {file = "pydantic_core-2.23.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a6b5099eeec78827553827f4c6b8615978bb4b6a88e5d9b93eddf8bb6790f55"},
- {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e55541f756f9b3ee346b840103f32779c695a19826a4c442b7954550a0972040"},
- {file = "pydantic_core-2.23.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5c7ba8ffb6d6f8f2ab08743be203654bb1aaa8c9dcb09f82ddd34eadb695605"},
- {file = "pydantic_core-2.23.4-cp39-none-win32.whl", hash = "sha256:37b0fe330e4a58d3c58b24d91d1eb102aeec675a3db4c292ec3928ecd892a9a6"},
- {file = "pydantic_core-2.23.4-cp39-none-win_amd64.whl", hash = "sha256:1498bec4c05c9c787bde9125cfdcc63a41004ff167f495063191b863399b1a29"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f455ee30a9d61d3e1a15abd5068827773d6e4dc513e795f380cdd59932c782d5"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e90d2e3bd2c3863d48525d297cd143fe541be8bbf6f579504b9712cb6b643ec"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e203fdf807ac7e12ab59ca2bfcabb38c7cf0b33c41efeb00f8e5da1d86af480"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e08277a400de01bc72436a0ccd02bdf596631411f592ad985dcee21445bd0068"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f220b0eea5965dec25480b6333c788fb72ce5f9129e8759ef876a1d805d00801"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d06b0c8da4f16d1d1e352134427cb194a0a6e19ad5db9161bf32b2113409e728"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:ba1a0996f6c2773bd83e63f18914c1de3c9dd26d55f4ac302a7efe93fb8e7433"},
- {file = "pydantic_core-2.23.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:9a5bce9d23aac8f0cf0836ecfc033896aa8443b501c58d0602dbfd5bd5b37753"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:78ddaaa81421a29574a682b3179d4cf9e6d405a09b99d93ddcf7e5239c742e21"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:883a91b5dd7d26492ff2f04f40fbb652de40fcc0afe07e8129e8ae779c2110eb"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88ad334a15b32a791ea935af224b9de1bf99bcd62fabf745d5f3442199d86d59"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:233710f069d251feb12a56da21e14cca67994eab08362207785cf8c598e74577"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:19442362866a753485ba5e4be408964644dd6a09123d9416c54cd49171f50744"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:624e278a7d29b6445e4e813af92af37820fafb6dcc55c012c834f9e26f9aaaef"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f5ef8f42bec47f21d07668a043f077d507e5bf4e668d5c6dfe6aaba89de1a5b8"},
- {file = "pydantic_core-2.23.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:aea443fffa9fbe3af1a9ba721a87f926fe548d32cab71d188a6ede77d0ff244e"},
- {file = "pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863"},
-]
-
-[package.dependencies]
-typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0"
-
-[[package]]
-name = "pydantic-numpy"
-version = "4.2.0"
-description = "Pydantic Model integration of the NumPy array"
-optional = false
-python-versions = ">=3.9,<3.13"
-files = [
- {file = "pydantic_numpy-4.2.0-py3-none-any.whl", hash = "sha256:9c81ca03ee10cb50fa098acc030a1a9f070570e346aa6b415077823f057526de"},
- {file = "pydantic_numpy-4.2.0.tar.gz", hash = "sha256:0f8f8a90b9d308a567c175de7a32fdf9bd9a938af7e85eaea27899562127aa2c"},
-]
-
-[package.dependencies]
-compress-pickle = {version = "*", extras = ["lz4"]}
-numpy = ">=1.23.0"
-pydantic = ">=2.0,<3.0"
-ruamel-yaml = ">=0.18.5,<0.19.0"
-semver = ">=3.0.1,<4.0.0"
-
-[[package]]
-name = "pygments"
-version = "2.18.0"
-description = "Pygments is a syntax highlighting package written in Python."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"},
- {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"},
-]
-
-[package.extras]
-windows-terminal = ["colorama (>=0.4.6)"]
-
-[[package]]
-name = "pyinstrument"
-version = "4.7.3"
-description = "Call stack profiler for Python. Shows you why your code is slow!"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pyinstrument-4.7.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6a79912f8a096ccad1b88a527719563f6b2b5dc94057873c2ca840dc6378cfee"},
- {file = "pyinstrument-4.7.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:089f7afb326ee937656ee1767813dc793ad20b3d353d081e16255b63830a4787"},
- {file = "pyinstrument-4.7.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f65107079f68dcaeb58ee032d98075ab7ac49be419c60673406043e0675393b4"},
- {file = "pyinstrument-4.7.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9402e339d802a7f5b1ad716b8411ab98f45e51c4b261e662b8a470c251af0acc"},
- {file = "pyinstrument-4.7.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f4e0155f563f66e821210c225af8b64a2283c0feff776c49feba623e7bafd"},
- {file = "pyinstrument-4.7.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c619f3064dae5284b904c4862b35639c35ecd439bb5b4152924f7ccb69edc5e3"},
- {file = "pyinstrument-4.7.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9b4d80deaf76cc171b3b707e2babc9a7046610c4e11022167949e60fc2dc62be"},
- {file = "pyinstrument-4.7.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c5fbe9d24154a118a4b86bed5ae228c3d8698216fad65257aca97e790527197a"},
- {file = "pyinstrument-4.7.3-cp310-cp310-win32.whl", hash = "sha256:7405aec2227ed87dc3bc3a8eb82b5dcdec68861d564ee0d429f9a51ca30ccd58"},
- {file = "pyinstrument-4.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:8043b9c1fb0c19a2957098930c3bad43ecdc1cf8e1d3f32a3b9ef74fdd3df028"},
- {file = "pyinstrument-4.7.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:77594adf4713bc3e430e300561a2d837213cf9015414c0e0de6aef0cb9cebd80"},
- {file = "pyinstrument-4.7.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:70afa765c06e4f7605033b85ef82ed946ec8e6ae1835e25f6cbb01205a624197"},
- {file = "pyinstrument-4.7.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1321514863be18138a6d761696b3f6e8645390dd2f6c8a6d66a453f0d5187c"},
- {file = "pyinstrument-4.7.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de40b44ff2fe78493b944b679cc084e72b2648c37a96fcfbccb9171a4449e509"},
- {file = "pyinstrument-4.7.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a7c481daec4bd77a3dbfbe01a0155e03352dd700f3c3efe4bdbc30821b20e19"},
- {file = "pyinstrument-4.7.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ae2c966c91da630a23dbff5f7e61ad2eee133cfaf1e4acf7e09fcf506cbb6251"},
- {file = "pyinstrument-4.7.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fa2715e3ac3ce2f4b9c4e468a9a4faf43ca645beea002cb47533902576f4f64d"},
- {file = "pyinstrument-4.7.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:61db15f8b59a3a1964041a8df260667fb5dabddd928301e3580cf93d7a05e352"},
- {file = "pyinstrument-4.7.3-cp311-cp311-win32.whl", hash = "sha256:4766bbb2b451460432c97baf00bbda56653429671e8daec344d343f21fb05b8f"},
- {file = "pyinstrument-4.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:b2d2a0e401db6800f63de0539415cdff46b138914d771a46db0b3f673f9827e7"},
- {file = "pyinstrument-4.7.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7c29f7a23e0f704f5f21aeeb47193460601e7359d09156ea043395870494b39a"},
- {file = "pyinstrument-4.7.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:84ceb25f24ceb03dc770b6c142ec4419506d3a04d66d778810cb8da76df25651"},
- {file = "pyinstrument-4.7.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d564d6f6151d3cab28430092cdcbd4aefe0834551af4b4f97e6e57025a348557"},
- {file = "pyinstrument-4.7.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e23ce5fcc30346e576b98ca24bd2a9a68cbc42b90cdb0d8f376fa82cee2fe23"},
- {file = "pyinstrument-4.7.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23d5ad174d2a488c164abee4407f3f3a6e6d5721ab1fab9e0ad9570631704c2"},
- {file = "pyinstrument-4.7.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d87749f68b9cc221628aab989a4a73b16030c27c714ecd83892d716f863d9739"},
- {file = "pyinstrument-4.7.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:897d09c876f18b713498be21430b39428a9254ffec0c6c06796fce0e6a8fe437"},
- {file = "pyinstrument-4.7.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2092910e745cfd0a62dadf041afb38239195244871ee127b1028e7e790602e6b"},
- {file = "pyinstrument-4.7.3-cp312-cp312-win32.whl", hash = "sha256:e9824e11290f6f2772c257cc0bd07f59405759287db6ebcbb06f962a3eba68fb"},
- {file = "pyinstrument-4.7.3-cp312-cp312-win_amd64.whl", hash = "sha256:cf1e67b37e936f647ce731fff5d2f54e102813274d350671dc5961ec8b46b3ff"},
- {file = "pyinstrument-4.7.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6de792dc65dcc75e73b721f4e89aa60a4d2f8617e5a5da060244058018ad0399"},
- {file = "pyinstrument-4.7.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:73da379506a09cdff2fdd23a0b3eb8f020f473d019f604538e0e5045613e33d4"},
- {file = "pyinstrument-4.7.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21e05f53810a6ff5fa261da838935fd1b2ab2bf30a7c053f6c72bcaaa6de0933"},
- {file = "pyinstrument-4.7.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d648596ea04409ca3ca260029041ed7fa046b776205bf9a0b75cda0a4f4d2515"},
- {file = "pyinstrument-4.7.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d98997347047a217ef6b844273d3753e543e0984f2220e9dd284cbef6054c2a"},
- {file = "pyinstrument-4.7.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7f09ebad95af94f5427c20005fc7ba84a0a3deae6324434d7ec3be99d369bf37"},
- {file = "pyinstrument-4.7.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8a66aee3d2cf0cc6b8e57cb189fd9fb16d13b8d538419999596ce4f58b5d4a9a"},
- {file = "pyinstrument-4.7.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eaa45270af0b9d86f1cef705520e9b43f4a1cd18397083f8a594a28f898d078b"},
- {file = "pyinstrument-4.7.3-cp313-cp313-win32.whl", hash = "sha256:6e85b34a9b8ed4df4deaa0afe63bc765ea29003eb5b9b3bc0323f7ad7f7cd0fd"},
- {file = "pyinstrument-4.7.3-cp313-cp313-win_amd64.whl", hash = "sha256:6002ea1018d6d6f9b6f1c66b3e14805213573bd69f79b2e7ad2c507441b3e73e"},
- {file = "pyinstrument-4.7.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b68c5b97690604741bb1f028ec75d2a6298500f415590ae92a766f71b82fc72a"},
- {file = "pyinstrument-4.7.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:df9ba133f5a771dd30df1d3b868af75bdb7f12c9ebd5ddd463d09aa6334d96ef"},
- {file = "pyinstrument-4.7.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bfad987207c89b51f80be71f5362cead4ccd62b9f407248b87e91863bba70e4d"},
- {file = "pyinstrument-4.7.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65fd559498902d1560d728238eea53d8dd54cb8f697b816cacce5524f09d8757"},
- {file = "pyinstrument-4.7.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:470a4f6de1a1edf7debe87917b5d12f94fe59975a8a0e91c22ad789b55720073"},
- {file = "pyinstrument-4.7.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f29ed5778b83bf40bd808f120cd2ea11ef94acd2aa5b64398e6d56958b88ab26"},
- {file = "pyinstrument-4.7.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:6d642d8c69091fd49286136b7d958f8dbac969a3f6259c7c6d78e8ff207d235e"},
- {file = "pyinstrument-4.7.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:346bc584c542c4c77ca46e8f55eb2d3265ee992839e06d535a22ca65c5b9e767"},
- {file = "pyinstrument-4.7.3-cp38-cp38-win32.whl", hash = "sha256:66af331f9da06df36afbdbd2b7128ae725bb444f24584d2ed1f4c67d1b2759b8"},
- {file = "pyinstrument-4.7.3-cp38-cp38-win_amd64.whl", hash = "sha256:57992c5f73fad7b560e27f864ff9824c6ccc834d48bbeaf4cecf66193cfe28c6"},
- {file = "pyinstrument-4.7.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8b944c939c49af88cec1e20e9c28eec80c478fc2fd53b23ed58702bcb5bcbcf9"},
- {file = "pyinstrument-4.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:edd85ee9c6aa5be0bf78d48ad2eb5e02fdab1a646875d90fa09cbc61f4c91a01"},
- {file = "pyinstrument-4.7.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e381fc56ba4a77cb45d82eb69689d900a5ee7205a5eb90131234b21ae7a1991"},
- {file = "pyinstrument-4.7.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98e1b7695c234786e82500394ef50f205713f8702a31aec84fdd0687e0ab8405"},
- {file = "pyinstrument-4.7.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03dd0c51f6ca706be5c27715e9b4527aa82003c2705d3173943c5b4a2b7a47e8"},
- {file = "pyinstrument-4.7.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2b312442f01fbf2582cd7c929703608cb82874b73a0f3250cbeffc4abddae4f5"},
- {file = "pyinstrument-4.7.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:e660d9a7f57909574010056dbc80869866623669455516ffc7421988286ddaf3"},
- {file = "pyinstrument-4.7.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:886ccb349aefcbd5be1f33247b3a1af4ad5d34939338d99e94bae064886bf0d8"},
- {file = "pyinstrument-4.7.3-cp39-cp39-win32.whl", hash = "sha256:1ce2828cc29b17720f3c66345ea6f9ff54a3860d0488b59c985377ce2e6a710b"},
- {file = "pyinstrument-4.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:e562e608f878540d19a514774e0f24fccaeac035674cf2b2afacdae9e0e19b29"},
- {file = "pyinstrument-4.7.3.tar.gz", hash = "sha256:3ad61041ff1880d4c99d3384cd267e38a0a6472b5a4dd765992db376bd4394c8"},
-]
-
-[package.extras]
-bin = ["click", "nox"]
-docs = ["furo (==2024.7.18)", "myst-parser (==3.0.1)", "sphinx (==7.4.7)", "sphinx-autobuild (==2024.4.16)", "sphinxcontrib-programoutput (==0.17)"]
-examples = ["django", "litestar", "numpy"]
-test = ["cffi (>=v1.17.0rc1)", "flaky", "greenlet (>=3.0.0a1)", "ipython", "pytest", "pytest-asyncio (==0.23.8)", "trio"]
-types = ["typing-extensions"]
-
-[[package]]
-name = "pymdown-extensions"
-version = "10.12"
-description = "Extension pack for Python Markdown."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pymdown_extensions-10.12-py3-none-any.whl", hash = "sha256:49f81412242d3527b8b4967b990df395c89563043bc51a3d2d7d500e52123b77"},
- {file = "pymdown_extensions-10.12.tar.gz", hash = "sha256:b0ee1e0b2bef1071a47891ab17003bfe5bf824a398e13f49f8ed653b699369a7"},
-]
-
-[package.dependencies]
-markdown = ">=3.6"
-pyyaml = "*"
-
-[package.extras]
-extra = ["pygments (>=2.12)"]
-
-[[package]]
-name = "pyparsing"
-version = "3.2.0"
-description = "pyparsing module - Classes and methods to define and execute parsing grammars"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "pyparsing-3.2.0-py3-none-any.whl", hash = "sha256:93d9577b88da0bbea8cc8334ee8b918ed014968fd2ec383e868fb8afb1ccef84"},
- {file = "pyparsing-3.2.0.tar.gz", hash = "sha256:cbf74e27246d595d9a74b186b810f6fbb86726dbf3b9532efb343f6d7294fe9c"},
-]
-
-[package.extras]
-diagrams = ["jinja2", "railroad-diagrams"]
-
-[[package]]
-name = "pytest"
-version = "8.3.3"
-description = "pytest: simple powerful testing with Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"},
- {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "sys_platform == \"win32\""}
-exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
-iniconfig = "*"
-packaging = "*"
-pluggy = ">=1.5,<2"
-tomli = {version = ">=1", markers = "python_version < \"3.11\""}
-
-[package.extras]
-dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
-
-[[package]]
-name = "python-dateutil"
-version = "2.9.0.post0"
-description = "Extensions to the standard Python datetime module"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-files = [
- {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
- {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
-]
-
-[package.dependencies]
-six = ">=1.5"
-
-[[package]]
-name = "pytz"
-version = "2024.2"
-description = "World timezone definitions, modern and historical"
-optional = false
-python-versions = "*"
-files = [
- {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"},
- {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"},
-]
-
-[[package]]
-name = "pywin32"
-version = "308"
-description = "Python for Window Extensions"
-optional = false
-python-versions = "*"
-files = [
- {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"},
- {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"},
- {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"},
- {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"},
- {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"},
- {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"},
- {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"},
- {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"},
- {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"},
- {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"},
- {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"},
- {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"},
- {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"},
- {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"},
- {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"},
- {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"},
- {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"},
- {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"},
-]
-
-[[package]]
-name = "pyyaml"
-version = "6.0.2"
-description = "YAML parser and emitter for Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"},
- {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"},
- {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"},
- {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"},
- {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"},
- {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"},
- {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"},
- {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"},
- {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"},
- {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"},
- {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"},
- {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"},
- {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"},
- {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"},
- {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"},
- {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"},
- {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"},
- {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"},
- {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"},
- {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"},
- {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"},
- {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"},
- {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"},
- {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"},
- {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"},
- {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"},
- {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"},
- {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"},
- {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"},
- {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"},
- {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"},
- {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"},
- {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"},
- {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"},
- {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"},
- {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"},
- {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"},
- {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"},
- {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"},
- {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"},
- {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"},
- {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"},
- {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"},
- {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"},
- {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"},
- {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"},
- {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"},
- {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"},
- {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"},
- {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"},
- {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"},
- {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"},
- {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"},
-]
-
-[[package]]
-name = "pyyaml-env-tag"
-version = "0.1"
-description = "A custom YAML tag for referencing environment variables in YAML files. "
-optional = false
-python-versions = ">=3.6"
-files = [
- {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"},
- {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"},
-]
-
-[package.dependencies]
-pyyaml = "*"
-
-[[package]]
-name = "pyzmq"
-version = "26.2.0"
-description = "Python bindings for 0MQ"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"},
- {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"},
- {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"},
- {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"},
- {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"},
- {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"},
- {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"},
- {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"},
- {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"},
- {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"},
- {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"},
- {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"},
- {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"},
- {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"},
- {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"},
- {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"},
- {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"},
- {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"},
- {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"},
- {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"},
- {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"},
- {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"},
- {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"},
- {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"},
- {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"},
- {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"},
- {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"},
- {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"},
- {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"},
- {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"},
- {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"},
- {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"},
- {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"},
- {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"},
- {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"},
- {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"},
- {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"},
- {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"},
- {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"},
- {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"},
- {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"},
- {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"},
- {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"},
- {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"},
- {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"},
- {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"},
- {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"},
- {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"},
- {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"},
- {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"},
- {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"},
- {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"},
- {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"},
- {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"},
- {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"},
- {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"},
- {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"},
- {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"},
- {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"},
- {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"},
- {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"},
- {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"},
- {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"},
- {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"},
- {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"},
- {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"},
- {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"},
- {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"},
- {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"},
- {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"},
- {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"},
- {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"},
- {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"},
- {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"},
- {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"},
- {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"},
- {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"},
- {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"},
- {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"},
- {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"},
- {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"},
- {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"},
- {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"},
- {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"},
- {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"},
- {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"},
- {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"},
- {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"},
- {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"},
- {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"},
- {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"},
- {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"},
- {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"},
- {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"},
- {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"},
- {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"},
- {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"},
- {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"},
- {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"},
- {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"},
- {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"},
- {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"},
- {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"},
- {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"},
- {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"},
- {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"},
- {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"},
- {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"},
- {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"},
-]
-
-[package.dependencies]
-cffi = {version = "*", markers = "implementation_name == \"pypy\""}
-
-[[package]]
-name = "regex"
-version = "2024.11.6"
-description = "Alternative regular expression module, to replace re."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91"},
- {file = "regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0"},
- {file = "regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c"},
- {file = "regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008"},
- {file = "regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62"},
- {file = "regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e"},
- {file = "regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519"},
- {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638"},
- {file = "regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7"},
- {file = "regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0"},
- {file = "regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d"},
- {file = "regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45"},
- {file = "regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9"},
- {file = "regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60"},
- {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a"},
- {file = "regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9"},
- {file = "regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e"},
- {file = "regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51"},
- {file = "regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad"},
- {file = "regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54"},
- {file = "regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b"},
- {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84"},
- {file = "regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4"},
- {file = "regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c"},
- {file = "regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4"},
- {file = "regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d"},
- {file = "regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff"},
- {file = "regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a"},
- {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b"},
- {file = "regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3"},
- {file = "regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f"},
- {file = "regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc"},
- {file = "regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f"},
- {file = "regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4"},
- {file = "regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001"},
- {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839"},
- {file = "regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e"},
- {file = "regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48"},
- {file = "regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f"},
- {file = "regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b"},
- {file = "regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57"},
- {file = "regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983"},
- {file = "regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519"},
-]
-
-[[package]]
-name = "requests"
-version = "2.32.3"
-description = "Python HTTP for Humans."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
- {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
-]
-
-[package.dependencies]
-certifi = ">=2017.4.17"
-charset-normalizer = ">=2,<4"
-idna = ">=2.5,<4"
-urllib3 = ">=1.21.1,<3"
-
-[package.extras]
-socks = ["PySocks (>=1.5.6,!=1.5.7)"]
-use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
-
-[[package]]
-name = "ruamel-yaml"
-version = "0.18.6"
-description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "ruamel.yaml-0.18.6-py3-none-any.whl", hash = "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636"},
- {file = "ruamel.yaml-0.18.6.tar.gz", hash = "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b"},
-]
-
-[package.dependencies]
-"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""}
-
-[package.extras]
-docs = ["mercurial (>5.7)", "ryd"]
-jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"]
-
-[[package]]
-name = "ruamel-yaml-clib"
-version = "0.2.12"
-description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5"},
- {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969"},
- {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd5415dded15c3822597455bc02bcd66e81ef8b7a48cb71a33628fc9fdde39df"},
- {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76"},
- {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6"},
- {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd"},
- {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da"},
- {file = "ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28"},
- {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6"},
- {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e"},
- {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e"},
- {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52"},
- {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642"},
- {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2"},
- {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4"},
- {file = "ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb"},
- {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632"},
- {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d"},
- {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c"},
- {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd"},
- {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31"},
- {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680"},
- {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5"},
- {file = "ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4"},
- {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a"},
- {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475"},
- {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef"},
- {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6"},
- {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf"},
- {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1"},
- {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6"},
- {file = "ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3"},
- {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987"},
- {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bc5f1e1c28e966d61d2519f2a3d451ba989f9ea0f2307de7bc45baa526de9e45"},
- {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a0e060aace4c24dcaf71023bbd7d42674e3b230f7e7b97317baf1e953e5b519"},
- {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7"},
- {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285"},
- {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed"},
- {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win32.whl", hash = "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12"},
- {file = "ruamel.yaml.clib-0.2.12-cp39-cp39-win_amd64.whl", hash = "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b"},
- {file = "ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f"},
-]
-
-[[package]]
-name = "ruff"
-version = "0.3.7"
-description = "An extremely fast Python linter and code formatter, written in Rust."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0e8377cccb2f07abd25e84fc5b2cbe48eeb0fea9f1719cad7caedb061d70e5ce"},
- {file = "ruff-0.3.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:15a4d1cc1e64e556fa0d67bfd388fed416b7f3b26d5d1c3e7d192c897e39ba4b"},
- {file = "ruff-0.3.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d28bdf3d7dc71dd46929fafeec98ba89b7c3550c3f0978e36389b5631b793663"},
- {file = "ruff-0.3.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:379b67d4f49774ba679593b232dcd90d9e10f04d96e3c8ce4a28037ae473f7bb"},
- {file = "ruff-0.3.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c060aea8ad5ef21cdfbbe05475ab5104ce7827b639a78dd55383a6e9895b7c51"},
- {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ebf8f615dde968272d70502c083ebf963b6781aacd3079081e03b32adfe4d58a"},
- {file = "ruff-0.3.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d48098bd8f5c38897b03604f5428901b65e3c97d40b3952e38637b5404b739a2"},
- {file = "ruff-0.3.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da8a4fda219bf9024692b1bc68c9cff4b80507879ada8769dc7e985755d662ea"},
- {file = "ruff-0.3.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c44e0149f1d8b48c4d5c33d88c677a4aa22fd09b1683d6a7ff55b816b5d074f"},
- {file = "ruff-0.3.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:3050ec0af72b709a62ecc2aca941b9cd479a7bf2b36cc4562f0033d688e44fa1"},
- {file = "ruff-0.3.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a29cc38e4c1ab00da18a3f6777f8b50099d73326981bb7d182e54a9a21bb4ff7"},
- {file = "ruff-0.3.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5b15cc59c19edca917f51b1956637db47e200b0fc5e6e1878233d3a938384b0b"},
- {file = "ruff-0.3.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e491045781b1e38b72c91247cf4634f040f8d0cb3e6d3d64d38dcf43616650b4"},
- {file = "ruff-0.3.7-py3-none-win32.whl", hash = "sha256:bc931de87593d64fad3a22e201e55ad76271f1d5bfc44e1a1887edd0903c7d9f"},
- {file = "ruff-0.3.7-py3-none-win_amd64.whl", hash = "sha256:5ef0e501e1e39f35e03c2acb1d1238c595b8bb36cf7a170e7c1df1b73da00e74"},
- {file = "ruff-0.3.7-py3-none-win_arm64.whl", hash = "sha256:789e144f6dc7019d1f92a812891c645274ed08af6037d11fc65fcbc183b7d59f"},
- {file = "ruff-0.3.7.tar.gz", hash = "sha256:d5c1aebee5162c2226784800ae031f660c350e7a3402c4d1f8ea4e97e232e3ba"},
-]
-
-[[package]]
-name = "semver"
-version = "3.0.2"
-description = "Python helper for Semantic Versioning (https://semver.org)"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "semver-3.0.2-py3-none-any.whl", hash = "sha256:b1ea4686fe70b981f85359eda33199d60c53964284e0cfb4977d243e37cf4bf4"},
- {file = "semver-3.0.2.tar.gz", hash = "sha256:6253adb39c70f6e51afed2fa7152bcd414c411286088fb4b9effb133885ab4cc"},
-]
-
-[[package]]
-name = "setuptools"
-version = "75.4.0"
-description = "Easily download, build, install, upgrade, and uninstall Python packages"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "setuptools-75.4.0-py3-none-any.whl", hash = "sha256:b3c5d862f98500b06ffdf7cc4499b48c46c317d8d56cb30b5c8bce4d88f5c216"},
- {file = "setuptools-75.4.0.tar.gz", hash = "sha256:1dc484f5cf56fd3fe7216d7b8df820802e7246cfb534a1db2aa64f14fcb9cdcb"},
-]
-
-[package.extras]
-check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"]
-core = ["importlib-metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"]
-cover = ["pytest-cov"]
-doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"]
-enabler = ["pytest-enabler (>=2.2)"]
-test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"]
-type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"]
-
-[[package]]
-name = "six"
-version = "1.16.0"
-description = "Python 2 and 3 compatibility utilities"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
-files = [
- {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
- {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
-]
-
-[[package]]
-name = "stack-data"
-version = "0.6.3"
-description = "Extract data from python stack frames and tracebacks for informative displays"
-optional = false
-python-versions = "*"
-files = [
- {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"},
- {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"},
-]
-
-[package.dependencies]
-asttokens = ">=2.1.0"
-executing = ">=1.2.0"
-pure-eval = "*"
-
-[package.extras]
-tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"]
-
-[[package]]
-name = "toml"
-version = "0.10.2"
-description = "Python Library for Tom's Obvious, Minimal Language"
-optional = false
-python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
-files = [
- {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
- {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
-]
-
-[[package]]
-name = "tomli"
-version = "2.1.0"
-description = "A lil' TOML parser"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"},
- {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"},
-]
-
-[[package]]
-name = "tornado"
-version = "6.4.1"
-description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"},
- {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"},
- {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"},
- {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"},
- {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"},
- {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"},
- {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"},
- {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"},
- {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"},
- {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"},
- {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"},
-]
-
-[[package]]
-name = "traitlets"
-version = "5.14.3"
-description = "Traitlets Python configuration system"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"},
- {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"},
-]
-
-[package.extras]
-docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"]
-test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"]
-
-[[package]]
-name = "types-toml"
-version = "0.10.8.20240310"
-description = "Typing stubs for toml"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "types-toml-0.10.8.20240310.tar.gz", hash = "sha256:3d41501302972436a6b8b239c850b26689657e25281b48ff0ec06345b8830331"},
- {file = "types_toml-0.10.8.20240310-py3-none-any.whl", hash = "sha256:627b47775d25fa29977d9c70dc0cbab3f314f32c8d8d0c012f2ef5de7aaec05d"},
-]
-
-[[package]]
-name = "typing-extensions"
-version = "4.12.2"
-description = "Backported and Experimental Type Hints for Python 3.8+"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"},
- {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"},
-]
-
-[[package]]
-name = "tzdata"
-version = "2024.2"
-description = "Provider of IANA time zone data"
-optional = false
-python-versions = ">=2"
-files = [
- {file = "tzdata-2024.2-py2.py3-none-any.whl", hash = "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"},
- {file = "tzdata-2024.2.tar.gz", hash = "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc"},
-]
-
-[[package]]
-name = "urllib3"
-version = "2.2.3"
-description = "HTTP library with thread-safe connection pooling, file post, and more."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"},
- {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"},
-]
-
-[package.extras]
-brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
-h2 = ["h2 (>=4,<5)"]
-socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
-zstd = ["zstandard (>=0.18.0)"]
-
-[[package]]
-name = "watchdog"
-version = "6.0.0"
-description = "Filesystem events monitoring"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"},
- {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"},
- {file = "watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3"},
- {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c"},
- {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2"},
- {file = "watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c"},
- {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948"},
- {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860"},
- {file = "watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0"},
- {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c"},
- {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134"},
- {file = "watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b"},
- {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8"},
- {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a"},
- {file = "watchdog-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c"},
- {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881"},
- {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11"},
- {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa"},
- {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e"},
- {file = "watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13"},
- {file = "watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379"},
- {file = "watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e"},
- {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f"},
- {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26"},
- {file = "watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c"},
- {file = "watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2"},
- {file = "watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a"},
- {file = "watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680"},
- {file = "watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f"},
- {file = "watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282"},
-]
-
-[package.extras]
-watchmedo = ["PyYAML (>=3.10)"]
-
-[[package]]
-name = "wcwidth"
-version = "0.2.13"
-description = "Measures the displayed width of unicode strings in a terminal"
-optional = false
-python-versions = "*"
-files = [
- {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"},
- {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"},
-]
-
-[[package]]
-name = "zipp"
-version = "3.21.0"
-description = "Backport of pathlib-compatible object wrapper for zip files"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"},
- {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"},
-]
-
-[package.extras]
-check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
-cover = ["pytest-cov"]
-doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
-enabler = ["pytest-enabler (>=2.2)"]
-test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
-type = ["pytest-mypy"]
-
-[metadata]
-lock-version = "2.0"
-python-versions = ">=3.9,<3.13"
-content-hash = "ec2b86943e101a0490dd2db25ab2cb435756ccaa7df7515260db6ff12488fdef"
diff --git a/pyproject.toml b/pyproject.toml
index 69feeba..1cc5b55 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,41 +1,30 @@
-[tool.poetry]
+[project]
name = "libeq"
-version = "0.1.0"
-description = ""
-authors = ["Lorenzo Castellino "]
+version = "0.3.0"
+description = "Library for solving equilibrium in solution problems"
+authors = [{name="Lorenzo Castellino", email=""},
+ {name="Salvador Blasco", email=""}]
readme = "README.md"
packages = [{ include = "libeq", from = "src" }]
+requires-python = ">= 3.10"
+dependencies = [
+ "numpy",
+]
+
+[project.scripts]
+libeq = "..src"
[tool.pytest.ini_options]
pythonpath = ["src"]
-[tool.poetry.dependencies]
-python = ">=3.9,<3.13"
-numpy = "^1.26.4"
-pydantic = "^2.6.4"
-pydantic-numpy = "^4.2.0"
-
-[tool.poetry.group.dev.dependencies]
-matplotlib = "^3.8.3"
-pandas = "^2.2.1"
-pytest = "^8.1.1"
-ipykernel = "^6.29.3"
-pyinstrument = "^4.6.2"
-ruff = "^0.3.4"
-inline-snapshot = "^0.8.2"
-
-[tool.poetry.group.docs.dependencies]
-mkdocs-material = "^9.5.15"
-mkdocstrings = { extras = ["python"], version = "^0.24.1" }
-mkdocs-gen-files = "^0.5.0"
-mkdocs-literate-nav = "^0.6.1"
-mkdocs-section-index = "^0.3.8"
-markdown-katex = "^202112.1034"
-mkdocs-glightbox = "^0.3.7"
-black = "^24.3.0"
-griffe-fieldz = "^0.1.2"
+[tool.run.ini_options]
+pythonpath = ["src"]
+[tool.mypy]
+mypy_path = "src"
-[build-system]
-requires = ["poetry-core"]
-build-backend = "poetry.core.masonry.api"
+[dependency-groups]
+dev = [
+ "numpy>=2.2.6",
+ "pytest>=8.4.2",
+]
diff --git a/src/libeq/consts.py b/src/libeq/consts.py
new file mode 100644
index 0000000..79f83c2
--- /dev/null
+++ b/src/libeq/consts.py
@@ -0,0 +1,9 @@
+from enum import IntEnum, auto
+import math
+from typing import Final
+
+class Flags(IntEnum):
+ CONSTANT = auto()
+ REFINE = auto()
+
+LN10: Final[float] = math.log(10)
diff --git a/src/libeq/data_structure.py b/src/libeq/data_structure.py
index bbfae9a..a8c308d 100644
--- a/src/libeq/data_structure.py
+++ b/src/libeq/data_structure.py
@@ -8,12 +8,18 @@
Np1DArrayFp64,
Np2DArrayFp64,
Np2DArrayInt8,
+ Np2DArrayInt16,
+ Np2DArrayInt32,
+ Np2DArrayInt64,
+ Np1DArrayInt64,
Np1DArrayBool,
)
from .utils import NumpyEncoder
from .parsers import parse_BSTAC_file
+from .parsers import parse_superquad_file
+from .consts import Flags
def _assemble_species_names(components, stoichiometry):
@@ -58,9 +64,11 @@ class TitrationParameters(BaseModel):
c0_sigma: Np1DArrayFp64 | None = None
ct: Np1DArrayFp64 | None = None
ct_sigma: Np1DArrayFp64 | None = None
+ c0_flags: List[int] = []
+ ct_flags: List[int] = []
- c0back: float = 0
- ctback: float = 0
+ c0back: float = 0.0
+ ctback: float = 0.0
class SimulationTitrationParameters(TitrationParameters):
@@ -70,16 +78,16 @@ class SimulationTitrationParameters(TitrationParameters):
class PotentiometryTitrationsParameters(TitrationParameters):
- electro_active_compoment: int | None = None
- e0: float | None = None
- e0_sigma: float | None = None
- slope: float | None = None
- v0: float | None = None
- v0_sigma: float | None = None
- v_add: Np1DArrayFp64 | None = None
- emf: Np1DArrayFp64 | None = None
- px_range: List[list[float]] = [[0, 0]]
- ignored: Np1DArrayBool | None = None
+ electro_active_compoment: int | None = None # index of the component
+ e0: float | None = None # in mV
+ e0_sigma: float | None = None # in mV
+ slope: float | None = None # in mV
+ v0: float | None = None # in mL
+ v0_sigma: float | None = None # in mL
+ v_add: Np1DArrayFp64 | None = None # in mL
+ emf: Np1DArrayFp64 | None = None # in mV
+ px_range: List[list[float]] = [[0, 0]] # dimmensionless
+ ignored: Np1DArrayBool | None = False
class PotentiometryOptions(BaseModel):
@@ -98,8 +106,8 @@ class SolverData(BaseModel):
potentiometry_opts: PotentiometryOptions = PotentiometryOptions()
components: List[str]
- stoichiometry: Np2DArrayInt8
- solid_stoichiometry: Np2DArrayInt8
+ stoichiometry: Np2DArrayInt8 | Np2DArrayInt16 | Np2DArrayInt32 | Np2DArrayInt64
+ solid_stoichiometry: Np2DArrayInt8 | Np2DArrayInt16 | Np2DArrayInt32 | Np2DArrayInt64 = np.array([], dtype=int)
log_beta: Np1DArrayFp64
log_beta_sigma: Np1DArrayFp64 = np.array([])
log_beta_ref_dbh: Np2DArrayFp64 = np.empty((0, 2))
@@ -107,13 +115,15 @@ class SolverData(BaseModel):
log_ks_sigma: Np1DArrayFp64 = np.array([])
log_ks_ref_dbh: Np2DArrayFp64 = np.empty((0, 2))
- charges: Np1DArrayFp64 = np.array([])
+ charges: Np1DArrayInt64 = np.array([])
ionic_strength_dependence: bool = False
reference_ionic_str_species: Np1DArrayFp64 | float = 0
reference_ionic_str_solids: Np1DArrayFp64 | float = 0
dbh_params: Np1DArrayFp64 = np.zeros(8)
+ temperature: float = 298.15 # Kelvin
+
@computed_field
@cached_property
def model_ready(self) -> tuple[bool, dict[str, str]]:
@@ -447,6 +457,7 @@ def load_from_bstac(cls, file_path: str) -> "SolverData":
parsed_data = parse_BSTAC_file(lines)
temperature = parsed_data["TEMP"]
+ data["temperature"] = temperature
data["stoichiometry"] = np.array(
[
[d[key] for key in d if key.startswith("IX")]
@@ -522,6 +533,38 @@ def load_from_bstac(cls, file_path: str) -> "SolverData":
)
return cls(**data)
+ @classmethod
+ def load_from_superquad(cls, file_path: str) -> "SolverData":
+ parsed_data = parse_superquad_file(file_path)
+ data = {}
+ temp = parsed_data.get('temperature', 298.15)
+ data['temperature'] = temp
+ data['stoichiometry'] = np.array(parsed_data['stoichiometry'], dtype=int)
+ data["solid_stoichiometry"] = np.empty(
+ (data["stoichiometry"].shape[0], 0), dtype=int)
+ data["log_beta"] = np.array(parsed_data["log_beta"], dtype=float)
+ data['components'] = parsed_data['components']
+
+ titration_options = [
+ PotentiometryTitrationsParameters(
+ c0=t['initial amount'] / t['starting volume'],
+ ct=t['buret concentration'],
+ electro_active_compoment=t['electroactive'],
+ e0=t['standard potential'],
+ e0_sigma=t['potential error'],
+ slope=(temp + 273.15) / 11.6048 * 2.303,
+ v0=t['starting volume'],
+ v0_sigma=t["volume erro"],
+ v_add=np.array(t["titre"]),
+ emf=np.array(t["potential"]),
+ c0back=t["background_params"][0] if "background_params" in t else 0,
+ ctback=t["background_params"][1] if "background_params" in t else 0,
+ px_range=[[parsed_data["PHI"], parsed_data["PHF"]]],
+ )
+ for t in parsed_data["titrations"]
+ ]
+
+
@classmethod
def load_from_pyes(cls, pyes_data: str | dict) -> "SolverData":
if isinstance(pyes_data, str):
@@ -547,8 +590,7 @@ def load_from_pyes(cls, pyes_data: str | dict) -> "SolverData":
list(pyes_data["speciesModel"]["EGF"].values()),
)
)
-
- data["solid_stoichiometry"] = np.row_stack(
+ data["solid_stoichiometry"] = np.vstack(
[
list(pyes_data["solidSpeciesModel"][col].values())
for col in data["components"]
@@ -628,17 +670,17 @@ def load_from_pyes(cls, pyes_data: str | dict) -> "SolverData":
weights = "calculated"
elif potentiometry_data["weightsMode"] == 2:
weights = "given"
-
+ #breakpoint()
for t in potentiometry_data["titrations"]:
titrations.append(
PotentiometryTitrationsParameters(
- c0=np.array(list(t.get("concView", {}).get("C0", {}).values())),
- ct=np.array(list(t.get("concView", {}).get("CT", {}).values())),
+ c0=np.array(list(t.get("concView", {}).get("C0", {}).values()), dtype=float),
+ ct=np.array(list(t.get("concView", {}).get("CT", {}).values()), dtype=float),
c0_sigma=np.array(
- list(t.get("concView", {}).get("Sigma C0", {}).values())
+ list(t.get("concView", {}).get("Sigma C0", {}).values()), dtype=float
),
ct_sigma=np.array(
- list(t.get("concView", {}).get("Sigma CT", {}).values())
+ list(t.get("concView", {}).get("Sigma CT", {}).values()), dtype=float
),
electro_active_compoment=t["electroActiveComponent"],
e0=t["e0"],
@@ -663,7 +705,8 @@ def load_from_pyes(cls, pyes_data: str | dict) -> "SolverData":
data["potentiometry_opts"] = PotentiometryOptions(
titrations=titrations,
weights=weights,
- beta_flags=[int(v) for v in potentiometry_data["beta_refine_flags"]],
+ beta_flags=[Flags.REFINE if v else Flags.CONSTANT
+ for v in potentiometry_data["beta_refine_flags"]],
conc_flags=[],
pot_flags=[],
)
diff --git a/src/libeq/optimizers/cpluss.py b/src/libeq/optimizers/cpluss.py
new file mode 100644
index 0000000..fcb88a1
--- /dev/null
+++ b/src/libeq/optimizers/cpluss.py
@@ -0,0 +1,78 @@
+import numpy as np
+
+#from libaux import assert_array
+
+
+def cpluss(concentration, beta, stoichiometry, full=False, logc=False):
+ r"""Compute the free concentrations for the extended components.
+
+ The concentration of the complexes is calculated by means of the
+ equilibrium condition.
+
+ .. math::`c_{i+S} = \beta_i \prod_{j=1}^E c_j^p_{ji}`
+
+ This is an auxiliary function.
+
+ Parameters:
+ concentration (:class:`numpy.ndarray`): The free concentrations of the
+ free components. It must be an (*S*,) or (*N*, *S*)-sized array
+ where *S* is the number of free components. This parameter can be
+ a masked array. In this case, the return concentration matric will
+ also be masked.
+ stoichiometry (:class:`numpy.ndarray`): The stoichiometric coefficient
+ matrix. It must be (*E*, *S*)-sized where E is the number of
+ equilibria.
+ beta (:class:`numpy.ndarray`): The equilibrium constants. The last
+ dimmension must be E-sized and the rest of the dimmensions must be
+ compatible with those of **concentration**.
+ full (bool): If set, the return array will be the full (*N*, *S* + *E*)
+ array. If unset only the extra calculated array (*N*, *E*) will be
+ returned.
+ logc (bool): If True, the natural logarithms of the concentrations are
+ expected. Otherwise, work with regular values for the
+ concentration.
+ Returns:
+ :class:`numpy.ndarray`: array of size (*N*, *E*) containing the
+ extended concentrations
+
+ Raises:
+ ValueError: If any parameter is incorrect.
+ """
+ # remove because this routine is called many many times
+ #assert_array(concentration, beta, stoichiometry)
+
+ if np.ma.is_masked(concentration):
+ np_log = np.ma.log
+ np_dot = np.ma.dot
+ np_exp = np.ma.exp
+ np_concatenate = np.ma.concatenate
+ else:
+ np_log = np.log
+ np_dot = np.dot
+ np_exp = np.exp
+ np_concatenate = np.concatenate
+
+ # concentration[concentration <= 0] = sys.float_info.min
+ if logc:
+ _c = concentration
+ else:
+ _c = np_log(concentration)
+ cext = np_log(beta) + np_dot(_c, stoichiometry.T)
+
+ if full:
+ p = np_concatenate((_c, cext), axis=1)
+ else:
+ p = cext
+
+ # if logc:
+ # return p
+ # else:
+ # # return np.nan_to_num(np.exp(p)) # replace NaN with 0
+ # return np_exp(p)
+
+ return p if logc else np_exp(p)
+
+
+def mass_action_solid(concentration, solubility_stoich):
+ logc = np.log(concentration)
+ return np.exp(np.dot(logc, solubility_stoich.T))
diff --git a/src/libeq/optimizers/fitter.py b/src/libeq/optimizers/fitter.py
index f07456b..6afd08f 100644
--- a/src/libeq/optimizers/fitter.py
+++ b/src/libeq/optimizers/fitter.py
@@ -1,7 +1,19 @@
+"""
+General functions for nonlinear fitting.
+"""
+
+
+from typing import Tuple, Dict, List, Final
+
import numpy as np
+from numpy.typing import NDArray
+
from libeq.excepts import TooManyIterations
+FArray = NDArray[float]
+
+
def levenberg_marquardt(x0, y, f, free_conc, jacobian, weights, capping=None, **kwargs):
r"""Non linear fitting by means of the Levenberg-Marquardt method.
@@ -61,7 +73,7 @@ def _report(*kws):
n_points = len(y)
n_vars = len(x0)
sigma_hist = []
-
+ # breakpoint()
# import pudb
# pudb.set_trace()
diff --git a/src/libeq/optimizers/fobj.py b/src/libeq/optimizers/fobj.py
new file mode 100644
index 0000000..ee982a4
--- /dev/null
+++ b/src/libeq/optimizers/fobj.py
@@ -0,0 +1,107 @@
+import numpy as np
+
+from .cpluss import cpluss, mass_action_solid
+
+
+def fobj(concentration, stoichiometry, analyticalc, beta=None):
+ r"""Return the value of the function to be minimized.
+
+ This function is defined as
+ :math:`f_i = c_i + \sum_{j=1}^E p_{ij}c_{j+S} - T_i`
+
+ Parameters:
+ concentration (:class:`numpy.ndarray`): free concentrations for all the
+ species in mmol/mL. It must be an array of
+ (*N*, *S* + *E* ) floats.
+ stoichiometry (:class:`numpy.ndarray`): The stoichiometric coefficients
+ array
+ analyticalc (:class:`numpy.ndarray`): The total concentrations of the
+ free components in mmol/mL. It must be an array of (*N*, *S*)
+ floats.
+
+ Returns:
+ :class:`numpy.ndarray`: array of (*N*, *S*) floats containing the
+ values of the function.
+ """
+ if np.ma.is_masked(concentration):
+ np_sum = np.ma.sum
+ else:
+ np_sum = np.sum
+
+ n_species = stoichiometry.shape[1]
+ if concentration.shape[1] == n_species:
+ c1 = concentration
+ c2 = cpluss(concentration, beta, stoichiometry)
+ else:
+ c1 = concentration[..., :n_species]
+ c2 = concentration[..., n_species:]
+
+ return c1 + np_sum(c2[..., np.newaxis]*stoichiometry[np.newaxis, ...],
+ axis=1) - analyticalc
+
+
+def fobj_solid(concentration, stoich_soln, stoich_solid, analyticalc, beta, solubility_product):
+ r"""Return the value of the objective function to be minimized for solids.
+
+ This objective function contains also information for solids.
+
+
+ Parameters:
+ concentration (:class:`numpy.ndarray`): free concentrations for all the
+ species in mmol/mL. It must be an array of
+ (*N*, *S* + *E1* + *E2* ) floats.
+ stoichiometry (:class:`numpy.ndarray`): The stoichiometric coefficients
+ array. It must be an array of (*E1*+*E2*,*S*).
+ analyticalc (:class:`numpy.ndarray`): The total concentrations of the
+ free components in mmol/mL. It must be an array of (*N*, *S*)
+ floats.
+
+ Returns:
+ :class:`numpy.ndarray`: array of (*N*, *S*) floats containing the
+ values of the function.
+
+ """
+ n_points, n_components = stoich_soln.shape
+ n_solids = len(solubility_product)
+ n_equils = len(beta)
+
+ c_comps = concentration[:,:n_components]
+ c_solut = concentration[:,:(n_components+n_equils)]
+ c_solid = concentration[:,(n_components+n_equils+1):]
+
+ raw_f = fobj(c_solut, stoich_soln, analyticalc)
+ solid_f = solid_factor(c_solid, stoich_solid)
+ raw_g = gobj(c_comps, stoich_solid, solubility_product)
+
+ return np.vstack((raw_f + solid_f, raw_g))
+
+
+def gobj(concentration, stoichiometry, solubility_product):
+ r"""Return the value of the function to be minimized for solids.
+
+ This function is defined as
+ :math:`g_i = \prod_k c_k^(q_{ik}) - Ks_i`
+
+ Parameters:
+ concentration (:class:`numpy.ndarray`): free concentrations for all the
+ species in mmol/mL. It must be an array of
+ (*N*, *S*) floats.
+ stoichiometry (:class:`numpy.ndarray`): The stoichiometric coefficients
+ array for precipitation equilibria.
+ solubility_product (:class:`numpy.ndarray`): an array with values
+ for the solubility_product.
+
+ Returns:
+ :class:`numpy.ndarray`: array of (*N*, *S*) floats containing the
+ values of the function.
+ """
+ aux = mass_action_solid(concentration, stoichiometry)
+ return aux / solubility_product - 1
+
+
+def solid_factor(conc_solid, stoich_solid):
+ """Factor containing the contribution of the precipitated solid.
+
+ This term is defined as :math:`\sum_j^{E_2} q_{ji}C_j`
+ """
+ return np.dot(conc_solid, stoich_solid)
diff --git a/src/libeq/optimizers/jacobian.py b/src/libeq/optimizers/jacobian.py
new file mode 100644
index 0000000..9547b55
--- /dev/null
+++ b/src/libeq/optimizers/jacobian.py
@@ -0,0 +1,168 @@
+import numpy as np
+
+from . import fobj
+
+
+def jacobian(concentration, stoichiometry, logc=False):
+ r"""Compute the jacobian array.
+
+ This function computes the jacobian for the function :func:`fobj`,
+ which is defined as
+
+ .. math:: J = \left( \begin{array}{ccc}
+ \frac{\partial f_0}{\partial c_0} & \cdots &
+ \frac{\partial f_0}{\partial c_S} \\
+ \vdots & \ddots & \vdots \\
+ \frac{\partial f_N}{\partial c_0} & \cdots &
+ \frac{\partial f_N}{\partial c_S} \\
+ \end{array} \right)
+
+ where :math:`f_i = c_i + \sum_{j=1}^E p_{ij}c_{j+S} - T_i`
+ and therefore
+
+ .. math:: J_{ij} = \delta_{ij} + c_j^{-1} \sum_{k=1}^E {p_{ki} p_{kj}
+ c_{k+S}}
+
+ Parameters:
+ concentration (:class:`ndarray`): the :term:`free concentrations array`
+ for every component. It must be an (*N*, *E* + *S* )-sized array
+ of floats.
+ stoichiometry (:class:`ndarray`): The :term:`stoichiometry array`.
+ It must be an (*E*, *S*)-sized array.
+ log (bool): If True, the returned result will be
+ :math:`J_{ij} = \frac{\partial f_i}{\partial\log c_j}`. If False
+ (default) the returned result will be
+ :math:`J_{ij} = \frac{\partial f_i}{\partial c_j}`
+ Returns:
+ :class:`ndarray`: An (*E*, *E*)-sized array which is the jacobian
+ matrix.
+ """
+ n_species = stoichiometry.shape[1]
+ aux1 = np.einsum('ij,ik,li->ljk', stoichiometry, stoichiometry,
+ concentration[:, n_species:])
+ aux2 = np.eye(n_species)
+ aux3 = concentration[:, np.newaxis, :n_species]
+ if logc:
+ return aux2 * aux3 + aux1
+ else:
+ return aux2 + aux1/aux3
+
+
+def jacobian_solid(concentration, stoichiometry, solubility_stoich, solubility_product):
+ jf1 = jacobian(concentration, stoichiometry)
+ jf2 = jacobian_f_solid(solubility_stoich)
+ jg1 = jacobian_g_solid(concentration, solubility_stoich, solubility_product)
+ z = np.zeros((jf1.shape[0], jf2.shape[1], jg1.shape[2]))
+ return np.block([[jf1, jf2],[jg1, z]])
+
+
+def jacobian_f_solid(solubility_stoich):
+ return solubility_stoich.T
+
+
+def jacobian_g_solid(concentration, solubility_stoich, solubility_product):
+ g = fobj.gobj(concentration, solubility_stoich, solubility_product)
+ return (1 + g[..., None])*solubility_stoich[None,...]/concentration[:,None,:]
+
+
+def dlogcdlogbeta(Amatrix, concentration, stoichiometry):
+ r"""Return ∂logc_k/∂logβ_i.
+
+ It returns the solution of the lineal system:
+ .. math :: \sum_{k=1}^S \left(
+ c_k\delta_{ki} + \sum_{j=1}^E {
+ p_{ji} p_{jk} c_{j+S}
+ }
+ \right) \frac{\partial\log c_k}{\partial \log\beta_b}
+ = -p_{bi}c_{b+S}
+ """
+ n_species = stoichiometry.shape[1]
+ B = -stoichiometry[np.newaxis, ...] * concentration[:, n_species:, None]
+ return np.linalg.solve(Amatrix, B.swapaxes(-1,-2))
+
+
+def extended_dlogcdlogbeta(dlcdlb, stoichiometry):
+ r"""Return ∂logc_k/∂logβ_i for the extended species E->E+S.
+
+ It returns the values of:
+ .. math :: \frac{\partial\log c_{i+S}}{\partial\log\beta_k} =
+ \delta_{ik} + \sum_{j=1}^S p_{ij}
+ \frac{\partial\log c_j}{\partial\log\beta_k}
+ """
+ n_equil = stoichiometry.shape[0]
+ return np.eye(n_equil) + np.einsum('ijk,lj->ikl', dlcdlb, stoichiometry)
+
+
+def dlogcdt(Amatrix, vol, vol0):
+ r"""Return ∂logc_k/∂t_i.
+
+ The definition is the following
+ .. math::
+
+ \sum_{k=1}^S \left(
+ c_k\delta_{ki} + \sum_{j=1}^E p_{ji}p_{jk} c_{j+S}
+ \right) \frac{\partial\log c_k}{\partial t_j} = \frac{v_0\cdot \delta_{ij}}{v+v_0}
+
+ The matrix **A** can be obtained from :func:`matrix_a`.
+
+ Parameters:
+ Amatrix (:class:`numpy.ndarray`): the matrix **A** which is a (N, S, S) float array.
+ vol (:class:`numpy.ndarray`): the titre
+ vol0 (float): the starting volume:
+ Returns:
+ :class:`numpy.ndarray`: an (N, S, S) array
+ """
+ n_points, n_species, *_ = Amatrix.shape
+ B = np.eye(n_species)[np.newaxis, ...] / (vol0 + vol[:, np.newaxis, np.newaxis])
+ return np.squeeze(np.linalg.solve(Amatrix, B))
+
+
+def dlogcdb(Amatrix, vol, vol0):
+ r"""Return ∂logc_k/∂b_i.
+
+ The definition is the following
+ .. math::
+
+ \sum_{k=1}^S \left(
+ c_k\delta_{ki} + \sum_{j=1}^E p_{ji}p_{jk} c_{j+S}
+ \right) \frac{\partial\log c_k}{\partial b_j} = \frac{v\cdot\delta_{ij}}{v+v_0}
+
+ The matrix **A** can be obtained from :func:`matrix_a`.
+
+ Parameters:
+ Amatrix (:class:`numpy.ndarray`): the matrix **A** which is a (N, S, S) float array.
+ vol (:class:`numpy.ndarray`): the titre
+ vol0 (float): the starting volume:
+ Returns:
+ :class:`numpy.ndarray`: an (N, S, S) array
+ """
+ n_points, n_species, *_ = Amatrix.shape
+ B = vol[:, np.newaxis, np.newaxis] * np.eye(n_species)[np.newaxis, ...] / (vol0 + vol[:, np.newaxis, np.newaxis])
+ return np.squeeze(np.linalg.solve(Amatrix, B))
+
+
+def amatrix(concentration, stoichiometryx):
+ r"""Calculate the matrix **A**.
+
+ **A** is a matrix that apperars commonly in many equations for the elaboration
+ of the jacobian. It is defined as follows:
+
+ .. math::
+
+ A_{nij} = c_{nk}\delta_{ki} + \sum_{j=1}^E p_{ki}p_{jk}c_{n,j+S}
+ """
+ return np.einsum('ji,jk,...j->...ik', stoichiometryx, stoichiometryx, concentration)
+
+
+def bmatrix_t(vol, vol0, n_species):
+ B = np.eye(n_species)[np.newaxis, ...] * vol0 / (vol0 + vol[:, np.newaxis, np.newaxis])
+ return B
+
+
+def bmatrix_b(vol, vol0, n_species):
+ B = vol[:, np.newaxis, np.newaxis] * np.eye(n_species)[np.newaxis, ...] / (vol0 + vol[:, np.newaxis, np.newaxis])
+ return B
+
+
+def solve_xmatrix(amatrix, bmatrix):
+ return np.squeeze(np.linalg.solve(amatrix, bmatrix))
diff --git a/src/libeq/optimizers/libemf.py b/src/libeq/optimizers/libemf.py
new file mode 100644
index 0000000..92bc59e
--- /dev/null
+++ b/src/libeq/optimizers/libemf.py
@@ -0,0 +1,144 @@
+"""Routines for constant fitting from potentiometric data.
+
+Module :mod:`libemf` contains the routines needed for fitting equilibrium
+constants from potentiometric data. The main function to invoke here is
+:func:`emffit` which handles most of the work. This is the only public
+function for this module.
+
+Author: Salvador Blasco
+"""
+
+
+import numpy as np
+from numpy.typing import NDArray
+
+NERNST = 25.6926 # mV
+RoverF = 0.086173424 # mV/K
+FArray = NDArray[float]
+
+
+def hselect(array: FArray, hindices: list[int]) -> FArray:
+ """Select columns that correspond to the electroactive species.
+
+ Given the concentrations array, selects the columns that correspond
+ to the electroactive species.
+
+ Parameters:
+ array (:class:`numpy.ndarray`): The :term:`free concentrations array`
+ hindices (list[int]): Indices of the electroactive specie(s).
+
+ Returns:
+ The part of C which is electroactive
+ """
+ return array[np.arange(len(hindices)),hindices]
+
+
+def nernst(electroactive_conc: FArray, emf0: FArray, slope: FArray | float = 1.0,
+ joint: FArray | float=0.0) -> FArray:
+ r"""Calculate the calculated potential.
+
+ Apply Nernst's equation to calculate potential according to
+ .. math ::
+
+ E = E^0 + f\frac{nF}{RT}\ln[C] + J
+
+ Parameters:
+ electroactive_conc (:class:`numpy.ndarray`): a 1D array of floats
+ representing the free concentrations of the electroactive species.
+ emf0 (:class:`numpy.ndarray`): The :term:`standard potential`
+ slope (:class:`numpy.ndarray`): The slope for :term:`Nernst's equation`
+ joint (:class:`numpy.ndarray`): The liquid joint contribution for :term:`Nernst's equation`
+ temperature (float): the absolute temperature
+ Returns:
+ :class:`numpy.ndarray`: an array of floats containing the calculated values
+ """
+ return emf0 + slope*np.log(electroactive_conc) + joint
+
+
+def emf_jac_beta(dlogc_dlogbeta: FArray, slope=1.0, temperature: float=298.15) -> FArray:
+ r"""Calculate the jacobian part related to equilibrium constants.
+
+ The calculation is done according to equation
+ .. math ::
+
+ \frac{\partial E_n}{\partial\log\beta_b}=\frac{fRT}{nF\log e}\frac{\partial\log c_{nh}}
+ {\partial\log\beta_b}
+
+ Parameters:
+ dlogc_dlogbeta (:class:`numpy.ndarray`): the derivative values. They can be obtained
+ from :func:`libeq.jacobian.dlogcdlogbeta`.
+ slope (:class:`numpy.ndarray`): The slope for :term:`Nernst's equation`
+ temperature (float): the absolute temperature
+ Returns:
+ :class:`numpy.ndarray`: an array of floats containing the calculated values
+ """
+ nernstian_slope = slope*RoverF*temperature
+ return nernstian_slope*dlogc_dlogbeta
+
+
+def emf_jac_init(dlogc_dt: FArray, slope=1.0, temperature=298.15) -> FArray:
+ r"""Calculate the jacobian part related to the initial amount.
+
+ The calculation is done according to equation
+ .. math ::
+
+ \frac{\partial E_n}{\partial t_i} = f\frac{RT}{nF}\frac{\partial\log c_{nh}}{\partial t_i}
+
+ Parameters:
+ dlogc_dt (:class:`numpy.ndarray`): the derivative values. They can be obtained
+ from :func:`libeq.jacobian.dlogcdt`.
+ slope (:class:`numpy.ndarray`): The slope for :term:`Nernst's equation`
+ temperature (float): the absolute temperature
+ Returns:
+ :class:`numpy.ndarray`: an array of floats containing the calculated values
+ """
+ nernstian_slope = slope*RoverF*temperature
+ return nernstian_slope*dlogc_dt
+
+
+def emf_jac_buret(dlogc_db: FArray, slope=1.0, temperature=298.15) -> FArray:
+ r"""Calculate the jacobian part related to the buret concentration.
+
+ The calculation is done according to equation
+ .. math ::
+
+ \frac{\partial E_n}{\partial b_i} = f\frac{RT}{nF}\frac{\partial\log c_{nh}}{\partial b_i}
+
+ Parameters:
+ dlogc_db (:class:`numpy.ndarray`): the derivative values. They can be obtained
+ from :func:`libeq.jacobian.dlogcdb`.
+ slope (:class:`numpy.ndarray`): The slope for :term:`Nernst's equation`
+ temperature (float): the absolute temperature
+ Returns:
+ :class:`numpy.ndarray`: an array of floats containing the calculated values
+ """
+ nernstian_slope = slope*RoverF*temperature
+ return nernstian_slope*dlogc_db
+
+
+def emf_jac_e0(size: int) -> FArray:
+ r"""Calculate the jacobian part related to the standard potential.
+
+ It returns ones based on the size according to equation
+ .. math ::
+
+ \frac{\partial E_n}{\partial E^0} = 1
+
+ Parameters:
+ size (int): the number of ones to return
+ Returns:
+ :class:`numpy.ndarray`: an array of floats containing the calculated values
+ """
+ return np.ones(size)
+
+
+def emf_weights(titre: FArray, titre_error: float, emf: FArray, emf_error: float) -> FArray:
+ gradient = np.gradient(emf, titre, axis=0)
+ return 1/(emf_error**2 + gradient**2 * titre_error**2)
+
+
+def residual_jacobian(emf: FArray, calc_emf: FArray, weights: FArray, demfdx) -> FArray:
+ # breakpoint()
+ aux = np.sqrt(weights)*(emf - calc_emf)*emf
+ return -2*np.sum(aux[:,None,None]*demfdx, axis=0)
+
diff --git a/src/libeq/optimizers/libfit.py b/src/libeq/optimizers/libfit.py
new file mode 100644
index 0000000..a0cacfd
--- /dev/null
+++ b/src/libeq/optimizers/libfit.py
@@ -0,0 +1,466 @@
+"""General functions for nonlinear fitting."""
+
+# pylint: disable=possibly-used-before-assignment
+
+import enum
+import math
+from typing import Tuple, Dict, List, Final
+
+import numpy as np
+from numpy.typing import NDArray
+
+# import consts
+import libeq.excepts
+from . import libmath
+# import report
+
+
+LOGK = 2.3025851 # ln(10) = 1/log(e)
+FloatArray = NDArray[float]
+
+
+class Exec(enum.IntEnum):
+ "Flag class for execution status."
+ INITIALISING = enum.auto()
+ RUNNING = enum.auto()
+ NORMAL_END = enum.auto()
+ TOO_MANY_ITERS = enum.auto()
+ ABNORMAL_END = enum.auto()
+ SINGULAR_MATRIX = enum.auto()
+
+
+def levenberg_marquardt(bridge, **kwargs) -> Dict[str, np.ndarray]:
+ r"""Non linear fitting by means of the Levenberg-Marquardt method.
+
+ Parameters:
+ x0 (:class:`numpy.ndarray`): initial guess.
+ weights (1D-array of floats): containing the values for weighting. It
+ must be the same shape and type as *y*.
+ func (callable): A function that accepts the values of *x0* and
+ return both the residuals vector and the jacobian matrix.
+ max_iterations (int, optional): maximum number of iterations allowed
+ threshold (float, optional): criteria for convergence
+ out_chisq (list, optional): If provided, the successive values for
+ χ² in each iteration will be stored.
+ verbosity (int, optional): An 0-2 number indicating the level of
+ verbosity to be printed. 0 for mute, 1 for normal and 2 for
+ pedantic output.
+ report (callable, optional): A callable function that accepts the
+ values of x0, iteration counter, free concentration values,
+ etc., and is called every iteration in order to report on the
+ progress of the fitting.
+ one_iter (bool, optional): Performs one iterations and returns the
+ result.
+ quiet_maxits (bool, optional): Prevents this funcyion from throwing
+ :class:`excepts.TooManyIterations` and quietly exits and returns
+ the result when the maximum number of iterations is reached.
+
+ Returns:
+ tuple:
+ - :class:`numpy.ndarray`: The refined constants in natural logarithmic
+ units
+ - :class:`numpy.ndarray`: The free concentrations
+ - dict: Extra optional parameters
+
+ Raises:
+ ValueError: If invalid parameters are passed.
+ """
+
+ DAMPING_UPPER: Final[float] = 1e7
+ DAMPING_LOWER: Final[float] = 1e-7
+ DAMPING_UPF: Final[float] = 11.0
+ DAMPING_LOWF: Final[float] = 9.0
+ DAMPING0: Final[float] = 1e3
+ report_buffer = kwargs.get('report', DummyReport())
+ one_iter = kwargs.get('one_iter', False)
+ chisq_threshold: Final[float] = kwargs.pop('chisq_threshold', 1e-3)
+ grad_threshold: Final[float] = kwargs.pop('grad_threshold', 1e-7)
+ step_threshold: Final[float] = kwargs.pop('step_threshold', 1e-7)
+ test_threshold: Final[float] = kwargs.pop('test_threshold', 1e-7)
+ max_iterations = kwargs.pop('max_iterations', 200)
+ quiet_maxits = kwargs.get('quiet_maxits', False)
+ damping: float = kwargs.pop('damping', DAMPING0)
+ debug: bool = kwargs.pop('debug', False)
+
+ n_points, n_vars = bridge.size()
+
+ iteration: int = 0
+ W: FloatArray = bridge.weights()
+ chisq: float = 1e99
+ sigma: float = math.inf
+ execution_status: Exec = Exec.INITIALISING
+ J: FArray
+ M: FArray = np.array([])
+ D: FArray = np.array([])
+ # breakpoint()
+
+ while iteration < max_iterations:
+ if execution_status == Exec.INITIALISING:
+ dx = np.zeros(n_vars)
+ else:
+ resid: FArray = bridge.tmp_residual()
+ gradient: FArray = J.T @ W @ resid
+ gradient_norm = np.linalg.norm(gradient)
+ try:
+ dx = np.linalg.solve(M+damping*D, gradient)
+ except np.linalg.LinAlgError as exc:
+ execution_status = Exec.SINGULAR_MATRIX
+ exception_thrown = exc
+ break
+
+ bridge.take_step(dx) # Step bridge values and build matrices
+ if execution_status == Exec.RUNNING:
+ new_chisq = resid.T @ W @ resid
+ test = (chisq-new_chisq)/abs(dx @ (damping*D @ dx - gradient))
+ elif execution_status == Exec.INITIALISING:
+ test = test_threshold+1
+
+ if test < test_threshold: # step REJECTED
+ damping = min((damping*DAMPING_UPF, DAMPING_UPPER))
+ else: # step ACCEPTED
+ bridge.accept_values()
+ if one_iter:
+ break
+ J, resid = bridge.matrices()
+ M: FloatArray = J.T @ W @ J
+ D: FloatArray = np.diag(np.diag(M))
+
+ if execution_status == Exec.RUNNING:
+ chisq = new_chisq
+ sigma = fit_sigma(resid, np.diag(W), n_points, n_vars)
+ bridge.report_step(iteration=iteration,
+ damping=damping,
+ chisq=chisq/bridge.degrees_of_freedom,
+ sigma=sigma,
+ gradient_norm=gradient_norm)
+ damping = max((damping/DAMPING_LOWF, DAMPING_LOWER))
+
+ if execution_status == Exec.RUNNING:
+ if debug and iteration:
+ print(f"iteration={iteration-1}, {damping=:.2e}, {test=:.4e}, {sigma=:.4e}, {chisq=:.4e}")
+ print(f"\t{dx=}\n\tx={bridge._variables}")
+
+ if chisq/bridge.degrees_of_freedom < chisq_threshold:
+ execution_status = Exec.NORMAL_END
+ if debug:
+ print(f"END: threshold {test/bridge.degrees_of_freedom}<{chisq_threshold}")
+ print(f"\t{dx=}\n\tx={bridge._variables}")
+ bridge.report_raw(f" refinent finished on threshold criteria [{test}<{chisq_threshold}]\n")
+ break
+
+ if gradient_norm < grad_threshold:
+ execution_status = Exec.NORMAL_END
+ if debug:
+ print(f"END: gradient {gradient_norm}<{grad_threshold}")
+ print(f"\tx={bridge._variables}")
+ bridge.report_raw(f"refinent finished on gradient criteria [{gradient_norm}<{grad_threshold}]\n")
+ break
+
+ if (step_size := max(np.abs(r) for r in bridge.relative_change(dx))) < step_threshold:
+ execution_status = Exec.NORMAL_END
+ if debug:
+ print(f"END: step {step_size}<{step_threshold}")
+ print(f"\tx={bridge._variables}")
+ bridge.report_raw(f"refinent ended on small step criteria [{step_size}<{step_threshold}]\n")
+ break
+
+ if math.isnan(test) or any(np.isnan(dx)):
+ execution_status = Exec.ABNORMAL_END
+ break
+
+ iteration += 1
+ if execution_status == Exec.INITIALISING:
+ execution_status = Exec.RUNNING
+ else:
+ execution_status = Exec.TOO_MANY_ITERS
+
+ ret = {'jacobian': J,
+ 'residuals': resid,
+ 'damping': damping,
+ 'iterations': iteration}
+ if execution_status == Exec.TOO_MANY_ITERS:
+ raise excepts.TooManyIterations(msg=("Maximum number of iterations reached"),
+ last_value=ret)
+ if execution_status == Exec.ABNORMAL_END:
+ raise excepts.UnstableIteration(msg=("The iteration is not stable"),
+ last_value=ret)
+ if execution_status == Exec.SINGULAR_MATRIX:
+ raise exception_thrown
+ return ret
+
+
+def simplex(x0, y, fnc, free_conc, weights, **kwargs):
+ r"""Non linear fitting by means of the Nelder-Mead method (SIMPLEX).
+
+ See `Numerical Recipes in C, §10.4
+ `_
+ and `http://www.scholarpedia.org/article/Nelder-Mead_algorithm`_
+
+ Parameters:
+ x0 (:class:`numpy.ndarray`): initial guess.
+ y (:class:`numpy.ndarray`): the experimental magnitude to be fitted.
+ weights (1D-array of floats): containing the values for weighting
+ fnc (callable): A function that accepts the values of *x0* as well as
+ the free concentrations and return the calculated values for *y*.
+ free_conc (callable): A function that accepts *x0* and returns the
+ values of the free concentration.
+ weights (1D-array of floats): containing the values for weighting. It
+ must be the same shape and type as *y*.
+ max_iterations (int, optional, default: 20): maximum number of
+ iterations allowed.
+ verbosity (int, optional): An 0-2 number indicating the level of
+ verbosity to be printed. 0 for mute, 1 for normal and 2 for
+ pedantic output.
+ report (callable, optional): A callable function that accepts the
+ values of x0, iteration counter, free concentration values,
+ etc., and is called every iteration in order to report on the
+ progress of the fitting.
+ term_x (float, optional, default=1e-5): Minimum simplex size threshold
+ defining the convergence.
+ term_f (float, optional, default=1e-7): Minimum objective function
+ change to define convergence.
+
+ Returns:
+ tuple:
+ - :class:`numpy.ndarray`: The refined constants in natural logarithmic
+ units
+ - :class:`numpy.ndarray`: The free concentrations
+ - dict: Extra optional parameters
+
+ Raises:
+ ValueError: If invalid parameters are passed.
+ """
+
+ # i. Check input parameters
+ # -------------------------
+ report = kwargs.get('report', None)
+ max_iterations = kwargs.get('max_iterations', 20)
+ term_x = kwargs.get('term_x', 1e-5)
+ term_f = kwargs.get('term_f', 1e-7)
+
+ # ii. initial parameters
+ # ----------------------
+ Nr: int = len(x0) # number of variables to refine
+ h: list[float] = Nr*[0.1] # the initial steps in each dimmension
+ alpha: float = 1.0 # constant for reflection operation
+ beta: float= 0.5 # constant for contraction operation
+ gamma = 2 # constant for expansion operation
+ delta: float = 0.5 # constant for shrinking operation
+ iteration: int = 0
+ chisq_hist = []
+
+ def _report(**kws):
+ if report is not None:
+ report(**kws)
+
+ def _fobj(_x_):
+ _concs = free_conc(_x_)
+ y_calc = fnc(_x_, _concs)
+ _f = np.sum((weights*(y - y_calc))**2) # compute χ₂(dx)
+ return _f, _concs
+
+ # iii. build initial simplex, n+1 points
+ # --------------------------------------
+ x = [x0] # simplex coordinates
+ _f, _c = _fobj(x0)
+ f = [_f] # simplex values
+ concs = [_c]
+
+ for i in range(Nr):
+ x_new = np.copy(x[0])
+ x_new[i] += h[i]
+ x.append(x_new)
+ _f, _c = _fobj(x_new)
+ f.append(_f)
+ concs.append(_c)
+
+ while True:
+ iteration += 1
+
+ # iv. Ordering: Determine the indices h, s, l of the worst, second
+ # worst and the best vertex, respectively, in the current working
+ # simplex S
+ _h, _s, _l = _hsl(f)
+
+ _report(iteration=iteration, x=x[_l]/LOGK, chisq=f[_l])
+
+ # v. Centroid: Calculate the centroid c of the best side—this is the
+ # one opposite the worst vertex xₕ
+ c = _centroid(x[:_h] + x[(_h+1):])
+
+ # vi. Transformation: Compute the new working simplex from the current
+ # one. First, try to replace only the worst vertex xₕ with a better
+ # point by using reflection, expansion or contraction with respect
+ # to the best side. All test points lie on the line defined by xₕ
+ # and c, and at most two of them are computed in one iteration. If
+ # this succeeds, the accepted point becomes the new vertex of the
+ # working simplex. If this fails, shrink the simplex towards the
+ # best vertex xₗ . In this case, n new vertices are computed.
+
+ # vi(a). Reflect: Compute the reflection point xᵣ:=c+α(c−xₕ) and
+ # fᵣ:=f(xᵣ). If fₗ≤fᵣ= f[_s]:
+ # vi(c). Contract: If fᵣ≥fₛ, compute the contraction point x_c by
+ # using the better of the two points xₕ and xᵣ.
+ if f_r < f[_h]:
+ # Outside: If fₛ≤fᵣ max_iterations:
+ break
+
+ _h, _s, _l = _hsl(f)
+ x_final = x[_l]
+ c_final = concs[_l]
+
+ ret_extra = {'iterations': iteration, 'convergence': chisq_hist}
+
+ return x_final, c_final, ret_extra
+
+
+def final_params(jacobian, weights, resid):
+ error_beta = libmath.error_params(jacobian, weights)
+ covar = libmath.covariance(jacobian, weights)
+ correl = libmath.correlation_matrix(covar)
+ return error_beta, covar, correl
+
+
+def _centroid(x: FloatArray):
+ """Given a list of vectors, return the centroid.
+
+ Parameters:
+ x (:class:`numpy.ndarray`): A list of 1D :class:`numpy.ndarray` of
+ the same length representing the vector for calculating the
+ centroid.
+
+ Returns:
+ :class:`numpy.ndarray`: A vector representing the centroid.
+
+ >>> _centroid([np.array([1,2,3,4]),
+ ... np.array([5,6,7,8]),
+ ... np.array([9,10,11,12])])
+ array([ 5., 6., 7., 8.])
+ """
+ return np.sum(np.vstack(x), axis=0) / len(x)
+
+
+def _hsl(lst):
+ """Given a list of floats, return the indices of the worst (biggest
+ value), second worst and best (lowest value)
+
+ >>> _hsl([5,3,7,1,0])
+ 3, 0, 4
+ """
+ # if not len(lst) > 2:
+ # breakpoint()
+ assert len(lst) > 2
+ f_idx = [lst.index(ff) for ff in sorted(lst, reverse=True)]
+ return f_idx[0], f_idx[1], f_idx[-1]
+
+
+def fit_sigma(residuals: np.ndarray, weights: np.ndarray, npoints: int, nparams: int) -> float:
+ """Calculate the fit's sigma value for a given set of residuals and weights."""
+ return np.sum(weights*residuals**2)/(npoints-nparams)
+
+
+class DummyReport:
+ def write(self, data):
+ pass
+
+# fitting_functions = {
+# consts.METHOD_LM: levenberg_marquardt,
+# consts.METHOD_NM: simplex
+# }
diff --git a/src/libeq/optimizers/libmath.py b/src/libeq/optimizers/libmath.py
new file mode 100644
index 0000000..2aefa8a
--- /dev/null
+++ b/src/libeq/optimizers/libmath.py
@@ -0,0 +1,138 @@
+import numpy as np
+
+
+def covariance(J, W):
+ """Compute covariance matrix.
+
+ Parameters:
+ J (:class:`numpy.ndarray`): the jacobian
+ W (:class:`numpy.ndarray`): the weights matrix
+ Returns:
+ :class:`numpy.ndarray`: an (*p*, *p*)-sized array representing
+ the covariance matrix.
+ """
+ aux2 = J.T @ np.diag(np.diag(W)) @ J
+ return np.linalg.pinv(aux2)
+
+
+def fitting_errors(covar):
+ return np.sqrt(np.diag(covar))
+
+
+def correlation_matrix(covar):
+ D = np.diag(covar)
+ nD = len(D)
+ return covar/np.sqrt(np.dot(D.reshape((nD, 1)), D.reshape((1, nD))))
+
+
+def extrapoly(x0, X, Y):
+ r"""Polynomial extrapolation.
+
+ Given a list of *x* and *y* points, and an *x0* point, this routine
+ calculates the polynomials that goes through the given points and
+ evaluates them for *x0*. It evaluates *m* extrapolations at once out of
+ *n* polynomials of degree *g* -1
+
+ Parameters:
+ x0 (:class:`numpy.ndarray`): An (m, n)-array with the values for the
+ polynomials to be evaluated.
+ X (:class:`numpy.ndarray`): An (n, g)-array with the *x* values of the
+ data.
+ Y (:class:`numpy.ndarray`): An (n, g)-array with the *y* values of the
+ data. Axis-0 must be of the same length than X.
+
+ Returns:
+ :class:`numpy.ndarray`: An (m, n)-array with calculated *y* values
+ that produce the evaluation of the polynomials at *x0*
+ """
+ def polyexp(array, axis, n):
+ """Given any array and one axis of it, return the same array with one
+ extra dimmension in which the new dimmension is the array raised to
+ 0..n
+
+ >>> a = np.array([[1, 1], [2, 2]])
+ >>> polyexp(a, -1, 2)
+ [[[1, 1], [1, 1]],
+ [[1, 1], [2, 2]],
+ [[1, 1], [4, 4]]]
+ """
+ a = np.expand_dims(array, axis)
+ s = [1] * a.ndim
+ s[axis] = n+1
+ b = np.reshape(np.arange(n+1), tuple(s))
+ return np.power(a, b)
+
+ g, n = Y.shape
+ Q = polyexp(X.T, -1, g-1)
+ assert Q.shape == (n, g, g)
+ A = np.linalg.solve(Q, Y.T)
+ assert A.shape == (n, g)
+ m = x0.shape[1]
+ assert x0.shape[0] == n
+ xexp = polyexp(x0.T, -1, g-1)
+ assert xexp.shape == (m, n, g)
+ r = np.sum(xexp * A[np.newaxis, ...], axis=-1)
+ return np.squeeze(r)
+
+
+def quadratic_extrapolation(a, b, c):
+ """Perform 3-point extrapolation.
+
+ Given three ordered points of an evenly spaced curve, return the
+ quadratic extrapolation for estimating the following point.
+ """
+ return a - 3*b + 3*c
+
+
+def nearest(a, b):
+ """Find nearest element in a sorted list of numbers.
+
+ Given a two list of indices, returns a sorted list of the indices of
+ **a** which are closer to those of **b**
+ """
+ return np.argsort(np.abs(a[:, None]-b[None, :]), axis=0)
+
+
+def sample_size_change(data, new_size):
+ """Resample a free concentration array.
+
+ Parameters:
+ data (:class:`numpy.ndarray`): The data to be resized. Dimmension 0
+ must be the sample number. Lenght of dimmension is assumed to
+ be the size of the old data.
+ new_size (int): The length of the new data.
+ Returns:
+ :class:`numpy.ndarray`: The resized array along dimmension 0.
+ """
+ from scipy.interpolate import interp1d
+ old_size = data.shape[0]
+ f_interp = interp1d(np.arange(old_size), data, axis=0, assume_sorted=True)
+ new_x = np.linspace(0, old_size-1, new_size)
+ return f_interp(new_x)
+
+
+def weighting_slope(x, y, error_x, error_y):
+ r"""Calculate weighting scheme acording to Gans et al.
+
+ .. math:: w = s_E^2 + \left(\frac{\partial E}{\partial V}\right)^2 s_V^2
+
+ Parameters:
+ x (iterable): volume in mL
+ y (iterable): emf in mV
+ error_x (iterable): error of volume in mL
+ error_y (iterable): error of emf in mV
+
+ Returns:
+ :class:`numpy.ndarray`: An array containing the calculated weights
+ """
+ dydx = np.gradient(x, y)
+ yield from (1/(error_y**2 + d**2 * error_x**2) for d in dydx)
+
+
+def m_matrix(jacobian, weights):
+ return np.dot(np.dot(jacobian.T, weights), jacobian)
+
+
+def error_params(jacobian, weights):
+ M = m_matrix(jacobian, weights)
+ return np.diag(np.linalg.inv(M))
diff --git a/src/libeq/optimizers/potentiometry.py b/src/libeq/optimizers/potentiometry.py
index d8e775a..189bb5b 100644
--- a/src/libeq/optimizers/potentiometry.py
+++ b/src/libeq/optimizers/potentiometry.py
@@ -1,415 +1,383 @@
-from functools import partial
-from itertools import accumulate
+"Test collection for potentiometry data fitting."
-import numpy as np
+import itertools
+from typing import Protocol, TypeAlias, Any
+import numpy as np
+from numpy.typing import NDArray
from libeq.data_structure import SolverData
-from libeq.excepts import FailedCalculateConcentrations, TooManyIterations
from libeq.solver import solve_equilibrium_equations
-from libeq.solver.solver_utils import (
- _assemble_outer_fixed_point_params,
- _prepare_common_data,
- _titration_total_c,
- _titration_background_ions_c,
-)
-
-from .fitter import levenberg_marquardt
-
-
-def PotentiometryOptimizer(data: SolverData, reporter=None):
- def f_obj(c):
- """
- Given the concentrations of the components, calculate the objective function value.
-
- Parameters:
- -------
- x : numpy.ndarray
- The concentrations of the components.
-
- Returns:
- -------
- emf : numpy.ndarray
- The calculcated potential from components.
-
- """
- electroactive = fhsel(c)
- calc_remf = np.log(electroactive)
- return np.ravel(calc_remf)
-
- def free_conc(updated_beta, iterations):
- nonlocal _initial_guess
- incoming_beta = updated_beta / 2.303
- gen = ravel(data.log_beta, incoming_beta, beta_flags)
- log_beta = np.fromiter(gen, dtype=float)
- # Solve the system of equations
- try:
- c, *_ = solve_equilibrium_equations(
- stoichiometry=stoichiometry,
- solid_stoichiometry=solid_stoichiometry,
- original_log_beta=log_beta,
- original_log_ks=original_log_ks,
- total_concentration=total_concentration,
- outer_fiexd_point_params=outer_fixed_point_params,
- initial_guess=_initial_guess,
- full=True,
- )
- except FailedCalculateConcentrations as e:
- msg = f"Error in calculating concentrations in iteration n.{iterations}\n\n"
- e.msg = msg + e.msg
- e.last_value = log_beta
- raise e
- except TooManyIterations as e:
- msg = f"Too many iterations in calculating concentrations in iteration n.{iterations}\n\n"
- e.msg = msg + e.msg
- e.last_value = log_beta
- raise e
- _initial_guess = c[:, : stoichiometry.shape[0]]
- return c
-
- def jacobian(concentration):
- """
- Calculate the jacobian matrix of the objective function.
-
- Parameters:
- -------
- x : numpy.ndarray
- The concentrations of the components.
-
- Returns:
- -------
- jac : numpy.ndarray
- The jacobian matrix of the objective function.
-
- """
- nc = stoichiometry.shape[0]
- J = np.zeros(shape=(concentration.shape[0], nc, nc))
- diagonals = np.einsum(
- "ij,jk->ijk", concentration[:, nc:], np.eye(concentration.shape[1] - nc)
- )
- # Compute Jacobian for soluble components only
- J = stoichiometry @ diagonals @ stoichiometry.T
- J[:, range(nc), range(nc)] += concentration[:, :nc]
-
- B = stoichiometry[np.newaxis, ...] * concentration[..., np.newaxis, nc:]
- dcdb = np.squeeze(np.linalg.solve(J, -B))
- return fhsel(dcdb[..., np.flatnonzero(beta_flags)]).T
-
- def text_reporter(*args):
- print(f"iteration n.{args[0]}")
- print("x", args[1])
- print("dx", args[2])
- print("sigma", args[3])
- print("----------------\n")
-
- # Load the n titrations with their potential from the data file
- slope = [t.slope for t in data.potentiometry_opts.titrations]
- emf = [t.emf for t in data.potentiometry_opts.titrations]
- emf0 = [t.e0 for t in data.potentiometry_opts.titrations]
- v_add = [t.v_add for t in data.potentiometry_opts.titrations]
- px_ranges = [t.px_range for t in data.potentiometry_opts.titrations]
- idx_to_keep = [~t.ignored for t in data.potentiometry_opts.titrations]
-
- reduced_emf = [
- build_reduced_emf(emf_, emf0_, slope_)
- for emf_, emf0_, slope_ in zip(emf, emf0, slope)
- ]
-
- for i, ranges in enumerate(px_ranges):
- if ranges:
- valid_ranges = np.array(
- [r for r in ranges if not (r[0] == 0 and r[1] == 0)]
- )
- if valid_ranges.size > 0:
- ll_ul = valid_ranges * 2.303
- emf_values = -reduced_emf[i][:, np.newaxis]
- idx = np.any(
- (emf_values >= ll_ul[:, 0]) & (emf_values <= ll_ul[:, 1]), axis=1
- )
- idx &= idx_to_keep[i]
- idx_to_keep[i] = idx
- reduced_emf[i] = reduced_emf[i][idx_to_keep[i]]
- emf[i] = emf[i][idx_to_keep[i]]
- v_add[i] = v_add[i][idx_to_keep[i]]
-
- full_emf = np.concatenate(reduced_emf, axis=0).ravel()
-
- n_exp_points = full_emf.shape[0]
-
- if data.potentiometry_opts.weights == "constants":
- weights = np.ones(n_exp_points)
- elif data.potentiometry_opts.weights == "calculated":
- e0_sigma = [t.e0_sigma for t in data.potentiometry_opts.titrations]
- v0_sigma = [t.v0_sigma for t in data.potentiometry_opts.titrations]
-
- weights = np.concatenate(
- [
- compute_weights(emf_, v_add_, e0_sigma_, v0_sigma_)
- for emf_, v_add_, e0_sigma_, v0_sigma_ in zip(
- emf, v_add, e0_sigma, v0_sigma
- )
- ],
- axis=0,
- ).ravel()
-
- elif data.potentiometry_opts.weights == "given":
- raise NotImplementedError("User given weights are not implemented yet.")
-
- slices = list(accumulate([0] + [s.shape[0] for s in reduced_emf]))
- electro_active_components = [
- t.electro_active_compoment for t in data.potentiometry_opts.titrations
- ]
- fhsel = partial(hselect, hindices=electro_active_components, slices=slices[:-1])
-
- beta_flags = np.array(data.potentiometry_opts.beta_flags).astype(int)
- beta_flags = np.where(beta_flags == -1, 0, beta_flags)
-
- (
- stoichiometry,
- solid_stoichiometry,
- original_log_beta,
- original_log_ks,
- charges,
- independent_component_activity,
- ) = _prepare_common_data(data)
-
- total_concentration = np.vstack(
- [
- _titration_total_c(t, i)
- for t, i in zip(data.potentiometry_opts.titrations, idx_to_keep)
- ]
- )
-
- background_ions_concentration = np.vstack(
- [
- _titration_background_ions_c(t, i)
- for t, i in zip(data.potentiometry_opts.titrations, idx_to_keep)
- ]
- )
+from libeq.consts import Flags, LN10
+
+from . import jacobian
+from . import libemf
+from . import libfit
- original_log_beta = np.tile(original_log_beta, (total_concentration.shape[0], 1))
- original_log_ks = np.tile(original_log_ks, (total_concentration.shape[0], 1))
- outer_fixed_point_params = _assemble_outer_fixed_point_params(
- data, charges, background_ions_concentration, independent_component_activity
- )
+FArray: TypeAlias = NDArray[float]
- _initial_guess, *_ = solve_equilibrium_equations(
- stoichiometry=stoichiometry,
- solid_stoichiometry=solid_stoichiometry,
- original_log_beta=original_log_beta,
- original_log_ks=original_log_ks,
- total_concentration=total_concentration,
- outer_fiexd_point_params=outer_fixed_point_params,
- initial_guess=None,
- full=False,
- )
- x, concs, return_extra = levenberg_marquardt(
- np.fromiter(unravel(data.log_beta, beta_flags), dtype=float) * 2.303,
- full_emf,
- f_obj,
- free_conc,
- jacobian,
- weights,
- report=reporter,
- )
+def refine_indices(flags: list[Flags]):
+ return [i == Flags.REFINE for i in flags]
- final_log_beta = np.tile(
- np.array(list(ravel(data.log_beta, x, data.potentiometry_opts.beta_flags))),
- (total_concentration.shape[0], 1),
- )
- concs, final_log_beta, *_ = solve_equilibrium_equations(
- stoichiometry=stoichiometry,
- solid_stoichiometry=solid_stoichiometry,
- original_log_beta=final_log_beta,
- original_log_ks=original_log_ks,
- total_concentration=total_concentration,
- outer_fiexd_point_params=outer_fixed_point_params,
- initial_guess=concs[:, : stoichiometry.shape[0]],
- full=True,
- )
+class Bridge(Protocol):
+ def __init__(self, data: SolverData):
+ ...
- return_extra["total_concentration"] = total_concentration
- return_extra["slices"] = slices
- return_extra["idx_to_keep"] = idx_to_keep
-
- return_extra["read_potential"] = emf
-
- reduced_calculated_emf = f_obj(concs)
- ix_ranges = list(zip(slices, slices[1:] + [concs.shape[0]]))[:-1]
- calculated_potential = []
- residuals_potential = []
- for counter, (i1, i2) in enumerate(ix_ranges):
- calculated_potential.append(
- rebuild_emf(reduced_calculated_emf[i1:i2], emf0[counter], slope[counter])
- )
- residuals_potential.append(emf[counter] - calculated_potential[counter])
- return_extra["calculated_potential"] = calculated_potential
- return_extra["residuals_potential"] = residuals_potential
-
- b_error, cor_matrix, cov_matrix = fit_final_calcs(
- return_extra["jacobian"], return_extra["residuals"], return_extra["weights"]
- )
+ def accept_values(self) -> None:
+ ...
- # For consistency return only the free concentrations
- concs = concs[:, : data.nc + data.nf]
+ def matrices(self) -> tuple[FArray, FArray]:
+ ...
- return x, concs, final_log_beta, b_error, cor_matrix, cov_matrix, return_extra
+ def size(self) -> tuple[int, int]:
+ ...
+ def take_step(self, increments: FArray) -> None:
+ ...
-def build_reduced_emf(emf, emf0, slope):
- """
- Build the reduced emf array from the emf, emf0, and slope values.
+ def tmp_residual(self) -> FArray:
+ ...
+
+ def weights(self) -> FArray:
+ ...
+
+
+class PotentiometryBridge:
+ def __init__(self, data: SolverData, reporter) -> None:
+ self._data = data
+ self._reporter = reporter
+ self._freeconcentration: FArray | None = None
+
+ self._stoich = self._stoichiometry(extended=False)
+ self._stoichx = self._stoichiometry(extended=True)
+ self._nspecies, self._ncomponents = self._stoich.shape
+ self._ntitrations = len(data.potentiometry_opts.titrations)
+ self._experimental_points = [ len(t.v_add) for t in self._titrations() ]
+ self._total_points = sum(self._experimental_points)
+ self._chargesx = np.sum(self._stoichx*data.charges, axis=1)
+
+ # calculate degrees of freedom
+ self._dof_beta = sum(1 for _ in data.potentiometry_opts.beta_flags if _ == Flags.REFINE)
+ self._dof_conc = 0
+ self._slices = []
+ self._slopes = np.zeros(self._total_points)
+ self._emf0 = np.zeros(self._total_points)
+ counter = 0
+ for ntit, titration in enumerate(self._titrations()):
+ self._dof_conc += sum(1 for _ in titration.c0_flags if _ == Flags.REFINE)
+ self._dof_conc += sum(1 for _ in titration.ct_flags if _ == Flags.REFINE)
+ self._slices.append(slice(counter, counter+len(titration.emf)))
+ self._slopes[self._slices[-1]] = titration.slope / LN10
+ self._emf0[self._slices[-1]] = titration.e0
+ counter += len(titration.emf)
+ self._dof = self._dof_beta + self._dof_conc
- Parameters:
- -------
- emf : numpy.ndarray
- The emf values.
- emf0 : float
- The standard emf value.
- slope : float
- The slope.
-
- Returns:
- -------
- reduced_emf : numpy.ndarray
- The reduced emf values.
-
- """
- return (emf - emf0) / (slope / 2.303)
-
-
-def rebuild_emf(remf, emf0, slope):
- """
- Reuild the original emf from the reduced emf, emf0, and slope values.
-
- Parameters:
- -------
- remf : numpy.ndarray
- The reduced emf values.
- emf0 : float
- The standard emf value.
- slope : float
- The slope.
-
- Returns:
- -------
- emf : numpy.ndarray
- The emf values.
+ ##> self._hindices
+ self._hindices = []
+ for titration in data.potentiometry_opts.titrations:
+ self._hindices.extend(len(titration.v_add) * [titration.electro_active_compoment])
+
+ ##> self._experimental_remf
+ self._experimental_emf = np.concatenate([t.emf for t in data.potentiometry_opts.titrations])
+
+ self._bmatrixt = np.concatenate([jacobian.bmatrix_t(t.v_add, t.v0, self._ncomponents)
+ for t in self._titrations()])
+
+ self._bmatrixb = np.concatenate([jacobian.bmatrix_b(t.v_add, t.v0, self._ncomponents)
+ for t in self._titrations()])
+
+ self._weights = np.concatenate([libemf.emf_weights(t.v_add, t.v0_sigma, t.emf, t.e0_sigma)
+ for t in data.potentiometry_opts.titrations])
+
+ # initial variable vector
+ self._idx_refinable = []
+ idx_refinable_beta = refine_indices(self._data.potentiometry_opts.beta_flags)
+ self._idx_refinable.extend(idx_refinable_beta)
+ beta_to_refine = np.extract(idx_refinable_beta, self._data.log_beta)
+ concs_to_refine = []
+
+ for titration in self._data.potentiometry_opts.titrations:
+ if titration.c0_flags:
+ assert len(titration.c0_flags) == self._ncomponents
+ idx_refinable_c0 = refine_indices(titration.c0_flags)
+ else:
+ idx_refinable_c0 = self._ncomponents*[False]
+ self._idx_refinable.extend(idx_refinable_c0)
+ concs_to_refine.append(np.extract(idx_refinable_c0, titration.c0))
+
+ if titration.ct_flags:
+ assert len(titration.ct_flags) == self._ncomponents
+ idx_refinable_ct = refine_indices(titration.ct_flags)
+ else:
+ idx_refinable_ct = self._ncomponents*[False]
+ self._idx_refinable.extend(idx_refinable_ct)
+
+ concs_to_refine.append(np.extract(idx_refinable_ct, titration.ct))
+
+ self._variables = np.concatenate([beta_to_refine*LN10, *concs_to_refine])
+ self._step = np.zeros(self._dof, dtype=float)
+
+ def accept_values(self) -> None:
+ "Accepts the step values and consolidates the data."
+ self._variables += self._step
+ self._step[...] = 0.0
+
+ def final_values(self):
+ yield self._beta()
+ yield from self._titration_parameters()
+
+ def iteration_history(self, **kwargs):
+ ...
+
+ def matrices(self) -> tuple[FArray, FArray]:
+ "Return the jacobian and the residual arrays."
+ # 1. calculate free concentrations
+ freec = self._calc_free_concs(initial=True, update=True)
+ assert freec.shape == (self._total_points, self._nspecies + self._ncomponents)
+
+ # 2. calculate A
+ amatrix = jacobian.amatrix(freec, self._stoichx)
+ assert amatrix.shape == (self._total_points, self._ncomponents, self._ncomponents)
+
+ # 3. calculate jacobian part referring to beta
+ dlogc_dlogbeta = jacobian.dlogcdlogbeta(amatrix, freec, self._stoich)
+ assert dlogc_dlogbeta.shape == (self._total_points, self._ncomponents, self._nspecies)
+ jbeta = dlogc_dlogbeta
+
+ # 4. calculate jacobian part referring to titration parameters
+ _jc0 = jacobian.solve_xmatrix(amatrix, self._bmatrixt)
+ _jct = jacobian.solve_xmatrix(amatrix, self._bmatrixb)
+ jtit = np.zeros((self._total_points, self._ncomponents, 2*self._ntitrations*self._ncomponents), dtype=float)
+ _js = [np.concatenate((_jc0[s], _jct[s]), axis=2) for s in self._slices]
+ for n, s1 in enumerate(self._slices):
+ s2 = slice(n*2*self._ncomponents, (n+1)*2*self._ncomponents)
+ jtit[s1, :, s2] = _js[n]
+
+ # 5. compute the total jacobian
+ jac = self._slopes[:, None, None] * np.concatenate([jbeta, jtit], axis=2)
+ assert jac.shape == (self._total_points, self._ncomponents, self._nspecies + 2*self._ncomponents*self._ntitrations)
+
+ # 6. remove non refined parts
+ trimmed_jac1 = jac[..., self._idx_refinable]
+ trimmed_jac2 = trimmed_jac1[np.arange(self._total_points), self._hindices].copy()
+
+ # 7. compute residual
+ residual = self.__calculate_residual(freec)
+
+ return trimmed_jac2, residual
+
+ def relative_change(self, step):
+ return step/self._variables
+
+ def report_raw(self, text):
+ print(text)
+
+ def report_step(self, **kwargs):
+ kwargs['log_beta'] = self._beta()
+ kwargs['stoichiometry'] = self._stoich
+ self._reporter(**kwargs)
+
+ def size(self) -> tuple[int, int]:
+ "Return number of points, number os variables."
+ return self._total_points, self._dof
+
+ def take_step(self, increments: FArray) -> None:
+ if increments.shape != self._step.shape:
+ raise ValueError(f"Shape mismatch: {increments.shape} != {self._step.shape}")
+ self._step[:] = increments[:]
+
+ def tmp_residual(self) -> FArray:
+ freec = self._calc_free_concs(initial=True, update=False)
+ return self.__calculate_residual(freec)
+
+ def weights(self) -> FArray:
+ return np.diag(self._weights)
+
+ @property
+ def degrees_of_freedom(self) -> int:
+ return self._dof
+
+ @property
+ def number_of_titrations(self) -> int:
+ return self._ntitrations
+
+ def _analytical_concentration(self) -> FArray:
+ aconc = []
+ for titration, (c0, ct) in zip(self._titrations(), self._titration_parameters()):
+ aux = (c0[None, :] * titration.v0 + ct[None, :] * titration.v_add[:, None]) / \
+ (titration.v0 + titration.v_add[:, None])
+ aconc.append(aux)
+ return np.concatenate(aconc, axis=0)
+
+ def _background_concentration(self) -> FArray:
+ # bconc = []
+ # for titration, (c0b, ctb) in zip(self._data.potentiometry_opts.titrations,
+ # self._titration_parameters()):
+ # aux = (c0b[None, :] * titration.v0 + ctb[None, :] * titration.v_add[:, None]) / \
+ # (titration.v0 + titration.v_add[:, None])
+ # bconc.append(aux)
+ bconc = [
+ (titration.c0back * titration.v0 + titration.ctback * titration.v_add[:, None]) / \
+ (titration.v0 + titration.v_add[:, None])
+ for titration in self._titrations()
+ ]
+ return np.concatenate(bconc, axis=0)
+
+ def _beta(self):
+ beta = self._data.log_beta.copy()
+ idx = refine_indices(self._data.potentiometry_opts.beta_flags)
+ beta[idx] = (self._variables[:self._dof_beta] + self._step[:self._dof_beta]) / LN10
+ return beta
+
+ def _stoichiometry(self, extended=False):
+ "Get stoichiometry array."
+ number_components = self._data.stoichiometry.shape[0]
+ if extended:
+ return np.vstack((np.eye(number_components, dtype=int),
+ np.array(self._data.stoichiometry.T)))
+ return self._data.stoichiometry.T
+
+ def _titrations(self):
+ yield from iter(self._data.potentiometry_opts.titrations)
+
+ def _titration_parameters(self):
+ itx = iter(self._variables[self._dof_beta:].tolist())
+ itd = iter(self._step[self._dof_beta:].tolist())
+
+ def select(c, flags):
+ x = c.copy()
+ for n, i in enumerate(flags):
+ if i == Flags.REFINE:
+ x[i] = next(itx) + next(itd)
+ return x
+
+ for titration in self._titrations():
+ c0 = select(titration.c0, titration.c0_flags)
+ ct = select(titration.ct, titration.ct_flags)
+ yield c0, ct
+
+ def _calc_free_concs(self, initial=False, update=False) -> FArray:
+ _initial_guess = None if initial else self._freeconcentration
+ log_beta = self._beta()
+ total_concentration = self._analytical_concentration()
+
+ #charges = self._data.charges
+ background_ions_concentration = self._background_concentration()
+ independent_component_activity = None
+
+ outer_fixed_point_params = {
+ "ionic_strength_dependence": self._data.ionic_strength_dependence,
+ "reference_ionic_str_species": self._data.reference_ionic_str_species,
+ "reference_ionic_str_solids": self._data.reference_ionic_str_solids,
+ "dbh_values": self._data.dbh_values.copy(),
+ "charges": self._chargesx,
+ "independent_component_activity": independent_component_activity,
+ "background_ions_concentration": background_ions_concentration,
+ }
+ c, *_ = solve_equilibrium_equations(
+ stoichiometry=self._data.stoichiometry,
+ solid_stoichiometry=self._data.solid_stoichiometry,
+ original_log_beta=log_beta,
+ original_log_ks=self._data.log_ks,
+ total_concentration=total_concentration,
+ outer_fiexd_point_params=outer_fixed_point_params,
+ initial_guess=_initial_guess,
+ full=True)
+ if update:
+ self._freeconcentration = c
+ return c
- """
- return (remf * (slope / 2.303)) + emf0
+ def __calculate_residual(self, free_concentrations):
+ assert free_concentrations.shape == (self._total_points, self._nspecies + self._ncomponents)
+ eactive = libemf.hselect(free_concentrations, self._hindices)
+ calculated_emf = self._emf0 + self._slopes * np.log(eactive)
+ assert calculated_emf.shape == (self._total_points,)
+ residual = self._experimental_emf - calculated_emf
+ return residual
-def compute_weights(emf, v_add, e_sigma, v_sigma):
+def PotentiometryOptimizer(data: SolverData, reporter=None) -> dict[str, Any]:
"""
- Compute the weights for the given emf, v_add, e_sigma, and v_sigma values.
+ Solve a potentiometry problem. Refine constants and possibly, concentrations.
Parameters:
-------
- emf : numpy.ndarray
- The emf values.
- v_add : numpy.ndarray
- The v_add values.
- e_sigma : numpy.ndarray
- The e_sigma values.
- v_sigma : numpy.ndarray
- The v_sigma values.
+ data : SolverData
+ The data for the refinement.
Returns:
+ x :
+ the refined data
+ concs :
+ the final free concentrations
+ final_log_beta :
+ the final refined constant values
+ b_error :
+ the fitting error in the concentration
+ cor_matrix :
+ the correlation matrix
+ cov_matrix :
+ the covariance matrix
+ return_extra :
+ additional information
-------
- weights : numpy.ndarray
- The calculated weights.
-
"""
- der2 = np.gradient(emf, v_add) ** 2
- return 1 / (der2 * v_sigma**2 + e_sigma**2)
+ bridge: Bridge = PotentiometryBridge(data, reporter)
+ fit_result = libfit.levenberg_marquardt(bridge, debug=True)
+ values = bridge.final_values()
+ final_beta = next(values)
+ final_total_concentration = list(itertools.islice(values, bridge.number_of_titrations))
+
+ return {
+ 'final_beta': final_beta,
+ 'final_total_concentration': final_total_concentration
+ }
-def hselect(array, hindices, slices):
- """Select columns that correspond to the electroactive species.
+def covariance_fun(J, W, F):
+ """Compute covariance matrix.
- Given the concentrations array, selects the columns that correspond
- to the electroactive species.
+ Returns the covariance matrix :math:`CV = inv(J'.W.J)*MSE`
+ Where MSE is mean-square error :math:`MSE = (R'*R)/(N-p)`
+ where *R* are the residuals, *N* is the number of observations and
+ *p* is the number of coefficients estimated
Parameters:
- array (:class:`numpy.ndarray`): The :term:`free concentrations array`
- hindices (list): List of ints or list of lists of ints with the indices
- of the electroactive species. Example: [[0,1],[1,2],[3,4],[4,5]].
- hindices are applied along axis=0
- slices (list of ints): Where to divide C. Example: [ 0, 5, 10, 15 ]
- slices are applied along axis=1
-
+ J (:class:`numpy.ndarray`): the jacobian
+ W (:class:`numpy.ndarray`): the weights matrix
+ F (:class:`numpy.ndarray`): the residuals
Returns:
- The part of C which is electroactive
-
- >>> slices = [0, 4, 7]
- >>> hindices = [[0,1],[1,2],[3,4]]
- >>> C = np.array([[ 0.255, 0.638, 0.898, 0.503, 0.418],
- ... [ 0.383, 0.789, 0.731, 0.713, 0.629],
- ... [ 0.698, 0.080, 0.597, 0.503, 0.456],
- ... [ 0.658, 0.399, 0.332, 0.700, 0.294],
- ... [ 0.534, 0.556, 0.762, 0.493, 0.510],
- ... [ 0.637, 0.065, 0.638, 0.770, 0.879],
- ... [ 0.598, 0.193, 0.912, 0.263, 0.118],
- ... [ 0.456, 0.680, 0.049, 0.381, 0.872],
- ... [ 0.418, 0.456, 0.430, 0.842, 0.172]])
- >>> hselect(C, hindices, slices)
- array([[0.255, 0.638], [0.383, 0.789], [0.698, 0.080], [0.658, 0.399],
- [0.556, 0.762], [0.065, 0.638], [0.193, 0.912], [0.381, 0.872],
- [0.842, 0.172]])
+ :class:`numpy.ndarray`: an (*p*, *p*)-sized array representing
+ the covariance matrix.
"""
- if slices is None and isinstance(int, hindices):
- return array[:, hindices, ...]
-
- if len(hindices) != len(slices):
- raise TypeError("hindices and slices have wrong size")
- # libaux.assert_array_dim(2, array)
-
- # slices → [ 0, 5, 10, 15 ]
- # 0→4 5→9 10→14 15→end
- # hindices → [[0,1],[1,2],[3,4],[4,5]]
- # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
- # ------------- ------------- -------------- --------
- # 0 0 0 0 0 1 1 1 1 1 3 3 3 3 3 4 4 4
- # 1 1 1 1 1 2 2 2 2 2 4 4 4 4 4 5 5 5
-
- num_points = array.shape[0]
- nslices = (b - a for a, b in zip(slices, slices[1:] + [array.shape[0]]))
- # y = np.array(sum([n*h for n, h in zip(nslices, hindices)], []))
- y = np.vstack([np.tile(np.array(h), (n, 1)) for h, n in zip(hindices, nslices)])
- return np.squeeze(array[np.arange(num_points), y.T, ...].T)
-
+ num_params = J.shape[1] if J.ndim == 2 else 1
+ mse = np.sum(F * np.diag(W) * F) / (len(F) - num_params)
+ temp = np.linalg.inv(np.atleast_2d(np.dot(np.dot(J.T, W), J)))
+ return temp * mse
-def unravel(x, flags):
- """Unravel data according to flags provided.
- This routine takes an array of data and an array of flags of the same
- length and returns another array with only the independet variables.
+def fit_final_calcs(jacobian, resids, weights):
+ """Perform final calculations common to some routines.
Parameters:
- x (iterable): the original data values
- flags (iterable): the flags indicating how to update x.
- Values must int. Accepted values are
-
- * 0: value is to be kept constant
- * 1: value is to be refined and the corresponding value from x
- will be substituted by the corresponding value from y.
- * >2: value is restrained. All places with the same number are
- refined together and the ratio between them is maintained.
-
+ jacobian (:class:`numpy.array`): the jacobian
+ resids (:class:`numpy.array`): the residuals
+ weights (:class:`numpy.array`): the weights
Returns:
- generator: Values of **x** processed according to **flags**.
+ * the error in beta
+ * the correlation matrix
+ * the covariance matrix
"""
- constr_list = []
- for i, f in zip(x, flags):
- if f == 1:
- yield i
- if f > 1:
- if f not in constr_list:
- yield i
- constr_list.append(f)
+ covariance = covariance_fun(jacobian, weights, resids)
+ cov_diag = np.diag(covariance)
+ error_B = np.sqrt(cov_diag) / np.log(10)
+ lenD = len(cov_diag)
+ correlation = covariance / np.sqrt(
+ np.dot(cov_diag.reshape((lenD, 1)), cov_diag.reshape((1, lenD)))
+ )
+ return error_B, correlation, covariance
def ravel(x, y, flags):
@@ -450,46 +418,3 @@ def ravel(x, y, flags):
else: # other: compute proportional value
yield x[i] * ref_val[f] / x[ref_index[f]]
-
-def covariance_fun(J, W, F):
- """Compute covariance matrix.
-
- Returns the covariance matrix :math:`CV = inv(J'.W.J)*MSE`
- Where MSE is mean-square error :math:`MSE = (R'*R)/(N-p)`
- where *R* are the residuals, *N* is the number of observations and
- *p* is the number of coefficients estimated
-
- Parameters:
- J (:class:`numpy.ndarray`): the jacobian
- W (:class:`numpy.ndarray`): the weights matrix
- F (:class:`numpy.ndarray`): the residuals
- Returns:
- :class:`numpy.ndarray`: an (*p*, *p*)-sized array representing
- the covariance matrix.
- """
- num_params = J.shape[1] if J.ndim == 2 else 1
- mse = np.sum(F * np.diag(W) * F) / (len(F) - num_params)
- temp = np.linalg.inv(np.atleast_2d(np.dot(np.dot(J.T, W), J)))
- return temp * mse
-
-
-def fit_final_calcs(jacobian, resids, weights):
- """Perform final calculations common to some routines.
-
- Parameters:
- jacobian (:class:`numpy.array`): the jacobian
- resids (:class:`numpy.array`): the residuals
- weights (:class:`numpy.array`): the weights
- Returns:
- * the error in beta
- * the correlation matrix
- * the covariance matrix
- """
- covariance = covariance_fun(jacobian, weights, resids)
- cov_diag = np.diag(covariance)
- error_B = np.sqrt(cov_diag) / np.log(10)
- lenD = len(cov_diag)
- correlation = covariance / np.sqrt(
- np.dot(cov_diag.reshape((lenD, 1)), cov_diag.reshape((1, lenD)))
- )
- return error_B, correlation, covariance
diff --git a/src/libeq/outer_fixed_point/wrappers.py b/src/libeq/outer_fixed_point/wrappers.py
index b647b14..30277d6 100644
--- a/src/libeq/outer_fixed_point/wrappers.py
+++ b/src/libeq/outer_fixed_point/wrappers.py
@@ -237,6 +237,7 @@ def _select_species_concentration(c, n_components, n_species):
def _update_formation_constants(
log_beta, ionic_strength, ref_ionic_strength, dbh_values
):
+ # breakpoint()
cis = np.tile(ionic_strength, ref_ionic_strength.shape[0])
radqcis = np.sqrt(cis)
fib2 = radqcis / (1 + (dbh_values["bdh"] * radqcis))
diff --git a/src/libeq/parsers/__init__.py b/src/libeq/parsers/__init__.py
index 5ebcf0c..31300cf 100644
--- a/src/libeq/parsers/__init__.py
+++ b/src/libeq/parsers/__init__.py
@@ -1 +1,2 @@
-from .bstac import parse_BSTAC_file # noqa: F401
+from .bstac import parse_BSTAC_file
+from .superquad import parse_superquad_file
diff --git a/src/libeq/parsers/superquad.py b/src/libeq/parsers/superquad.py
new file mode 100644
index 0000000..d91fd99
--- /dev/null
+++ b/src/libeq/parsers/superquad.py
@@ -0,0 +1,150 @@
+def parse_superquad_file(filename: str) -> dict:
+ """Import data from a superquad file.
+
+ Parameters:
+ -----------
+ filename: str
+ The file to read data from.
+ """
+ data = import_superquad_data(filename)
+ outdata = {}
+ _ = next(data) # control numbers (unused)
+ labels = list(next(data))
+ outdata['components'] = labels
+ temperature = next(data)
+ outdata['temperature'] = temperature
+
+ logB = next(data)
+ outdata['log_beta'] = logB
+
+ stoich = next(data)
+ outdata['stoichiometry'] = stoich
+ beta_flags = next(data)
+
+ titrations = []
+ outdata['titrations'] = titrations
+ for emfd in data:
+ # cascade unpacking
+ amounts, electr, dataset = emfd
+ plot_keys, order, t0, buret, tflag = amounts
+ V0, errV, n, hindex, emf0, erremf0 = electr
+ V, emf = dataset
+ titrations.append({
+ 'initial amount': t0,
+ 'buret concentration': buret,
+ 'standard potential': emf0,
+ 'potential error': erremf0,
+ 'electroactive': hindex,
+ 'starting volume': V0,
+ 'volume error': errV,
+ 'potential': emf,
+ 'titre': V
+ })
+ return outdata
+
+
+def import_superquad_data(filename):
+ """Import data from Superquad file.
+
+ This function imports data from a file which complies with SUPERQUAD
+ file format.
+
+ Parameters:
+ filename (string or file): A readable source from where the data is read.
+
+ Yields:
+ * title (str): title of the project
+ * control numbers (sequence)
+ * labels (list of str): the labels of the principal components
+ * temperature (float): the temperature
+ * logB (:class:`numpy.ndarray`): the constants in log10 units
+ * P (:class:`numpy.ndarray`): the stoichiometric coefficients
+ * flags (:class:`numpy.ndarray`): the refinement flags
+ * emf (generator of :class:`numpy.ndarray`): the potential read
+ * V (generator of :class:`numpy.ndarray`): the volume of titre
+ * E0 (generator of floats): the standard potential
+ * n (generator of int): the number of electrons involved
+ * E0flags (generator of int): the refinement flags for E0
+ * error_E0 (generator of float): the error associated to E0
+ * V0 (generator of float): the initial volume
+ * error_V0 (generator of float): the error associated to volume
+ * T0 (generator of :class:`numpy.ndarray`): the initial amounts for the
+ principal components
+ * T0flags (generator of :class:`numpy.ndarray`): the refinement flags
+ for T0.
+ * buret (generator of :class:`numpy.ndarray`): the concentration in the
+ buret.
+ * hindex (generator of int): The index of the electroactive component.
+ * fRTnF (generator of float): Nernst's propocionality number.
+ """
+ def read_amounts(handler):
+ plot_keys = []
+ order = []
+ t0 = []
+ buret = []
+ tflag = []
+ for line in handler:
+ if line.strip() == '':
+ if len(t0) == 0:
+ return None
+ else:
+ return plot_keys, order, t0, buret, tflag
+ # break
+ # return plot_keys, order, t0, buret, tflag
+
+ aux = line.split()
+ plot_keys.append(int(aux[0]))
+ order.append(int(aux[1]))
+ t0.append(float(aux[2]))
+ buret.append(float(aux[3]))
+ tflag.append(int(aux[4]))
+
+ def read_electrodes(handler):
+ volume, err_volume = map(float, handler.readline().split())
+ aux = handler.readline().split()
+ n, hindex = map(int, aux[0:2])
+ emf0, erremf0 = map(float, aux[2:4])
+ assert handler.readline().strip() == ''
+ return volume, err_volume, n, hindex, emf0, erremf0
+
+ def read_data(handler):
+ aux = []
+ for line in handler:
+ if line.strip() == '':
+ break
+ aux.append(tuple(map(float, line.split())))
+ return tuple(zip(*aux))
+
+ def read_titration(handler):
+ while True:
+ amm = read_amounts(handler)
+ if amm is None:
+ return
+ elc = read_electrodes(handler)
+ dat = read_data(handler)
+
+ yield (amm, elc, dat)
+
+ with open(filename, "r") as f:
+ yield f.readline() # title
+ numbers = tuple(int(i) for i in f.readline().split())
+ yield numbers # control numbers
+ num_species = numbers[2]
+ yield tuple(f.readline().strip() for i in range(num_species)) # labels
+ yield float(f.readline()) # temperature
+
+ B = []
+ P = []
+ keys = []
+ for line in f:
+ if line.strip() == '':
+ break
+ b_, *p_, k_ = line.split()
+ B.append(float(b_))
+ P.append([int(_) for _ in p_])
+ keys.append(int(k_))
+
+ yield B
+ yield P
+ yield keys
+ yield from read_titration(f)
diff --git a/src/libeq/solver/nr.py b/src/libeq/solver/nr.py
index fd25359..d5fda72 100644
--- a/src/libeq/solver/nr.py
+++ b/src/libeq/solver/nr.py
@@ -175,11 +175,10 @@ def _panic_save():
if zero_offdiag:
J *= np.eye(n_species) # zerom
+ dx = np.linalg.solve(J, -F[...,None]).squeeze(-1)
if scaling:
d = DRScaling(J, F)
- dx = np.linalg.solve(J, -F) / np.sqrt(d)
- else:
- dx = np.linalg.solve(J, -F)
+ dx /= np.sqrt(d)
if forcer:
step_length, _ = linesearch3(
diff --git a/src/libeq/solver/solver.py b/src/libeq/solver/solver.py
index 87ef3c3..157bbca 100644
--- a/src/libeq/solver/solver.py
+++ b/src/libeq/solver/solver.py
@@ -123,8 +123,8 @@ def solve_equilibrium_equations(
else:
initial_guess = np.atleast_2d(initial_guess)
- damping_fn = outer_fixed_point(
- **outer_fiexd_point_params,
+ damping_fn = outer_fixed_point( # this is too convoluted
+ **outer_fiexd_point_params, # TODO refactor for readability
)(pcf)
nr_fn = outer_fixed_point(
@@ -162,7 +162,6 @@ def solve_equilibrium_equations(
max_iterations=1000,
threshold=1e-10,
)
-
if solid_stoichiometry.shape[1] > 0:
result, log_beta, log_ks, saturation_index = solids_solver(
result,
diff --git a/notebooks/staco4.inp b/tests/data/staco4.inp
similarity index 100%
rename from notebooks/staco4.inp
rename to tests/data/staco4.inp
diff --git a/tests/test_potentiometry.py b/tests/test_potentiometry.py
new file mode 100644
index 0000000..1b86941
--- /dev/null
+++ b/tests/test_potentiometry.py
@@ -0,0 +1,117 @@
+"Test collection for potentiometry data fitting."
+
+import numpy as np
+import numpy.testing as npt
+from libeq.data_structure import SolverData, PotentiometryOptions, PotentiometryTitrationsParameters
+from libeq import PotentiometryOptimizer
+from libeq.optimizers.potentiometry import Flags
+
+
+def test_first():
+ sd = __load_data()
+ result = PotentiometryOptimizer(sd)
+ true_beta = np.array([ 10.19, 16.32, 19.01, 21.01, 22.51, -9.15, -17.1, -28.39, -40.71, -8.89, -57.53, 16.25, 19.25, 4.65, -13.78])
+ npt.assert_allclose(result['final_beta'], true_beta, rtol=0.02)
+
+
+
+def __load_data():
+ titration1 = PotentiometryTitrationsParameters(
+ electro_active_compoment=2,
+ e0=405.0,
+ e0_sigma=0.01,
+ slope=59.16,
+ v0=25.0,
+ v0_sigma=0.01,
+ c0 = np.array([0.5e-3, 0.5e-3, 25.0e-3]),
+ c0_flags = [Flags.CONSTANT, Flags.CONSTANT, Flags.CONSTANT],
+ ct = np.array([0.0, 0.0, -0.1]),
+ ct_flags = [Flags.CONSTANT, Flags.CONSTANT, Flags.CONSTANT],
+ v_add = np.array([ 0.00, 0.08, 0.16, 0.24, 0.32, 0.40, 0.48, 0.56, 0.64, 0.72, 0.80, 0.88, 0.96, 1.04, 1.12, 1.20, 1.28, 1.36, 1.44, 1.52, 1.60, 1.68, 1.76, 1.84, 1.92, 2.00, 2.08, 2.16, 2.24, 2.32, 2.40, 2.48, 2.56, 2.64, 2.72, 2.80, 2.88, 2.96, 3.04, 3.12, 3.20, 3.28, 3.36, 3.44, 3.52, 3.60, 3.68, 3.76, 3.84, 3.92, 4.00, 4.08, 4.16, 4.24, 4.32, 4.40, 4.48, 4.56, 4.64, 4.72, 4.80, 4.88, 4.96, 5.04, 5.12, 5.20, 5.28, 5.36, 5.44, 5.52, 5.60, 5.68, 5.76, 5.84, 5.92, 6.00, 6.08, 6.16, 6.24, 6.32, 6.40, 6.48, 6.56, 6.64, 6.72, 6.80, 6.88, 6.96, 7.04, 7.12, 7.2 , 7.28, 7.36, 7.44, 7.52, 7.6 , 7.68, 7.76, 7.84, 7.92, 8.00, 8.08, 8.16, 8.24, 8.32, 8.4 , 8.48, 8.56, 8.64, 8.72, 8.8 , 8.88, 8.96, 9.04, 9.12, 9.2 , 9.28, 9.36, 9.44, 9.52, 9.6, 9.68, 9.76, 9.84, 9.92, 10.0, 10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56, 10.64, 10.72, 10.8 , 10.88, 10.96, 11.04, 11.12, 11.2, 11.28, 11.36, 11.44, 11.52, 11.6 , 11.68, 11.76, 11.84, 11.92]),
+ emf = np.array([ 308.4, 308.0, 307.5, 307.1, 306.7, 306.2, 305.8, 305.3, 304.9, 304.4, 304.0, 303.5, 303.0, 302.5, 302.1, 301.6, 301.1, 300.6, 300.1, 299.5, 299.0, 298.5, 298.0, 297.4, 296.9, 296.3, 295.7, 295.1, 294.5, 293.9, 293.3, 292.7, 292.1, 291.4, 290.8, 290.1, 289.4, 288.7, 288.0, 287.2, 286.5, 285.7, 284.9, 284.1, 283.3, 282.4, 281.6, 280.6, 279.7, 278.8, 277.8, 276.7, 275.7, 274.5, 273.4, 272.2, 270.9, 269.6, 268.3, 266.8, 265.3, 263.7, 262.0, 260.2, 258.3, 256.2, 253.9, 251.5, 248.8, 245.9, 242.6, 238.9, 234.6, 229.5, 223.4, 215.6, 204.8, 187.5, 129.8, -192.8, -212.4, -223.3, -231.0, -236.8, -241.6, -245.6, -249.1, -252.1, -254.8, -257.3, -259.5, -261.5, -263.4, -265.2, -266.8, -268.3, -269.8, -271.1, -272.4, -273.6, -274.8, -275.9, -276.9, -278.0, -278.9, -279.8, -280.7, -281.6, -282.4, -283.2, -284.0, -284.7, -285.5, -286.2, -286.8, -287.5, -288.1, -288.7, -289.3, -289.9, -290.5, -291.1, -291.6, -292.1, -292.6, -293.1, -293.6, -294.1, -294.6, -295.0, -295.5, -295.9, -296.4, -296.8, -297.2, -297.6, -298.0, -298.4, -298.8, -299.1, -299.5, -299.9, -300.2, -300.6, -300.9, -301.2, -301.6, -301.9, -302.2, -302.5 ])
+ )
+ titration2 = PotentiometryTitrationsParameters(
+ electro_active_compoment=2,
+ e0=405.0,
+ e0_sigma=0.01,
+ slope=59.16,
+ v0=25.0,
+ v0_sigma=0.01,
+ c0 = np.array([1.0e-3, 1.0e-3, 25.0e-3]),
+ c0_flags = [Flags.CONSTANT, Flags.CONSTANT, Flags.CONSTANT],
+ ct_flags = [Flags.CONSTANT, Flags.CONSTANT, Flags.CONSTANT],
+ ct = np.array([0.0, 0.0, -0.1005]),
+ v_add = np.array([ 0.00, 0.08, 0.16, 0.24, 0.32, 0.40, 0.48, 0.56, 0.64, 0.72, 0.80, 0.88, 0.96, 1.04, 1.12, 1.20, 1.28, 1.36, 1.44, 1.52, 1.60, 1.68, 1.76, 1.84, 1.92, 2.00, 2.08, 2.16, 2.24, 2.32, 2.40, 2.48, 2.56, 2.64, 2.72, 2.80, 2.88, 2.96, 3.04, 3.12, 3.20, 3.28, 3.36, 3.44, 3.52, 3.60, 3.68, 3.76, 3.84, 3.92, 4.00, 4.08, 4.16, 4.24, 4.32, 4.40, 4.48, 4.56, 4.64, 4.72, 4.80, 4.88, 4.96, 5.04, 5.12, 5.20, 5.28, 5.36, 5.44, 5.52, 5.60, 5.68, 5.76, 5.84, 5.92, 6.00, 6.08, 6.16, 6.24, 6.32, 6.40, 6.48, 6.56, 6.64, 6.72, 6.80, 6.88, 6.96, 7.04, 7.12, 7.2 , 7.28, 7.36, 7.44, 7.52, 7.6 , 7.68, 7.76, 7.84, 7.92, 8.00, 8.08, 8.16, 8.24, 8.32, 8.4 , 8.48, 8.56, 8.64, 8.72, 8.8 , 8.88, 8.96, 9.04, 9.12, 9.2 , 9.28, 9.36, 9.44, 9.52, 9.6, 9.68, 9.76, 9.84, 9.92, 10.0, 10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56, 10.64, 10.72, 10.8 , 10.88, 10.96, 11.04, 11.12, 11.2, 11.28, 11.36, 11.44, 11.52, 11.6 , 11.68, 11.76, 11.84, 11.92]),
+ emf = np.array([ 306.9, 306.5, 306.1, 305.6, 305.2, 304.8, 304.3, 303.9, 303.4, 303.0, 302.5, 302.0, 301.6, 301.1, 300.6, 300.1, 299.6, 299.1, 298.6, 298.1, 297.6, 297.0, 296.5, 295.9, 295.4, 294.8, 294.2, 293.7, 293.1, 292.5, 291.8, 291.2, 290.6, 289.9, 289.2, 288.6, 287.9, 287.1, 286.4, 285.7, 284.9, 284.1, 283.3, 282.5, 281.6, 280.7, 279.8, 278.9, 278.0, 277.0, 275.9, 274.9, 273.8, 272.6, 271.4, 270.2, 268.9, 267.5, 266.1, 264.5, 263.0, 261.3, 259.5, 257.6, 255.5, 253.3, 250.9, 248.3, 245.5, 242.3, 238.8, 234.8, 230.2, 224.8, 218.3, 210.1, 199.0, 181.3, 123.3, -191.4, -211.0, -222.0, -229.7, -235.6, -240.4, -244.5, -248.0, -251.0, -253.8, -256.2, -258.5, -260.6, -262.5, -264.2, -265.9, -267.4, -268.9, -270.3, -271.6, -272.8, -274.0, -275.1, -276.2, -277.2, -278.2, -279.1, -280.0, -280.9, -281.7, -282.5, -283.3, -284.1, -284.8, -285.5, -286.2, -286.9, -287.5, -288.1, -288.8, -289.3, -289.9, -290.5, -291.0, -291.6, -292.1, -292.6, -293.1, -293.6, -294.1, -294.5, -295.0, -295.4, -295.9, -296.3, -296.7, -297.1, -297.5, -297.9, -298.3, -298.7, -299.1, -299.4, -299.8, -300.1, -300.5, -300.8, -301.2, -301.5, -301.8, -302.1])
+ )
+ titration3 = PotentiometryTitrationsParameters(
+ electro_active_compoment=2,
+ e0=405.0,
+ e0_sigma=0.01,
+ slope=59.16,
+ v0=25.0,
+ v0_sigma=0.01,
+ c0 = np.array([1.5e-3, 1.5e-3, 25.0e-3]),
+ c0_flags = [Flags.CONSTANT, Flags.CONSTANT, Flags.CONSTANT],
+ ct_flags = [Flags.CONSTANT, Flags.CONSTANT, Flags.CONSTANT],
+ ct = np.array([0.0, 0.0, -0.1000]),
+ v_add = np.array([ 0.00, 0.08, 0.16, 0.24, 0.32, 0.40, 0.48, 0.56, 0.64, 0.72, 0.80, 0.88, 0.96, 1.04, 1.12, 1.20, 1.28, 1.36, 1.44, 1.52, 1.60, 1.68, 1.76, 1.84, 1.92, 2.00, 2.08, 2.16, 2.24, 2.32, 2.40, 2.48, 2.56, 2.64, 2.72, 2.80, 2.88, 2.96, 3.04, 3.12, 3.20, 3.28, 3.36, 3.44, 3.52, 3.60, 3.68, 3.76, 3.84, 3.92, 4.00, 4.08, 4.16, 4.24, 4.32, 4.40, 4.48, 4.56, 4.64, 4.72, 4.80, 4.88, 4.96, 5.04, 5.12, 5.20, 5.28, 5.36, 5.44, 5.52, 5.60, 5.68, 5.76, 5.84, 5.92, 6.00, 6.08, 6.16, 6.24, 6.32, 6.40, 6.48, 6.56, 6.64, 6.72, 6.80, 6.88, 6.96, 7.04, 7.12, 7.2 , 7.28, 7.36, 7.44, 7.52, 7.6 , 7.68, 7.76, 7.84, 7.92, 8.00, 8.08, 8.16, 8.24, 8.32, 8.4 , 8.48, 8.56, 8.64, 8.72, 8.8 , 8.88, 8.96, 9.04, 9.12, 9.2 , 9.28, 9.36, 9.44, 9.52, 9.6, 9.68, 9.76, 9.84, 9.92, 10.0, 10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56, 10.64, 10.72, 10.8 , 10.88, 10.96, 11.04, 11.12, 11.2, 11.28, 11.36, 11.44, 11.52, 11.6 , 11.68, 11.76, 11.84, 11.92]),
+ emf = np.array([ 305.7, 305.3, 304.8, 304.4, 304.0, 303.5, 303.1, 302.6, 302.2, 301.7, 301.3, 300.8, 300.3, 299.9, 299.4, 298.9, 298.4, 297.9, 297.4, 296.8, 296.3, 295.8, 295.2, 294.7, 294.1, 293.5, 293.0, 292.4, 291.8, 291.1, 290.5, 289.9, 289.2, 288.6, 287.9, 287.2, 286.5, 285.7, 285.0, 284.2, 283.4, 282.6, 281.8, 281.0, 280.1, 279.2, 278.3, 277.3, 276.3, 275.3, 274.2, 273.1, 272.0, 270.8, 269.5, 268.2, 266.8, 265.4, 263.9, 262.3, 260.6, 258.9, 257.0, 254.9, 252.8, 250.4, 247.9, 245.1, 242.1, 238.8, 235.0, 230.8, 226.0, 220.4, 213.7, 205.3, 194.0, 176.2, 118.2, -190.1, -209.7, -220.8, -228.5, -234.4, -239.3, -243.3, -246.9, -250.0, -252.7, -255.2, -257.5, -259.6, -261.5, -263.3, -265.0, -266.5, -268.0, -269.4, -270.7, -272.0, -273.2, -274.3, -275.4, -276.4, -277.4, -278.4, -279.3, -280.2, -281.0, -281.9, -282.6, -283.4, -284.2, -284.9, -285.6, -286.2, -286.9, -287.5, -288.2, -288.8, -289.4, -289.9, -290.5, -291.0, -291.6, -292.1, -292.6, -293.1, -293.6, -294.0, -294.5, -294.9, -295.4, -295.8, -296.2, -296.7, -297.1, -297.5, -297.9, -298.2, -298.6, -299.0, -299.4, -299.7, -300.1, -300.4, -300.7, -301.1, -301.4, -301.7 ])
+ )
+ titration4 = PotentiometryTitrationsParameters(
+ electro_active_compoment=2,
+ e0=405.0,
+ e0_sigma=0.01,
+ slope=59.16,
+ v0=25.0,
+ v0_sigma=0.01,
+ c0 = np.array([2.0e-3, 2.0e-3, 25.0e-3]),
+ c0_flags = [Flags.CONSTANT, Flags.CONSTANT, Flags.CONSTANT],
+ ct_flags = [Flags.CONSTANT, Flags.CONSTANT, Flags.CONSTANT],
+ ct = np.array([0.0, 0.0, -0.1000]),
+ v_add = np.array([ 0.00, 0.08, 0.16, 0.24, 0.32, 0.40, 0.48, 0.56, 0.64, 0.72, 0.80, 0.88, 0.96, 1.04, 1.12, 1.20, 1.28, 1.36, 1.44, 1.52, 1.60, 1.68, 1.76, 1.84, 1.92, 2.00, 2.08, 2.16, 2.24, 2.32, 2.40, 2.48, 2.56, 2.64, 2.72, 2.80, 2.88, 2.96, 3.04, 3.12, 3.20, 3.28, 3.36, 3.44, 3.52, 3.60, 3.68, 3.76, 3.84, 3.92, 4.00, 4.08, 4.16, 4.24, 4.32, 4.40, 4.48, 4.56, 4.64, 4.72, 4.80, 4.88, 4.96, 5.04, 5.12, 5.20, 5.28, 5.36, 5.44, 5.52, 5.60, 5.68, 5.76, 5.84, 5.92, 6.00, 6.08, 6.16, 6.24, 6.32, 6.40, 6.48, 6.56, 6.64, 6.72, 6.80, 6.88, 6.96, 7.04, 7.12, 7.2 , 7.28, 7.36, 7.44, 7.52, 7.6 , 7.68, 7.76, 7.84, 7.92, 8.00, 8.08, 8.16, 8.24, 8.32, 8.4 , 8.48, 8.56, 8.64, 8.72, 8.8 , 8.88, 8.96, 9.04, 9.12, 9.2 , 9.28, 9.36, 9.44, 9.52, 9.6, 9.68, 9.76, 9.84, 9.92, 10.0, 10.08, 10.16, 10.24, 10.32, 10.4, 10.48, 10.56, 10.64, 10.72, 10.8 , 10.88, 10.96, 11.04, 11.12, 11.2, 11.28, 11.36, 11.44, 11.52, 11.6 , 11.68, 11.76, 11.84, 11.92]),
+ emf = np.array([ 304.6, 304.2, 303.7, 303.3, 302.9, 302.4, 302.0, 301.5, 301.1, 300.6, 300.2, 299.7, 299.2, 298.7, 298.2, 297.7, 297.2, 296.7, 296.2, 295.7, 295.2, 294.6, 294.1, 293.5, 292.9, 292.4, 291.8, 291.2, 290.5, 289.9, 289.3, 288.6, 288.0, 287.3, 286.6, 285.9, 285.2, 284.4, 283.6, 282.9, 282.1, 281.2, 280.4, 279.5, 278.6, 277.7, 276.7, 275.7, 274.7, 273.6, 272.5, 271.4, 270.2, 268.9, 267.6, 266.3, 264.8, 263.3, 261.8, 260.1, 258.3, 256.4, 254.5, 252.3, 250.0, 247.6, 244.9, 242.0, 238.8, 235.3, 231.4, 227.0, 222.0, 216.3, 209.4, 201.0, 189.7, 171.8, 113.9, -188.8, -208.5, -219.6, -227.3, -233.3, -238.1, -242.2, -245.8, -248.9, -251.7, -254.2, -256.5, -258.6, -260.6, -262.4, -264.1, -265.7, -267.1, -268.6, -269.9, -271.2, -272.4, -273.5, -274.6, -275.7, -276.7, -277.6, -278.6, -279.5, -280.3, -281.2, -282.0, -282.7, -283.5, -284.2, -284.9, -285.6, -286.3, -286.9, -287.6, -288.2, -288.8, -289.4, -289.9, -290.5, -291.0, -291.5, -292.0, -292.5, -293.0, -293.5, -294.0, -294.4, -294.9, -295.3, -295.8, -296.2, -296.6, -297.0, -297.4, -297.8, -298.2, -298.5, -298.9, -299.3, -299.6, -300.0, -300.3, -300.7, -301.0, -301.3 ])
+ )
+ pot = PotentiometryOptions(
+ titrations = [ titration1, titration2, titration3, titration4 ],
+ beta_flags = [Flags.CONSTANT,Flags.CONSTANT,Flags.CONSTANT,Flags.CONSTANT,Flags.CONSTANT,
+ Flags.CONSTANT,Flags.CONSTANT,Flags.CONSTANT,Flags.CONSTANT,Flags.CONSTANT,
+ Flags.CONSTANT,Flags.REFINE,Flags.REFINE,Flags.REFINE,Flags.CONSTANT]
+ )
+ sd = SolverData(
+ components = ['EDTA', 'Zn', 'H'],
+ charges = [ -4, 2, 1 ],
+ stoichiometry = np.array([[1,0, 1],
+ [1,0, 2],
+ [1,0, 3],
+ [1,0, 4],
+ [1,0, 5],
+ [0,1,-1],
+ [0,1,-2],
+ [0,1,-3],
+ [0,1,-4],
+ [0,2,-1],
+ [0,2,-6],
+ [1,1, 0],
+ [1,1, 1],
+ [1,1,-1],
+ [0,0,-1]], dtype=int).T,
+ solid_stoichiometry = np.array([[]], dtype=int),
+ log_beta = np.array([ 10.19,
+ 16.32,
+ 19.01,
+ 21.01,
+ 22.51,
+ -9.15,
+ -17.1,
+ -28.39,
+ -40.71,
+ -8.89,
+ -57.53,
+ 16.25,
+ 19.25,
+ 4.65,
+ -13.78]),
+ potentiometry_opts = pot
+ )
+ return sd
diff --git a/uv.lock b/uv.lock
new file mode 100644
index 0000000..58e084a
--- /dev/null
+++ b/uv.lock
@@ -0,0 +1,314 @@
+version = 1
+revision = 3
+requires-python = ">=3.10"
+resolution-markers = [
+ "python_full_version >= '3.11'",
+ "python_full_version < '3.11'",
+]
+
+[[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 = "exceptiongroup"
+version = "1.3.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions", marker = "python_full_version < '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" },
+]
+
+[[package]]
+name = "iniconfig"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
+]
+
+[[package]]
+name = "libeq"
+version = "0.3.0"
+source = { virtual = "." }
+dependencies = [
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
+ { name = "numpy", version = "2.3.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+]
+
+[package.dev-dependencies]
+dev = [
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },
+ { name = "numpy", version = "2.3.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" },
+ { name = "pytest" },
+]
+
+[package.metadata]
+requires-dist = [{ name = "numpy" }]
+
+[package.metadata.requires-dev]
+dev = [
+ { name = "numpy", specifier = ">=2.2.6" },
+ { name = "pytest", specifier = ">=8.4.2" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.2.6"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version < '3.11'",
+]
+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/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" },
+ { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" },
+ { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" },
+ { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" },
+ { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" },
+ { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" },
+ { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" },
+ { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" },
+ { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" },
+ { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" },
+ { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" },
+ { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" },
+ { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" },
+ { 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" },
+ { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" },
+ { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" },
+ { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" },
+ { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" },
+]
+
+[[package]]
+name = "numpy"
+version = "2.3.4"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.11'",
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b5/f4/098d2270d52b41f1bd7db9fc288aaa0400cb48c2a3e2af6fa365d9720947/numpy-2.3.4.tar.gz", hash = "sha256:a7d018bfedb375a8d979ac758b120ba846a7fe764911a64465fd87b8729f4a6a", size = 20582187, upload-time = "2025-10-15T16:18:11.77Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/60/e7/0e07379944aa8afb49a556a2b54587b828eb41dc9adc56fb7615b678ca53/numpy-2.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e78aecd2800b32e8347ce49316d3eaf04aed849cd5b38e0af39f829a4e59f5eb", size = 21259519, upload-time = "2025-10-15T16:15:19.012Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/cb/5a69293561e8819b09e34ed9e873b9a82b5f2ade23dce4c51dc507f6cfe1/numpy-2.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7fd09cc5d65bda1e79432859c40978010622112e9194e581e3415a3eccc7f43f", size = 14452796, upload-time = "2025-10-15T16:15:23.094Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/04/ff11611200acd602a1e5129e36cfd25bf01ad8e5cf927baf2e90236eb02e/numpy-2.3.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1b219560ae2c1de48ead517d085bc2d05b9433f8e49d0955c82e8cd37bd7bf36", size = 5381639, upload-time = "2025-10-15T16:15:25.572Z" },
+ { url = "https://files.pythonhosted.org/packages/ea/77/e95c757a6fe7a48d28a009267408e8aa382630cc1ad1db7451b3bc21dbb4/numpy-2.3.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:bafa7d87d4c99752d07815ed7a2c0964f8ab311eb8168f41b910bd01d15b6032", size = 6914296, upload-time = "2025-10-15T16:15:27.079Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/d2/137c7b6841c942124eae921279e5c41b1c34bab0e6fc60c7348e69afd165/numpy-2.3.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36dc13af226aeab72b7abad501d370d606326a0029b9f435eacb3b8c94b8a8b7", size = 14591904, upload-time = "2025-10-15T16:15:29.044Z" },
+ { url = "https://files.pythonhosted.org/packages/bb/32/67e3b0f07b0aba57a078c4ab777a9e8e6bc62f24fb53a2337f75f9691699/numpy-2.3.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7b2f9a18b5ff9824a6af80de4f37f4ec3c2aab05ef08f51c77a093f5b89adda", size = 16939602, upload-time = "2025-10-15T16:15:31.106Z" },
+ { url = "https://files.pythonhosted.org/packages/95/22/9639c30e32c93c4cee3ccdb4b09c2d0fbff4dcd06d36b357da06146530fb/numpy-2.3.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9984bd645a8db6ca15d850ff996856d8762c51a2239225288f08f9050ca240a0", size = 16372661, upload-time = "2025-10-15T16:15:33.546Z" },
+ { url = "https://files.pythonhosted.org/packages/12/e9/a685079529be2b0156ae0c11b13d6be647743095bb51d46589e95be88086/numpy-2.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:64c5825affc76942973a70acf438a8ab618dbd692b84cd5ec40a0a0509edc09a", size = 18884682, upload-time = "2025-10-15T16:15:36.105Z" },
+ { url = "https://files.pythonhosted.org/packages/cf/85/f6f00d019b0cc741e64b4e00ce865a57b6bed945d1bbeb1ccadbc647959b/numpy-2.3.4-cp311-cp311-win32.whl", hash = "sha256:ed759bf7a70342f7817d88376eb7142fab9fef8320d6019ef87fae05a99874e1", size = 6570076, upload-time = "2025-10-15T16:15:38.225Z" },
+ { url = "https://files.pythonhosted.org/packages/7d/10/f8850982021cb90e2ec31990291f9e830ce7d94eef432b15066e7cbe0bec/numpy-2.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:faba246fb30ea2a526c2e9645f61612341de1a83fb1e0c5edf4ddda5a9c10996", size = 13089358, upload-time = "2025-10-15T16:15:40.404Z" },
+ { url = "https://files.pythonhosted.org/packages/d1/ad/afdd8351385edf0b3445f9e24210a9c3971ef4de8fd85155462fc4321d79/numpy-2.3.4-cp311-cp311-win_arm64.whl", hash = "sha256:4c01835e718bcebe80394fd0ac66c07cbb90147ebbdad3dcecd3f25de2ae7e2c", size = 10462292, upload-time = "2025-10-15T16:15:42.896Z" },
+ { url = "https://files.pythonhosted.org/packages/96/7a/02420400b736f84317e759291b8edaeee9dc921f72b045475a9cbdb26b17/numpy-2.3.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef1b5a3e808bc40827b5fa2c8196151a4c5abe110e1726949d7abddfe5c7ae11", size = 20957727, upload-time = "2025-10-15T16:15:44.9Z" },
+ { url = "https://files.pythonhosted.org/packages/18/90/a014805d627aa5750f6f0e878172afb6454552da929144b3c07fcae1bb13/numpy-2.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c2f91f496a87235c6aaf6d3f3d89b17dba64996abadccb289f48456cff931ca9", size = 14187262, upload-time = "2025-10-15T16:15:47.761Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/e4/0a94b09abe89e500dc748e7515f21a13e30c5c3fe3396e6d4ac108c25fca/numpy-2.3.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f77e5b3d3da652b474cc80a14084927a5e86a5eccf54ca8ca5cbd697bf7f2667", size = 5115992, upload-time = "2025-10-15T16:15:50.144Z" },
+ { url = "https://files.pythonhosted.org/packages/88/dd/db77c75b055c6157cbd4f9c92c4458daef0dd9cbe6d8d2fe7f803cb64c37/numpy-2.3.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:8ab1c5f5ee40d6e01cbe96de5863e39b215a4d24e7d007cad56c7184fdf4aeef", size = 6648672, upload-time = "2025-10-15T16:15:52.442Z" },
+ { url = "https://files.pythonhosted.org/packages/e1/e6/e31b0d713719610e406c0ea3ae0d90760465b086da8783e2fd835ad59027/numpy-2.3.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77b84453f3adcb994ddbd0d1c5d11db2d6bda1a2b7fd5ac5bd4649d6f5dc682e", size = 14284156, upload-time = "2025-10-15T16:15:54.351Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/58/30a85127bfee6f108282107caf8e06a1f0cc997cb6b52cdee699276fcce4/numpy-2.3.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4121c5beb58a7f9e6dfdee612cb24f4df5cd4db6e8261d7f4d7450a997a65d6a", size = 16641271, upload-time = "2025-10-15T16:15:56.67Z" },
+ { url = "https://files.pythonhosted.org/packages/06/f2/2e06a0f2adf23e3ae29283ad96959267938d0efd20a2e25353b70065bfec/numpy-2.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:65611ecbb00ac9846efe04db15cbe6186f562f6bb7e5e05f077e53a599225d16", size = 16059531, upload-time = "2025-10-15T16:15:59.412Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/e7/b106253c7c0d5dc352b9c8fab91afd76a93950998167fa3e5afe4ef3a18f/numpy-2.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dabc42f9c6577bcc13001b8810d300fe814b4cfbe8a92c873f269484594f9786", size = 18578983, upload-time = "2025-10-15T16:16:01.804Z" },
+ { url = "https://files.pythonhosted.org/packages/73/e3/04ecc41e71462276ee867ccbef26a4448638eadecf1bc56772c9ed6d0255/numpy-2.3.4-cp312-cp312-win32.whl", hash = "sha256:a49d797192a8d950ca59ee2d0337a4d804f713bb5c3c50e8db26d49666e351dc", size = 6291380, upload-time = "2025-10-15T16:16:03.938Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/a8/566578b10d8d0e9955b1b6cd5db4e9d4592dd0026a941ff7994cedda030a/numpy-2.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:985f1e46358f06c2a09921e8921e2c98168ed4ae12ccd6e5e87a4f1857923f32", size = 12787999, upload-time = "2025-10-15T16:16:05.801Z" },
+ { url = "https://files.pythonhosted.org/packages/58/22/9c903a957d0a8071b607f5b1bff0761d6e608b9a965945411f867d515db1/numpy-2.3.4-cp312-cp312-win_arm64.whl", hash = "sha256:4635239814149e06e2cb9db3dd584b2fa64316c96f10656983b8026a82e6e4db", size = 10197412, upload-time = "2025-10-15T16:16:07.854Z" },
+ { url = "https://files.pythonhosted.org/packages/57/7e/b72610cc91edf138bc588df5150957a4937221ca6058b825b4725c27be62/numpy-2.3.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c090d4860032b857d94144d1a9976b8e36709e40386db289aaf6672de2a81966", size = 20950335, upload-time = "2025-10-15T16:16:10.304Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/46/bdd3370dcea2f95ef14af79dbf81e6927102ddf1cc54adc0024d61252fd9/numpy-2.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a13fc473b6db0be619e45f11f9e81260f7302f8d180c49a22b6e6120022596b3", size = 14179878, upload-time = "2025-10-15T16:16:12.595Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/01/5a67cb785bda60f45415d09c2bc245433f1c68dd82eef9c9002c508b5a65/numpy-2.3.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:3634093d0b428e6c32c3a69b78e554f0cd20ee420dcad5a9f3b2a63762ce4197", size = 5108673, upload-time = "2025-10-15T16:16:14.877Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/cd/8428e23a9fcebd33988f4cb61208fda832800ca03781f471f3727a820704/numpy-2.3.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:043885b4f7e6e232d7df4f51ffdef8c36320ee9d5f227b380ea636722c7ed12e", size = 6641438, upload-time = "2025-10-15T16:16:16.805Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/d1/913fe563820f3c6b079f992458f7331278dcd7ba8427e8e745af37ddb44f/numpy-2.3.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4ee6a571d1e4f0ea6d5f22d6e5fbd6ed1dc2b18542848e1e7301bd190500c9d7", size = 14281290, upload-time = "2025-10-15T16:16:18.764Z" },
+ { url = "https://files.pythonhosted.org/packages/9e/7e/7d306ff7cb143e6d975cfa7eb98a93e73495c4deabb7d1b5ecf09ea0fd69/numpy-2.3.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc8a63918b04b8571789688b2780ab2b4a33ab44bfe8ccea36d3eba51228c953", size = 16636543, upload-time = "2025-10-15T16:16:21.072Z" },
+ { url = "https://files.pythonhosted.org/packages/47/6a/8cfc486237e56ccfb0db234945552a557ca266f022d281a2f577b98e955c/numpy-2.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:40cc556d5abbc54aabe2b1ae287042d7bdb80c08edede19f0c0afb36ae586f37", size = 16056117, upload-time = "2025-10-15T16:16:23.369Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/0e/42cb5e69ea901e06ce24bfcc4b5664a56f950a70efdcf221f30d9615f3f3/numpy-2.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ecb63014bb7f4ce653f8be7f1df8cbc6093a5a2811211770f6606cc92b5a78fd", size = 18577788, upload-time = "2025-10-15T16:16:27.496Z" },
+ { url = "https://files.pythonhosted.org/packages/86/92/41c3d5157d3177559ef0a35da50f0cda7fa071f4ba2306dd36818591a5bc/numpy-2.3.4-cp313-cp313-win32.whl", hash = "sha256:e8370eb6925bb8c1c4264fec52b0384b44f675f191df91cbe0140ec9f0955646", size = 6282620, upload-time = "2025-10-15T16:16:29.811Z" },
+ { url = "https://files.pythonhosted.org/packages/09/97/fd421e8bc50766665ad35536c2bb4ef916533ba1fdd053a62d96cc7c8b95/numpy-2.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:56209416e81a7893036eea03abcb91c130643eb14233b2515c90dcac963fe99d", size = 12784672, upload-time = "2025-10-15T16:16:31.589Z" },
+ { url = "https://files.pythonhosted.org/packages/ad/df/5474fb2f74970ca8eb978093969b125a84cc3d30e47f82191f981f13a8a0/numpy-2.3.4-cp313-cp313-win_arm64.whl", hash = "sha256:a700a4031bc0fd6936e78a752eefb79092cecad2599ea9c8039c548bc097f9bc", size = 10196702, upload-time = "2025-10-15T16:16:33.902Z" },
+ { url = "https://files.pythonhosted.org/packages/11/83/66ac031464ec1767ea3ed48ce40f615eb441072945e98693bec0bcd056cc/numpy-2.3.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:86966db35c4040fdca64f0816a1c1dd8dbd027d90fca5a57e00e1ca4cd41b879", size = 21049003, upload-time = "2025-10-15T16:16:36.101Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/99/5b14e0e686e61371659a1d5bebd04596b1d72227ce36eed121bb0aeab798/numpy-2.3.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:838f045478638b26c375ee96ea89464d38428c69170360b23a1a50fa4baa3562", size = 14302980, upload-time = "2025-10-15T16:16:39.124Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/44/e9486649cd087d9fc6920e3fc3ac2aba10838d10804b1e179fb7cbc4e634/numpy-2.3.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d7315ed1dab0286adca467377c8381cd748f3dc92235f22a7dfc42745644a96a", size = 5231472, upload-time = "2025-10-15T16:16:41.168Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/51/902b24fa8887e5fe2063fd61b1895a476d0bbf46811ab0c7fdf4bd127345/numpy-2.3.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:84f01a4d18b2cc4ade1814a08e5f3c907b079c847051d720fad15ce37aa930b6", size = 6739342, upload-time = "2025-10-15T16:16:43.777Z" },
+ { url = "https://files.pythonhosted.org/packages/34/f1/4de9586d05b1962acdcdb1dc4af6646361a643f8c864cef7c852bf509740/numpy-2.3.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:817e719a868f0dacde4abdfc5c1910b301877970195db9ab6a5e2c4bd5b121f7", size = 14354338, upload-time = "2025-10-15T16:16:46.081Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/06/1c16103b425de7969d5a76bdf5ada0804b476fed05d5f9e17b777f1cbefd/numpy-2.3.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85e071da78d92a214212cacea81c6da557cab307f2c34b5f85b628e94803f9c0", size = 16702392, upload-time = "2025-10-15T16:16:48.455Z" },
+ { url = "https://files.pythonhosted.org/packages/34/b2/65f4dc1b89b5322093572b6e55161bb42e3e0487067af73627f795cc9d47/numpy-2.3.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2ec646892819370cf3558f518797f16597b4e4669894a2ba712caccc9da53f1f", size = 16134998, upload-time = "2025-10-15T16:16:51.114Z" },
+ { url = "https://files.pythonhosted.org/packages/d4/11/94ec578896cdb973aaf56425d6c7f2aff4186a5c00fac15ff2ec46998b46/numpy-2.3.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:035796aaaddfe2f9664b9a9372f089cfc88bd795a67bd1bfe15e6e770934cf64", size = 18651574, upload-time = "2025-10-15T16:16:53.429Z" },
+ { url = "https://files.pythonhosted.org/packages/62/b7/7efa763ab33dbccf56dade36938a77345ce8e8192d6b39e470ca25ff3cd0/numpy-2.3.4-cp313-cp313t-win32.whl", hash = "sha256:fea80f4f4cf83b54c3a051f2f727870ee51e22f0248d3114b8e755d160b38cfb", size = 6413135, upload-time = "2025-10-15T16:16:55.992Z" },
+ { url = "https://files.pythonhosted.org/packages/43/70/aba4c38e8400abcc2f345e13d972fb36c26409b3e644366db7649015f291/numpy-2.3.4-cp313-cp313t-win_amd64.whl", hash = "sha256:15eea9f306b98e0be91eb344a94c0e630689ef302e10c2ce5f7e11905c704f9c", size = 12928582, upload-time = "2025-10-15T16:16:57.943Z" },
+ { url = "https://files.pythonhosted.org/packages/67/63/871fad5f0073fc00fbbdd7232962ea1ac40eeaae2bba66c76214f7954236/numpy-2.3.4-cp313-cp313t-win_arm64.whl", hash = "sha256:b6c231c9c2fadbae4011ca5e7e83e12dc4a5072f1a1d85a0a7b3ed754d145a40", size = 10266691, upload-time = "2025-10-15T16:17:00.048Z" },
+ { url = "https://files.pythonhosted.org/packages/72/71/ae6170143c115732470ae3a2d01512870dd16e0953f8a6dc89525696069b/numpy-2.3.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:81c3e6d8c97295a7360d367f9f8553973651b76907988bb6066376bc2252f24e", size = 20955580, upload-time = "2025-10-15T16:17:02.509Z" },
+ { url = "https://files.pythonhosted.org/packages/af/39/4be9222ffd6ca8a30eda033d5f753276a9c3426c397bb137d8e19dedd200/numpy-2.3.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7c26b0b2bf58009ed1f38a641f3db4be8d960a417ca96d14e5b06df1506d41ff", size = 14188056, upload-time = "2025-10-15T16:17:04.873Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/3d/d85f6700d0a4aa4f9491030e1021c2b2b7421b2b38d01acd16734a2bfdc7/numpy-2.3.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:62b2198c438058a20b6704351b35a1d7db881812d8512d67a69c9de1f18ca05f", size = 5116555, upload-time = "2025-10-15T16:17:07.499Z" },
+ { url = "https://files.pythonhosted.org/packages/bf/04/82c1467d86f47eee8a19a464c92f90a9bb68ccf14a54c5224d7031241ffb/numpy-2.3.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:9d729d60f8d53a7361707f4b68a9663c968882dd4f09e0d58c044c8bf5faee7b", size = 6643581, upload-time = "2025-10-15T16:17:09.774Z" },
+ { url = "https://files.pythonhosted.org/packages/0c/d3/c79841741b837e293f48bd7db89d0ac7a4f2503b382b78a790ef1dc778a5/numpy-2.3.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd0c630cf256b0a7fd9d0a11c9413b42fef5101219ce6ed5a09624f5a65392c7", size = 14299186, upload-time = "2025-10-15T16:17:11.937Z" },
+ { url = "https://files.pythonhosted.org/packages/e8/7e/4a14a769741fbf237eec5a12a2cbc7a4c4e061852b6533bcb9e9a796c908/numpy-2.3.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5e081bc082825f8b139f9e9fe42942cb4054524598aaeb177ff476cc76d09d2", size = 16638601, upload-time = "2025-10-15T16:17:14.391Z" },
+ { url = "https://files.pythonhosted.org/packages/93/87/1c1de269f002ff0a41173fe01dcc925f4ecff59264cd8f96cf3b60d12c9b/numpy-2.3.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:15fb27364ed84114438fff8aaf998c9e19adbeba08c0b75409f8c452a8692c52", size = 16074219, upload-time = "2025-10-15T16:17:17.058Z" },
+ { url = "https://files.pythonhosted.org/packages/cd/28/18f72ee77408e40a76d691001ae599e712ca2a47ddd2c4f695b16c65f077/numpy-2.3.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:85d9fb2d8cd998c84d13a79a09cc0c1091648e848e4e6249b0ccd7f6b487fa26", size = 18576702, upload-time = "2025-10-15T16:17:19.379Z" },
+ { url = "https://files.pythonhosted.org/packages/c3/76/95650169b465ececa8cf4b2e8f6df255d4bf662775e797ade2025cc51ae6/numpy-2.3.4-cp314-cp314-win32.whl", hash = "sha256:e73d63fd04e3a9d6bc187f5455d81abfad05660b212c8804bf3b407e984cd2bc", size = 6337136, upload-time = "2025-10-15T16:17:22.886Z" },
+ { url = "https://files.pythonhosted.org/packages/dc/89/a231a5c43ede5d6f77ba4a91e915a87dea4aeea76560ba4d2bf185c683f0/numpy-2.3.4-cp314-cp314-win_amd64.whl", hash = "sha256:3da3491cee49cf16157e70f607c03a217ea6647b1cea4819c4f48e53d49139b9", size = 12920542, upload-time = "2025-10-15T16:17:24.783Z" },
+ { url = "https://files.pythonhosted.org/packages/0d/0c/ae9434a888f717c5ed2ff2393b3f344f0ff6f1c793519fa0c540461dc530/numpy-2.3.4-cp314-cp314-win_arm64.whl", hash = "sha256:6d9cd732068e8288dbe2717177320723ccec4fb064123f0caf9bbd90ab5be868", size = 10480213, upload-time = "2025-10-15T16:17:26.935Z" },
+ { url = "https://files.pythonhosted.org/packages/83/4b/c4a5f0841f92536f6b9592694a5b5f68c9ab37b775ff342649eadf9055d3/numpy-2.3.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:22758999b256b595cf0b1d102b133bb61866ba5ceecf15f759623b64c020c9ec", size = 21052280, upload-time = "2025-10-15T16:17:29.638Z" },
+ { url = "https://files.pythonhosted.org/packages/3e/80/90308845fc93b984d2cc96d83e2324ce8ad1fd6efea81b324cba4b673854/numpy-2.3.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9cb177bc55b010b19798dc5497d540dea67fd13a8d9e882b2dae71de0cf09eb3", size = 14302930, upload-time = "2025-10-15T16:17:32.384Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/4e/07439f22f2a3b247cec4d63a713faae55e1141a36e77fb212881f7cda3fb/numpy-2.3.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:0f2bcc76f1e05e5ab58893407c63d90b2029908fa41f9f1cc51eecce936c3365", size = 5231504, upload-time = "2025-10-15T16:17:34.515Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/de/1e11f2547e2fe3d00482b19721855348b94ada8359aef5d40dd57bfae9df/numpy-2.3.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:8dc20bde86802df2ed8397a08d793da0ad7a5fd4ea3ac85d757bf5dd4ad7c252", size = 6739405, upload-time = "2025-10-15T16:17:36.128Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/40/8cd57393a26cebe2e923005db5134a946c62fa56a1087dc7c478f3e30837/numpy-2.3.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e199c087e2aa71c8f9ce1cb7a8e10677dc12457e7cc1be4798632da37c3e86e", size = 14354866, upload-time = "2025-10-15T16:17:38.884Z" },
+ { url = "https://files.pythonhosted.org/packages/93/39/5b3510f023f96874ee6fea2e40dfa99313a00bf3ab779f3c92978f34aace/numpy-2.3.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85597b2d25ddf655495e2363fe044b0ae999b75bc4d630dc0d886484b03a5eb0", size = 16703296, upload-time = "2025-10-15T16:17:41.564Z" },
+ { url = "https://files.pythonhosted.org/packages/41/0d/19bb163617c8045209c1996c4e427bccbc4bbff1e2c711f39203c8ddbb4a/numpy-2.3.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04a69abe45b49c5955923cf2c407843d1c85013b424ae8a560bba16c92fe44a0", size = 16136046, upload-time = "2025-10-15T16:17:43.901Z" },
+ { url = "https://files.pythonhosted.org/packages/e2/c1/6dba12fdf68b02a21ac411c9df19afa66bed2540f467150ca64d246b463d/numpy-2.3.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e1708fac43ef8b419c975926ce1eaf793b0c13b7356cfab6ab0dc34c0a02ac0f", size = 18652691, upload-time = "2025-10-15T16:17:46.247Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/73/f85056701dbbbb910c51d846c58d29fd46b30eecd2b6ba760fc8b8a1641b/numpy-2.3.4-cp314-cp314t-win32.whl", hash = "sha256:863e3b5f4d9915aaf1b8ec79ae560ad21f0b8d5e3adc31e73126491bb86dee1d", size = 6485782, upload-time = "2025-10-15T16:17:48.872Z" },
+ { url = "https://files.pythonhosted.org/packages/17/90/28fa6f9865181cb817c2471ee65678afa8a7e2a1fb16141473d5fa6bacc3/numpy-2.3.4-cp314-cp314t-win_amd64.whl", hash = "sha256:962064de37b9aef801d33bc579690f8bfe6c5e70e29b61783f60bcba838a14d6", size = 13113301, upload-time = "2025-10-15T16:17:50.938Z" },
+ { url = "https://files.pythonhosted.org/packages/54/23/08c002201a8e7e1f9afba93b97deceb813252d9cfd0d3351caed123dcf97/numpy-2.3.4-cp314-cp314t-win_arm64.whl", hash = "sha256:8b5a9a39c45d852b62693d9b3f3e0fe052541f804296ff401a72a1b60edafb29", size = 10547532, upload-time = "2025-10-15T16:17:53.48Z" },
+ { url = "https://files.pythonhosted.org/packages/b1/b6/64898f51a86ec88ca1257a59c1d7fd077b60082a119affefcdf1dd0df8ca/numpy-2.3.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6e274603039f924c0fe5cb73438fa9246699c78a6df1bd3decef9ae592ae1c05", size = 21131552, upload-time = "2025-10-15T16:17:55.845Z" },
+ { url = "https://files.pythonhosted.org/packages/ce/4c/f135dc6ebe2b6a3c77f4e4838fa63d350f85c99462012306ada1bd4bc460/numpy-2.3.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d149aee5c72176d9ddbc6803aef9c0f6d2ceeea7626574fc68518da5476fa346", size = 14377796, upload-time = "2025-10-15T16:17:58.308Z" },
+ { url = "https://files.pythonhosted.org/packages/d0/a4/f33f9c23fcc13dd8412fc8614559b5b797e0aba9d8e01dfa8bae10c84004/numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:6d34ed9db9e6395bb6cd33286035f73a59b058169733a9db9f85e650b88df37e", size = 5306904, upload-time = "2025-10-15T16:18:00.596Z" },
+ { url = "https://files.pythonhosted.org/packages/28/af/c44097f25f834360f9fb960fa082863e0bad14a42f36527b2a121abdec56/numpy-2.3.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:fdebe771ca06bb8d6abce84e51dca9f7921fe6ad34a0c914541b063e9a68928b", size = 6819682, upload-time = "2025-10-15T16:18:02.32Z" },
+ { url = "https://files.pythonhosted.org/packages/c5/8c/cd283b54c3c2b77e188f63e23039844f56b23bba1712318288c13fe86baf/numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e92defe6c08211eb77902253b14fe5b480ebc5112bc741fd5e9cd0608f847", size = 14422300, upload-time = "2025-10-15T16:18:04.271Z" },
+ { url = "https://files.pythonhosted.org/packages/b0/f0/8404db5098d92446b3e3695cf41c6f0ecb703d701cb0b7566ee2177f2eee/numpy-2.3.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13b9062e4f5c7ee5c7e5be96f29ba71bc5a37fed3d1d77c37390ae00724d296d", size = 16760806, upload-time = "2025-10-15T16:18:06.668Z" },
+ { url = "https://files.pythonhosted.org/packages/95/8e/2844c3959ce9a63acc7c8e50881133d86666f0420bcde695e115ced0920f/numpy-2.3.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:81b3a59793523e552c4a96109dde028aa4448ae06ccac5a76ff6532a85558a7f", size = 12973130, upload-time = "2025-10-15T16:18:09.397Z" },
+]
+
+[[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 = "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 = "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 = "pytest"
+version = "8.4.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "colorama", marker = "sys_platform == 'win32'" },
+ { name = "exceptiongroup", marker = "python_full_version < '3.11'" },
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+ { name = "tomli", marker = "python_full_version < '3.11'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" },
+]
+
+[[package]]
+name = "tomli"
+version = "2.3.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload-time = "2025-10-08T22:01:47.119Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/b3/2e/299f62b401438d5fe1624119c723f5d877acc86a4c2492da405626665f12/tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", size = 153236, upload-time = "2025-10-08T22:01:00.137Z" },
+ { url = "https://files.pythonhosted.org/packages/86/7f/d8fffe6a7aefdb61bced88fcb5e280cfd71e08939da5894161bd71bea022/tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", size = 148084, upload-time = "2025-10-08T22:01:01.63Z" },
+ { url = "https://files.pythonhosted.org/packages/47/5c/24935fb6a2ee63e86d80e4d3b58b222dafaf438c416752c8b58537c8b89a/tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", size = 234832, upload-time = "2025-10-08T22:01:02.543Z" },
+ { url = "https://files.pythonhosted.org/packages/89/da/75dfd804fc11e6612846758a23f13271b76d577e299592b4371a4ca4cd09/tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", size = 242052, upload-time = "2025-10-08T22:01:03.836Z" },
+ { url = "https://files.pythonhosted.org/packages/70/8c/f48ac899f7b3ca7eb13af73bacbc93aec37f9c954df3c08ad96991c8c373/tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", size = 239555, upload-time = "2025-10-08T22:01:04.834Z" },
+ { url = "https://files.pythonhosted.org/packages/ba/28/72f8afd73f1d0e7829bfc093f4cb98ce0a40ffc0cc997009ee1ed94ba705/tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", size = 245128, upload-time = "2025-10-08T22:01:05.84Z" },
+ { url = "https://files.pythonhosted.org/packages/b6/eb/a7679c8ac85208706d27436e8d421dfa39d4c914dcf5fa8083a9305f58d9/tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", size = 96445, upload-time = "2025-10-08T22:01:06.896Z" },
+ { url = "https://files.pythonhosted.org/packages/0a/fe/3d3420c4cb1ad9cb462fb52967080575f15898da97e21cb6f1361d505383/tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", size = 107165, upload-time = "2025-10-08T22:01:08.107Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891, upload-time = "2025-10-08T22:01:09.082Z" },
+ { url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796, upload-time = "2025-10-08T22:01:10.266Z" },
+ { url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121, upload-time = "2025-10-08T22:01:11.332Z" },
+ { url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070, upload-time = "2025-10-08T22:01:12.498Z" },
+ { url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859, upload-time = "2025-10-08T22:01:13.551Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296, upload-time = "2025-10-08T22:01:14.614Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124, upload-time = "2025-10-08T22:01:15.629Z" },
+ { url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698, upload-time = "2025-10-08T22:01:16.51Z" },
+ { url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819, upload-time = "2025-10-08T22:01:17.964Z" },
+ { url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766, upload-time = "2025-10-08T22:01:18.959Z" },
+ { url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771, upload-time = "2025-10-08T22:01:20.106Z" },
+ { url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586, upload-time = "2025-10-08T22:01:21.164Z" },
+ { url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792, upload-time = "2025-10-08T22:01:22.417Z" },
+ { url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909, upload-time = "2025-10-08T22:01:23.859Z" },
+ { url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946, upload-time = "2025-10-08T22:01:24.893Z" },
+ { url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705, upload-time = "2025-10-08T22:01:26.153Z" },
+ { url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244, upload-time = "2025-10-08T22:01:27.06Z" },
+ { url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637, upload-time = "2025-10-08T22:01:28.059Z" },
+ { url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925, upload-time = "2025-10-08T22:01:29.066Z" },
+ { url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045, upload-time = "2025-10-08T22:01:31.98Z" },
+ { url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835, upload-time = "2025-10-08T22:01:32.989Z" },
+ { url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109, upload-time = "2025-10-08T22:01:34.052Z" },
+ { url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930, upload-time = "2025-10-08T22:01:35.082Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964, upload-time = "2025-10-08T22:01:36.057Z" },
+ { url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065, upload-time = "2025-10-08T22:01:37.27Z" },
+ { url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088, upload-time = "2025-10-08T22:01:38.235Z" },
+ { url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193, upload-time = "2025-10-08T22:01:39.712Z" },
+ { url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488, upload-time = "2025-10-08T22:01:40.773Z" },
+ { url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669, upload-time = "2025-10-08T22:01:41.824Z" },
+ { url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709, upload-time = "2025-10-08T22:01:43.177Z" },
+ { url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563, upload-time = "2025-10-08T22:01:44.233Z" },
+ { url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756, upload-time = "2025-10-08T22:01:45.234Z" },
+ { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" },
+]
+
+[[package]]
+name = "typing-extensions"
+version = "4.15.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" },
+]