From e33692a17b737e7e83e568303e8dd1a298645378 Mon Sep 17 00:00:00 2001 From: tomsail Date: Mon, 1 Jun 2026 08:49:14 +0200 Subject: [PATCH 1/3] chore: replace in-house Serafin class with python-serafin dependency --- .pre-commit-config.yaml | 1 + poetry.lock | 641 +++++----- pyproject.toml | 1 + requirements/requirements-dev.txt | 562 +++++---- requirements/requirements.txt | 149 +-- xarray_selafin/Serafin.py | 1326 -------------------- xarray_selafin/data/Serafin_var2D.csv | 62 - xarray_selafin/data/Serafin_var3D.csv | 26 - xarray_selafin/variable/__init__.py | 0 xarray_selafin/variable/variables_2d.py | 371 ------ xarray_selafin/variable/variables_3d.py | 73 -- xarray_selafin/variable/variables_utils.py | 172 --- xarray_selafin/xarray_backend.py | 33 +- 13 files changed, 735 insertions(+), 2682 deletions(-) delete mode 100644 xarray_selafin/Serafin.py delete mode 100644 xarray_selafin/data/Serafin_var2D.csv delete mode 100644 xarray_selafin/data/Serafin_var3D.csv delete mode 100644 xarray_selafin/variable/__init__.py delete mode 100755 xarray_selafin/variable/variables_2d.py delete mode 100755 xarray_selafin/variable/variables_3d.py delete mode 100755 xarray_selafin/variable/variables_utils.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 221990c..5ef78c3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -44,6 +44,7 @@ repos: rev: "23.11.0" hooks: - id: "black" + args: [--line-length, "127"] - repo: "https://github.com/astral-sh/ruff-pre-commit" # Ruff version. diff --git a/poetry.lock b/poetry.lock index 0501c13..5472f62 100644 --- a/poetry.lock +++ b/poetry.lock @@ -80,23 +80,6 @@ charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] -[[package]] -name = "bleach" -version = "6.3.0" -description = "An easy safelist-based HTML-sanitizing tool." -optional = false -python-versions = ">=3.10" -files = [ - {file = "bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6"}, - {file = "bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22"}, -] - -[package.dependencies] -webencodings = "*" - -[package.extras] -css = ["tinycss2 (>=1.1.0,<1.5)"] - [[package]] name = "bokeh" version = "3.9.0" @@ -147,13 +130,13 @@ ujson = ["ujson (>=5.10.0)"] [[package]] name = "certifi" -version = "2026.4.22" +version = "2026.5.20" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" files = [ - {file = "certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a"}, - {file = "certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580"}, + {file = "certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897"}, + {file = "certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d"}, ] [[package]] @@ -339,13 +322,13 @@ files = [ [[package]] name = "click" -version = "8.4.0" +version = "8.4.1" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.10" files = [ - {file = "click-8.4.0-py3-none-any.whl", hash = "sha256:40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81"}, - {file = "click-8.4.0.tar.gz", hash = "sha256:638f1338fe1235c8f4e008e4a8a254fb5c5fbdcbb40ece3c9142ebb78e792973"}, + {file = "click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2"}, + {file = "click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96"}, ] [package.dependencies] @@ -826,13 +809,13 @@ tests-nb = ["nbval", "pytest-xdist"] [[package]] name = "idna" -version = "3.15" +version = "3.17" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8"}, - {file = "idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc"}, + {file = "idna-3.17-py3-none-any.whl", hash = "sha256:466e48829084efe2548012b855df21540b96f2e20e51bd124c851536556a592c"}, + {file = "idna-3.17.tar.gz", hash = "sha256:5eb0cb53bc467c12eadcf6de83163ad8527cec9416f44b9b61b19caedad2b87f"}, ] [package.extras] @@ -874,13 +857,13 @@ files = [ [[package]] name = "ipython" -version = "9.13.0" +version = "9.14.0" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.11" files = [ - {file = "ipython-9.13.0-py3-none-any.whl", hash = "sha256:57f9d4639e20818d328d287c7b549af3d05f12486ea8f2e7f73e52a36ec4d201"}, - {file = "ipython-9.13.0.tar.gz", hash = "sha256:7e834b6afc99f020e3f05966ced34792f40267d64cb1ea9043886dab0dde5967"}, + {file = "ipython-9.14.0-py3-none-any.whl", hash = "sha256:8fd984a3372c14b12790b084ba6b5cff5678c0cb063244a0034f06a51f20d6c2"}, + {file = "ipython-9.14.0.tar.gz", hash = "sha256:6f27ff0f1d9ea050e0551f71568bc4b34d8aba579e8f111c5b4175f44ac6b4aa"}, ] [package.dependencies] @@ -891,7 +874,7 @@ jedi = ">=0.18.2" matplotlib-inline = ">=0.1.6" pexpect = {version = ">4.6", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} prompt_toolkit = ">=3.0.41,<3.1.0" -psutil = ">=7" +psutil = {version = ">=7", markers = "sys_platform != \"emscripten\""} pygments = ">=2.14.0" stack_data = ">=0.6.0" traitlets = ">=5.13.0" @@ -1050,145 +1033,145 @@ files = [ [[package]] name = "lxml" -version = "6.1.0" +version = "6.1.1" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.8" files = [ - {file = "lxml-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:41dcc4c7b10484257cbd6c37b83ddb26df2b0e5aff5ac00d095689015af868ec"}, - {file = "lxml-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a31286dbb5e74c8e9a5344465b77ab4c5bd511a253b355b5ca2fae7e579fafec"}, - {file = "lxml-6.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1bc4cc83fb7f66ffb16f74d6dd0162e144333fc36ebcce32246f80c8735b2551"}, - {file = "lxml-6.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:20cf4d0651987c906a2f5cba4e3a8d6ba4bfdf973cfe2a96c0d6053888ea2ecd"}, - {file = "lxml-6.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffb34ea45a82dd637c2c97ae1bbb920850c1e59bcae79ce1c15af531d83e7215"}, - {file = "lxml-6.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a1d9b99e5b2597e4f5aed2484fef835256fa1b68a19e4265c97628ef4bf8bcf4"}, - {file = "lxml-6.1.0-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:d43aa26dcda363f21e79afa0668f5029ed7394b3bb8c92a6927a3d34e8b610ea"}, - {file = "lxml-6.1.0-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:6262b87f9e5c1e5fe501d6c153247289af42eb44ad7660b9b3de17baaf92d6f6"}, - {file = "lxml-6.1.0-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d1392c569c032f78a11a25d1de1c43fff13294c793b39e19d84fade3045cbbc3"}, - {file = "lxml-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:045e387d1f4f42a418380930fa3f45c73c9b392faf67e495e58902e68e8f44a7"}, - {file = "lxml-6.1.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:9f93d5b8b07f73e8c77e3c6556a3db269918390c804b5e5fcdd4858232cc8f16"}, - {file = "lxml-6.1.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:de550d129f18d8ab819651ffe4f38b1b713c7e116707de3c0c6400d0ef34fbc1"}, - {file = "lxml-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c08da09dc003c9e8c70e06b53a11db6fb3b250c21c4236b03c7d7b443c318e7a"}, - {file = "lxml-6.1.0-cp310-cp310-win32.whl", hash = "sha256:37448bf9c7d7adfc5254763901e2bbd6bb876228dfc1fc7f66e58c06368a7544"}, - {file = "lxml-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:2593a0a6621545b9095b71ad74ed4226eba438a7d9fc3712a99bdb15508cf93a"}, - {file = "lxml-6.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:e80807d72f96b96ad5588cb85c75616e4f2795a7737d4630784c51497beb7776"}, - {file = "lxml-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cec05be8c876f92a5aa07b01d60bbb4d11cfbdd654cad0561c0d7b5c043a61b9"}, - {file = "lxml-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9c03e048b6ce8e77b09c734e931584894ecd58d08296804ca2d0b184c933ce50"}, - {file = "lxml-6.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:942454ff253da14218f972b23dc72fa4edf6c943f37edd19cd697618b626fac5"}, - {file = "lxml-6.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d036ee7b99d5148072ac7c9b847193decdfeac633db350363f7bce4fff108f0e"}, - {file = "lxml-6.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ae5d8d5427f3cc317e7950f2da7ad276df0cfa37b8de2f5658959e618ea8512"}, - {file = "lxml-6.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:363e47283bde87051b821826e71dde47f107e08614e1aa312ba0c5711e77738c"}, - {file = "lxml-6.1.0-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:f504d861d9f2a8f94020130adac88d66de93841707a23a86244263d1e54682f5"}, - {file = "lxml-6.1.0-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:23a5dc68e08ed13331d61815c08f260f46b4a60fdd1640bbeb82cf89a9d90289"}, - {file = "lxml-6.1.0-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f15401d8d3dbf239e23c818afc10c7207f7b95f9a307e092122b6f86dd43209a"}, - {file = "lxml-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fcf3da95e93349e0647d48d4b36a12783105bcc74cb0c416952f9988410846a3"}, - {file = "lxml-6.1.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:0d082495c5fcf426e425a6e28daaba1fcb6d8f854a4ff01effb1f1f381203eb9"}, - {file = "lxml-6.1.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:e3c4f84b24a1fcba435157d111c4b755099c6ff00a3daee1ad281817de75ed11"}, - {file = "lxml-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:976a6b39b1b13e8c354ad8d3f261f3a4ac6609518af91bdb5094760a08f132c4"}, - {file = "lxml-6.1.0-cp311-cp311-win32.whl", hash = "sha256:857efde87d365706590847b916baff69c0bc9252dc5af030e378c9800c0b10e3"}, - {file = "lxml-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:183bfb45a493081943be7ea2b5adfc2b611e1cf377cefa8b8a8be404f45ef9a7"}, - {file = "lxml-6.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:19f4164243fc206d12ed3d866e80e74f5bc3627966520da1a5f97e42c32a3f39"}, - {file = "lxml-6.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d2f17a16cd8751e8eb233a7e41aecdf8e511712e00088bf9be455f604cd0d28d"}, - {file = "lxml-6.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0cea5b1d3e6e77d71bd2b9972eb2446221a69dc52bb0b9c3c6f6e5700592d93"}, - {file = "lxml-6.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc46da94826188ed45cb53bd8e3fc076ae22675aea2087843d4735627f867c6d"}, - {file = "lxml-6.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9147d8e386ec3b82c3b15d88927f734f565b0aaadef7def562b853adca45784a"}, - {file = "lxml-6.1.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5715e0e28736a070f3f34a7ccc09e2fdcba0e3060abbcf61a1a5718ff6d6b105"}, - {file = "lxml-6.1.0-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4937460dc5df0cdd2f06a86c285c28afda06aefa3af949f9477d3e8df430c485"}, - {file = "lxml-6.1.0-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bc783ee3147e60a25aa0445ea82b3e8aabb83b240f2b95d32cb75587ff781814"}, - {file = "lxml-6.1.0-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:40d9189f80075f2e1f88db21ef815a2b17b28adf8e50aaf5c789bfe737027f32"}, - {file = "lxml-6.1.0-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:05b9b8787e35bec69e68daf4952b2e6dfcfb0db7ecf1a06f8cdfbbac4eb71aad"}, - {file = "lxml-6.1.0-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0f0f08beb0182e3e9a86fae124b3c47a7b41b7b69b225e1377db983802404e54"}, - {file = "lxml-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73becf6d8c81d4c76b1014dbd3584cb26d904492dcf73ca85dc8bff08dcd6d2d"}, - {file = "lxml-6.1.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1ae225f66e5938f4fa29d37e009a3bb3b13032ac57eb4eb42afa44f6e4054e69"}, - {file = "lxml-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:690022c7fae793b0489aa68a658822cea83e0d5933781811cabbf5ea3bcfe73d"}, - {file = "lxml-6.1.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:63aeafc26aac0be8aff14af7871249e87ea1319be92090bfd632ec68e03b16a5"}, - {file = "lxml-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:264c605ab9c0e4aa1a679636f4582c4d3313700009fac3ec9c3412ed0d8f3e1d"}, - {file = "lxml-6.1.0-cp312-cp312-win32.whl", hash = "sha256:56971379bc5ee8037c5a0f09fa88f66cdb7d37c3e38af3e45cf539f41131ac1f"}, - {file = "lxml-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:bba078de0031c219e5dd06cf3e6bf8fb8e6e64a77819b358f53bb132e3e03366"}, - {file = "lxml-6.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:c3592631e652afa34999a088f98ba7dfc7d6aff0d535c410bea77a71743f3819"}, - {file = "lxml-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a0092f2b107b69601adf562a57c956fbb596e05e3e6651cabd3054113b007e45"}, - {file = "lxml-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fc7140d7a7386e6b545d41b7358f4d02b656d4053f5fa6859f92f4b9c2572c4d"}, - {file = "lxml-6.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:419c58fc92cc3a2c3fa5f78c63dbf5da70c1fa9c1b25f25727ecee89a96c7de2"}, - {file = "lxml-6.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:37fabd1452852636cf38ecdcc9dd5ca4bba7a35d6c53fa09725deeb894a87491"}, - {file = "lxml-6.1.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2853c8b2170cc6cd54a6b4d50d2c1a8a7aeca201f23804b4898525c7a152cfc"}, - {file = "lxml-6.1.0-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8e369cbd690e788c8d15e56222d91a09c6a417f49cbc543040cba0fe2e25a79e"}, - {file = "lxml-6.1.0-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e69aa6805905807186eb00e66c6d97a935c928275182eb02ee40ba00da9623b2"}, - {file = "lxml-6.1.0-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:4bd1bdb8a9e0e2dd229de19b5f8aebac80e916921b4b2c6ef8a52bc131d0c1f9"}, - {file = "lxml-6.1.0-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:cbd7b79cdcb4986ad78a2662625882747f09db5e4cd7b2ae178a88c9c51b3dfe"}, - {file = "lxml-6.1.0-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:43e4d297f11080ec9d64a4b1ad7ac02b4484c9f0e2179d9c4ef78e886e747b88"}, - {file = "lxml-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cc16682cc987a3da00aa56a3aa3075b08edb10d9b1e476938cfdbee8f3b67181"}, - {file = "lxml-6.1.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d6d8efe71429635f0559579092bb5e60560d7b9115ee38c4adbea35632e7fa24"}, - {file = "lxml-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e39ab3a28af7784e206d8606ec0e4bcad0190f63a492bca95e94e5a4aef7f6e"}, - {file = "lxml-6.1.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:9eb667bf50856c4a58145f8ca2d5e5be160191e79eb9e30855a476191b3c3495"}, - {file = "lxml-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7f4a77d6f7edf9230cee3e1f7f6764722a41604ee5681844f18db9a81ea0ec33"}, - {file = "lxml-6.1.0-cp313-cp313-win32.whl", hash = "sha256:28902146ffbe5222df411c5d19e5352490122e14447e98cd118907ee3fd6ee62"}, - {file = "lxml-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:4a1503c56e4e2b38dc76f2f2da7bae69670c0f1933e27cfa34b2fa5876410b16"}, - {file = "lxml-6.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:e0af85773850417d994d019741239b901b22c6680206f46a34766926e466141d"}, - {file = "lxml-6.1.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:ab863fd37458fed6456525f297d21239d987800c46e67da5ef04fc6b3dd93ac8"}, - {file = "lxml-6.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6fd8b1df8254ff4fd93fd31da1fc15770bde23ac045be9bb1f87425702f61cc9"}, - {file = "lxml-6.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:47024feaae386a92a146af0d2aeed65229bf6fff738e6a11dda6b0015fb8fd03"}, - {file = "lxml-6.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3f00972f84450204cd5d93a5395965e348956aaceaadec693a22ec743f8ae3eb"}, - {file = "lxml-6.1.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97faa0860e13b05b15a51fb4986421ef7a30f0b3334061c416e0981e9450ca4c"}, - {file = "lxml-6.1.0-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:972a6451204798675407beaad97b868d0c733d9a74dafefc63120b81b8c2de28"}, - {file = "lxml-6.1.0-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fe022f20bc4569ec66b63b3fb275a3d628d9d32da6326b2982584104db6d3086"}, - {file = "lxml-6.1.0-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:75c4c7c619a744f972f4451bf5adf6d0fb00992a1ffc9fd78e13b0bc817cc99f"}, - {file = "lxml-6.1.0-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:3648f20d25102a22b6061c688beb3a805099ea4beb0a01ce62975d926944d292"}, - {file = "lxml-6.1.0-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:77b9f99b17cbf14026d1e618035077060fc7195dd940d025149f3e2e830fbfcb"}, - {file = "lxml-6.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:32662519149fd7a9db354175aa5e417d83485a8039b8aaa62f873ceee7ea4cad"}, - {file = "lxml-6.1.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:73d658216fc173cf2c939e90e07b941c5e12736b0bf6a99e7af95459cfe8eabb"}, - {file = "lxml-6.1.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ac4db068889f8772a4a698c5980ec302771bb545e10c4b095d4c8be26749616f"}, - {file = "lxml-6.1.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:45e9dfbd1b661eb64ba0d4dbe762bd210c42d86dd1e5bd2bdf89d634231beb43"}, - {file = "lxml-6.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:89e8d73d09ac696a5ba42ec69787913d53284f12092f651506779314f10ba585"}, - {file = "lxml-6.1.0-cp314-cp314-win32.whl", hash = "sha256:ebe33f4ec1b2de38ceb225a1749a2965855bffeef435ba93cd2d5d540783bf2f"}, - {file = "lxml-6.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:398443df51c538bd578529aa7e5f7afc6c292644174b47961f3bf87fe5741120"}, - {file = "lxml-6.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:8c8984e1d8c4b3949e419158fda14d921ff703a9ed8a47236c6eb7a2b6cb4946"}, - {file = "lxml-6.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1081dd10bc6fa437db2500e13993abf7cc30716d0a2f40e65abb935f02ec559c"}, - {file = "lxml-6.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:dabecc48db5f42ba348d1f5d5afdc54c6c4cc758e676926c7cd327045749517d"}, - {file = "lxml-6.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e3dd5fe19c9e0ac818a9c7f132a5e43c1339ec1cbbfecb1a938bd3a47875b7c9"}, - {file = "lxml-6.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9e7b0a4ca6dcc007a4cef00a761bba2dea959de4bd2df98f926b33c92ca5dfb9"}, - {file = "lxml-6.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d27bbe326c6b539c64b42638b18bc6003a8d88f76213a97ac9ed4f885efeab7"}, - {file = "lxml-6.1.0-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4e425db0c5445ef0ad56b0eec54f89b88b2d884656e536a90b2f52aecb4ca86"}, - {file = "lxml-6.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4b89b098105b8599dc57adac95d1813409ac476d3c948a498775d3d0c6124bfb"}, - {file = "lxml-6.1.0-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:c4a699432846df86cc3de502ee85f445ebad748a1c6021d445f3e514d2cd4b1c"}, - {file = "lxml-6.1.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:30e7b2ed63b6c8e97cca8af048589a788ab5c9c905f36d9cf1c2bb549f450d2f"}, - {file = "lxml-6.1.0-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:022981127642fe19866d2907d76241bb07ed21749601f727d5d5dd1ce5d1b773"}, - {file = "lxml-6.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:23cad0cc86046d4222f7f418910e46b89971c5a45d3c8abfad0f64b7b05e4a9b"}, - {file = "lxml-6.1.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:21c3302068f50d1e8728c67c87ba92aa87043abee517aa2576cca1855326b405"}, - {file = "lxml-6.1.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:be10838781cb3be19251e276910cd508fe127e27c3242e50521521a0f3781690"}, - {file = "lxml-6.1.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2173a7bffe97667bbf0767f8a99e587740a8c56fdf3befac4b09cb29a80276fd"}, - {file = "lxml-6.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c6854e9cf99c84beb004eecd7d3a3868ef1109bf2b1df92d7bc11e96a36c2180"}, - {file = "lxml-6.1.0-cp314-cp314t-win32.whl", hash = "sha256:00750d63ef0031a05331b9223463b1c7c02b9004cef2346a5b2877f0f9494dd2"}, - {file = "lxml-6.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:80410c3a7e3c617af04de17caa9f9f20adaa817093293d69eae7d7d0522836f5"}, - {file = "lxml-6.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:26dd9f57ee3bd41e7d35b4c98a2ffd89ed11591649f421f0ec19f67d50ec67ac"}, - {file = "lxml-6.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b6c2f225662bc5ad416bdd06f72ca301b31b39ce4261f0e0097017fc2891b940"}, - {file = "lxml-6.1.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a86f06f059e22a0d574990ee2df24ede03f7f3c68c1336293eee9536c4c776cd"}, - {file = "lxml-6.1.0-cp38-cp38-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:468479e52ecf3ec23799c863336d02c05fc2f7ffd1a1424eeeb9a28d4eb69d13"}, - {file = "lxml-6.1.0-cp38-cp38-manylinux_2_28_i686.whl", hash = "sha256:a02ca8fe48815bddcfca3248efe54451abb9dbf2f7d1c5744c8aa4142d476919"}, - {file = "lxml-6.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:bb40648d96157f9081886defe13eac99253e663be969ff938a9289eff6e47b72"}, - {file = "lxml-6.1.0-cp38-cp38-win32.whl", hash = "sha256:1dd6a1c3ad4cb674f44525d9957f3e9c209bb6dd9213245195167a281fcc2bdc"}, - {file = "lxml-6.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:4e2c54d6b47361d0f1d3bc8d4e082ad87201e56ccdcca4d3b9ee3644ff595ec8"}, - {file = "lxml-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:920354904d1cb86577d4b3cfe2830c2dbe81d6f4449e57ada428f1609b5985f7"}, - {file = "lxml-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c871299c595ee004d186f61840f0bfc4941aa3f17c8ba4a565ead7e4f4f820ee"}, - {file = "lxml-6.1.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d0d799ff958655781296ec870d5e2448e75150da2b3d07f13ff5b0c2c35beefd"}, - {file = "lxml-6.1.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ba11752e346bd804ea312ec2eea2532dfa8b8d3261d81a32ef9e6ab16256280"}, - {file = "lxml-6.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:26c5272c6a4bf4cf32d3f5a7890c942b0e04438691157d341616d02cca74d4bd"}, - {file = "lxml-6.1.0-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c53fa3a5a52122d590e847a57ccf955557b9634a7f99ff5a35131321b0a85317"}, - {file = "lxml-6.1.0-cp39-cp39-manylinux_2_28_i686.whl", hash = "sha256:76b958b4ea3104483c20f74866d55aa056546e15ebe83dd7aecd63698f43b755"}, - {file = "lxml-6.1.0-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:8c11b984b5ce6add4dccc7144c7be5d364d298f15b0c6a57da1991baedc750ce"}, - {file = "lxml-6.1.0-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d3829a6e6fd550a219564912d4002c537f65da4c6ae4e093cc34462f4fa027ad"}, - {file = "lxml-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:52b0ac6903cf74ebf997eb8c682d2fbac7d1ab7e4c552413eec55868a9b73f39"}, - {file = "lxml-6.1.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:29f5c00cb7d752bce2c70ebd2d31b0a42f9499ffdd3ecb2f31a5b73ee43031ad"}, - {file = "lxml-6.1.0-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:c748ebcb6877de89f48ab90ca96642ac458fff5dec291a2b9337cd4d0934e383"}, - {file = "lxml-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:08950a23f296b3f83521577274e3d3b0f3d739bf2e68d01a752e4288bc50d286"}, - {file = "lxml-6.1.0-cp39-cp39-win32.whl", hash = "sha256:11a873c77a181b4fef9c2e357d08ed399542c2af1390101da66720a19c7c9618"}, - {file = "lxml-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:81ff55c70b67d19d52b6fd118a114c0a4c97d799cd3089ff9bd9e2ff4b414ee2"}, - {file = "lxml-6.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:481d6e2104285d9add34f41b42b247b76b61c5b5c26c303c2e9707bbf8bd9a64"}, - {file = "lxml-6.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:546b66c0dd1bb8d9fa89d7123e5fa19a8aff3a1f2141eb22df96112afb17b842"}, - {file = "lxml-6.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5cfa1a34df366d9dc0d5eaf420f4cf2bb1e1bebe1066d1c2fc28c179f8a4004c"}, - {file = "lxml-6.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db88156fcf544cdbf0d95588051515cfdfd4c876fc66444eb98bceb5d6db76de"}, - {file = "lxml-6.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:07f98f5496f96bf724b1e3c933c107f0cbf2745db18c03d2e13a291c3afd2635"}, - {file = "lxml-6.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4642e04449a1e164b5ff71ffd901ddb772dfabf5c9adf1b7be5dffe1212bc037"}, - {file = "lxml-6.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:7da13bb6fbadfafb474e0226a30570a3445cfd47c86296f2446dafbd77079ace"}, - {file = "lxml-6.1.0.tar.gz", hash = "sha256:bfd57d8008c4965709a919c3e9a98f76c2c7cb319086b3d26858250620023b13"}, + {file = "lxml-6.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:09dd5b7075dc2f7709654a46543ba1ea3c2e217b2ed8fbd413a8a945a0f40f60"}, + {file = "lxml-6.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f6ac4ef4d82dff54670227a69c67782ae0b811b5cf6b17954f1e8f7502fc0d1d"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:556e94a63c9b04716f8e4de2abb65775061f846e89331b6c5be79183a24f98ea"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c6bf403fbb3b3e348a561a5f4f0b9961835657981c802a1df03653eef8a9074"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1dde6131244bba38a17c745836ba190bc753fd73c9291666287fd0a3fa3dcf30"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98fc784c2c1440667aeedf8465bdfe10208acf0ead656a2c68627299f546b315"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:add8cf6ddf9a65116119a28ece0f7886e30af27ba724a7594305f1d1b58a92a1"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:cf9d57306d848218f3601fee7601fab1a327c942d56e2e97610583cb4dd74206"}, + {file = "lxml-6.1.1-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88136950da4d13c318bde414ce10219931937851327f44328f2df4d2c4614067"}, + {file = "lxml-6.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cecdd5dfdc87b1fd87dbf81d4b037a544f47f4c744200a67013771682d67686a"}, + {file = "lxml-6.1.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cd312b9692e831d2ffcad61eab31d91d4b4655a962e61de8fb410472cbcd37aa"}, + {file = "lxml-6.1.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:5b7328b46d49fc9477d91ae8f6d55340347d827b7734ba3ea33faae0efef1383"}, + {file = "lxml-6.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37a58976370f36d9329d118ad0b953c5aeb9119ac9c6a4e258942a225d0573a1"}, + {file = "lxml-6.1.1-cp310-cp310-win32.whl", hash = "sha256:cea3f4c1af79af13cdb2da0c028111d8f8522d4f22a000c82385535f24e5cf3a"}, + {file = "lxml-6.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:3abf332af33a74288675d936fe861fd4344da0dd6622193fbc4f2bfbb35536b5"}, + {file = "lxml-6.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:8dadbe5b217ff35b6a8d16610dd710219b59b76d13f0e3f0d9f36786206e4485"}, + {file = "lxml-6.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:53b7d2b7a10b1c35c0a5e21e9224accf60c1bbfba523990732e521b2b73adef2"}, + {file = "lxml-6.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ff3f333630ab480244a1bff72043e511a91eb22e7595dead8653ee5612dd8f3d"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a4bbea04c97f6d78a48e3fbc1cb9116d2780b1b39e03a23f6eb9b603fd61f510"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db1d75f6617a49c1c01bc7023713e0ff59ab32c9579ae62a7674c0e34f3b0b0a"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a12689be69a28ddaa0ab99a5a1137da2afd5f8f16df7b5680b66f616d3eda1d"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b73c339ae29b90fd2d06e58ebd555a751bde9cd6bbd36cc0281b9a2c94e9d8"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:752d3bbfe874715ccd0aec7f88d7fc623c0f1fd7aa7b3238a084e017bad2a009"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:6b1761fbf9ec984e2e9d9c589ef5f5fd684b7c19f92aadd567a26c5224958db6"}, + {file = "lxml-6.1.1-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d680fbcb768404c601ecb43519ecd8461f6954cb11c06a78962f666832ccfca8"}, + {file = "lxml-6.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:162af1091cd785f2f27e62d3547ae9bc58ec5c86dd314d67021fd02463708d83"}, + {file = "lxml-6.1.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e9308ff8241c532df3f3e570f9a5aeed6c853f888512ba4b75638d7c11c95ef6"}, + {file = "lxml-6.1.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5f6994074ebae6ffb04447268e37dc16edc304f9859cf91acb86e0af6c1b395c"}, + {file = "lxml-6.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80c2dfadb855da477cf73373ad29a333535dedb9b12bad02c9814c8e2b43bf08"}, + {file = "lxml-6.1.1-cp311-cp311-win32.whl", hash = "sha256:30a89d3ac8faec007453fb541f3f46807eeec88edd5826f6e3fe001752a2c621"}, + {file = "lxml-6.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:abbefa31eee84842140f67acef1c828e28bba8bbf0c3bc6e5492a9af88152c28"}, + {file = "lxml-6.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:dcb292aa7fe485ceff7af4f92e46c5af397daec5dff64871a528f0fc47a3cc5b"}, + {file = "lxml-6.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:104c09bda8d2a562824c0e319d0768ce26a779b7601e0931d33b09b53c392ef7"}, + {file = "lxml-6.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:25c6997a9a534e016695a0ba06b2f07945de682731ff01065b6d5a4474179da1"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:27acc820660aaffa4f7c087f29120e12980f7779d56d8492d263170111284740"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f"}, + {file = "lxml-6.1.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955"}, + {file = "lxml-6.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a"}, + {file = "lxml-6.1.1-cp312-cp312-win32.whl", hash = "sha256:126c93f7f56f0eda92f6d8c619edc463a4f23d9252f1c9d0405a76f25fa9f11a"}, + {file = "lxml-6.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:26e6eda8d38c1fcab1090dd196ee87cbd13788e531937610e2589085de074e77"}, + {file = "lxml-6.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:6540377fbd53fe1b629172288c464fb18db11ce1fa7dc15891da10aa9dcc3e7f"}, + {file = "lxml-6.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:68a9198d0fc122d14bb76837de9aa80cf84caed990b5b237f532ed87d3706736"}, + {file = "lxml-6.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7d47866cb32fb503450b6edc9df355d10dc49836af2e89901bd6ac6b0896d9d9"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb7c9811bfaa8b1ed5ed319f5d370dfbcaa59d52ea64be2a5a85e18195930354"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:762ff394d5bd56da0cf034a23dcce4e13923f15321a2adfa2ac00201dc6d3fca"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a088f287f7d8275a33c07f2cac6c50b9319309a0200a39e7e75d80c707723099"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e902da4b04e6b52e5893900d4b8ab46068f75f3561f01bf1080957f9fd932ed6"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d4962d4c66bf830a7e59ed6cfc17d148149898a3aefa8ec6e59763e6e3ed085"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:581d4c8ae690a6609e64862dd6b7c2489635c2d13907fc2b20f2bc200ff1d21e"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:876e1ff5930ed8bf295ec5ef9a8155e9b6b1876bbf1deed8b3a8069311875a8f"}, + {file = "lxml-6.1.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9eb9b5a968f6e0f6d640092a567e14529ff8cea2e29d00da6f78a79fa49f013c"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aa49e06d94aba782c6a02eecb7e507969e7e7a41b267f1b359bb35585f295d5b"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:70cdfd80589d59e43e18005dd7244e8895e93db8ab6a620b7e23df5445a4e3d2"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:aad9aa39483ed8ec44d6d2e59e5b98a0d80676ef0d92f44bfc374836111f62f5"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d49514be2f28d895c38cf9d2b72d7b9a07d00314519f456c0b50b53cfcf4c785"}, + {file = "lxml-6.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:47402e62c52ff5988c1e8c6c63177f5708bccf48e366dea4e3dcf1e645e04947"}, + {file = "lxml-6.1.1-cp313-cp313-win32.whl", hash = "sha256:3483644525531e1d5762b0c44a8e18b6efba321b6dcf8a8952de10b037618bca"}, + {file = "lxml-6.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:a10bd2fd62e8ce916ececb342f348f190724a098c1faa056fdfb2a22ad5e8660"}, + {file = "lxml-6.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:424aa57aca0897eb922aef34395bd1289b3b6f04e6bae20ea123c0c7e333cffc"}, + {file = "lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:19b7ab10b210b0b3ad7985d9ac4eb66ab09a90b20fe6e2f7ba55d01a234345d0"}, + {file = "lxml-6.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c08e5c694306507275f2290073350c4f32e383db15213b2c69e7ff39c1193840"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:74a9717fd0d82effef5c2854f0d917231d5324b5a3eb7275c43ac9fa32f97a14"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efe0374196335f93b53269acd811b944f2e6bdc88e8894f214bd636455484909"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac931cdc9442c1763b8a8f6cd62c0c938737eafc5be75eff88df55fc73bc0d00"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aee395f5d0927f947758b4ec119fd5fc8ec71f07a1c5c52077b30b04c0fa6955"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9395002973c827b3ed67db77e6ec09f092919a587022174554096a269378fb13"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:73bc2086f141224ebddb7fc5c6a36ca58b31b94b561e1dfe8e073e3270fad1e7"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:3779def59032b81e44a5f70096ef6bf2082f8d901937dca354474ba09782e245"}, + {file = "lxml-6.1.1-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:86c89b9d55ebf820ad7c90bc533410f0d098054f293351f10603c0c46ff598f5"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19607c6bbff2a44cf3fe8250abccd20942d3462473e0a721d01d379ed017e462"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c6ed5141a5c7507cf3ee76bd363b0d6f801e3321adc35b5d825a23115faa5465"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:62aeb7e85b5d60320b9d77eef2e773994e2c0ce10121b277e0a19804e1654a5a"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b1b963fd8f5caa68e99dfae060d54de1fe9cba899b8718b44a00cdca53c3e590"}, + {file = "lxml-6.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63876be28efefa04a1df615b46770e82042cce445cfdce55160522f57b231ccb"}, + {file = "lxml-6.1.1-cp314-cp314-win32.whl", hash = "sha256:7f7a92e8583f06b1fd49d01158143b8461cfcd135dcb10ec807270a3051bd603"}, + {file = "lxml-6.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:b2d444f2e66624d68e9c6b211e28a76e22fff5fcabcfff4deac18b529b7d4137"}, + {file = "lxml-6.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:3fd9728a2735fda14f4e8235830c86b539e9661e849665bf926d3f867943b4bf"}, + {file = "lxml-6.1.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:787b2496d0dbe8cd180984e8d29e3a6f76e7ea34db781cb3bd55e4ba1ef8b4ee"}, + {file = "lxml-6.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2c8daa471358dc2d6fcf02165e80ec68f77871a286df95bc5cc3816153b0fd2c"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:acd7d70b64c0aae0c7922cca83d288a16f5f6da523637697872253415269baef"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4f0dd2f01f9f8a89f565d000e03abcf0a13d692a346c8d22f628d49af098777a"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b7e8a14c8634bf6f7a568634cb395305a6d964aeb5b7ee32248094bed3a7e2c"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:86281fbdd6a8162756f8d603f37e3435bfa38043adb79c6dc6a2dfee065e7525"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5d7152ec39ca7c402d8fb9bad86140a15b9503bd0c54484e3f1bbe3dd37ceca"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:88d8cb75b9d82858497a5393e3c63cfbf03035225e4b35a49ed7ccb151e4dc0e"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f64ec5397ea6a41fc1b4af0380d79b44a755b5531dcaccd9940fb260dca93038"}, + {file = "lxml-6.1.1-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d34bbf07dbc7ca5970671b1512e928991fb5e9d95365636c9b2d8b4f53af405e"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:17e0e18d4ad8adbd0399291bc44845b69d9dd68439a3cdebdf35ff902ec05072"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:3ab541146f1f6968c462d6c2ac495148e8cdba2f8347700b2141b6ec5a75bf52"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2a0217714657e023ef4293500f65aa20fce6164c8fd6b08fa5bd4a859fb14b9b"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:05a82eb6e1530a64f26225b55cbd178113bd0b5af1c2b625f25e5296742c26d2"}, + {file = "lxml-6.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9e36f163528fc50cbef305f02a5fd66d404edf7049cdaff211dbc2cba5a7013e"}, + {file = "lxml-6.1.1-cp314-cp314t-win32.whl", hash = "sha256:649dda677cf3bd6ac9ae14007ba0c824ded8ce5808b53fc7431d9140399118c1"}, + {file = "lxml-6.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:793033d6c5cdf33a573f910d9bea14ef8f5771820411d118da8e1182edb53d5e"}, + {file = "lxml-6.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:58bb955caba94e467d2a96da17660d2d704e0675894cba21ab8a775b8621fd1c"}, + {file = "lxml-6.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6689e828a94eee4f139408c337bb198e014724bb8a8c26d3cfac49d119ed69a6"}, + {file = "lxml-6.1.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdebcc8a75d38c7598dfb2c9ed852d7a9eb4a10d6e2d0764b919b802bf32ac88"}, + {file = "lxml-6.1.1-cp38-cp38-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8be8ad51249698103d24b0571df35a10990fbe93dd043b6c024172189485f5e3"}, + {file = "lxml-6.1.1-cp38-cp38-manylinux_2_28_i686.whl", hash = "sha256:76447f65250ed2501ead1a1552f5ce8edff159a86f308348e6a9c4acb5e1f1b4"}, + {file = "lxml-6.1.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ffecec8eb889b58ba9be5b95fb1cc78e22ea8eedea38e8736a1568fe1979250e"}, + {file = "lxml-6.1.1-cp38-cp38-win32.whl", hash = "sha256:c674693f055fa2495de12292cb45e9944199d8eaef5a2dec45175c7c61cb73e3"}, + {file = "lxml-6.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:55b03549819867ea141c0202242c4816c82e52ec36e7e648db9d8da5a3dc3ed6"}, + {file = "lxml-6.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9f79d5325907f13e1be0b3e4dacc1049d1dffc4aeee3c995284bea5fe0fab7d"}, + {file = "lxml-6.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:83b6b30eb131da7a75b601f28c5d6971e6ed3e887919bf6b6a1ad3c2df289080"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:441dd227fa0690eb9fc81edabc63cdcefc212bba99b906dcf6e32cc1a9d3e533"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e07c65f443c887bbcf31cc1771d932ecc192a5273943589b3c7572b749f1ffb2"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5bec7d03d78d853597d6107854c2310ce3f761fd218fe9fe91d5101fcf6c2efe"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f76acfb5f68ba982635a53fd985a8044be98a35b43232c2a1ee235ffab3e1dd"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_28_i686.whl", hash = "sha256:8d43ca737b20e106e4aebc42b2f3ae19f00ba63d7eb731698ee083d72d15646f"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:32ab449a5486f6c758e849bb86710d0e45edc24a04e250c01555f8f5653958f8"}, + {file = "lxml-6.1.1-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53c909b62a0532183542fed00c5a7218258c56292d409bc789886fe1cb04c438"}, + {file = "lxml-6.1.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:640f97d43d867bcb9c75b3af013b64850756b746cb6bce8ace83b70da3abba9d"}, + {file = "lxml-6.1.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:469e3618338bd7ab5beb412d2439825479fcf0dab99e394ca563dbc4eaf6c834"}, + {file = "lxml-6.1.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:aae97dfdb60715c164419ac2532a76d013c3918a665eb6cb7288098b5f349aaf"}, + {file = "lxml-6.1.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c9a4b821dc7055bf9e05ff5719e18ec501f75c0f0bbfabd573b277559780833d"}, + {file = "lxml-6.1.1-cp39-cp39-win32.whl", hash = "sha256:639f6c857d91d9be29bd7502348d6736dab168b54b5158cd899abf11684dc186"}, + {file = "lxml-6.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:34c2d737beabfe35baada43941ed519251e9a12e779031496bcd5d539fcfd730"}, + {file = "lxml-6.1.1-cp39-cp39-win_arm64.whl", hash = "sha256:07a4a68e286ee7a1ed7dfb8af83e615757c0ccfe9f18c6b4ea6771388d9ba8c9"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:31033dc34636ea6b7d5cc11b1ddbda78a14de858ba9d3e1ed4b69a3085bc521e"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3893c14c4b6ac5b2d54ba8cf03e99fe5104e592de491f19bd6b82756c09f8004"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c07da4cebf6889f03ebac8d238f62318e29f495de0aa18a51ea14e61ae907e2e"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6f0ce10945fab9c4c06ce14e22af9059d1a87493a9af4501a5b0b9187e21cf2"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f8844cd288697c6425c9beba919302241e3278871dc6519515e72b04e987abcf"}, + {file = "lxml-6.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:ed21202aec73cda4d55d1ce57b389aadb90ffb044e6cd1080b8347efe1b1ec84"}, + {file = "lxml-6.1.1.tar.gz", hash = "sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40"}, ] [package.extras] @@ -1545,6 +1528,42 @@ numpy = [ parallel = ["mpi4py"] tests = ["Cython", "packaging", "pytest", "typing-extensions (>=4.15.0)"] +[[package]] +name = "nh3" +version = "0.3.5" +description = "Python binding to Ammonia HTML sanitizer Rust crate" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nh3-0.3.5-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:23a312224875f72cd16bde417f49071451877e29ef646a60e50fcb69407cc18a"}, + {file = "nh3-0.3.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:387abd011e81959d5a35151a11350a0795c6edeb53ebfa02d2e882dc01299263"}, + {file = "nh3-0.3.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:48f45e3e914be93a596431aa143dedf1582557bf41a58153c296048d6e3798c9"}, + {file = "nh3-0.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0a09f51806fd51b4fedbf9ea2b61fef388f19aef0d62fe51199d41648be14588"}, + {file = "nh3-0.3.5-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:c357f1d042c67f135a5e6babb2b0e3b9d9224ff4a3543240f597767b01384ffd"}, + {file = "nh3-0.3.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:38748140bf76383ab7ce2dce0ad4cb663855d8fbc9098f7f3483673d09616a17"}, + {file = "nh3-0.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:84bdeb082544fbcb77a12c034dd77d7da0556fdc0727b787eb6214b958c15e29"}, + {file = "nh3-0.3.5-cp314-cp314t-win32.whl", hash = "sha256:c3aae321f67ae66cff2a627115f106a377d4475d10b0e13d97959a13486b9a88"}, + {file = "nh3-0.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c88605d8d468f7fc1b31e06129bc91d6c96f6c621776c9b504a0da9beac9df5f"}, + {file = "nh3-0.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:72c5bdedec27fa33de6a5326346ea8aa3fe54f6ac294d54c4b204fb66a9f1e79"}, + {file = "nh3-0.3.5-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3bb854485c9b33e5bb143ff3e49e577073bc6bc320f0ff8fc316dd89c0d3c101"}, + {file = "nh3-0.3.5-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d401ab2d8e86d59e2126e3ab2a2f45840c405842b626d9a51624b3a33b6878"}, + {file = "nh3-0.3.5-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acfd354e61accbe4c74f8017c6e397a776916dfe47c48643cf7fd84ade826f93"}, + {file = "nh3-0.3.5-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:52d877980d7ca01dc3baf3936bf844828bc6f332962227a684ed79c18cce14c3"}, + {file = "nh3-0.3.5-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:207c01801d3e9bb8ec08f08689346bdd30ce15b8bf60013a925d08b5388962a4"}, + {file = "nh3-0.3.5-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea232933394d1d58bf7c4bb348dc4660eae6604e1ae81cd2ba6d9ed80d390f3b"}, + {file = "nh3-0.3.5-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe3a787dc76b50de6bee54ef242f26c41dfe47654428e3e94f0fae5bb6dd2cc1"}, + {file = "nh3-0.3.5-cp38-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:488928988caad25ba14b1eb5bc74e25e21f3b5e40341d956f3ce4a8bc19460dc"}, + {file = "nh3-0.3.5-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c069570b06aa848457713ad7af4a9905691291548c4466a9ad78ee95808382b"}, + {file = "nh3-0.3.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:eeedc90ed8c42c327e8e10e621ccfa314fc6cce35d5929f4297ff1cdb89667c4"}, + {file = "nh3-0.3.5-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:de8e8621853b6470fe928c684ee0d3f39ea8086cebafe4c416486488dea7b68d"}, + {file = "nh3-0.3.5-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:6ea58cc44d274c643b83547ca9654a0b1a817609b160601356f76a2b744c49ad"}, + {file = "nh3-0.3.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e49c9b564e6bcb03ecd2f057213df9a0de15a95812ac9db9600b590db23d3ae9"}, + {file = "nh3-0.3.5-cp38-abi3-win32.whl", hash = "sha256:559e4c73b689e9a7aa97ac9760b1bc488038d7c1a575aa4ab5a0e19ee9630c0f"}, + {file = "nh3-0.3.5-cp38-abi3-win_amd64.whl", hash = "sha256:45e6a65dc88a300a2e3502cb9c8e6d1d6b831d6fba7470643333609c6aab1f30"}, + {file = "nh3-0.3.5-cp38-abi3-win_arm64.whl", hash = "sha256:8f85285700a18e9f3fc5bff41fe573fa84f81542ef13b48a89f9fecca0474d3b"}, + {file = "nh3-0.3.5.tar.gz", hash = "sha256:45855e14ff056064fec77133bfcf7cd691838168e5e17bbef075394954dc9dc8"}, +] + [[package]] name = "numcodecs" version = "0.16.5" @@ -1591,83 +1610,83 @@ zfpy = ["zfpy (>=1.0.0)"] [[package]] name = "numpy" -version = "2.4.5" +version = "2.4.6" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.11" files = [ - {file = "numpy-2.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3176dc8ff71dbb593606f91a69ad0c3cd3303c7eb546af477370ab9edf760288"}, - {file = "numpy-2.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1811150e5148f5a01a7cc282cb2f489b4a3050a773e173adb480e507bad3a3d7"}, - {file = "numpy-2.4.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0d63a780070871210853ba01e90b88f9b85cf2abf63a7f143d5127189265ddf6"}, - {file = "numpy-2.4.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:0c6919cefafb3b76cd46a89dbb203bf1dd95529d2a6d09fef2d325d95d6a79d8"}, - {file = "numpy-2.4.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d51efede1e58e8b11877536a5518f60e318d8ff69b89ad7b38ee5e431b24d772"}, - {file = "numpy-2.4.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:07ce7e74da92d7c71b5df157b9758bcdd53d7fea10602154de3afd2b3ddc34dd"}, - {file = "numpy-2.4.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d7828234a13185effb34979e146f9921f2a65dfbbe215e6dbb57d6478fc8e059"}, - {file = "numpy-2.4.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f96083adc3dfc1bbf778f2c79654d88115fa07074c97cb724fe9508f12d91c55"}, - {file = "numpy-2.4.5-cp311-cp311-win32.whl", hash = "sha256:4ed78c904a638b6e5d7cd4db90c06fca5fc6ec2f28d258305368f454a50e79cf"}, - {file = "numpy-2.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:079b0fad6f2899b23c5da89792b5409d2d83fc83e8bd5c2299cc9c397a264864"}, - {file = "numpy-2.4.5-cp311-cp311-win_arm64.whl", hash = "sha256:d6c78e260b53affe9b395a9d54fc61f101f9521c4d9452c7e9e3718b19e2215b"}, - {file = "numpy-2.4.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:654fb8674b61b1c4bd568f944d13a908566fdcb0d797303521d4149d16da05ef"}, - {file = "numpy-2.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4cd9f6fa7ce10dc4627f2bb81dd9075dab67e94632e04c2b638e12575ddaa862"}, - {file = "numpy-2.4.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:4f5bc96d35d94e4ceab8b38a92241b4611e95dc44e63b9f1fa2a331858ee3507"}, - {file = "numpy-2.4.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:4bb33e900ee81730ad77a258965134aa8ceac805124f7e5229347beda4b8d0aa"}, - {file = "numpy-2.4.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32f8f852273ef32b291201ac2a2c97629c4a1ee8632bb670e3443eaa09fc2e72"}, - {file = "numpy-2.4.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:685681e956fc8dcb75adc6ff26694e1dfd738b24bd8d4696c51ca0110157f912"}, - {file = "numpy-2.4.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6f64dd84b277a737eb59513f6b9bb6195bf41ab11941ef15b2562dbab43fa8ef"}, - {file = "numpy-2.4.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b42d9496f79e3a728192f05a42d86e36163217b7cdecb3813d0028a0aa6b72d7"}, - {file = "numpy-2.4.5-cp312-cp312-win32.whl", hash = "sha256:86d980970f5110595ca14855768073b08585fc1acc36895de303e039e7dee4a5"}, - {file = "numpy-2.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:3333dba6a4e611d666f69e177ba8fe4140366ff681a5feb2374d3fd4fff3acb6"}, - {file = "numpy-2.4.5-cp312-cp312-win_arm64.whl", hash = "sha256:4593d197270b894efeb538dcbe227e4bcf1c77f88c4c6bf933ead812cfaa4453"}, - {file = "numpy-2.4.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1ef248460b645c102026b82337cc4e88231909c66dd77b59ec6d6cac7e44f277"}, - {file = "numpy-2.4.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4603622bdcdbf8dccb1d9d5b21d16a7aa4e473ae6c8e14048d846fd4ca2907a0"}, - {file = "numpy-2.4.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6c18d49c67689c562854b53fdc433b93e47c12952aa6fa6d59f185e1a5992419"}, - {file = "numpy-2.4.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b1c663ddc641f4192e90511bec61a09bc231e3bbdb996cdc6edbcaa0e528d685"}, - {file = "numpy-2.4.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93793222b524f692f12b2f8752ce8b1d9d9125b2bfd5dbf0fb69c92c5e1ce86c"}, - {file = "numpy-2.4.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1616bde34b2bcba2fa9bde06217ce00da4f3d1bdfb264d54525a99e8fe170d83"}, - {file = "numpy-2.4.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:09d7d97da1c2c62f4818b3e150a57572ff8dcf1cf5ac501aac832ffd4ebd9566"}, - {file = "numpy-2.4.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d68d0b355ab2e39fe0de59001d7151dfdbbb880ef67baeed806661e03df5097"}, - {file = "numpy-2.4.5-cp313-cp313-win32.whl", hash = "sha256:fe28b64777ddfa0eca9b5f51474034ebe3dcb8324f48f27b28f479085673ae33"}, - {file = "numpy-2.4.5-cp313-cp313-win_amd64.whl", hash = "sha256:fb4a6c9c537d6ccec9cc4aeae4261bd3cc79b070c67ddc0646f5b1c07fddde42"}, - {file = "numpy-2.4.5-cp313-cp313-win_arm64.whl", hash = "sha256:6d7df2da2e7ea0624a43aa368104b3a3ce14aae98ad4bb2c9a93fecef76f1c97"}, - {file = "numpy-2.4.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:2a235607a18df941760a695927051af4b1cd5d3ee85840d0e2af816785771feb"}, - {file = "numpy-2.4.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:58dcf64969d870f36bc7fbd557d2617e997db7dc06261b6e3327148ea460d0a4"}, - {file = "numpy-2.4.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:235f54b0156274d8fa3155db3ed6d2f401c7e8f3367c90db0a12f02a58fde6ed"}, - {file = "numpy-2.4.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3b5bb65437a3555c648e706475db01c645559ca80dc8b03e4f202ea757e0d6"}, - {file = "numpy-2.4.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7f09a7e5f017d7098c66522097c96257411c9620c0926212200d66bc8cee3976"}, - {file = "numpy-2.4.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:993a88d8fdd8554466a8765cd8bacd97ba56b70ca6b0a04bcdca77f5afed4222"}, - {file = "numpy-2.4.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:84f58bed609b5669f5ad3d597901a4f1f86ee5b3c3708aaa55f05b4fe6e0f656"}, - {file = "numpy-2.4.5-cp313-cp313t-win32.whl", hash = "sha256:7200c58f3f933ca61e66346667dcc8510bb111995e9ce15398a731e6a4afa4bb"}, - {file = "numpy-2.4.5-cp313-cp313t-win_amd64.whl", hash = "sha256:c26c71080d35db5002102f5d9ff614d45de02aa1f7802943e691e063e5ee93bc"}, - {file = "numpy-2.4.5-cp313-cp313t-win_arm64.whl", hash = "sha256:2caa576d1707b275cba1aeb60a5c50daa6fa2a3f28ecb08123bc05fd439005db"}, - {file = "numpy-2.4.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:889ca2c072315de638a5194a772aa1fa2df92bdd6175f6a222d4784040424b61"}, - {file = "numpy-2.4.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:89e89304fb1f8c3f0ecfa4a7d48f311dd79771336a940e920159d643d1307e77"}, - {file = "numpy-2.4.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:144fcc5a3a17679b2b82543b4a2d8dd29937230a7af13232b5f753872feb6361"}, - {file = "numpy-2.4.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:398bb16772b265b9fa5c07b07072646ea97137c10ffb62a9a087b277fc825c29"}, - {file = "numpy-2.4.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb352e7b8876da1249e72254736d6c58c505fa4e58a3d7e30efca241ca9ca9ce"}, - {file = "numpy-2.4.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7341b08ff8124d7353939778e2707b8732d03c78c1c30e0815aba2dacbe1245a"}, - {file = "numpy-2.4.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:deb01226f012539f3945261ffe1c10aec081a0fa0a5c925419933c70f3ae2d23"}, - {file = "numpy-2.4.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d888bdf7335f76878c3c7b264ac1ff089863e211ec81249f9fb5795c2183dc25"}, - {file = "numpy-2.4.5-cp314-cp314-win32.whl", hash = "sha256:15f90d1256e9b2320aff24fde44815b787ab6d7c49a1a11bfd8138b321c5f080"}, - {file = "numpy-2.4.5-cp314-cp314-win_amd64.whl", hash = "sha256:4bd2cd4ef9c0afa87de73723c0a33c0edff62143e1432917458e26d3d195d87f"}, - {file = "numpy-2.4.5-cp314-cp314-win_arm64.whl", hash = "sha256:db304568c650e9d7039744d3575d0d287754debb2057d7c7b8cdfdc2c487a957"}, - {file = "numpy-2.4.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6de2883e0d2c63eae1bab1a84b390dca74aabb3d20ea1f5d58f360853c83abf3"}, - {file = "numpy-2.4.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:06760fe73ae5005008748d182de612c733542af3cde063d532cd2127561b27be"}, - {file = "numpy-2.4.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:4b51a01745cb04cc19278482207444b4d30728ce91c28d27a3bfae5fc6ff24c7"}, - {file = "numpy-2.4.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a05636d7937d0936f271e5ba957fa8d746b5be3c2025caa1a2508f4fe521d40"}, - {file = "numpy-2.4.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b86f56048ed09c3bbe48962a7dff077c2fd3274f8cf981800f3b38eac49cc3"}, - {file = "numpy-2.4.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:130d58151c4db23e9fa860b84784e219a3aa3e030acc88a493ea37006c4dfd4c"}, - {file = "numpy-2.4.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d475afc8cbe935ff5944f753d863bba774d7f4e1feaaa4102901e3e053ca5963"}, - {file = "numpy-2.4.5-cp314-cp314t-win32.whl", hash = "sha256:27f4a6dc26353a860b348961b9aa9e009835688b435cfa105e873b8dc2c726f5"}, - {file = "numpy-2.4.5-cp314-cp314t-win_amd64.whl", hash = "sha256:76ac6e90f5e226011c88f9b7040a4bcae612518bc7e9adc127e697a13b28ad1a"}, - {file = "numpy-2.4.5-cp314-cp314t-win_arm64.whl", hash = "sha256:7c392e2c1bf596701d3c6832be7567eab5d5b0a13865036c33365ee097d37f8b"}, - {file = "numpy-2.4.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6bf0bfc1c2e1db972e30b6cd3d4861f477f3af908b27799b239dc3cbe3eb4b95"}, - {file = "numpy-2.4.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:73d664413fb97229149c4711ef56531a6fe8c15c1c2626b0bbe497b84c287e70"}, - {file = "numpy-2.4.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:b35bee5ef99e8d227a07829bee2e864fcb65f7c157646fcd8ec8b4b45dd8b88f"}, - {file = "numpy-2.4.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:02981d0fc9f9ce147643d552966d47f329a02f7ecb3b113e84207242f20dfa83"}, - {file = "numpy-2.4.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0e63caf31a1df06338ae63d999f7a33a675ced62eea9c9b02db4b1c1f45cff38"}, - {file = "numpy-2.4.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d8fc52b85a7b45e474be53eddf08e006d22e381a4e41bcde8e4aa08da0e7d198"}, - {file = "numpy-2.4.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:40c71d50a4da1a7c317af419461052d3911a5770bfc5fd55baf52cc45e7a2c20"}, - {file = "numpy-2.4.5.tar.gz", hash = "sha256:ca670567a5683b7c1670ec03e0ddd5862e10934e92a70751d68d7b7b74ca7f9f"}, + {file = "numpy-2.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4"}, + {file = "numpy-2.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d"}, + {file = "numpy-2.4.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8"}, + {file = "numpy-2.4.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538"}, + {file = "numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47"}, + {file = "numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93"}, + {file = "numpy-2.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8"}, + {file = "numpy-2.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6"}, + {file = "numpy-2.4.6-cp311-cp311-win32.whl", hash = "sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8"}, + {file = "numpy-2.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147"}, + {file = "numpy-2.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577"}, + {file = "numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1"}, + {file = "numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb"}, + {file = "numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41"}, + {file = "numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698"}, + {file = "numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f"}, + {file = "numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853"}, + {file = "numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a"}, + {file = "numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2"}, + {file = "numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45"}, + {file = "numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751"}, + {file = "numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8"}, + {file = "numpy-2.4.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0"}, + {file = "numpy-2.4.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb"}, + {file = "numpy-2.4.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f"}, + {file = "numpy-2.4.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3"}, + {file = "numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b"}, + {file = "numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089"}, + {file = "numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a"}, + {file = "numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605"}, + {file = "numpy-2.4.6-cp313-cp313-win32.whl", hash = "sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91"}, + {file = "numpy-2.4.6-cp313-cp313-win_amd64.whl", hash = "sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359"}, + {file = "numpy-2.4.6-cp313-cp313-win_arm64.whl", hash = "sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778"}, + {file = "numpy-2.4.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1"}, + {file = "numpy-2.4.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe"}, + {file = "numpy-2.4.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997"}, + {file = "numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20"}, + {file = "numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d"}, + {file = "numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67"}, + {file = "numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd"}, + {file = "numpy-2.4.6-cp313-cp313t-win32.whl", hash = "sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab"}, + {file = "numpy-2.4.6-cp313-cp313t-win_amd64.whl", hash = "sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75"}, + {file = "numpy-2.4.6-cp313-cp313t-win_arm64.whl", hash = "sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd"}, + {file = "numpy-2.4.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079"}, + {file = "numpy-2.4.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7"}, + {file = "numpy-2.4.6-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5"}, + {file = "numpy-2.4.6-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096"}, + {file = "numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b"}, + {file = "numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8"}, + {file = "numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402"}, + {file = "numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb"}, + {file = "numpy-2.4.6-cp314-cp314-win32.whl", hash = "sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1"}, + {file = "numpy-2.4.6-cp314-cp314-win_amd64.whl", hash = "sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261"}, + {file = "numpy-2.4.6-cp314-cp314-win_arm64.whl", hash = "sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6"}, + {file = "numpy-2.4.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a"}, + {file = "numpy-2.4.6-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e"}, + {file = "numpy-2.4.6-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e"}, + {file = "numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43"}, + {file = "numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e"}, + {file = "numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895"}, + {file = "numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4"}, + {file = "numpy-2.4.6-cp314-cp314t-win32.whl", hash = "sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063"}, + {file = "numpy-2.4.6-cp314-cp314t-win_amd64.whl", hash = "sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627"}, + {file = "numpy-2.4.6-cp314-cp314t-win_arm64.whl", hash = "sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66"}, + {file = "numpy-2.4.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662"}, + {file = "numpy-2.4.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7"}, + {file = "numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f"}, + {file = "numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c"}, + {file = "numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0"}, + {file = "numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02"}, + {file = "numpy-2.4.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73"}, + {file = "numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda"}, ] [[package]] @@ -1789,25 +1808,26 @@ xml = ["lxml (>=5.3.0)"] [[package]] name = "panel" -version = "1.8.10" +version = "1.9.2" description = "The powerful data exploration & web app framework for Python." optional = false python-versions = ">=3.10" files = [ - {file = "panel-1.8.10-py3-none-any.whl", hash = "sha256:b1de9304e729b87fdeee59a5be5b0d3ce7786dc301626cb728f69fbc4c136693"}, - {file = "panel-1.8.10.tar.gz", hash = "sha256:762881b06efb99f3d201749a3634c6b5f18f46cfca520970c2c1bb31bed42c90"}, + {file = "panel-1.9.2-py3-none-any.whl", hash = "sha256:7099ad4334c305d7e2654d46945d3117e63379f15d0b8635e67f3f825dbccd9b"}, + {file = "panel-1.9.2.tar.gz", hash = "sha256:ede8daa7a2515a2f3b49f19ed9aff75fcef48d6d8c3b9df3a4ebf26a551a0407"}, ] [package.dependencies] -bleach = "*" bokeh = ">=3.7.0,<3.10.0" linkify-it-py = "*" markdown = "*" markdown-it-py = "*" mdit-py-plugins = "*" narwhals = ">=2" +nh3 = "*" packaging = "*" pandas = ">=1.2" +panel-material-ui = ">=0.10.0" param = ">=2.1.0,<3.0" pyviz-comms = ">=2.0.0" requests = "*" @@ -1817,19 +1837,39 @@ typing-extensions = "*" [package.extras] dev = ["watchfiles"] fastapi = ["bokeh-fastapi (>=0.1.5,<0.2.0)", "fastapi[standard]"] -mypy = ["mypy", "pandas-stubs", "types-bleach", "types-croniter", "types-markdown", "types-psutil", "types-requests", "types-tqdm", "typing-extensions"] +mypy = ["mypy", "pandas-stubs", "types-croniter", "types-markdown", "types-psutil", "types-requests", "types-tqdm", "typing-extensions"] recommended = ["holoviews (>=1.18.0)", "jupyterlab", "matplotlib", "pillow", "plotly"] tests = ["psutil", "pytest", "pytest-asyncio", "pytest-rerunfailures (<16.0)", "pytest-xdist"] +[[package]] +name = "panel-material-ui" +version = "0.11.2" +description = "An extension to bring MaterialUI components to Panel." +optional = false +python-versions = ">=3.10" +files = [ + {file = "panel_material_ui-0.11.2-py3-none-any.whl", hash = "sha256:adbfae5776412d6cfa8f6fccf7af932ee264749f4d366a5a80e5af67d5bb7739"}, + {file = "panel_material_ui-0.11.2.tar.gz", hash = "sha256:ef0912f6d0621d176d8f085f93027aafa00dc4934d04b4fd82d03a51ea29ea22"}, +] + +[package.dependencies] +bokeh = ">=3.8.0" +packaging = "*" +panel = ">=1.8.0" + +[package.extras] +dev = ["plotly", "pytest", "pytest-asyncio", "pytest-rerunfailures (<16)", "pytest-xdist", "watchfiles"] +mypy = ["mypy", "types-requests", "typing-extensions"] + [[package]] name = "param" -version = "2.3.3" +version = "2.4.0" description = "Declarative parameters for robust Python classes and a rich API for reactive programming" optional = false python-versions = ">=3.10" files = [ - {file = "param-2.3.3-py3-none-any.whl", hash = "sha256:ae25afbc372c1a5e4ee72935cc76ff77b1db1c4eb092bc46715c906ef3cc2e69"}, - {file = "param-2.3.3.tar.gz", hash = "sha256:43c24345d287d4abda15eac65b5b15d55f178a393421f0bfca02a77dd6c0d1dd"}, + {file = "param-2.4.0-py3-none-any.whl", hash = "sha256:770ecebb1bb8ffaeb8722a00976ba5092af287344471c513ba51597b4257339b"}, + {file = "param-2.4.0.tar.gz", hash = "sha256:d2c09da9fe80084cb5a8732761f26786317133995344df03db5f09d63ac35233"}, ] [package.extras] @@ -2014,13 +2054,13 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.9.6" +version = "4.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.10" files = [ - {file = "platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917"}, - {file = "platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a"}, + {file = "platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a"}, + {file = "platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7"}, ] [[package]] @@ -2226,6 +2266,24 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-serafin" +version = "0.1.0" +description = "Read and write Serafin (TELEMAC) binary files" +optional = false +python-versions = ">=3.10" +files = [ + {file = "python_serafin-0.1.0-py3-none-any.whl", hash = "sha256:2afd42ac11bded0182c0e90be7c72c3cf27ed48a45cb712f3b130df78e7edbc3"}, + {file = "python_serafin-0.1.0.tar.gz", hash = "sha256:621a85a99a5352d9335369be8903486b4fb2565559d30707446cb35d5b1b67c8"}, +] + +[package.dependencies] +numpy = ">=1.24" + +[package.extras] +dev = ["pre-commit", "pytest (>=8)", "pytest-cov", "ruff"] +docs = ["furo (>=2024.8)", "myst-parser[linkify] (>=3.0)", "sphinx (>=7.3)", "sphinx-autodoc-typehints (>=2.0)", "sphinx-copybutton (>=0.5)", "sphinx-design (>=0.6)"] + [[package]] name = "pyviz-comms" version = "3.0.6" @@ -2473,13 +2531,13 @@ files = [ [[package]] name = "soupsieve" -version = "2.8.3" +version = "2.8.4" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.9" files = [ - {file = "soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95"}, - {file = "soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349"}, + {file = "soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65"}, + {file = "soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e"}, ] [[package]] @@ -2570,21 +2628,21 @@ files = [ [[package]] name = "tornado" -version = "6.5.5" +version = "6.5.6" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.9" files = [ - {file = "tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa"}, - {file = "tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521"}, - {file = "tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5"}, - {file = "tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07"}, - {file = "tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e"}, - {file = "tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca"}, - {file = "tornado-6.5.5-cp39-abi3-win32.whl", hash = "sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7"}, - {file = "tornado-6.5.5-cp39-abi3-win_amd64.whl", hash = "sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b"}, - {file = "tornado-6.5.5-cp39-abi3-win_arm64.whl", hash = "sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6"}, - {file = "tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9"}, + {file = "tornado-6.5.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:65fcfaafb079435c2c19dc9e07c0f1cf0fa9051759ed0a7d0a3ba7ea7f64919c"}, + {file = "tornado-6.5.6-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:38bc01b4acacded2de63ae78023548e41ebe6fbed3ec05a796d7ae3ad893887e"}, + {file = "tornado-6.5.6-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b942e6a137fda31ff54bf8e6e2c8d1c37f1f50583f3ed53fb840b53b9601d104"}, + {file = "tornado-6.5.6-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8666946e70171b8c3f1fc9b7876fac492e84822c4c7f3746f4e8f8bc9ac92a79"}, + {file = "tornado-6.5.6-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1c34cfab7ad6d104f052f55de06d39bbafc5885cfeb4da688803308dbcfa90b7"}, + {file = "tornado-6.5.6-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:385f35e4e22fb52551dfcda4cdc8c30c61c2c001aef5ddad99cdfe116952efd3"}, + {file = "tornado-6.5.6-cp39-abi3-win32.whl", hash = "sha256:db475f1b67b2809b10bb16264829087724ca8d24fe4ed47f7b8675cae453ef86"}, + {file = "tornado-6.5.6-cp39-abi3-win_amd64.whl", hash = "sha256:6739bf1e8eb09230f1280ddbd3236f0309db70f2c551a8dbc40f62babdf82f79"}, + {file = "tornado-6.5.6-cp39-abi3-win_arm64.whl", hash = "sha256:2543597b24a695d72338a9a77818362d72387c03ae173f1f169eadc5c91466ac"}, + {file = "tornado-6.5.6.tar.gz", hash = "sha256:9a365179fe8ff6b8766f602c0f67c185d778193e9bdd828b19f0b6ed7764177d"}, ] [[package]] @@ -2746,17 +2804,6 @@ files = [ {file = "wcwidth-0.7.0.tar.gz", hash = "sha256:90e3a7ea092341c44b99562e75d09e4d5160fe7a3974c6fb842a101a95e7eed0"}, ] -[[package]] -name = "webencodings" -version = "0.5.1" -description = "Character encoding aliases for legacy web content" -optional = false -python-versions = "*" -files = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] - [[package]] name = "webob" version = "1.8.9" @@ -2857,24 +2904,24 @@ remote = ["fsspec (>=2023.10.0)", "obstore (>=0.5.1)"] [[package]] name = "zensical" -version = "0.0.42" +version = "0.0.43" description = "A modern static site generator built by the creators of Material for MkDocs" optional = false python-versions = ">=3.10" files = [ - {file = "zensical-0.0.42-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bffd7a34b570fa3ccadf1d23babb0f7c4851c6b626e4fc8ed9f21c2eaae85968"}, - {file = "zensical-0.0.42-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:ee1a79789f9462ef44a4b6ebbfc8b5bf4b2447607da8bc5b35bc9c4ce4ea2370"}, - {file = "zensical-0.0.42-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e9a5d508ce8d1b07d8417f0623be476f6b37d445ab4356481a71e613a7979d6"}, - {file = "zensical-0.0.42-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fbc0951a676e48afe7df3a9b2a30958dcf9c426ed2480972d3c04d6de485ba3"}, - {file = "zensical-0.0.42-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f0e96e53f39b9e4b929a25d9df70bd7fa8217166a854e2c8f3185983dd01500"}, - {file = "zensical-0.0.42-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7d586e57436d603e88acd856864f99f0771aef24bf6560b2de238417bd3817c"}, - {file = "zensical-0.0.42-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3c026f023330d67f986a94b68ffd36dc5066882e697e1125c37308d8d684135c"}, - {file = "zensical-0.0.42-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:e5908bc09cf5c1c50c9504241e37f89955daf3e89ba1b9d71c17972578b24804"}, - {file = "zensical-0.0.42-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0bf96b55f0a44e8716bcb334a16380ed56772b555145da775a7d8ac8678cb6f"}, - {file = "zensical-0.0.42-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:47cd99583738a8ab03fac4080741275c56e741a06dc8edfb541f4c1649a5ae69"}, - {file = "zensical-0.0.42-cp310-abi3-win32.whl", hash = "sha256:83090e53fba061967ecb3dff81500b1900f288bae108bf54084a2aeb6648ebd0"}, - {file = "zensical-0.0.42-cp310-abi3-win_amd64.whl", hash = "sha256:2e4304e103f9cd5c637045bbae1ff29de3009ab01b16e99c2fd6d4bbceb7a3ee"}, - {file = "zensical-0.0.42.tar.gz", hash = "sha256:cc346b833868a59412fe8d8498a152be90be9f3d8fb87e1f1a1c2e1146cbae1b"}, + {file = "zensical-0.0.43-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:17c335362b6bac3a50178181694a964f6d9f0c516fc532129ba5a0a5c4103fb6"}, + {file = "zensical-0.0.43-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:b8fe97f185194215f6193af45a17d2b30ebd72c8113e3650f2d7d6767b9c2206"}, + {file = "zensical-0.0.43-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c4c85978c765b3e7f347e8102dfe1373d4bbe4229d7008b6bdbf352f1fbcd7f"}, + {file = "zensical-0.0.43-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:90d7c06ffd07b2bdf78bef041d541baba8a3ea51fd2dd84dbdbc5b0229076524"}, + {file = "zensical-0.0.43-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:60022f4a6b95e46ec0023f51052fcd491743b3ebd08c0066b22a5cf1e741fecd"}, + {file = "zensical-0.0.43-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e278eb948a0b7545d50609d713c7c27e366dade4523ff73a311a5d5f136518a"}, + {file = "zensical-0.0.43-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b85e5ab99fbda13823e67c43a4be6e5ebda6600602969c6575e143f20ac203fd"}, + {file = "zensical-0.0.43-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:751385accc92cccfd4560dabed7c423870686ef6ede244a67e5c96286af25e8f"}, + {file = "zensical-0.0.43-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:dd3ff5bfa6e65cf3d2550dc639c3da2a3bfa11087b83d57e06623c4c1607d583"}, + {file = "zensical-0.0.43-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:85055a115b12f49c6ab194dcf04f966fc06b690ed6a8ddddd819929fc5f340e6"}, + {file = "zensical-0.0.43-cp310-abi3-win32.whl", hash = "sha256:8a75ddd4bb3cd3c4a8e71d2ebae44c5611fd636c1d355c6124dd96e2f9c52838"}, + {file = "zensical-0.0.43-cp310-abi3-win_amd64.whl", hash = "sha256:03a9d1744a6394ad66c355d6f1de04cfd92efa525b0b94bf6dbf6971c5cd2c6b"}, + {file = "zensical-0.0.43.tar.gz", hash = "sha256:dc2d3804ff562795c1024130e0c3ce79736467930729dda314f096d0e35b98c8"}, ] [package.dependencies] @@ -2889,24 +2936,24 @@ tomli = ">=2.4.0" [[package]] name = "zipp" -version = "3.23.1" +version = "4.1.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" files = [ - {file = "zipp-3.23.1-py3-none-any.whl", hash = "sha256:0b3596c50a5c700c9cb40ba8d86d9f2cc4807e9bedb06bcdf7fac85633e444dc"}, - {file = "zipp-3.23.1.tar.gz", hash = "sha256:32120e378d32cd9714ad503c1d024619063ec28aad2248dc6672ad13edfa5110"}, + {file = "zipp-4.1.0-py3-none-any.whl", hash = "sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f"}, + {file = "zipp-4.1.0.tar.gz", hash = "sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602"}, ] [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +check = ["pytest-checkdocs (>=2.14)", "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)"] +enabler = ["pytest-enabler (>=3.4)"] test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] -type = ["pytest-mypy"] +type = ["pytest-mypy (>=1.0.1)"] [metadata] lock-version = "2.0" python-versions = ">=3.11" -content-hash = "58605576e4bba66eec2333bdecf2c6b22b37f6074bf816d4408949e628d342b4" +content-hash = "d380c297207ec94a3b99a59a57a29e2b99fcc15b64ec3421a0b194a6881b2bef" diff --git a/pyproject.toml b/pyproject.toml index 4536dcd..12c77c0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ include = [ python = ">=3.11" numpy = "*" xarray = "*" +python-serafin = "*" [tool.poetry.plugins."xarray.backends"] selafin = "xarray_selafin.xarray_backend:SelafinBackendEntrypoint" diff --git a/requirements/requirements-dev.txt b/requirements/requirements-dev.txt index cc76864..e3e671e 100644 --- a/requirements/requirements-dev.txt +++ b/requirements/requirements-dev.txt @@ -17,18 +17,15 @@ backrefs==7.0 ; python_version >= "3.11" \ beautifulsoup4==4.14.3 ; python_version >= "3.11" \ --hash=sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb \ --hash=sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86 -bleach==6.3.0 ; python_version >= "3.11" \ - --hash=sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22 \ - --hash=sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6 bokeh==3.9.0 ; python_version >= "3.11" \ --hash=sha256:775219714a8496973ddbae16b1861606ba19fe670a421e4d43267b41148e07a3 \ --hash=sha256:b252bfb16a505f0e0c57d532d0df308ae1667235bafc622aa9441fe9e7c5ce4a cattrs==26.1.0 ; python_version >= "3.11" \ --hash=sha256:d1e0804c42639494d469d08d4f26d6b9de9b8ab26b446db7b5f8c2e97f7c3096 \ --hash=sha256:fa239e0f0ec0715ba34852ce813986dfed1e12117e209b816ab87401271cdd40 -certifi==2026.4.22 ; python_version >= "3.11" \ - --hash=sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a \ - --hash=sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580 +certifi==2026.5.20 ; python_version >= "3.11" \ + --hash=sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897 \ + --hash=sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d cftime==1.6.5 ; python_version >= "3.11" \ --hash=sha256:12d95c6af852114a13301c5a61e41afdbd1542e72939c1083796f8418b9b8b0e \ --hash=sha256:179681b023349a2fe277ceccc89d4fc52c0dd105cb59b7187b5bc5d442875133 \ @@ -191,9 +188,9 @@ charset-normalizer==3.4.7 ; python_version >= "3.11" \ --hash=sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6 \ --hash=sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79 \ --hash=sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464 -click==8.4.0 ; python_version >= "3.11" \ - --hash=sha256:40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81 \ - --hash=sha256:638f1338fe1235c8f4e008e4a8a254fb5c5fbdcbb40ece3c9142ebb78e792973 +click==8.4.1 ; python_version >= "3.11" \ + --hash=sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2 \ + --hash=sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96 cloudpickle==3.1.2 ; python_version >= "3.11" \ --hash=sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414 \ --hash=sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a @@ -392,9 +389,9 @@ holoviews==1.22.1 ; python_version >= "3.11" \ hvplot==0.12.2 ; python_version >= "3.11" \ --hash=sha256:0687e2e4d2eeb035c437af0011922abff856054299c121914d903a02b1bb1b22 \ --hash=sha256:9e29bbe65f94937d4eeaeccf33566540df936c8f9aeadfa12ea9f306d5237938 -idna==3.15 ; python_version >= "3.11" \ - --hash=sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8 \ - --hash=sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc +idna==3.17 ; python_version >= "3.11" \ + --hash=sha256:466e48829084efe2548012b855df21540b96f2e20e51bd124c851536556a592c \ + --hash=sha256:5eb0cb53bc467c12eadcf6de83163ad8527cec9416f44b9b61b19caedad2b87f importlib-metadata==9.0.0 ; python_version < "3.12" and python_version >= "3.11" \ --hash=sha256:2d21d1cc5a017bd0559e36150c21c830ab1dc304dedd1b7ea85d20f45ef3edd7 \ --hash=sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc @@ -404,9 +401,9 @@ iniconfig==2.3.0 ; python_version >= "3.11" \ ipython-pygments-lexers==1.1.1 ; python_version >= "3.11" \ --hash=sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81 \ --hash=sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c -ipython==9.13.0 ; python_version >= "3.11" \ - --hash=sha256:57f9d4639e20818d328d287c7b549af3d05f12486ea8f2e7f73e52a36ec4d201 \ - --hash=sha256:7e834b6afc99f020e3f05966ced34792f40267d64cb1ea9043886dab0dde5967 +ipython==9.14.0 ; python_version >= "3.11" \ + --hash=sha256:6f27ff0f1d9ea050e0551f71568bc4b34d8aba579e8f111c5b4175f44ac6b4aa \ + --hash=sha256:8fd984a3372c14b12790b084ba6b5cff5678c0cb063244a0034f06a51f20d6c2 ipywidgets==8.1.8 ; python_version >= "3.11" \ --hash=sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668 \ --hash=sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e @@ -431,141 +428,141 @@ linkify-it-py==2.1.0 ; python_version >= "3.11" \ locket==1.0.0 ; python_version >= "3.11" \ --hash=sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632 \ --hash=sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3 -lxml==6.1.0 ; python_version >= "3.11" \ - --hash=sha256:00750d63ef0031a05331b9223463b1c7c02b9004cef2346a5b2877f0f9494dd2 \ - --hash=sha256:022981127642fe19866d2907d76241bb07ed21749601f727d5d5dd1ce5d1b773 \ - --hash=sha256:045e387d1f4f42a418380930fa3f45c73c9b392faf67e495e58902e68e8f44a7 \ - --hash=sha256:05b9b8787e35bec69e68daf4952b2e6dfcfb0db7ecf1a06f8cdfbbac4eb71aad \ - --hash=sha256:07f98f5496f96bf724b1e3c933c107f0cbf2745db18c03d2e13a291c3afd2635 \ - --hash=sha256:08950a23f296b3f83521577274e3d3b0f3d739bf2e68d01a752e4288bc50d286 \ - --hash=sha256:0d082495c5fcf426e425a6e28daaba1fcb6d8f854a4ff01effb1f1f381203eb9 \ - --hash=sha256:0f0f08beb0182e3e9a86fae124b3c47a7b41b7b69b225e1377db983802404e54 \ - --hash=sha256:1081dd10bc6fa437db2500e13993abf7cc30716d0a2f40e65abb935f02ec559c \ - --hash=sha256:11a873c77a181b4fef9c2e357d08ed399542c2af1390101da66720a19c7c9618 \ - --hash=sha256:183bfb45a493081943be7ea2b5adfc2b611e1cf377cefa8b8a8be404f45ef9a7 \ - --hash=sha256:19f4164243fc206d12ed3d866e80e74f5bc3627966520da1a5f97e42c32a3f39 \ - --hash=sha256:1ae225f66e5938f4fa29d37e009a3bb3b13032ac57eb4eb42afa44f6e4054e69 \ - --hash=sha256:1bc4cc83fb7f66ffb16f74d6dd0162e144333fc36ebcce32246f80c8735b2551 \ - --hash=sha256:1dd6a1c3ad4cb674f44525d9957f3e9c209bb6dd9213245195167a281fcc2bdc \ - --hash=sha256:20cf4d0651987c906a2f5cba4e3a8d6ba4bfdf973cfe2a96c0d6053888ea2ecd \ - --hash=sha256:2173a7bffe97667bbf0767f8a99e587740a8c56fdf3befac4b09cb29a80276fd \ - --hash=sha256:21c3302068f50d1e8728c67c87ba92aa87043abee517aa2576cca1855326b405 \ - --hash=sha256:23a5dc68e08ed13331d61815c08f260f46b4a60fdd1640bbeb82cf89a9d90289 \ - --hash=sha256:23cad0cc86046d4222f7f418910e46b89971c5a45d3c8abfad0f64b7b05e4a9b \ - --hash=sha256:2593a0a6621545b9095b71ad74ed4226eba438a7d9fc3712a99bdb15508cf93a \ - --hash=sha256:264c605ab9c0e4aa1a679636f4582c4d3313700009fac3ec9c3412ed0d8f3e1d \ - --hash=sha256:26c5272c6a4bf4cf32d3f5a7890c942b0e04438691157d341616d02cca74d4bd \ - --hash=sha256:26dd9f57ee3bd41e7d35b4c98a2ffd89ed11591649f421f0ec19f67d50ec67ac \ - --hash=sha256:28902146ffbe5222df411c5d19e5352490122e14447e98cd118907ee3fd6ee62 \ - --hash=sha256:29f5c00cb7d752bce2c70ebd2d31b0a42f9499ffdd3ecb2f31a5b73ee43031ad \ - --hash=sha256:30e7b2ed63b6c8e97cca8af048589a788ab5c9c905f36d9cf1c2bb549f450d2f \ - --hash=sha256:32662519149fd7a9db354175aa5e417d83485a8039b8aaa62f873ceee7ea4cad \ - --hash=sha256:363e47283bde87051b821826e71dde47f107e08614e1aa312ba0c5711e77738c \ - --hash=sha256:3648f20d25102a22b6061c688beb3a805099ea4beb0a01ce62975d926944d292 \ - --hash=sha256:37448bf9c7d7adfc5254763901e2bbd6bb876228dfc1fc7f66e58c06368a7544 \ - --hash=sha256:37fabd1452852636cf38ecdcc9dd5ca4bba7a35d6c53fa09725deeb894a87491 \ - --hash=sha256:398443df51c538bd578529aa7e5f7afc6c292644174b47961f3bf87fe5741120 \ - --hash=sha256:3ae5d8d5427f3cc317e7950f2da7ad276df0cfa37b8de2f5658959e618ea8512 \ - --hash=sha256:3f00972f84450204cd5d93a5395965e348956aaceaadec693a22ec743f8ae3eb \ - --hash=sha256:40d9189f80075f2e1f88db21ef815a2b17b28adf8e50aaf5c789bfe737027f32 \ - --hash=sha256:419c58fc92cc3a2c3fa5f78c63dbf5da70c1fa9c1b25f25727ecee89a96c7de2 \ - --hash=sha256:41dcc4c7b10484257cbd6c37b83ddb26df2b0e5aff5ac00d095689015af868ec \ - --hash=sha256:43e4d297f11080ec9d64a4b1ad7ac02b4484c9f0e2179d9c4ef78e886e747b88 \ - --hash=sha256:45e9dfbd1b661eb64ba0d4dbe762bd210c42d86dd1e5bd2bdf89d634231beb43 \ - --hash=sha256:4642e04449a1e164b5ff71ffd901ddb772dfabf5c9adf1b7be5dffe1212bc037 \ - --hash=sha256:468479e52ecf3ec23799c863336d02c05fc2f7ffd1a1424eeeb9a28d4eb69d13 \ - --hash=sha256:47024feaae386a92a146af0d2aeed65229bf6fff738e6a11dda6b0015fb8fd03 \ - --hash=sha256:481d6e2104285d9add34f41b42b247b76b61c5b5c26c303c2e9707bbf8bd9a64 \ - --hash=sha256:4937460dc5df0cdd2f06a86c285c28afda06aefa3af949f9477d3e8df430c485 \ - --hash=sha256:4a1503c56e4e2b38dc76f2f2da7bae69670c0f1933e27cfa34b2fa5876410b16 \ - --hash=sha256:4b89b098105b8599dc57adac95d1813409ac476d3c948a498775d3d0c6124bfb \ - --hash=sha256:4bd1bdb8a9e0e2dd229de19b5f8aebac80e916921b4b2c6ef8a52bc131d0c1f9 \ - --hash=sha256:4e2c54d6b47361d0f1d3bc8d4e082ad87201e56ccdcca4d3b9ee3644ff595ec8 \ - --hash=sha256:52b0ac6903cf74ebf997eb8c682d2fbac7d1ab7e4c552413eec55868a9b73f39 \ - --hash=sha256:546b66c0dd1bb8d9fa89d7123e5fa19a8aff3a1f2141eb22df96112afb17b842 \ - --hash=sha256:56971379bc5ee8037c5a0f09fa88f66cdb7d37c3e38af3e45cf539f41131ac1f \ - --hash=sha256:5715e0e28736a070f3f34a7ccc09e2fdcba0e3060abbcf61a1a5718ff6d6b105 \ - --hash=sha256:5cfa1a34df366d9dc0d5eaf420f4cf2bb1e1bebe1066d1c2fc28c179f8a4004c \ - --hash=sha256:5d27bbe326c6b539c64b42638b18bc6003a8d88f76213a97ac9ed4f885efeab7 \ - --hash=sha256:6262b87f9e5c1e5fe501d6c153247289af42eb44ad7660b9b3de17baaf92d6f6 \ - --hash=sha256:63aeafc26aac0be8aff14af7871249e87ea1319be92090bfd632ec68e03b16a5 \ - --hash=sha256:690022c7fae793b0489aa68a658822cea83e0d5933781811cabbf5ea3bcfe73d \ - --hash=sha256:6fd8b1df8254ff4fd93fd31da1fc15770bde23ac045be9bb1f87425702f61cc9 \ - --hash=sha256:73becf6d8c81d4c76b1014dbd3584cb26d904492dcf73ca85dc8bff08dcd6d2d \ - --hash=sha256:73d658216fc173cf2c939e90e07b941c5e12736b0bf6a99e7af95459cfe8eabb \ - --hash=sha256:75c4c7c619a744f972f4451bf5adf6d0fb00992a1ffc9fd78e13b0bc817cc99f \ - --hash=sha256:76b958b4ea3104483c20f74866d55aa056546e15ebe83dd7aecd63698f43b755 \ - --hash=sha256:77b9f99b17cbf14026d1e618035077060fc7195dd940d025149f3e2e830fbfcb \ - --hash=sha256:7ba11752e346bd804ea312ec2eea2532dfa8b8d3261d81a32ef9e6ab16256280 \ - --hash=sha256:7da13bb6fbadfafb474e0226a30570a3445cfd47c86296f2446dafbd77079ace \ - --hash=sha256:7e39ab3a28af7784e206d8606ec0e4bcad0190f63a492bca95e94e5a4aef7f6e \ - --hash=sha256:7f4a77d6f7edf9230cee3e1f7f6764722a41604ee5681844f18db9a81ea0ec33 \ - --hash=sha256:80410c3a7e3c617af04de17caa9f9f20adaa817093293d69eae7d7d0522836f5 \ - --hash=sha256:81ff55c70b67d19d52b6fd118a114c0a4c97d799cd3089ff9bd9e2ff4b414ee2 \ - --hash=sha256:857efde87d365706590847b916baff69c0bc9252dc5af030e378c9800c0b10e3 \ - --hash=sha256:89e8d73d09ac696a5ba42ec69787913d53284f12092f651506779314f10ba585 \ - --hash=sha256:8c11b984b5ce6add4dccc7144c7be5d364d298f15b0c6a57da1991baedc750ce \ - --hash=sha256:8c8984e1d8c4b3949e419158fda14d921ff703a9ed8a47236c6eb7a2b6cb4946 \ - --hash=sha256:8e369cbd690e788c8d15e56222d91a09c6a417f49cbc543040cba0fe2e25a79e \ - --hash=sha256:9147d8e386ec3b82c3b15d88927f734f565b0aaadef7def562b853adca45784a \ - --hash=sha256:920354904d1cb86577d4b3cfe2830c2dbe81d6f4449e57ada428f1609b5985f7 \ - --hash=sha256:942454ff253da14218f972b23dc72fa4edf6c943f37edd19cd697618b626fac5 \ - --hash=sha256:972a6451204798675407beaad97b868d0c733d9a74dafefc63120b81b8c2de28 \ - --hash=sha256:976a6b39b1b13e8c354ad8d3f261f3a4ac6609518af91bdb5094760a08f132c4 \ - --hash=sha256:97faa0860e13b05b15a51fb4986421ef7a30f0b3334061c416e0981e9450ca4c \ - --hash=sha256:9c03e048b6ce8e77b09c734e931584894ecd58d08296804ca2d0b184c933ce50 \ - --hash=sha256:9e7b0a4ca6dcc007a4cef00a761bba2dea959de4bd2df98f926b33c92ca5dfb9 \ - --hash=sha256:9eb667bf50856c4a58145f8ca2d5e5be160191e79eb9e30855a476191b3c3495 \ - --hash=sha256:9f93d5b8b07f73e8c77e3c6556a3db269918390c804b5e5fcdd4858232cc8f16 \ - --hash=sha256:a0092f2b107b69601adf562a57c956fbb596e05e3e6651cabd3054113b007e45 \ - --hash=sha256:a02ca8fe48815bddcfca3248efe54451abb9dbf2f7d1c5744c8aa4142d476919 \ - --hash=sha256:a1d9b99e5b2597e4f5aed2484fef835256fa1b68a19e4265c97628ef4bf8bcf4 \ - --hash=sha256:a2853c8b2170cc6cd54a6b4d50d2c1a8a7aeca201f23804b4898525c7a152cfc \ - --hash=sha256:a31286dbb5e74c8e9a5344465b77ab4c5bd511a253b355b5ca2fae7e579fafec \ - --hash=sha256:a86f06f059e22a0d574990ee2df24ede03f7f3c68c1336293eee9536c4c776cd \ - --hash=sha256:ab863fd37458fed6456525f297d21239d987800c46e67da5ef04fc6b3dd93ac8 \ - --hash=sha256:ac4db068889f8772a4a698c5980ec302771bb545e10c4b095d4c8be26749616f \ - --hash=sha256:b6c2f225662bc5ad416bdd06f72ca301b31b39ce4261f0e0097017fc2891b940 \ - --hash=sha256:bb40648d96157f9081886defe13eac99253e663be969ff938a9289eff6e47b72 \ - --hash=sha256:bba078de0031c219e5dd06cf3e6bf8fb8e6e64a77819b358f53bb132e3e03366 \ - --hash=sha256:bc783ee3147e60a25aa0445ea82b3e8aabb83b240f2b95d32cb75587ff781814 \ - --hash=sha256:be10838781cb3be19251e276910cd508fe127e27c3242e50521521a0f3781690 \ - --hash=sha256:bfd57d8008c4965709a919c3e9a98f76c2c7cb319086b3d26858250620023b13 \ - --hash=sha256:c08da09dc003c9e8c70e06b53a11db6fb3b250c21c4236b03c7d7b443c318e7a \ - --hash=sha256:c3592631e652afa34999a088f98ba7dfc7d6aff0d535c410bea77a71743f3819 \ - --hash=sha256:c4a699432846df86cc3de502ee85f445ebad748a1c6021d445f3e514d2cd4b1c \ - --hash=sha256:c4e425db0c5445ef0ad56b0eec54f89b88b2d884656e536a90b2f52aecb4ca86 \ - --hash=sha256:c53fa3a5a52122d590e847a57ccf955557b9634a7f99ff5a35131321b0a85317 \ - --hash=sha256:c6854e9cf99c84beb004eecd7d3a3868ef1109bf2b1df92d7bc11e96a36c2180 \ - --hash=sha256:c748ebcb6877de89f48ab90ca96642ac458fff5dec291a2b9337cd4d0934e383 \ - --hash=sha256:c871299c595ee004d186f61840f0bfc4941aa3f17c8ba4a565ead7e4f4f820ee \ - --hash=sha256:cbd7b79cdcb4986ad78a2662625882747f09db5e4cd7b2ae178a88c9c51b3dfe \ - --hash=sha256:cc16682cc987a3da00aa56a3aa3075b08edb10d9b1e476938cfdbee8f3b67181 \ - --hash=sha256:cec05be8c876f92a5aa07b01d60bbb4d11cfbdd654cad0561c0d7b5c043a61b9 \ - --hash=sha256:d036ee7b99d5148072ac7c9b847193decdfeac633db350363f7bce4fff108f0e \ - --hash=sha256:d0d799ff958655781296ec870d5e2448e75150da2b3d07f13ff5b0c2c35beefd \ - --hash=sha256:d1392c569c032f78a11a25d1de1c43fff13294c793b39e19d84fade3045cbbc3 \ - --hash=sha256:d2f17a16cd8751e8eb233a7e41aecdf8e511712e00088bf9be455f604cd0d28d \ - --hash=sha256:d3829a6e6fd550a219564912d4002c537f65da4c6ae4e093cc34462f4fa027ad \ - --hash=sha256:d43aa26dcda363f21e79afa0668f5029ed7394b3bb8c92a6927a3d34e8b610ea \ - --hash=sha256:d6d8efe71429635f0559579092bb5e60560d7b9115ee38c4adbea35632e7fa24 \ - --hash=sha256:dabecc48db5f42ba348d1f5d5afdc54c6c4cc758e676926c7cd327045749517d \ - --hash=sha256:db88156fcf544cdbf0d95588051515cfdfd4c876fc66444eb98bceb5d6db76de \ - --hash=sha256:de550d129f18d8ab819651ffe4f38b1b713c7e116707de3c0c6400d0ef34fbc1 \ - --hash=sha256:e0af85773850417d994d019741239b901b22c6680206f46a34766926e466141d \ - --hash=sha256:e3c4f84b24a1fcba435157d111c4b755099c6ff00a3daee1ad281817de75ed11 \ - --hash=sha256:e3dd5fe19c9e0ac818a9c7f132a5e43c1339ec1cbbfecb1a938bd3a47875b7c9 \ - --hash=sha256:e69aa6805905807186eb00e66c6d97a935c928275182eb02ee40ba00da9623b2 \ - --hash=sha256:e80807d72f96b96ad5588cb85c75616e4f2795a7737d4630784c51497beb7776 \ - --hash=sha256:ebe33f4ec1b2de38ceb225a1749a2965855bffeef435ba93cd2d5d540783bf2f \ - --hash=sha256:f0cea5b1d3e6e77d71bd2b9972eb2446221a69dc52bb0b9c3c6f6e5700592d93 \ - --hash=sha256:f15401d8d3dbf239e23c818afc10c7207f7b95f9a307e092122b6f86dd43209a \ - --hash=sha256:f504d861d9f2a8f94020130adac88d66de93841707a23a86244263d1e54682f5 \ - --hash=sha256:fc46da94826188ed45cb53bd8e3fc076ae22675aea2087843d4735627f867c6d \ - --hash=sha256:fc7140d7a7386e6b545d41b7358f4d02b656d4053f5fa6859f92f4b9c2572c4d \ - --hash=sha256:fcf3da95e93349e0647d48d4b36a12783105bcc74cb0c416952f9988410846a3 \ - --hash=sha256:fe022f20bc4569ec66b63b3fb275a3d628d9d32da6326b2982584104db6d3086 \ - --hash=sha256:ffb34ea45a82dd637c2c97ae1bbb920850c1e59bcae79ce1c15af531d83e7215 +lxml==6.1.1 ; python_version >= "3.11" \ + --hash=sha256:05a82eb6e1530a64f26225b55cbd178113bd0b5af1c2b625f25e5296742c26d2 \ + --hash=sha256:07a4a68e286ee7a1ed7dfb8af83e615757c0ccfe9f18c6b4ea6771388d9ba8c9 \ + --hash=sha256:09dd5b7075dc2f7709654a46543ba1ea3c2e217b2ed8fbd413a8a945a0f40f60 \ + --hash=sha256:0b7e8a14c8634bf6f7a568634cb395305a6d964aeb5b7ee32248094bed3a7e2c \ + --hash=sha256:104c09bda8d2a562824c0e319d0768ce26a779b7601e0931d33b09b53c392ef7 \ + --hash=sha256:126c93f7f56f0eda92f6d8c619edc463a4f23d9252f1c9d0405a76f25fa9f11a \ + --hash=sha256:162af1091cd785f2f27e62d3547ae9bc58ec5c86dd314d67021fd02463708d83 \ + --hash=sha256:17e0e18d4ad8adbd0399291bc44845b69d9dd68439a3cdebdf35ff902ec05072 \ + --hash=sha256:18b73c339ae29b90fd2d06e58ebd555a751bde9cd6bbd36cc0281b9a2c94e9d8 \ + --hash=sha256:19607c6bbff2a44cf3fe8250abccd20942d3462473e0a721d01d379ed017e462 \ + --hash=sha256:19b7ab10b210b0b3ad7985d9ac4eb66ab09a90b20fe6e2f7ba55d01a234345d0 \ + --hash=sha256:1d4962d4c66bf830a7e59ed6cfc17d148149898a3aefa8ec6e59763e6e3ed085 \ + --hash=sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f \ + --hash=sha256:1dde6131244bba38a17c745836ba190bc753fd73c9291666287fd0a3fa3dcf30 \ + --hash=sha256:25c6997a9a534e016695a0ba06b2f07945de682731ff01065b6d5a4474179da1 \ + --hash=sha256:26e6eda8d38c1fcab1090dd196ee87cbd13788e531937610e2589085de074e77 \ + --hash=sha256:27acc820660aaffa4f7c087f29120e12980f7779d56d8492d263170111284740 \ + --hash=sha256:2a0217714657e023ef4293500f65aa20fce6164c8fd6b08fa5bd4a859fb14b9b \ + --hash=sha256:2c8daa471358dc2d6fcf02165e80ec68f77871a286df95bc5cc3816153b0fd2c \ + --hash=sha256:30a89d3ac8faec007453fb541f3f46807eeec88edd5826f6e3fe001752a2c621 \ + --hash=sha256:31033dc34636ea6b7d5cc11b1ddbda78a14de858ba9d3e1ed4b69a3085bc521e \ + --hash=sha256:32ab449a5486f6c758e849bb86710d0e45edc24a04e250c01555f8f5653958f8 \ + --hash=sha256:3483644525531e1d5762b0c44a8e18b6efba321b6dcf8a8952de10b037618bca \ + --hash=sha256:34c2d737beabfe35baada43941ed519251e9a12e779031496bcd5d539fcfd730 \ + --hash=sha256:3779def59032b81e44a5f70096ef6bf2082f8d901937dca354474ba09782e245 \ + --hash=sha256:37a58976370f36d9329d118ad0b953c5aeb9119ac9c6a4e258942a225d0573a1 \ + --hash=sha256:3893c14c4b6ac5b2d54ba8cf03e99fe5104e592de491f19bd6b82756c09f8004 \ + --hash=sha256:3a12689be69a28ddaa0ab99a5a1137da2afd5f8f16df7b5680b66f616d3eda1d \ + --hash=sha256:3ab541146f1f6968c462d6c2ac495148e8cdba2f8347700b2141b6ec5a75bf52 \ + --hash=sha256:3abf332af33a74288675d936fe861fd4344da0dd6622193fbc4f2bfbb35536b5 \ + --hash=sha256:3fd9728a2735fda14f4e8235830c86b539e9661e849665bf926d3f867943b4bf \ + --hash=sha256:424aa57aca0897eb922aef34395bd1289b3b6f04e6bae20ea123c0c7e333cffc \ + --hash=sha256:441dd227fa0690eb9fc81edabc63cdcefc212bba99b906dcf6e32cc1a9d3e533 \ + --hash=sha256:469e3618338bd7ab5beb412d2439825479fcf0dab99e394ca563dbc4eaf6c834 \ + --hash=sha256:47402e62c52ff5988c1e8c6c63177f5708bccf48e366dea4e3dcf1e645e04947 \ + --hash=sha256:4f0dd2f01f9f8a89f565d000e03abcf0a13d692a346c8d22f628d49af098777a \ + --hash=sha256:53b7d2b7a10b1c35c0a5e21e9224accf60c1bbfba523990732e521b2b73adef2 \ + --hash=sha256:53c909b62a0532183542fed00c5a7218258c56292d409bc789886fe1cb04c438 \ + --hash=sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc \ + --hash=sha256:556e94a63c9b04716f8e4de2abb65775061f846e89331b6c5be79183a24f98ea \ + --hash=sha256:55b03549819867ea141c0202242c4816c82e52ec36e7e648db9d8da5a3dc3ed6 \ + --hash=sha256:581d4c8ae690a6609e64862dd6b7c2489635c2d13907fc2b20f2bc200ff1d21e \ + --hash=sha256:58bb955caba94e467d2a96da17660d2d704e0675894cba21ab8a775b8621fd1c \ + --hash=sha256:5b7328b46d49fc9477d91ae8f6d55340347d827b7734ba3ea33faae0efef1383 \ + --hash=sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955 \ + --hash=sha256:5bec7d03d78d853597d6107854c2310ce3f761fd218fe9fe91d5101fcf6c2efe \ + --hash=sha256:5c6bf403fbb3b3e348a561a5f4f0b9961835657981c802a1df03653eef8a9074 \ + --hash=sha256:5f6994074ebae6ffb04447268e37dc16edc304f9859cf91acb86e0af6c1b395c \ + --hash=sha256:62aeb7e85b5d60320b9d77eef2e773994e2c0ce10121b277e0a19804e1654a5a \ + --hash=sha256:63876be28efefa04a1df615b46770e82042cce445cfdce55160522f57b231ccb \ + --hash=sha256:639f6c857d91d9be29bd7502348d6736dab168b54b5158cd899abf11684dc186 \ + --hash=sha256:640f97d43d867bcb9c75b3af013b64850756b746cb6bce8ace83b70da3abba9d \ + --hash=sha256:649dda677cf3bd6ac9ae14007ba0c824ded8ce5808b53fc7431d9140399118c1 \ + --hash=sha256:6540377fbd53fe1b629172288c464fb18db11ce1fa7dc15891da10aa9dcc3e7f \ + --hash=sha256:6689e828a94eee4f139408c337bb198e014724bb8a8c26d3cfac49d119ed69a6 \ + --hash=sha256:68a9198d0fc122d14bb76837de9aa80cf84caed990b5b237f532ed87d3706736 \ + --hash=sha256:6b1761fbf9ec984e2e9d9c589ef5f5fd684b7c19f92aadd567a26c5224958db6 \ + --hash=sha256:70cdfd80589d59e43e18005dd7244e8895e93db8ab6a620b7e23df5445a4e3d2 \ + --hash=sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b \ + --hash=sha256:73bc2086f141224ebddb7fc5c6a36ca58b31b94b561e1dfe8e073e3270fad1e7 \ + --hash=sha256:74a9717fd0d82effef5c2854f0d917231d5324b5a3eb7275c43ac9fa32f97a14 \ + --hash=sha256:752d3bbfe874715ccd0aec7f88d7fc623c0f1fd7aa7b3238a084e017bad2a009 \ + --hash=sha256:762ff394d5bd56da0cf034a23dcce4e13923f15321a2adfa2ac00201dc6d3fca \ + --hash=sha256:76447f65250ed2501ead1a1552f5ce8edff159a86f308348e6a9c4acb5e1f1b4 \ + --hash=sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635 \ + --hash=sha256:787b2496d0dbe8cd180984e8d29e3a6f76e7ea34db781cb3bd55e4ba1ef8b4ee \ + --hash=sha256:793033d6c5cdf33a573f910d9bea14ef8f5771820411d118da8e1182edb53d5e \ + --hash=sha256:7d47866cb32fb503450b6edc9df355d10dc49836af2e89901bd6ac6b0896d9d9 \ + --hash=sha256:7f7a92e8583f06b1fd49d01158143b8461cfcd135dcb10ec807270a3051bd603 \ + --hash=sha256:80c2dfadb855da477cf73373ad29a333535dedb9b12bad02c9814c8e2b43bf08 \ + --hash=sha256:83b6b30eb131da7a75b601f28c5d6971e6ed3e887919bf6b6a1ad3c2df289080 \ + --hash=sha256:86281fbdd6a8162756f8d603f37e3435bfa38043adb79c6dc6a2dfee065e7525 \ + --hash=sha256:86c89b9d55ebf820ad7c90bc533410f0d098054f293351f10603c0c46ff598f5 \ + --hash=sha256:876e1ff5930ed8bf295ec5ef9a8155e9b6b1876bbf1deed8b3a8069311875a8f \ + --hash=sha256:88136950da4d13c318bde414ce10219931937851327f44328f2df4d2c4614067 \ + --hash=sha256:88d8cb75b9d82858497a5393e3c63cfbf03035225e4b35a49ed7ccb151e4dc0e \ + --hash=sha256:8be8ad51249698103d24b0571df35a10990fbe93dd043b6c024172189485f5e3 \ + --hash=sha256:8d43ca737b20e106e4aebc42b2f3ae19f00ba63d7eb731698ee083d72d15646f \ + --hash=sha256:8dadbe5b217ff35b6a8d16610dd710219b59b76d13f0e3f0d9f36786206e4485 \ + --hash=sha256:9395002973c827b3ed67db77e6ec09f092919a587022174554096a269378fb13 \ + --hash=sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383 \ + --hash=sha256:98fc784c2c1440667aeedf8465bdfe10208acf0ead656a2c68627299f546b315 \ + --hash=sha256:9e36f163528fc50cbef305f02a5fd66d404edf7049cdaff211dbc2cba5a7013e \ + --hash=sha256:9eb9b5a968f6e0f6d640092a567e14529ff8cea2e29d00da6f78a79fa49f013c \ + --hash=sha256:9f76acfb5f68ba982635a53fd985a8044be98a35b43232c2a1ee235ffab3e1dd \ + --hash=sha256:a088f287f7d8275a33c07f2cac6c50b9319309a0200a39e7e75d80c707723099 \ + --hash=sha256:a10bd2fd62e8ce916ececb342f348f190724a098c1faa056fdfb2a22ad5e8660 \ + --hash=sha256:a4bbea04c97f6d78a48e3fbc1cb9116d2780b1b39e03a23f6eb9b603fd61f510 \ + --hash=sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a \ + --hash=sha256:aa49e06d94aba782c6a02eecb7e507969e7e7a41b267f1b359bb35585f295d5b \ + --hash=sha256:aad9aa39483ed8ec44d6d2e59e5b98a0d80676ef0d92f44bfc374836111f62f5 \ + --hash=sha256:aae97dfdb60715c164419ac2532a76d013c3918a665eb6cb7288098b5f349aaf \ + --hash=sha256:abbefa31eee84842140f67acef1c828e28bba8bbf0c3bc6e5492a9af88152c28 \ + --hash=sha256:ac931cdc9442c1763b8a8f6cd62c0c938737eafc5be75eff88df55fc73bc0d00 \ + --hash=sha256:acd7d70b64c0aae0c7922cca83d288a16f5f6da523637697872253415269baef \ + --hash=sha256:add8cf6ddf9a65116119a28ece0f7886e30af27ba724a7594305f1d1b58a92a1 \ + --hash=sha256:aee395f5d0927f947758b4ec119fd5fc8ec71f07a1c5c52077b30b04c0fa6955 \ + --hash=sha256:b1b963fd8f5caa68e99dfae060d54de1fe9cba899b8718b44a00cdca53c3e590 \ + --hash=sha256:b2d444f2e66624d68e9c6b211e28a76e22fff5fcabcfff4deac18b529b7d4137 \ + --hash=sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf \ + --hash=sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40 \ + --hash=sha256:bdebcc8a75d38c7598dfb2c9ed852d7a9eb4a10d6e2d0764b919b802bf32ac88 \ + --hash=sha256:c07da4cebf6889f03ebac8d238f62318e29f495de0aa18a51ea14e61ae907e2e \ + --hash=sha256:c08e5c694306507275f2290073350c4f32e383db15213b2c69e7ff39c1193840 \ + --hash=sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2 \ + --hash=sha256:c5d7152ec39ca7c402d8fb9bad86140a15b9503bd0c54484e3f1bbe3dd37ceca \ + --hash=sha256:c674693f055fa2495de12292cb45e9944199d8eaef5a2dec45175c7c61cb73e3 \ + --hash=sha256:c6ed5141a5c7507cf3ee76bd363b0d6f801e3321adc35b5d825a23115faa5465 \ + --hash=sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc \ + --hash=sha256:c9a4b821dc7055bf9e05ff5719e18ec501f75c0f0bbfabd573b277559780833d \ + --hash=sha256:c9f79d5325907f13e1be0b3e4dacc1049d1dffc4aeee3c995284bea5fe0fab7d \ + --hash=sha256:cd312b9692e831d2ffcad61eab31d91d4b4655a962e61de8fb410472cbcd37aa \ + --hash=sha256:cea3f4c1af79af13cdb2da0c028111d8f8522d4f22a000c82385535f24e5cf3a \ + --hash=sha256:cecdd5dfdc87b1fd87dbf81d4b037a544f47f4c744200a67013771682d67686a \ + --hash=sha256:cf9d57306d848218f3601fee7601fab1a327c942d56e2e97610583cb4dd74206 \ + --hash=sha256:d34bbf07dbc7ca5970671b1512e928991fb5e9d95365636c9b2d8b4f53af405e \ + --hash=sha256:d49514be2f28d895c38cf9d2b72d7b9a07d00314519f456c0b50b53cfcf4c785 \ + --hash=sha256:d680fbcb768404c601ecb43519ecd8461f6954cb11c06a78962f666832ccfca8 \ + --hash=sha256:db1d75f6617a49c1c01bc7023713e0ff59ab32c9579ae62a7674c0e34f3b0b0a \ + --hash=sha256:dcb292aa7fe485ceff7af4f92e46c5af397daec5dff64871a528f0fc47a3cc5b \ + --hash=sha256:e07c65f443c887bbcf31cc1771d932ecc192a5273943589b3c7572b749f1ffb2 \ + --hash=sha256:e902da4b04e6b52e5893900d4b8ab46068f75f3561f01bf1080957f9fd932ed6 \ + --hash=sha256:e9308ff8241c532df3f3e570f9a5aeed6c853f888512ba4b75638d7c11c95ef6 \ + --hash=sha256:eb7c9811bfaa8b1ed5ed319f5d370dfbcaa59d52ea64be2a5a85e18195930354 \ + --hash=sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818 \ + --hash=sha256:ed21202aec73cda4d55d1ce57b389aadb90ffb044e6cd1080b8347efe1b1ec84 \ + --hash=sha256:efe0374196335f93b53269acd811b944f2e6bdc88e8894f214bd636455484909 \ + --hash=sha256:f64ec5397ea6a41fc1b4af0380d79b44a755b5531dcaccd9940fb260dca93038 \ + --hash=sha256:f6ac4ef4d82dff54670227a69c67782ae0b811b5cf6b17954f1e8f7502fc0d1d \ + --hash=sha256:f6f0ce10945fab9c4c06ce14e22af9059d1a87493a9af4501a5b0b9187e21cf2 \ + --hash=sha256:f8844cd288697c6425c9beba919302241e3278871dc6519515e72b04e987abcf \ + --hash=sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc \ + --hash=sha256:ff3f333630ab480244a1bff72043e511a91eb22e7595dead8653ee5612dd8f3d \ + --hash=sha256:ffecec8eb889b58ba9be5b95fb1cc78e22ea8eedea38e8736a1568fe1979250e markdown-it-py==4.2.0 ; python_version >= "3.11" \ --hash=sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49 \ --hash=sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a @@ -712,6 +709,34 @@ netcdf4==1.7.4 ; python_version >= "3.11" \ --hash=sha256:d3f9497873454207f9480847d02b1b19a4bc81ad6e9166e1c17d4e2f8f3555d1 \ --hash=sha256:ddfc7e9d261125c74708119440c85ea288b5fee41db676d2ba1ce9be11f96932 \ --hash=sha256:dec70e809cc65b04ebe95113ee9c85ba46a51c3a37c058d2b2b0cadc4d3052d8 +nh3==0.3.5 ; python_version >= "3.11" \ + --hash=sha256:0a09f51806fd51b4fedbf9ea2b61fef388f19aef0d62fe51199d41648be14588 \ + --hash=sha256:207c01801d3e9bb8ec08f08689346bdd30ce15b8bf60013a925d08b5388962a4 \ + --hash=sha256:23a312224875f72cd16bde417f49071451877e29ef646a60e50fcb69407cc18a \ + --hash=sha256:2c069570b06aa848457713ad7af4a9905691291548c4466a9ad78ee95808382b \ + --hash=sha256:38748140bf76383ab7ce2dce0ad4cb663855d8fbc9098f7f3483673d09616a17 \ + --hash=sha256:387abd011e81959d5a35151a11350a0795c6edeb53ebfa02d2e882dc01299263 \ + --hash=sha256:3bb854485c9b33e5bb143ff3e49e577073bc6bc320f0ff8fc316dd89c0d3c101 \ + --hash=sha256:45855e14ff056064fec77133bfcf7cd691838168e5e17bbef075394954dc9dc8 \ + --hash=sha256:45e6a65dc88a300a2e3502cb9c8e6d1d6b831d6fba7470643333609c6aab1f30 \ + --hash=sha256:488928988caad25ba14b1eb5bc74e25e21f3b5e40341d956f3ce4a8bc19460dc \ + --hash=sha256:48f45e3e914be93a596431aa143dedf1582557bf41a58153c296048d6e3798c9 \ + --hash=sha256:50d401ab2d8e86d59e2126e3ab2a2f45840c405842b626d9a51624b3a33b6878 \ + --hash=sha256:52d877980d7ca01dc3baf3936bf844828bc6f332962227a684ed79c18cce14c3 \ + --hash=sha256:559e4c73b689e9a7aa97ac9760b1bc488038d7c1a575aa4ab5a0e19ee9630c0f \ + --hash=sha256:6ea58cc44d274c643b83547ca9654a0b1a817609b160601356f76a2b744c49ad \ + --hash=sha256:72c5bdedec27fa33de6a5326346ea8aa3fe54f6ac294d54c4b204fb66a9f1e79 \ + --hash=sha256:84bdeb082544fbcb77a12c034dd77d7da0556fdc0727b787eb6214b958c15e29 \ + --hash=sha256:8f85285700a18e9f3fc5bff41fe573fa84f81542ef13b48a89f9fecca0474d3b \ + --hash=sha256:acfd354e61accbe4c74f8017c6e397a776916dfe47c48643cf7fd84ade826f93 \ + --hash=sha256:c357f1d042c67f135a5e6babb2b0e3b9d9224ff4a3543240f597767b01384ffd \ + --hash=sha256:c3aae321f67ae66cff2a627115f106a377d4475d10b0e13d97959a13486b9a88 \ + --hash=sha256:c88605d8d468f7fc1b31e06129bc91d6c96f6c621776c9b504a0da9beac9df5f \ + --hash=sha256:de8e8621853b6470fe928c684ee0d3f39ea8086cebafe4c416486488dea7b68d \ + --hash=sha256:e49c9b564e6bcb03ecd2f057213df9a0de15a95812ac9db9600b590db23d3ae9 \ + --hash=sha256:ea232933394d1d58bf7c4bb348dc4660eae6604e1ae81cd2ba6d9ed80d390f3b \ + --hash=sha256:eeedc90ed8c42c327e8e10e621ccfa314fc6cce35d5929f4297ff1cdb89667c4 \ + --hash=sha256:fe3a787dc76b50de6bee54ef242f26c41dfe47654428e3e94f0fae5bb6dd2cc1 numcodecs==0.16.5 ; python_version >= "3.11" \ --hash=sha256:0107e839ef75b854e969cb577e140b1aadb9847893937636582d23a2a4c6ce50 \ --hash=sha256:015a7c859ecc2a06e2a548f64008c0ec3aaecabc26456c2c62f4278d8fc20597 \ @@ -734,79 +759,79 @@ numcodecs==0.16.5 ; python_version >= "3.11" \ --hash=sha256:c043af648eb280cd61785c99c22ff5c3c3460f906eb51a8511327c4f5111b283 \ --hash=sha256:c398919ef2eb0e56b8e97456f622640bfd3deed06de3acc976989cbcb22628a3 \ --hash=sha256:e2d04a19cb57a3c519b4127ac377cca6471aee1990d7c18f5b1e3a4fe1306689 -numpy==2.4.5 ; python_version >= "3.11" \ - --hash=sha256:02981d0fc9f9ce147643d552966d47f329a02f7ecb3b113e84207242f20dfa83 \ - --hash=sha256:06760fe73ae5005008748d182de612c733542af3cde063d532cd2127561b27be \ - --hash=sha256:079b0fad6f2899b23c5da89792b5409d2d83fc83e8bd5c2299cc9c397a264864 \ - --hash=sha256:07ce7e74da92d7c71b5df157b9758bcdd53d7fea10602154de3afd2b3ddc34dd \ - --hash=sha256:09d7d97da1c2c62f4818b3e150a57572ff8dcf1cf5ac501aac832ffd4ebd9566 \ - --hash=sha256:0c6919cefafb3b76cd46a89dbb203bf1dd95529d2a6d09fef2d325d95d6a79d8 \ - --hash=sha256:0d63a780070871210853ba01e90b88f9b85cf2abf63a7f143d5127189265ddf6 \ - --hash=sha256:0e63caf31a1df06338ae63d999f7a33a675ced62eea9c9b02db4b1c1f45cff38 \ - --hash=sha256:130d58151c4db23e9fa860b84784e219a3aa3e030acc88a493ea37006c4dfd4c \ - --hash=sha256:144fcc5a3a17679b2b82543b4a2d8dd29937230a7af13232b5f753872feb6361 \ - --hash=sha256:14b86f56048ed09c3bbe48962a7dff077c2fd3274f8cf981800f3b38eac49cc3 \ - --hash=sha256:15f90d1256e9b2320aff24fde44815b787ab6d7c49a1a11bfd8138b321c5f080 \ - --hash=sha256:1616bde34b2bcba2fa9bde06217ce00da4f3d1bdfb264d54525a99e8fe170d83 \ - --hash=sha256:1811150e5148f5a01a7cc282cb2f489b4a3050a773e173adb480e507bad3a3d7 \ - --hash=sha256:1ef248460b645c102026b82337cc4e88231909c66dd77b59ec6d6cac7e44f277 \ - --hash=sha256:235f54b0156274d8fa3155db3ed6d2f401c7e8f3367c90db0a12f02a58fde6ed \ - --hash=sha256:27f4a6dc26353a860b348961b9aa9e009835688b435cfa105e873b8dc2c726f5 \ - --hash=sha256:2a235607a18df941760a695927051af4b1cd5d3ee85840d0e2af816785771feb \ - --hash=sha256:2caa576d1707b275cba1aeb60a5c50daa6fa2a3f28ecb08123bc05fd439005db \ - --hash=sha256:2d68d0b355ab2e39fe0de59001d7151dfdbbb880ef67baeed806661e03df5097 \ - --hash=sha256:3176dc8ff71dbb593606f91a69ad0c3cd3303c7eb546af477370ab9edf760288 \ - --hash=sha256:32f8f852273ef32b291201ac2a2c97629c4a1ee8632bb670e3443eaa09fc2e72 \ - --hash=sha256:3333dba6a4e611d666f69e177ba8fe4140366ff681a5feb2374d3fd4fff3acb6 \ - --hash=sha256:398bb16772b265b9fa5c07b07072646ea97137c10ffb62a9a087b277fc825c29 \ - --hash=sha256:40c71d50a4da1a7c317af419461052d3911a5770bfc5fd55baf52cc45e7a2c20 \ - --hash=sha256:4593d197270b894efeb538dcbe227e4bcf1c77f88c4c6bf933ead812cfaa4453 \ - --hash=sha256:4603622bdcdbf8dccb1d9d5b21d16a7aa4e473ae6c8e14048d846fd4ca2907a0 \ - --hash=sha256:4b51a01745cb04cc19278482207444b4d30728ce91c28d27a3bfae5fc6ff24c7 \ - --hash=sha256:4bb33e900ee81730ad77a258965134aa8ceac805124f7e5229347beda4b8d0aa \ - --hash=sha256:4bd2cd4ef9c0afa87de73723c0a33c0edff62143e1432917458e26d3d195d87f \ - --hash=sha256:4cd9f6fa7ce10dc4627f2bb81dd9075dab67e94632e04c2b638e12575ddaa862 \ - --hash=sha256:4ed78c904a638b6e5d7cd4db90c06fca5fc6ec2f28d258305368f454a50e79cf \ - --hash=sha256:4f5bc96d35d94e4ceab8b38a92241b4611e95dc44e63b9f1fa2a331858ee3507 \ - --hash=sha256:58dcf64969d870f36bc7fbd557d2617e997db7dc06261b6e3327148ea460d0a4 \ - --hash=sha256:654fb8674b61b1c4bd568f944d13a908566fdcb0d797303521d4149d16da05ef \ - --hash=sha256:685681e956fc8dcb75adc6ff26694e1dfd738b24bd8d4696c51ca0110157f912 \ - --hash=sha256:6bf0bfc1c2e1db972e30b6cd3d4861f477f3af908b27799b239dc3cbe3eb4b95 \ - --hash=sha256:6c18d49c67689c562854b53fdc433b93e47c12952aa6fa6d59f185e1a5992419 \ - --hash=sha256:6d7df2da2e7ea0624a43aa368104b3a3ce14aae98ad4bb2c9a93fecef76f1c97 \ - --hash=sha256:6de2883e0d2c63eae1bab1a84b390dca74aabb3d20ea1f5d58f360853c83abf3 \ - --hash=sha256:6f64dd84b277a737eb59513f6b9bb6195bf41ab11941ef15b2562dbab43fa8ef \ - --hash=sha256:7200c58f3f933ca61e66346667dcc8510bb111995e9ce15398a731e6a4afa4bb \ - --hash=sha256:7341b08ff8124d7353939778e2707b8732d03c78c1c30e0815aba2dacbe1245a \ - --hash=sha256:73d664413fb97229149c4711ef56531a6fe8c15c1c2626b0bbe497b84c287e70 \ - --hash=sha256:76ac6e90f5e226011c88f9b7040a4bcae612518bc7e9adc127e697a13b28ad1a \ - --hash=sha256:7c392e2c1bf596701d3c6832be7567eab5d5b0a13865036c33365ee097d37f8b \ - --hash=sha256:7f09a7e5f017d7098c66522097c96257411c9620c0926212200d66bc8cee3976 \ - --hash=sha256:84f58bed609b5669f5ad3d597901a4f1f86ee5b3c3708aaa55f05b4fe6e0f656 \ - --hash=sha256:86d980970f5110595ca14855768073b08585fc1acc36895de303e039e7dee4a5 \ - --hash=sha256:889ca2c072315de638a5194a772aa1fa2df92bdd6175f6a222d4784040424b61 \ - --hash=sha256:89e89304fb1f8c3f0ecfa4a7d48f311dd79771336a940e920159d643d1307e77 \ - --hash=sha256:93793222b524f692f12b2f8752ce8b1d9d9125b2bfd5dbf0fb69c92c5e1ce86c \ - --hash=sha256:993a88d8fdd8554466a8765cd8bacd97ba56b70ca6b0a04bcdca77f5afed4222 \ - --hash=sha256:9a05636d7937d0936f271e5ba957fa8d746b5be3c2025caa1a2508f4fe521d40 \ - --hash=sha256:b1c663ddc641f4192e90511bec61a09bc231e3bbdb996cdc6edbcaa0e528d685 \ - --hash=sha256:b35bee5ef99e8d227a07829bee2e864fcb65f7c157646fcd8ec8b4b45dd8b88f \ - --hash=sha256:b42d9496f79e3a728192f05a42d86e36163217b7cdecb3813d0028a0aa6b72d7 \ - --hash=sha256:c26c71080d35db5002102f5d9ff614d45de02aa1f7802943e691e063e5ee93bc \ - --hash=sha256:ca670567a5683b7c1670ec03e0ddd5862e10934e92a70751d68d7b7b74ca7f9f \ - --hash=sha256:d475afc8cbe935ff5944f753d863bba774d7f4e1feaaa4102901e3e053ca5963 \ - --hash=sha256:d51efede1e58e8b11877536a5518f60e318d8ff69b89ad7b38ee5e431b24d772 \ - --hash=sha256:d6c78e260b53affe9b395a9d54fc61f101f9521c4d9452c7e9e3718b19e2215b \ - --hash=sha256:d7828234a13185effb34979e146f9921f2a65dfbbe215e6dbb57d6478fc8e059 \ - --hash=sha256:d888bdf7335f76878c3c7b264ac1ff089863e211ec81249f9fb5795c2183dc25 \ - --hash=sha256:d8fc52b85a7b45e474be53eddf08e006d22e381a4e41bcde8e4aa08da0e7d198 \ - --hash=sha256:db304568c650e9d7039744d3575d0d287754debb2057d7c7b8cdfdc2c487a957 \ - --hash=sha256:deb01226f012539f3945261ffe1c10aec081a0fa0a5c925419933c70f3ae2d23 \ - --hash=sha256:ef3b5bb65437a3555c648e706475db01c645559ca80dc8b03e4f202ea757e0d6 \ - --hash=sha256:f96083adc3dfc1bbf778f2c79654d88115fa07074c97cb724fe9508f12d91c55 \ - --hash=sha256:fb352e7b8876da1249e72254736d6c58c505fa4e58a3d7e30efca241ca9ca9ce \ - --hash=sha256:fb4a6c9c537d6ccec9cc4aeae4261bd3cc79b070c67ddc0646f5b1c07fddde42 \ - --hash=sha256:fe28b64777ddfa0eca9b5f51474034ebe3dcb8324f48f27b28f479085673ae33 +numpy==2.4.6 ; python_version >= "3.11" \ + --hash=sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1 \ + --hash=sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4 \ + --hash=sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f \ + --hash=sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079 \ + --hash=sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096 \ + --hash=sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47 \ + --hash=sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66 \ + --hash=sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d \ + --hash=sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1 \ + --hash=sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e \ + --hash=sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147 \ + --hash=sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd \ + --hash=sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75 \ + --hash=sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063 \ + --hash=sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73 \ + --hash=sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab \ + --hash=sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4 \ + --hash=sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41 \ + --hash=sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402 \ + --hash=sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698 \ + --hash=sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7 \ + --hash=sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8 \ + --hash=sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b \ + --hash=sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8 \ + --hash=sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0 \ + --hash=sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662 \ + --hash=sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91 \ + --hash=sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0 \ + --hash=sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f \ + --hash=sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3 \ + --hash=sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f \ + --hash=sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67 \ + --hash=sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6 \ + --hash=sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997 \ + --hash=sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b \ + --hash=sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e \ + --hash=sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538 \ + --hash=sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627 \ + --hash=sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93 \ + --hash=sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02 \ + --hash=sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853 \ + --hash=sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c \ + --hash=sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43 \ + --hash=sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd \ + --hash=sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8 \ + --hash=sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089 \ + --hash=sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778 \ + --hash=sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1 \ + --hash=sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb \ + --hash=sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261 \ + --hash=sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb \ + --hash=sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a \ + --hash=sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8 \ + --hash=sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359 \ + --hash=sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5 \ + --hash=sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7 \ + --hash=sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751 \ + --hash=sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8 \ + --hash=sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605 \ + --hash=sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e \ + --hash=sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45 \ + --hash=sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2 \ + --hash=sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895 \ + --hash=sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe \ + --hash=sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb \ + --hash=sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a \ + --hash=sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577 \ + --hash=sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d \ + --hash=sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a \ + --hash=sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda \ + --hash=sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6 \ + --hash=sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20 packaging==26.2 ; python_version >= "3.11" \ --hash=sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e \ --hash=sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661 @@ -862,12 +887,15 @@ pandas==3.0.3 ; python_version >= "3.11" \ --hash=sha256:e3a2ec42c98ffa2565a67e08e218d06d72576d758d90facb7c00805194d8f360 \ --hash=sha256:f8894dc474d648fe7b6ff0ca9b0bd73950d19952bc1a6534540762c5d79d305c \ --hash=sha256:fed2ff7fd9779120e388e285fc029bd5cf9490cdd2e4166a9ee22c0e49a9ab09 -panel==1.8.10 ; python_version >= "3.11" \ - --hash=sha256:762881b06efb99f3d201749a3634c6b5f18f46cfca520970c2c1bb31bed42c90 \ - --hash=sha256:b1de9304e729b87fdeee59a5be5b0d3ce7786dc301626cb728f69fbc4c136693 -param==2.3.3 ; python_version >= "3.11" \ - --hash=sha256:43c24345d287d4abda15eac65b5b15d55f178a393421f0bfca02a77dd6c0d1dd \ - --hash=sha256:ae25afbc372c1a5e4ee72935cc76ff77b1db1c4eb092bc46715c906ef3cc2e69 +panel-material-ui==0.11.2 ; python_version >= "3.11" \ + --hash=sha256:adbfae5776412d6cfa8f6fccf7af932ee264749f4d366a5a80e5af67d5bb7739 \ + --hash=sha256:ef0912f6d0621d176d8f085f93027aafa00dc4934d04b4fd82d03a51ea29ea22 +panel==1.9.2 ; python_version >= "3.11" \ + --hash=sha256:7099ad4334c305d7e2654d46945d3117e63379f15d0b8635e67f3f825dbccd9b \ + --hash=sha256:ede8daa7a2515a2f3b49f19ed9aff75fcef48d6d8c3b9df3a4ebf26a551a0407 +param==2.4.0 ; python_version >= "3.11" \ + --hash=sha256:770ecebb1bb8ffaeb8722a00976ba5092af287344471c513ba51597b4257339b \ + --hash=sha256:d2c09da9fe80084cb5a8732761f26786317133995344df03db5f09d63ac35233 parso==0.8.7 ; python_version >= "3.11" \ --hash=sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c \ --hash=sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1 @@ -972,9 +1000,9 @@ pillow==12.2.0 ; python_version >= "3.11" \ --hash=sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7 \ --hash=sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06 \ --hash=sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5 -platformdirs==4.9.6 ; python_version >= "3.11" \ - --hash=sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a \ - --hash=sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917 +platformdirs==4.10.0 ; python_version >= "3.11" \ + --hash=sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7 \ + --hash=sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a pluggy==1.6.0 ; python_version >= "3.11" \ --hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3 \ --hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 @@ -984,7 +1012,7 @@ pooch==1.9.0 ; python_version >= "3.11" \ prompt-toolkit==3.0.52 ; python_version >= "3.11" \ --hash=sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855 \ --hash=sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955 -psutil==7.2.2 ; python_version >= "3.11" \ +psutil==7.2.2 ; sys_platform != "emscripten" and python_version >= "3.11" \ --hash=sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372 \ --hash=sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9 \ --hash=sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841 \ @@ -1027,6 +1055,9 @@ pytest==9.0.3 ; python_version >= "3.11" \ python-dateutil==2.9.0.post0 ; python_version >= "3.11" \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 +python-serafin==0.1.0 ; python_version >= "3.11" \ + --hash=sha256:2afd42ac11bded0182c0e90be7c72c3cf27ed48a45cb712f3b130df78e7edbc3 \ + --hash=sha256:621a85a99a5352d9335369be8903486b4fb2565559d30707446cb35d5b1b67c8 pyviz-comms==3.0.6 ; python_version >= "3.11" \ --hash=sha256:4eba6238cd4a7f4add2d11879ce55411785b7d38a7c5dba42c7a0826ca53e6c2 \ --hash=sha256:73d66b620390d97959b2c4d8a2c0778d41fe20581be4717f01e46b8fae8c5695 @@ -1171,9 +1202,9 @@ scipy==1.17.1 ; python_version >= "3.11" \ six==1.17.0 ; python_version >= "3.11" \ --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 -soupsieve==2.8.3 ; python_version >= "3.11" \ - --hash=sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349 \ - --hash=sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95 +soupsieve==2.8.4 ; python_version >= "3.11" \ + --hash=sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e \ + --hash=sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65 stack-data==0.6.3 ; python_version >= "3.11" \ --hash=sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9 \ --hash=sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 @@ -1228,17 +1259,17 @@ tomli==2.4.1 ; python_version >= "3.11" \ toolz==1.1.0 ; python_version >= "3.11" \ --hash=sha256:15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8 \ --hash=sha256:27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b -tornado==6.5.5 ; sys_platform != "emscripten" and python_version >= "3.11" \ - --hash=sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9 \ - --hash=sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6 \ - --hash=sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca \ - --hash=sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e \ - --hash=sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07 \ - --hash=sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa \ - --hash=sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b \ - --hash=sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521 \ - --hash=sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7 \ - --hash=sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5 +tornado==6.5.6 ; sys_platform != "emscripten" and python_version >= "3.11" \ + --hash=sha256:1c34cfab7ad6d104f052f55de06d39bbafc5885cfeb4da688803308dbcfa90b7 \ + --hash=sha256:2543597b24a695d72338a9a77818362d72387c03ae173f1f169eadc5c91466ac \ + --hash=sha256:385f35e4e22fb52551dfcda4cdc8c30c61c2c001aef5ddad99cdfe116952efd3 \ + --hash=sha256:38bc01b4acacded2de63ae78023548e41ebe6fbed3ec05a796d7ae3ad893887e \ + --hash=sha256:65fcfaafb079435c2c19dc9e07c0f1cf0fa9051759ed0a7d0a3ba7ea7f64919c \ + --hash=sha256:6739bf1e8eb09230f1280ddbd3236f0309db70f2c551a8dbc40f62babdf82f79 \ + --hash=sha256:8666946e70171b8c3f1fc9b7876fac492e84822c4c7f3746f4e8f8bc9ac92a79 \ + --hash=sha256:9a365179fe8ff6b8766f602c0f67c185d778193e9bdd828b19f0b6ed7764177d \ + --hash=sha256:b942e6a137fda31ff54bf8e6e2c8d1c37f1f50583f3ed53fb840b53b9601d104 \ + --hash=sha256:db475f1b67b2809b10bb16264829087724ca8d24fe4ed47f7b8675cae453ef86 tqdm==4.67.3 ; python_version >= "3.11" \ --hash=sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb \ --hash=sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf @@ -1294,9 +1325,6 @@ watchdog==6.0.0 ; python_version >= "3.11" \ wcwidth==0.7.0 ; python_version >= "3.11" \ --hash=sha256:5d69154c429a82910e241c738cd0e2976fac8a2dd47a1a805f4afed1c0f136f2 \ --hash=sha256:90e3a7ea092341c44b99562e75d09e4d5160fe7a3974c6fb842a101a95e7eed0 -webencodings==0.5.1 ; python_version >= "3.11" \ - --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ - --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 webob==1.8.9 ; python_version >= "3.11" \ --hash=sha256:45e34c58ed0c7e2ecd238ffd34432487ff13d9ad459ddfd77895e67abba7c1f9 \ --hash=sha256:ad6078e2edb6766d1334ec3dee072ac6a7f95b1e32ce10def8ff7f0f02d56589 @@ -1315,20 +1343,20 @@ xyzservices==2026.3.0 ; python_version >= "3.11" \ zarr==3.1.6 ; python_version >= "3.11" \ --hash=sha256:b5a82c5079d1c3d4ee8f06746fa3b9a98a7d804300fa3f4be154362a33e1207e \ --hash=sha256:d95e72cbea4b90e9a70679468b8266400331756232576ae2b43400ac5108d0eb -zensical==0.0.42 ; python_version >= "3.11" \ - --hash=sha256:2e4304e103f9cd5c637045bbae1ff29de3009ab01b16e99c2fd6d4bbceb7a3ee \ - --hash=sha256:3c026f023330d67f986a94b68ffd36dc5066882e697e1125c37308d8d684135c \ - --hash=sha256:47cd99583738a8ab03fac4080741275c56e741a06dc8edfb541f4c1649a5ae69 \ - --hash=sha256:5e9a5d508ce8d1b07d8417f0623be476f6b37d445ab4356481a71e613a7979d6 \ - --hash=sha256:83090e53fba061967ecb3dff81500b1900f288bae108bf54084a2aeb6648ebd0 \ - --hash=sha256:8f0e96e53f39b9e4b929a25d9df70bd7fa8217166a854e2c8f3185983dd01500 \ - --hash=sha256:9fbc0951a676e48afe7df3a9b2a30958dcf9c426ed2480972d3c04d6de485ba3 \ - --hash=sha256:b7d586e57436d603e88acd856864f99f0771aef24bf6560b2de238417bd3817c \ - --hash=sha256:bffd7a34b570fa3ccadf1d23babb0f7c4851c6b626e4fc8ed9f21c2eaae85968 \ - --hash=sha256:c0bf96b55f0a44e8716bcb334a16380ed56772b555145da775a7d8ac8678cb6f \ - --hash=sha256:cc346b833868a59412fe8d8498a152be90be9f3d8fb87e1f1a1c2e1146cbae1b \ - --hash=sha256:e5908bc09cf5c1c50c9504241e37f89955daf3e89ba1b9d71c17972578b24804 \ - --hash=sha256:ee1a79789f9462ef44a4b6ebbfc8b5bf4b2447607da8bc5b35bc9c4ce4ea2370 -zipp==3.23.1 ; python_version < "3.12" and python_version >= "3.11" \ - --hash=sha256:0b3596c50a5c700c9cb40ba8d86d9f2cc4807e9bedb06bcdf7fac85633e444dc \ - --hash=sha256:32120e378d32cd9714ad503c1d024619063ec28aad2248dc6672ad13edfa5110 +zensical==0.0.43 ; python_version >= "3.11" \ + --hash=sha256:03a9d1744a6394ad66c355d6f1de04cfd92efa525b0b94bf6dbf6971c5cd2c6b \ + --hash=sha256:0e278eb948a0b7545d50609d713c7c27e366dade4523ff73a311a5d5f136518a \ + --hash=sha256:17c335362b6bac3a50178181694a964f6d9f0c516fc532129ba5a0a5c4103fb6 \ + --hash=sha256:4c4c85978c765b3e7f347e8102dfe1373d4bbe4229d7008b6bdbf352f1fbcd7f \ + --hash=sha256:60022f4a6b95e46ec0023f51052fcd491743b3ebd08c0066b22a5cf1e741fecd \ + --hash=sha256:751385accc92cccfd4560dabed7c423870686ef6ede244a67e5c96286af25e8f \ + --hash=sha256:85055a115b12f49c6ab194dcf04f966fc06b690ed6a8ddddd819929fc5f340e6 \ + --hash=sha256:8a75ddd4bb3cd3c4a8e71d2ebae44c5611fd636c1d355c6124dd96e2f9c52838 \ + --hash=sha256:90d7c06ffd07b2bdf78bef041d541baba8a3ea51fd2dd84dbdbc5b0229076524 \ + --hash=sha256:b85e5ab99fbda13823e67c43a4be6e5ebda6600602969c6575e143f20ac203fd \ + --hash=sha256:b8fe97f185194215f6193af45a17d2b30ebd72c8113e3650f2d7d6767b9c2206 \ + --hash=sha256:dc2d3804ff562795c1024130e0c3ce79736467930729dda314f096d0e35b98c8 \ + --hash=sha256:dd3ff5bfa6e65cf3d2550dc639c3da2a3bfa11087b83d57e06623c4c1607d583 +zipp==4.1.0 ; python_version < "3.12" and python_version >= "3.11" \ + --hash=sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f \ + --hash=sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602 diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 6e5aa7b..4022206 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,76 +1,76 @@ -numpy==2.4.5 ; python_version >= "3.11" \ - --hash=sha256:02981d0fc9f9ce147643d552966d47f329a02f7ecb3b113e84207242f20dfa83 \ - --hash=sha256:06760fe73ae5005008748d182de612c733542af3cde063d532cd2127561b27be \ - --hash=sha256:079b0fad6f2899b23c5da89792b5409d2d83fc83e8bd5c2299cc9c397a264864 \ - --hash=sha256:07ce7e74da92d7c71b5df157b9758bcdd53d7fea10602154de3afd2b3ddc34dd \ - --hash=sha256:09d7d97da1c2c62f4818b3e150a57572ff8dcf1cf5ac501aac832ffd4ebd9566 \ - --hash=sha256:0c6919cefafb3b76cd46a89dbb203bf1dd95529d2a6d09fef2d325d95d6a79d8 \ - --hash=sha256:0d63a780070871210853ba01e90b88f9b85cf2abf63a7f143d5127189265ddf6 \ - --hash=sha256:0e63caf31a1df06338ae63d999f7a33a675ced62eea9c9b02db4b1c1f45cff38 \ - --hash=sha256:130d58151c4db23e9fa860b84784e219a3aa3e030acc88a493ea37006c4dfd4c \ - --hash=sha256:144fcc5a3a17679b2b82543b4a2d8dd29937230a7af13232b5f753872feb6361 \ - --hash=sha256:14b86f56048ed09c3bbe48962a7dff077c2fd3274f8cf981800f3b38eac49cc3 \ - --hash=sha256:15f90d1256e9b2320aff24fde44815b787ab6d7c49a1a11bfd8138b321c5f080 \ - --hash=sha256:1616bde34b2bcba2fa9bde06217ce00da4f3d1bdfb264d54525a99e8fe170d83 \ - --hash=sha256:1811150e5148f5a01a7cc282cb2f489b4a3050a773e173adb480e507bad3a3d7 \ - --hash=sha256:1ef248460b645c102026b82337cc4e88231909c66dd77b59ec6d6cac7e44f277 \ - --hash=sha256:235f54b0156274d8fa3155db3ed6d2f401c7e8f3367c90db0a12f02a58fde6ed \ - --hash=sha256:27f4a6dc26353a860b348961b9aa9e009835688b435cfa105e873b8dc2c726f5 \ - --hash=sha256:2a235607a18df941760a695927051af4b1cd5d3ee85840d0e2af816785771feb \ - --hash=sha256:2caa576d1707b275cba1aeb60a5c50daa6fa2a3f28ecb08123bc05fd439005db \ - --hash=sha256:2d68d0b355ab2e39fe0de59001d7151dfdbbb880ef67baeed806661e03df5097 \ - --hash=sha256:3176dc8ff71dbb593606f91a69ad0c3cd3303c7eb546af477370ab9edf760288 \ - --hash=sha256:32f8f852273ef32b291201ac2a2c97629c4a1ee8632bb670e3443eaa09fc2e72 \ - --hash=sha256:3333dba6a4e611d666f69e177ba8fe4140366ff681a5feb2374d3fd4fff3acb6 \ - --hash=sha256:398bb16772b265b9fa5c07b07072646ea97137c10ffb62a9a087b277fc825c29 \ - --hash=sha256:40c71d50a4da1a7c317af419461052d3911a5770bfc5fd55baf52cc45e7a2c20 \ - --hash=sha256:4593d197270b894efeb538dcbe227e4bcf1c77f88c4c6bf933ead812cfaa4453 \ - --hash=sha256:4603622bdcdbf8dccb1d9d5b21d16a7aa4e473ae6c8e14048d846fd4ca2907a0 \ - --hash=sha256:4b51a01745cb04cc19278482207444b4d30728ce91c28d27a3bfae5fc6ff24c7 \ - --hash=sha256:4bb33e900ee81730ad77a258965134aa8ceac805124f7e5229347beda4b8d0aa \ - --hash=sha256:4bd2cd4ef9c0afa87de73723c0a33c0edff62143e1432917458e26d3d195d87f \ - --hash=sha256:4cd9f6fa7ce10dc4627f2bb81dd9075dab67e94632e04c2b638e12575ddaa862 \ - --hash=sha256:4ed78c904a638b6e5d7cd4db90c06fca5fc6ec2f28d258305368f454a50e79cf \ - --hash=sha256:4f5bc96d35d94e4ceab8b38a92241b4611e95dc44e63b9f1fa2a331858ee3507 \ - --hash=sha256:58dcf64969d870f36bc7fbd557d2617e997db7dc06261b6e3327148ea460d0a4 \ - --hash=sha256:654fb8674b61b1c4bd568f944d13a908566fdcb0d797303521d4149d16da05ef \ - --hash=sha256:685681e956fc8dcb75adc6ff26694e1dfd738b24bd8d4696c51ca0110157f912 \ - --hash=sha256:6bf0bfc1c2e1db972e30b6cd3d4861f477f3af908b27799b239dc3cbe3eb4b95 \ - --hash=sha256:6c18d49c67689c562854b53fdc433b93e47c12952aa6fa6d59f185e1a5992419 \ - --hash=sha256:6d7df2da2e7ea0624a43aa368104b3a3ce14aae98ad4bb2c9a93fecef76f1c97 \ - --hash=sha256:6de2883e0d2c63eae1bab1a84b390dca74aabb3d20ea1f5d58f360853c83abf3 \ - --hash=sha256:6f64dd84b277a737eb59513f6b9bb6195bf41ab11941ef15b2562dbab43fa8ef \ - --hash=sha256:7200c58f3f933ca61e66346667dcc8510bb111995e9ce15398a731e6a4afa4bb \ - --hash=sha256:7341b08ff8124d7353939778e2707b8732d03c78c1c30e0815aba2dacbe1245a \ - --hash=sha256:73d664413fb97229149c4711ef56531a6fe8c15c1c2626b0bbe497b84c287e70 \ - --hash=sha256:76ac6e90f5e226011c88f9b7040a4bcae612518bc7e9adc127e697a13b28ad1a \ - --hash=sha256:7c392e2c1bf596701d3c6832be7567eab5d5b0a13865036c33365ee097d37f8b \ - --hash=sha256:7f09a7e5f017d7098c66522097c96257411c9620c0926212200d66bc8cee3976 \ - --hash=sha256:84f58bed609b5669f5ad3d597901a4f1f86ee5b3c3708aaa55f05b4fe6e0f656 \ - --hash=sha256:86d980970f5110595ca14855768073b08585fc1acc36895de303e039e7dee4a5 \ - --hash=sha256:889ca2c072315de638a5194a772aa1fa2df92bdd6175f6a222d4784040424b61 \ - --hash=sha256:89e89304fb1f8c3f0ecfa4a7d48f311dd79771336a940e920159d643d1307e77 \ - --hash=sha256:93793222b524f692f12b2f8752ce8b1d9d9125b2bfd5dbf0fb69c92c5e1ce86c \ - --hash=sha256:993a88d8fdd8554466a8765cd8bacd97ba56b70ca6b0a04bcdca77f5afed4222 \ - --hash=sha256:9a05636d7937d0936f271e5ba957fa8d746b5be3c2025caa1a2508f4fe521d40 \ - --hash=sha256:b1c663ddc641f4192e90511bec61a09bc231e3bbdb996cdc6edbcaa0e528d685 \ - --hash=sha256:b35bee5ef99e8d227a07829bee2e864fcb65f7c157646fcd8ec8b4b45dd8b88f \ - --hash=sha256:b42d9496f79e3a728192f05a42d86e36163217b7cdecb3813d0028a0aa6b72d7 \ - --hash=sha256:c26c71080d35db5002102f5d9ff614d45de02aa1f7802943e691e063e5ee93bc \ - --hash=sha256:ca670567a5683b7c1670ec03e0ddd5862e10934e92a70751d68d7b7b74ca7f9f \ - --hash=sha256:d475afc8cbe935ff5944f753d863bba774d7f4e1feaaa4102901e3e053ca5963 \ - --hash=sha256:d51efede1e58e8b11877536a5518f60e318d8ff69b89ad7b38ee5e431b24d772 \ - --hash=sha256:d6c78e260b53affe9b395a9d54fc61f101f9521c4d9452c7e9e3718b19e2215b \ - --hash=sha256:d7828234a13185effb34979e146f9921f2a65dfbbe215e6dbb57d6478fc8e059 \ - --hash=sha256:d888bdf7335f76878c3c7b264ac1ff089863e211ec81249f9fb5795c2183dc25 \ - --hash=sha256:d8fc52b85a7b45e474be53eddf08e006d22e381a4e41bcde8e4aa08da0e7d198 \ - --hash=sha256:db304568c650e9d7039744d3575d0d287754debb2057d7c7b8cdfdc2c487a957 \ - --hash=sha256:deb01226f012539f3945261ffe1c10aec081a0fa0a5c925419933c70f3ae2d23 \ - --hash=sha256:ef3b5bb65437a3555c648e706475db01c645559ca80dc8b03e4f202ea757e0d6 \ - --hash=sha256:f96083adc3dfc1bbf778f2c79654d88115fa07074c97cb724fe9508f12d91c55 \ - --hash=sha256:fb352e7b8876da1249e72254736d6c58c505fa4e58a3d7e30efca241ca9ca9ce \ - --hash=sha256:fb4a6c9c537d6ccec9cc4aeae4261bd3cc79b070c67ddc0646f5b1c07fddde42 \ - --hash=sha256:fe28b64777ddfa0eca9b5f51474034ebe3dcb8324f48f27b28f479085673ae33 +numpy==2.4.6 ; python_version >= "3.11" \ + --hash=sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1 \ + --hash=sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4 \ + --hash=sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f \ + --hash=sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079 \ + --hash=sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096 \ + --hash=sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47 \ + --hash=sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66 \ + --hash=sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d \ + --hash=sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1 \ + --hash=sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e \ + --hash=sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147 \ + --hash=sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd \ + --hash=sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75 \ + --hash=sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063 \ + --hash=sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73 \ + --hash=sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab \ + --hash=sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4 \ + --hash=sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41 \ + --hash=sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402 \ + --hash=sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698 \ + --hash=sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7 \ + --hash=sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8 \ + --hash=sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b \ + --hash=sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8 \ + --hash=sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0 \ + --hash=sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662 \ + --hash=sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91 \ + --hash=sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0 \ + --hash=sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f \ + --hash=sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3 \ + --hash=sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f \ + --hash=sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67 \ + --hash=sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6 \ + --hash=sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997 \ + --hash=sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b \ + --hash=sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e \ + --hash=sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538 \ + --hash=sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627 \ + --hash=sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93 \ + --hash=sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02 \ + --hash=sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853 \ + --hash=sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c \ + --hash=sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43 \ + --hash=sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd \ + --hash=sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8 \ + --hash=sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089 \ + --hash=sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778 \ + --hash=sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1 \ + --hash=sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb \ + --hash=sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261 \ + --hash=sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb \ + --hash=sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a \ + --hash=sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8 \ + --hash=sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359 \ + --hash=sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5 \ + --hash=sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7 \ + --hash=sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751 \ + --hash=sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8 \ + --hash=sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605 \ + --hash=sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e \ + --hash=sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45 \ + --hash=sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2 \ + --hash=sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895 \ + --hash=sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe \ + --hash=sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb \ + --hash=sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a \ + --hash=sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577 \ + --hash=sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d \ + --hash=sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a \ + --hash=sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda \ + --hash=sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6 \ + --hash=sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20 packaging==26.2 ; python_version >= "3.11" \ --hash=sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e \ --hash=sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661 @@ -126,6 +126,9 @@ pandas==3.0.3 ; python_version >= "3.11" \ python-dateutil==2.9.0.post0 ; python_version >= "3.11" \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 +python-serafin==0.1.0 ; python_version >= "3.11" \ + --hash=sha256:2afd42ac11bded0182c0e90be7c72c3cf27ed48a45cb712f3b130df78e7edbc3 \ + --hash=sha256:621a85a99a5352d9335369be8903486b4fb2565559d30707446cb35d5b1b67c8 six==1.17.0 ; python_version >= "3.11" \ --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 diff --git a/xarray_selafin/Serafin.py b/xarray_selafin/Serafin.py deleted file mode 100644 index b812fcf..0000000 --- a/xarray_selafin/Serafin.py +++ /dev/null @@ -1,1326 +0,0 @@ -"""! -Adapted from https://github.com/CNR-Engineering/PyTelTools - -Read/Write Serafin files and manipulate associated data. - -Handles Serafin file with: - - single and double precision - - big and little endian - -The sizes (file, header, frame) are in bytes (8 bits). -""" -import copy -import logging -import os -import struct - -import numpy as np - -from .variable.variables_2d import VARIABLES_2D -from .variable.variables_3d import VARIABLES_3D - -# from .conf import settings - -logger = logging.getLogger(__name__) - - -# Default language for variables -LANG = "en" - -# Encoding Information Type (EIT) for Serafin title, variable names and units -SLF_EIT = "iso-8859-1" - - -VARIABLES_ID_2D, VARIABLES_ID_3D = {"fr": {}, "en": {}}, {"fr": {}, "en": {}} - - -def build_variables_table(): - base_folder = os.path.dirname(os.path.realpath(__file__)) - for dic, name in zip( - [VARIABLES_ID_2D, VARIABLES_ID_3D], ["Serafin_var2D.csv", "Serafin_var3D.csv"] - ): - with open(os.path.join(base_folder, "data", name), "r") as f: - f.readline() # header - for line in f.readlines(): - var_id, var_name_fr, var_name_en, _ = line.rstrip().split(";") - dic["fr"][var_name_fr] = var_id - dic["en"][var_name_en] = var_id - - -build_variables_table() - - -class SerafinValidationError(Exception): - """! - @brief Custom exception for Serafin file content check - """ - - def __init__(self, message): - """! - @param message : error message description - """ - super().__init__(message) - self.message = message - logger.error("SERAFIN VALIDATION ERROR: %s" % message) - - -class SerafinRequestError(Exception): - """! - @brief Custom exception for requesting invalid values from Serafin object - """ - - def __init__(self, message): - """! - @param message : error message description - """ - super().__init__(message) - self.message = message - logger.error("SERAFIN REQUEST ERROR: %s" % message) - - -class SerafinHeader: - """! - @brief: Data type for reading and storing the Serafin file header - - # Attributes: - ## Sizes - - file_size : total file size - - header_size : size taken by header only (set by `_set_header_size`) - - frame_size : size taken by a single frame (set by `_set_frame_size`) - - ## Float precision: simple or double precision - (attributes are set by `_set_as_single_precision` or `_set_as_double_precision`) - - float_type : 'f' or 'd' - - float_size : 4 or 8 - - np_float_type: np.float32 or np.float64 - - - endian : file endianness ('>' = big-endian, '<' = little-endian) - - - title : title of the simulation - - file_format : file format type (e.g. b'SERAFIN ') - - language : language for variables ('fr' or 'en') - - - is_2d : True in 2D else False - - has_knolg : True if ipobo is replaced by KNOLG array - - date <[int]>: list with 6 integers (year, month, day, hour, minute and second) or None if not available - - nb_frames : number of frames - - - nb_var : number of variables - - nb_var_quadratic : ? - - nb_nodes_per_elem : number of nodes per element - - nb_planes : number of layers (should be 0 in 2D) - - - var_IDs <[str]>: variable identifiers - - var_names <[str]>: variable names - - var_units <[str]>: variable units - - - params <(int)>: tuple of 10 integer parameters - - nb_elements : number of 3D elements - - nb_nodes : number of 3D nodes - - nb_nodes_per_elem : number of nodes per element (= 3 in 2D and 6 in 3D) - - nb_nodes_2d : number of 2D nodes (equals to `nb_nodes` in 2D) - - - mesh_origin <(int, int)>: x and y shift to apply to written coordinates (set by `set_mesh_origin`) - - x_stored : east written coordinates [shape = nb_nodes] - - y_stored : north written coordinates [shape = nb_nodes] - - x : east coordinates [shape = nb_nodes] (set by `_compute_mesh_coordinates`) - - y : north coordinates [shape = nb_nodes] (set by `_compute_mesh_coordinates`) - - ikle : connectivity table with 1-indexed nodes number [shape = nb_nodes_per_elem * nb_elements] - - ikle_2d : reshaped connectivity table - [shape = (nb_elements, nb_nodes_per_elem)] (set by `_build_ikle_2d`) - - ipobo : array with 0 values for inner nodes and 1-indexed node number for boundary nodes - [shape = nb_nodes] - """ - - def __init__(self, title="", format_type="SERAFIN ", lang=LANG, endian=">"): - """ - @param title : title of the simulation - @param format_type : - @param lang : language for variables - """ - self.file_size = -1 - self.header_size = -1 - self.frame_size = -1 - - self.float_type = "" - self.float_size = -1 - self.np_float_type = None - - self.endian = endian - - self.title = bytes(title, SLF_EIT).ljust(72) - self.file_format = b"".ljust(8) - self._set_file_format_and_precision(format_type) - - if lang not in ("fr", "en"): - raise SerafinRequestError( - "Language (for Serafin variables) %s is not implemented" % lang - ) - self.language = lang - - self.is_2d = True - self.has_knolg = False - self.date = None - - self.nb_var = 0 - self.nb_var_quadratic = 0 - self.nb_planes = 0 - self.nb_frames = 0 - - self.var_IDs = [] - self.var_names = [] - self.var_units = [] - - self.params = (1, 0, 0, 0, 0, 0, 0, 0, 0, 0) - self.nb_elements = -1 - self.nb_nodes = -1 - self.nb_nodes_per_elem = -1 - self.nb_nodes_2d = -1 - - self.mesh_origin = (0, 0) - self.x_stored = None - self.y_stored = None - self.x = None - self.y = None - self.ikle = None - self.ikle_2d = None - self.ipobo = None - - @property - def np_type(self): - return np.dtype(self.np_float_type).newbyteorder(self.endian) - - def _check_dim(self): - # verify data consistence and determine 2D or 3D - if self.is_2d: - if self.nb_nodes_per_elem not in (1, 3): - raise SerafinValidationError("Unknown mesh type") - else: - if self.nb_nodes_per_elem != 6: - raise SerafinValidationError( - "The number of nodes per element is not equal to 6" - ) - if self.nb_planes < 2: - raise SerafinValidationError("The number of planes is less than 2") - - def _set_file_format_and_precision(self, file_format): - """! - @brief: Set some attributes to read/write single or double precision Serafin depending on file format - @file_format : Serafin file format (max length is 8) - If file format is not recognized, the file is expected to be simple precision - """ - self.file_format = bytes(file_format, SLF_EIT).ljust(8) - if file_format in ("SERAFIND", "SELAFIND", " D"): - self._set_as_double_precision() - else: - if file_format not in ("SERAFIN ", "SERAFINS", "SELAFIN ", "SERAPHIN"): - logger.warning( - 'Format "%s" is unknown and is forced to "SERAFIN "' % file_format - ) - self.file_format = bytes("SERAFIN", SLF_EIT).ljust(8) - self._set_as_single_precision() - - def _set_has_knolg(self): - self.has_knolg = self.params[7] != 0 or self.params[8] != 0 - - def compute_ikle(self, nb_planes, nb_nodes_per_elem): - ikle_bottom_pattern = np.concatenate( - (self.ikle_2d, self.ikle_2d + self.nb_nodes_2d), axis=1 - ) - ikle = np.empty( - (nb_planes - 1, self.nb_elements // (nb_planes - 1), nb_nodes_per_elem), - dtype=np.int64, - ) - for i in range(nb_planes - 1): - ikle[i] = ikle_bottom_pattern + i * self.nb_nodes_2d - return ikle.flatten() - - def build_params(self): - self.params = ( - 1, - 0, - self.mesh_origin[0], - self.mesh_origin[1], - 0, - 0, - self.nb_planes, - 0, - 0, - 0 if self.date is None else 1, - ) - - def _build_ikle_2d(self): - if self.is_2d: - self.ikle_2d = self.ikle.reshape(self.nb_elements, self.nb_nodes_per_elem) - else: - ikle = self.ikle.reshape(self.nb_elements, self.nb_nodes_per_elem) - self.ikle_2d = np.empty( - [self.nb_elements // (self.nb_planes - 1), 3], dtype=np.int64 - ) - nb_lines = self.ikle_2d.shape[0] - # test the integer division - if nb_lines * (self.nb_planes - 1) != self.nb_elements: - raise SerafinValidationError( - "The number of elements is not divisible by (number of planes - 1)" - ) - for i in range(nb_lines): - self.ikle_2d[i] = ikle[i, [0, 1, 2]] - - def _set_as_single_precision(self): - """Set Serafin as single precision""" - self.float_type = "f" - self.float_size = 4 - self.np_float_type = np.float32 - - def _set_as_double_precision(self): - """Set Serafin as double precision""" - self.float_type = "d" - self.float_size = 8 - self.np_float_type = np.float64 - - def unpack_int(self, bytes2unpack, nb=1): - """ - Unpack bytes to integer(s) - @param bytes2unpack : bytes to unpack - @param nb : number of consecutive integers - @return <(int)> - """ - fmt = self.endian + str(nb) + "i" - return struct.unpack(fmt, bytes2unpack) - - def unpack_float(self, bytes2unpack, nb=1): - """ - Unpack bytes to float(s) - @param bytes2unpack : bytes to unpack - @param nb : number of consecutive float - @return <(float)> - """ - fmt = self.endian + str(nb) + self.float_type - return struct.unpack(fmt, bytes2unpack) - - def pack_int(self, *args, nb=1): - """ - Pack integers - @param args <(int)>: integers to pack - @param nb : number of integer values - @return - """ - fmt = self.endian + str(nb) + "i" - return struct.pack(fmt, *args) - - def pack_float(self, *args, nb=1): - """ - Pack floats - @param args <(float)>: floats to pack - @param nb : number of float values - @return - """ - fmt = self.endian + str(nb) + self.float_type - return struct.pack(fmt, *args) - - def toggle_endianness(self): - """Toggle original endianness (between big or little endian)""" - if self.endian == ">": - self.endian = "<" - else: - self.endian = ">" - logger.debug( - "Toggle endianness to %s" % ("big" if self.endian == ">" else "litte") - ) - - def _compute_mesh_coordinates(self): - """Compute mesh coordinates from origin""" - # if settings.ENABLE_MESH_ORIGIN: - self.x = self.mesh_origin[0] + self.x_stored - self.y = self.mesh_origin[1] + self.y_stored - # else: - # self.x = self.x_stored - # self.y = self.y_stored - - def _set_header_size(self): - """Set header size""" - nb_ikle_values = self.nb_elements * self.nb_nodes_per_elem - coord_size = self.nb_nodes * self.float_size - self.header_size = ( - (80 + 8) - + (8 + 8) - + (self.nb_var * (8 + 32)) - + (40 + 8) - + (self.params[-1] * ((6 * 4) + 8)) - + (16 + 8) - + (nb_ikle_values * 4 + 8) - + (self.nb_nodes * 4 + 8) - + 2 * (coord_size + 8) - ) - - def _set_frame_size(self): - """Set frame size (all variable values for one time step)""" - self.frame_size = ( - 8 + self.float_size + (self.nb_var * (8 + self.nb_nodes * self.float_size)) - ) - - def _expected_file_size(self): - """Returns expected file size""" - return self.header_size + self.nb_frames * self.frame_size - - def summary(self): - template = ( - "The file is of type {} {}. It has {} variable{}{},\n" - "on {} nodes and {} elements for {} time frame{}." - ) - return template.format( - self.file_format.decode(SLF_EIT), - {True: "2D", False: "3D"}[self.is_2d], - self.nb_var, - ["", "s"][self.nb_var > 1], - "" if self.is_2d else ", %d layers" % self.nb_planes, - self.nb_nodes, - self.nb_elements, - self.nb_frames, - ["", "s"][self.nb_frames > 1], - ) - - def copy(self): - """Returns a deep copy of the current instance""" - return copy.deepcopy(self) - - def copy_as_2d(self): - """! - Returns a 2D equivalent copy of the current instance - @return : output Serafin header - """ - if self.is_2d: - raise SerafinRequestError( - "Cannot convert header to a 2D equivalent because the input is not 3D" - ) - - ori_params = self.params - nb_planes = self.nb_planes - new_header = self.copy() - - # Overwrites relevant attributes - new_header.nb_planes = 0 - new_params = list(ori_params) - new_params[6] = new_header.nb_planes - new_header.params = tuple(new_params) - new_header.is_2d = True - new_header.nb_elements //= nb_planes - 1 - new_header.nb_nodes //= nb_planes - new_header.nb_nodes_per_elem = 3 - new_header.nb_nodes_2d = new_header.nb_nodes - npd = new_header.nb_nodes_per_elem - new_header.ikle = np.take( - self.ikle, - [2 * npd * i + j for i in range(new_header.nb_elements) for j in range(3)], - ) - new_header.ipobo = self.ipobo[: self.nb_nodes_2d] - new_header.x_stored = self.x_stored[: self.nb_nodes_2d] - new_header.y_stored = self.y_stored[: self.nb_nodes_2d] - new_header._compute_mesh_coordinates() - - # Update sizes - new_header._set_header_size() - new_header._set_frame_size() - new_header.file_size = new_header._expected_file_size() - - return new_header - - def copy_as_3d(self, nb_planes): - """! - Returns a 3D equivalent copy of the current instance - @param nb_planes : number of planes - @return : output Serafin header - """ - if not self.is_2d: - raise SerafinRequestError( - "Cannot convert header to a 3D equivalent because the input is not 2D" - ) - if nb_planes < 2: - raise SerafinRequestError("A 3D file has to contain at least 2 planes") - ori_params = self.params - new_header = self.copy() - - # Overwrites relevant attributes - new_header.nb_planes = nb_planes - new_params = list(ori_params) - new_params[6] = new_header.nb_planes - new_header.params = tuple(new_params) - new_header.is_2d = False - new_header.nb_elements *= nb_planes - 1 - new_header.nb_nodes *= nb_planes - new_header.nb_nodes_per_elem = 6 - - ikle_bottom_pattern = np.concatenate( - (self.ikle_2d, self.ikle_2d + new_header.nb_nodes_2d), axis=1 - ) - ikle = np.empty( - (nb_planes - 1, self.nb_elements, new_header.nb_nodes_per_elem), - dtype=np.int64, - ) - for i in range(nb_planes - 1): - ikle[i] = ikle_bottom_pattern + i * new_header.nb_nodes_2d - new_header.ikle = ikle.flatten() - new_header._build_ikle_2d() - - ipobo = np.empty((nb_planes, new_header.nb_nodes_2d), dtype=np.int64) - for i in range(nb_planes): - ipobo[i] = self.ipobo + i * self.ipobo.max() - ipobo[i][self.ipobo == 0] = 0 - new_header.ipobo = ipobo.flatten() - - new_header.x_stored = np.tile(self.x_stored, nb_planes) - new_header.y_stored = np.tile(self.y_stored, nb_planes) - new_header._compute_mesh_coordinates() - - # Update sizes - new_header._set_header_size() - new_header._set_frame_size() - new_header.file_size = new_header._expected_file_size() - - return new_header - - def nearest_node(self, target_x, target_y): - """! - Find the nearest node of a target point (from x and y coordinates) - @param target_x : east target coordinate - @param target_y : north target coordinate - @return : node number (1-indexed) - """ - dist = np.sqrt(np.power(self.x - target_x, 2) + np.power(self.y - target_y, 2)) - return np.argmin(dist) + 1 - - def same_2d_mesh(self, other): - """! - @brief: Check if the other mesh is strictly identical (same order of nodes and elements) on the horizontal - @param other : header to compare - @return: bool - """ - # Speedup in comparing by increasing complexity - if ( - self.nb_nodes_2d != other.nb_nodes_2d - or self.nb_elements != other.nb_elements - ): - return False - elif np.all(self.x_stored != other.x_stored) or np.all( - self.y_stored != other.y_stored - ): - return False - elif np.all(self.ikle != other.ikle) or np.all(self.ipobo != other.ipobo): - return False - else: - return True - - def is_double_precision(self): - return self.float_type == "d" - - def to_single_precision(self): - self.file_format = bytes("SERAFIN", SLF_EIT).ljust(8) - self.float_type = "f" - self.float_size = 4 - self.np_float_type = np.float32 - self._set_frame_size() - self._set_header_size() - self.file_size = self._expected_file_size() - - def to_double_precision(self): - self.file_format = bytes("SERAFIND", SLF_EIT).ljust(8) - self.float_type = "d" - self.float_size = 8 - self.np_float_type = np.float64 - self._set_frame_size() - self._set_header_size() - self.file_size = self._expected_file_size() - - def empty_variables(self): - """Empty all variables""" - self.nb_var = 0 - self.var_IDs, self.var_names, self.var_units = [], [], [] - - def add_variable(self, var_ID, var_name, var_unit): - """! - @brief: Add a single variable - @param var_ID : variables identifier (abbreviation) - @param var_name : variable name - @param var_unit : variable unit - """ - self.nb_var += 1 - self.var_IDs.append(var_ID) - self.var_names.append(var_name) - self.var_units.append(var_unit) - - def add_variable_str(self, var_ID, var_name, var_unit): - """! - @brief: Add a single variable with strings - @param var_ID : variables identifier (abbreviation) - @param var_name : variable name - @param var_unit : variable unit - """ - self.nb_var += 1 - self.var_IDs.append(var_ID) - self.var_names.append(bytes(var_name, SLF_EIT).ljust(16)) - self.var_units.append(bytes(var_unit, SLF_EIT).ljust(16)) - - def add_variable_from_ID(self, var_ID): - """! - @brief: Add new variable from its ID - @param var_ID : variable ID - """ - try: - if self.is_2d: - var_name = VARIABLES_2D[var_ID].name(self.language) - var_unit = VARIABLES_2D[var_ID].unit() - else: - var_name = VARIABLES_3D[var_ID].name(self.language) - var_unit = VARIABLES_3D[var_ID].unit() - except KeyError: - raise SerafinRequestError( - 'The variable "%s" is not known (lang=%s)' % (var_ID, self.language) - ) - self.add_variable_str(var_ID, var_name, var_unit) - - def set_mesh_origin(self, x, y): - """! - @brief: Set mesh origin coordinates (Beware: coordinates should be integers!) - @param x : X-coordinate of the origin - @param y : Y-coordinate of the origin - """ - assert isinstance(x, int) and isinstance(y, int) - self.mesh_origin = (x, y) - params = list(self.params) - params[2] = x - params[3] = y - self.params = tuple(params) - - def set_variables(self, selected_vars): - """! - @brief: Set new variables - @param selected_vars <[str, bytes, bytes]>: list composed of variable ID, name and unit - """ - self.empty_variables() - for var_ID, var_name, var_unit in selected_vars: - self.add_variable(var_ID, var_name, var_unit) - - def iter_on_all_variables(self): - """! - Iterate on variables - @return : variable ID, name and unit - """ - for var_ID, var_name, var_unit in zip( - self.var_IDs, self.var_names, self.var_units - ): - yield var_ID, var_name, var_unit - - def transform_mesh_copy(self, transformations): - """! - @brief Apply transformations on 2D nodes of a mesh copy - @param transformations <[geom.transformation.Transformation]>: list of successive transformations - @return: modified copy of original header with transformed mesh nodes - """ - if not transformations: - return self.copy() - points = [np.array([x, y, 0]) for x, y in zip(self.x, self.y)] - for t in transformations: - points = [t(p) for p in points] - new_header = self.copy() - new_header.x_stored = np.array([p[0] for p in points]) - new_header.y_stored = np.array([p[1] for p in points]) - self.set_mesh_origin(0, 0) - self._compute_mesh_coordinates() - return new_header - - def transform_mesh(self, transformations): - """! - @brief Apply transformations on mesh nodes (only in 2D) - @param transformations <[geom.transformation.Transformation]>: list of successive transformations - """ - if not transformations: - return - points = [np.array([x, y, 0]) for x, y in zip(self.x, self.y)] - for t in transformations: - points = [t(p) for p in points] - self.x_stored = np.array([p[0] for p in points]) - self.y_stored = np.array([p[1] for p in points]) - self.set_mesh_origin(0, 0) - self._compute_mesh_coordinates() - - def is_ccw(self, vertices): - """! - @brief return True if the boundary is counter-clockwise (only in 2D) - @param vertices <[float]>: list of coordinates - """ - v = np.array(vertices) - x = v[:, 0] - y = v[:, 1] - return np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1)) < 0 - - def get_all_edges(self): - """Get all edges (pair of nodes)""" - edges = np.zeros((3 * len(self.ikle_2d), 2), dtype=np.int64) - for i, (n1, n2, n3) in enumerate(self.ikle_2d): - edges[3 * i, :] = [n1, n2] - edges[3 * i + 1, :] = [n2, n3] - edges[3 * i + 2, :] = [n3, n1] - return edges - - def get_external_edges(self): - """Get external edges (pair of nodes)""" - edges = self.get_all_edges() - # Trick to identify unique pair of nodes (even if node orders might differ) in defining a strange function - edges_multi = edges[:, 0] * edges[:, 1] / (edges[:, 0] + edges[:, 1]) - unique, unique_inverse, unique_counts = np.unique( - edges_multi, return_inverse=True, return_counts=True - ) - # A boundary node is connected only once to another node (not twice!) - boundary_edges = edges[unique_counts[unique_inverse] == 1] - return boundary_edges - - def iter_on_boundaries(self): - """ - Iterate over all boundaries to get the nodes describing them - Each element is an ordered list of nodes (1-indexed numbering) - - How boundaries are defined: - - the first boundary is the external boundary and then the islands (internal boundaries) are described - in an arbitrary order - - the external boundary is described counter-clockwise - - the islands are described clockwise - - the first boundary node should be the node with the minimum value of x+y (corresponds to the bottom left corner) - """ - boundary_edges = self.get_external_edges() - - # Build boundaries by iteration on all boundary edges (for each boundary, from first node until it loops) - id_boundary = 1 - while len(boundary_edges) != 0: - boundary_nodes = np.unique( - boundary_edges.flatten() - ) # Node numbering 1-indexed - x_plus_y = self.x[boundary_nodes - 1] + self.y[boundary_nodes - 1] - - # current_boundary_nodes, first_node, prev_node and next_node contain 1-indexed node(s) - first_node = boundary_nodes[np.argmin(x_plus_y)] - logger.debug( - "Build new boundary from node %i among %i nodes" - % (first_node, len(boundary_nodes)) - ) - prev_node = copy.deepcopy(first_node) - next_node = -1 - - # Build list of nodes describing the boundary (/!\ first and last node are explicitly duplicated): - current_boundary_nodes = [first_node] - while next_node != first_node: - try: - index = np.where(boundary_edges == prev_node)[0][0] - except IndexError: - logger.critical(np.where(boundary_edges == prev_node)) - raise SerafinRequestError( - "Unexpected error while determining next boundary node after node %i" - % prev_node - ) - n1, n2 = boundary_edges[index, :] - boundary_edges = np.delete(boundary_edges, index, axis=0) - next_node = n1 if n2 == prev_node else n2 - prev_node = next_node - current_boundary_nodes.append(next_node) - - # Determine if boundary is clock-wise - if len(current_boundary_nodes) > 2: - boundary_geom = [ - (self.x[n - 1], self.y[n - 1]) for n in current_boundary_nodes[:-1] - ] - - ccw = self.is_ccw(boundary_geom) - else: - ccw = True # arbitrary value (order can not be defined!) - - # Reverse node ordering (if necessary) and remove last duplicated node - if id_boundary == 1: # this is the first boundary (external) - if not ccw: - current_boundary_nodes.reverse() - else: # current boundary is an island - if ccw: - current_boundary_nodes.reverse() - current_boundary_nodes.pop() - logger.debug( - "Boundary %i has %i nodes" % (id_boundary, len(current_boundary_nodes)) - ) - yield current_boundary_nodes - id_boundary += 1 - - def build_ipobo(self): - """ - Build IPOBO array containing 0 values for inner nodes and 1-indexed node number for boundary nodes - Beware: This method will probably crash if some nodes are duplicated! - """ - ipobo_2d = np.zeros(self.nb_nodes_2d, dtype=np.int64) - - try: - id_boundary_node = 0 - for boundary_nodes in self.iter_on_boundaries(): - for n in boundary_nodes: - id_boundary_node += 1 - ipobo_2d[n - 1] = id_boundary_node - - self.ipobo = ipobo_2d - if not self.is_2d: - shift_ipobo = np.zeros(self.nb_nodes_2d) - shift_ipobo[ipobo_2d > 0] = id_boundary_node - for i_plan in range(self.nb_planes): - if i_plan > 0: - self.ipobo = np.concatenate( - (self.ipobo, ipobo_2d + i_plan * shift_ipobo) - ) - except SerafinRequestError: - logger.warning( - "The IPOBO table could not be built and set to 0. Check if some nodes are superimposed." - ) - self.ipobo = np.zeros(self.nb_nodes, dtype=np.int64) - - def _set_as_2d(self): - """! - Beware: nb_nodes_2d has to be consistant - """ - self.is_2d = True - self.nb_nodes_2d = self.nb_nodes - self.nb_planes = 0 - self.nb_nodes_per_elem = 3 - - def from_triangulation(self, nodes, ikle, ipobo=None): - """! - Set to Serafin 2D header from a given triangulation - - @param nodes : x and y coordinates - @param ikle : connectivity table (1-indexed) - @param ipobo : boundary indicator table - """ - assert ikle.min() == 1 and ikle.max() == len( - nodes - ) # check arrays are 1-indexed - self.nb_nodes = nodes.shape[0] - self._set_as_2d() - self.nb_elements = ikle.shape[0] - self.x_stored = nodes[:, 0] - self.y_stored = nodes[:, 1] - self._compute_mesh_coordinates() - self.ikle = ikle.flatten() - self._build_ikle_2d() - self.build_params() - if ipobo is None: - self.build_ipobo() - else: - if ipobo.shape != (len(nodes),): - raise SerafinValidationError( - "IPOBO table is not a 1D-array with length of %i." % len(nodes) - ) - self.ipobo = ipobo - - def from_file(self, file, file_size): - """! - @param file <_io.BufferedReader>: input Serafin stream - @param file_size : file size (in bytes) - @return : output Serafin header - """ - # Check if file is empty (usefull if re-runs after a crash) - if self.file_size == 0: - raise SerafinValidationError("File is empty (file size is equal to 0)") - self.file_size = file_size - - # Determine binary file endianness from first integer - first_int_block = file.read(4) - if struct.unpack(">i", first_int_block)[0] == 80: - self.endian = ">" - elif struct.unpack(": language for variables ('fr' or 'en') - - mode : file open mode - - file <_io.BufferedReader>: input Serafin stream - - filename : path to file - - file_size : size of file - """ - - def __init__(self, filename, mode, language): - self.language = language - self.mode = mode - - self.file = None # will be opened when called using `with` statement - self.filename = filename - self.file_size = None - - def __enter__(self): - self.file = open(self.filename, self.mode) - return self - - def __exit__(self, *args, **kwargs): - self.file.close() - return False - - -class Read(Serafin): - """! - @brief Serafin file input stream - - # Additional attributes: - - header : Serafin header - - time <[float]>: time series in seconds - """ - - def __init__(self, filename, language): - """! - @param filename : path to input Serafin file - @param language : Serafin variable name language ('fr' or 'en') - """ - super().__init__(filename, "rb", language) - self.header = None - self.time = [] - self.file_size = os.path.getsize(self.filename) - - def unpack_array(self, size, np_type): - """! - @brief Interpret the buffer file as a 1-dimensional array - @param size : size (number of values * number of bytes) - @param np_type : numpy type format (`>f4` for example) - """ - return np.frombuffer(self.file.read(size), dtype=np_type) - - def read_header(self): - """! - @brief Read the file header and check the file consistency - """ - self.header = SerafinHeader(lang=self.language) - self.header.from_file(self.file, self.file_size) - - def get_time(self): - """! - @brief Read the time in the Serafin file - """ - if self.header is None: - raise SerafinRequestError( - "Cannot read time without any header (forgot read_header ?)" - ) - self.file.seek(self.header.header_size, 0) - for _ in range(self.header.nb_frames): - self.file.read(4) - self.time.append( - self.header.unpack_float(self.file.read(self.header.float_size), 1)[0] - ) - self.file.read(4) - self.file.seek(self.header.frame_size - 8 - self.header.float_size, 1) - - def subset_time(self, start, end, ech): - """! - @brief Get a subset of the time frames list - @param start : starting time (in seconds) - @param end : ending time (in seconds) - @param ech : sampling frequency - @return <[float]>: sampled time serie - """ - new_time = [] - for time_index, time in enumerate(self.time): - if start <= time <= end: - if time_index % ech == 0: - new_time.append((time_index, time)) - return new_time - - def _get_var_index(self, var_ID): - """! - @brief Handle data request by variable ID - @param var_ID : the ID of the requested variable - @return index the index of the frame (0-based) - """ - if self.header is None: - raise SerafinRequestError( - "Cannot extract variable from empty list (forgot read_header ?)" - ) - try: - index = self.header.var_IDs.index(var_ID) - except ValueError: - raise SerafinRequestError("Variable ID %s not found" % var_ID) - return index - - def _seek_to_frame(self, time_index, pos_var=0): - return self.file.seek( - self.header.header_size - + time_index * self.header.frame_size - + 8 - + self.header.float_size - + pos_var * (8 + self.header.float_size * self.header.nb_nodes), - 0, - ) - - def read_var_in_frame(self, time_index, var_ID): - """! - @brief Read a single variable in a frame - @param time_index : the index of the frame (0-based) - @param var_ID : variable ID - @return : values of the variables, of length equal to the number of nodes - """ - if time_index < 0: - raise SerafinRequestError("Impossible to read a negative time index!") - pos_var = self._get_var_index(var_ID) - self._seek_to_frame(time_index, pos_var) - self.file.read(4) - array = self.unpack_array( - self.header.float_size * self.header.nb_nodes, self.header.np_type - ) - if len(array) != self.header.nb_nodes: - raise SerafinRequestError("CRITICAL ERROR: buffer was truncated (%i vs %i values) while reading" - % (len(array), self.header.nb_nodes)) - return array - - def read_vars_in_frame(self, time_index, var_IDs=None): - """! - @brief Read multiple variables in a frame - @param time_index : the index of the frame (0-based) - @param var_IDs <[str]>: list of variable IDs (if not present, all variables are considered) - @return : values of the variables with shape (number of variables, number of 2D nodes) - """ - if var_IDs is None: - var_IDs = self.header.var_IDs - if time_index < 0: - raise SerafinRequestError("Impossible to read a negative time index!") - - res = np.empty( - (len(var_IDs), self.header.nb_nodes), dtype=self.header.np_float_type - ) - for i, var_ID in enumerate(var_IDs): - pos_var = self._get_var_index(var_ID) - self._seek_to_frame(time_index, pos_var) - self.file.read(4) - res[i, :] = self.unpack_array( - self.header.float_size * self.header.nb_nodes, self.header.np_type - ) - return res - - def iter_on_all_frames(self): - """! - @brief iterate over all frames with time and values - @return <(float, numpy 2D-array)>: tuple with time and values of the variables with shape - (number of variables, number of 2D nodes) - """ - self.file.seek(self.header.header_size, 0) - - res = np.empty( - (self.header.nb_var, self.header.nb_nodes), dtype=self.header.np_float_type - ) - for time_index in range(self.header.nb_frames): - self.file.read(4) - time = self.header.unpack_float(self.file.read(self.header.float_size), 1)[ - 0 - ] - self.file.read(4) - - for i in range(self.header.nb_var): - self.file.read(4) - res[i, :] = self.unpack_array( - self.header.float_size * self.header.nb_nodes, self.header.np_type - ) - self.file.read(4) - - yield time, res - - def read_var_in_frame_as_3d(self, time_index, var_ID): - """! - @brief Read a single variable in a 3D frame - @param time_index : the index of the frame (0-based) - @param var_ID : variable ID - @return : values of the variables with shape (planes number, number of 2D nodes) - """ - if self.header.is_2d: - raise SerafinRequestError("Reading values as 3D is only possible in 3D!") - new_shape = (self.header.nb_planes, self.header.nb_nodes_2d) - return self.read_var_in_frame(time_index, var_ID).reshape(new_shape) - - def read_vars_in_frame_as_3d(self, time_index, var_IDs=None): - """! - @brief Read multiple variables in a 3D frame - @param time_index : the index of the frame (0-based) - @param var_IDs <[str]>: list of variable IDs (if not present, all variables are considered) - @return : values of the variables with shape - (number of variables, planes number, number of 2D nodes) - """ - if self.header.is_2d: - raise SerafinRequestError("Reading values as 3D is only possible in 3D!") - if var_IDs is None: - var_IDs = self.header.var_IDs - new_shape = (len(var_IDs), self.header.nb_planes, self.header.nb_nodes_2d) - return self.read_vars_in_frame(time_index, var_IDs).reshape(new_shape) - - def read_var_in_frame_at_layer(self, time_index, var_ID, iplan): - """! - @brief Read a single variable in a frame at specific layer - @param time_index : the index of the frame (0-based) - @param var_ID : variable ID - @param iplan : 1-based index of layer - @return : values of the variables, of length equal to the number of nodes - """ - if self.header.is_2d: - raise SerafinRequestError( - "Extracting values at a specific layer is only possible in 3D!" - ) - if iplan < 1 or iplan > self.header.nb_planes: - raise SerafinRequestError( - "Layer %i is not inside [1, %i]" % (iplan, self.header.nb_planes) - ) - return self.read_var_in_frame_as_3d(time_index, var_ID)[iplan + 1] - - -class Write(Serafin): - """! - @brief Serafin file output stream - - (No additional attributes) - """ - - def __init__(self, filename, language, overwrite=False): - """! - @param filename : path to output Serafin file - @param language : Serafin variable name language ('fr' or 'en') - @param overwrite : overwrite if file already exists - """ - mode = "wb" if overwrite else "xb" - super().__init__(filename, mode, language) - logger.info('Writing the output file: "%s"' % filename) - - def __enter__(self): - try: - return Serafin.__enter__(self) - except FileExistsError: - raise SerafinRequestError("Cannot overwrite existing file") - - def write_header(self, header): - """! - @brief Write Serafin header from attributes - """ - logger.debug( - "Writing header with %i nodes, %i elements %s and %i variable %s" - % ( - header.nb_nodes, - header.nb_elements, - "" if header.is_2d else ", %i layers" % header.nb_planes, - header.nb_var, - ["", "s"][header.nb_var > 1], - ) - ) - - # Title and file type - self.file.write(header.pack_int(80)) - self.file.write(header.title) - self.file.write(header.file_format) - self.file.write(header.pack_int(80)) - - # Number of variables - self.file.write(header.pack_int(8)) - self.file.write(header.pack_int(header.nb_var)) - self.file.write(header.pack_int(header.nb_var_quadratic)) - self.file.write(header.pack_int(8)) - - # Variable names and units - for j in range(header.nb_var): - self.file.write(header.pack_int(2 * 16)) - self.file.write(header.var_names[j].ljust(16)) - self.file.write(header.var_units[j].ljust(16)) - self.file.write(header.pack_int(2 * 16)) - - # Date - self.file.write(header.pack_int(10 * 4)) - self.file.write(header.pack_int(*header.params, nb=10)) - self.file.write(header.pack_int(10 * 4)) - if header.params[-1] == 1: - self.file.write(header.pack_int(6 * 4)) - self.file.write(header.pack_int(*header.date, nb=6)) - self.file.write(header.pack_int(6 * 4)) - - # Number of elements, of nodes, of nodes per element and the magic number - self.file.write(header.pack_int(4 * 4)) - self.file.write(header.pack_int(header.nb_elements)) - self.file.write(header.pack_int(header.nb_nodes)) - self.file.write(header.pack_int(header.nb_nodes_per_elem)) - self.file.write(header.pack_int(1)) # magic number - self.file.write(header.pack_int(4 * 4)) - - # IKLE - nb_ikle_values = header.nb_elements * header.nb_nodes_per_elem - self.file.write(header.pack_int(4 * nb_ikle_values)) - self.file.write( - np.array(header.ikle, dtype=np.dtype(np.int32).newbyteorder(header.endian)) - ) - self.file.write(header.pack_int(4 * nb_ikle_values)) - - # IPOBO - self.file.write(header.pack_int(4 * header.nb_nodes)) - self.file.write( - np.array(header.ipobo, dtype=np.dtype(np.int32).newbyteorder(header.endian)) - ) - self.file.write(header.pack_int(4 * header.nb_nodes)) - - # X coordinates - self.file.write(header.pack_int(header.float_size * header.nb_nodes)) - self.file.write(np.array(header.x_stored, dtype=header.np_type)) - self.file.write(header.pack_int(header.float_size * header.nb_nodes)) - - # Y coordinates - self.file.write(header.pack_int(header.float_size * header.nb_nodes)) - self.file.write(np.array(header.y_stored, dtype=header.np_type)) - self.file.write(header.pack_int(header.float_size * header.nb_nodes)) - - def write_entire_frame(self, header, time_to_write, values): - """! - @brief write all variables/nodes values - @param header : output header - @param time_to_write : output time (in seconds) - @param values : values to write, of dimension (nb_var, nb_nodes) - """ - if values.shape != (header.nb_var, header.nb_nodes): - raise SerafinValidationError( - "Shape of values %s is not consistant with SerafinHeader (%i, %i)" - % (str(values.shape), header.nb_var, header.nb_nodes) - ) - self.file.write(header.pack_int(header.float_size)) - self.file.write(header.pack_float(time_to_write)) - self.file.write(header.pack_int(header.float_size)) - - for i in range(header.nb_var): - self.file.write(header.pack_int(header.float_size * header.nb_nodes)) - self.file.write(np.array(values[i, :], dtype=header.np_type)) - self.file.write(header.pack_int(header.float_size * header.nb_nodes)) diff --git a/xarray_selafin/data/Serafin_var2D.csv b/xarray_selafin/data/Serafin_var2D.csv deleted file mode 100644 index 975b466..0000000 --- a/xarray_selafin/data/Serafin_var2D.csv +++ /dev/null @@ -1,62 +0,0 @@ -varID;fr;en;unit -U;VITESSE U;VELOCITY U;M/S -V;VITESSE V;VELOCITY V;M/S -C;CELERITE;CELERITY;M/S -H;HAUTEUR D'EAU;WATER DEPTH;M -S;SURFACE LIBRE;FREE SURFACE;M -B;FOND;BOTTOM;M -F;FROUDE;FROUDE NUMBER; -Q;DEBIT SCALAIRE;SCALAR FLOWRATE;M2/S -Q;DEBIT Q;FLOWRATE Q;M2/S -I;DEBIT SUIVANT X;FLOWRATE ALONG X;M2/S -I;DEBIT QX;FLOWRATE QX;M2/S -J;DEBIT SUIVANT Y;FLOWRATE ALONG Y;M2/S -J;DEBIT QY;FLOWRATE QX;M2/S -E;DISSIPATION;DISSIPATION;WATT/KG -D;VISCOSITE TURB.;VISCOSITY;M2/S -K;ENERGIE TURBUL.;TURBULENT ENERG.;JOULE/KG -P;PRESSION ATMOS.;AIR PRESSURE;PASCAL -M;VITESSE SCALAIRE;SCALAR VELOCITY;M/S -X;VENT X;WIND ALONG X;M/S -Y;VENT Y;WIND ALONG Y;M/S -W;FROTTEMENT;BOTTOM FRICTION; -W;COEFT FROTTEMENT;FRICTION COEFT; -A;DERIVE EN X;DRIFT ALONG X;M -G;DERIVE EN Y;DRIFT ALONG Y;M -L;NBRE DE COURANT;COURANT NUMBER; -MAXZ;COTE MAXIMUM;HIGH WATER MARK;M -TMXZ;TEMPS COTE MAXI;HIGH WATER TIME;S -MAXV;VITESSE MAXIMUM;HIGHEST VELOCITY;M/S -TMXV;T VITESSE MAXI;TIME OF HIGH VEL;S -US;VITESSE DE FROT.;FRICTION VEL.;M/S -US;VITESSE DE FROT;FRICTION VELOCIT;M/S -TAU;CONTRAINTE;BED SHEAR STRESS;PASCAL -TAU;FROTTEMENT TOB;BED SHEAR STRESS;PASCAL -DMAX;DIAMETRE;DIAMETER;MM -WH;HAUTEUR HM0;WAVE HEIGHT HM0;M -PPT;PERIODE PIC TPR5;PEAK PERIOD TPR5;S -RB;FOND RIGIDE;RIGID BED;M -THETAW;DIRECTION MOY;MEAN DIRECTION;DEG -QS;DEBIT SOLIDE;SOLID DISCH;M2/S -QSX;DEBIT SOLIDE X;SOLID DISCH X;M2/S -QSY;DEBIT SOLIDE Y;SOLID DISCH Y;M2/S -QS;DEBIT SOLIDE;SOLID DISCHARGE;M2/S -QSX;DEBIT SOL EN X;SOLID DIS IN X;M2/S -QSY;DEBIT SOL EN Y;SOLID DIS IN Y;M2/S -EV;EVOLUTION;EVOLUTION;M -EV;EVOLUTION FOND;BED EVOLUTION;M -KS;RUGOSITE TOTALE.;RUGOSITE TOTALE;M -KS;RUGOSITE TOTALE;RUGOSITE TOTALE;M -MU;CORR FROTT PEAU;FROT. PEAU MU; -D50;DIAMETRE MOYEN;MEAN DIAMETER;M -UWB;VITESSE FOND;BOTTOM VELOCITY;M/S -QSBL;QS CHARRIAGE;QS BEDLOAD;M2/S -QSBLX;QS CHARRIAGE X;QS BEDLOAD X;M2/S -QSBLY;QS CHARRIAGE Y;QS BEDLOAD Y;M2/S -QSSUSP;QS SUSPENSION;QS SUSPENSION;M2/S -QSSUSPX;QS SUSPENSION X;QS SUSPENSION X;M2/S -QSSUSPY;QS SUSPENSION Y;QS SUSPENSION Y;M2/S -HD;EPAISSEUR DU LIT;BED THICKNESS;M -EF;FLUX D'EROSION;EROSION FLUX;KG/M2/S -DF;FLUX DE DEPOT;DEPOSITION FLUX;KG/M2/S -FROTP;FROT. PEAU;FROT. PEAU;PASCAL diff --git a/xarray_selafin/data/Serafin_var3D.csv b/xarray_selafin/data/Serafin_var3D.csv deleted file mode 100644 index b5662b6..0000000 --- a/xarray_selafin/data/Serafin_var3D.csv +++ /dev/null @@ -1,26 +0,0 @@ -varID;fr;en;unit -Z;COTE Z;ELEVATION Z;M -U;VITESSE U;VELOCITY U;M/S -V;VITESSE V;VELOCITY V;M/S -W;VITESSE W;VELOCITY W;M/S -NUX;NUX POUR VITESSE;NUX FOR VELOCITY;M2/S -NUY;NUY POUR VITESSE;NUY FOR VELOCITY;M2/S -NUZ;NUZ POUR VITESSE;NUZ FOR VELOCITY;M2/S -K;ENERGIE TURBULEN;TURBULENT ENERGY;JOULE/KG -EPS;DISSIPATION;DISSIPATION;WATT/KG -RI;NB DE RICHARDSON;RICHARDSON NUMB; -RHO;DENSITE RELATIVE;RELATIVE DENSITY; -DP;PRESSION DYNAMIQ;DYNAMIC PRESSURE;PA -PH;PRESSION HYDROST;HYDROSTATIC PRES;PA -UCONV;U CONVECTION;U ADVECTION;M/S -VCONV;V CONVECTION;V ADVECTION;M/S -WCONV;W CONVECTION;W ADVECTION;M/S -DM1;DM1;DM1; -DHHN;DHHN;DHHN;M -UCONVC;UCONVC;UCONVC;M/S -VCONVC;VCONVC;VCONVC;M/S -UD;UD;UD;M/S -VD;VD;VD;M/S -WD;WD;WD;M/S -M;VITESSE SCALAIRE;SCALAR VELOCITY;M/S -NU;NU POUR VITESSE;NU FOR VELOCITY;M2/S diff --git a/xarray_selafin/variable/__init__.py b/xarray_selafin/variable/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/xarray_selafin/variable/variables_2d.py b/xarray_selafin/variable/variables_2d.py deleted file mode 100755 index 65719eb..0000000 --- a/xarray_selafin/variable/variables_2d.py +++ /dev/null @@ -1,371 +0,0 @@ -"""! -Handle 2D variables and their relationships in Serafin files for additional variable computation -""" - -from .variables_utils import * - - -# define variables -spec = """S,SURFACE LIBRE,FREE SURFACE,M -B,FOND,BOTTOM,M -EV,EVOLUTION FOND,BED EVOLUTION,M -H,HAUTEUR D'EAU,WATER DEPTH,M -M,VITESSE SCALAIRE,SCALAR VELOCITY,M/S -C,CELERITE,CELERITY,M/S -F,FROUDE,FROUDE NUMBER, -I,DEBIT SUIVANT X,FLOWRATE ALONG X,M2/S -J,DEBIT SUIVANT Y,FLOWRATE ALONG Y,M2/S -Q,DEBIT SCALAIRE,SCALAR FLOWRATE,M2/S -US,VITESSE DE FROT.,FRICTION VEL.,M/S -TAU,CONTRAINTE,BED SHEAR STRESS,PASCAL -DMAX,DIAMETRE,DIAMETER,MM -W,FROTTEMENT,BOTTOM FRICTION, -ROUSE,NOMBRE DE ROUSE,ROUSE NUMBER, -FROTP,FROT. PEAU,FROT. PEAU,PASCAL -QS,DEBIT SOLIDE,SOLID DISCH,M2/S -QSX,DEBIT SOLIDE X,SOLID DISCH X,M2/S -QSY,DEBIT SOLIDE Y,SOLID DISCH Y,M2/S -QSBL,QS CHARRIAGE,QS BEDLOAD,M2/S -QSBLX,QS CHARRIAGE X,QS BEDLOAD X,M2/S -QSBLY,QS CHARRIAGE Y,QS BEDLOAD Y,M2/S -QSSUSP,QS SUSPENSION,QS SUSPENSION,M2/S -QSSUSPX,QS SUSPENSION X,QS SUSPENSION X,M2/S -QSSUSPY,QS SUSPENSION Y,QS SUSPENSION Y,M2/S -U,VITESSE U,VELOCITY U,M/S -V,VITESSE V,VELOCITY V,M/S -HD,EPAISSEUR DU LIT,BED THICKNESS,M -RB,FOND RIGIDE,RIGID BED,M -EF,FLUX D'EROSION,EROSION FLUX,KG/M2/S -DF,FLUX DE DEPOT,DEPOSITION FLUX,KG/M2/S -MU,CORR FROTT PEAU,FROT. PEAU MU,""" - -basic_2D_vars_IDs = [ - "H", - "U", - "V", - "M", - "S", - "B", - "I", - "J", - "Q", - "C", - "F", - "US", - "TAU", - "DMAX", - "HD", - "RB", - "QS", - "QSX", - "QSY", - "QSBL", - "QSBLX", - "QSBLY", - "QSSUSP", - "QSSUSPX", - "QSSUSPY", - "EF", - "DF", - "MU", - "FROTP", -] -VARIABLES_2D = build_variables(spec) - -( - H, - U, - V, - M, - S, - B, - I, - J, - Q, - C, - F, - US, - TAU, - DMAX, - HD, - RB, - QS, - QSX, - QSY, - QSBL, - QSBLX, - QSBLY, - QSSUSP, - QSSUSPX, - QSSUSPY, - EF, - DF, - MU, - FROTP, - W, - ROUSE, -) = [VARIABLES_2D[var] for var in basic_2D_vars_IDs + ["W", "ROUSE"]] - - -# define basic equations -BASIC_2D_EQUATIONS = { - "H": Equation((S, B), H, MINUS), - "S": Equation((H, B), S, PLUS), - "B": Equation((S, H), B, MINUS), - "M": Equation((U, V), M, NORM2), - "I": Equation((H, U), I, TIMES), - "J": Equation((H, V), J, TIMES), - "Q": Equation((I, J), Q, NORM2), - "C": Equation((H,), C, COMPUTE_C), - "F": Equation((M, C), F, COMPUTE_F), - "HD": Equation((B, RB), HD, MINUS), - "RB": Equation((B, HD), RB, MINUS), - "Bbis": Equation((HD, RB), B, PLUS), - "QS": Equation((QSX, QSY), QS, NORM2), - "QSbis": Equation((EF, DF), QS, PLUS), - "QSBL": Equation((QSBLX, QSBLY), QSBL, NORM2), - "QSSUSP": Equation((QSSUSP, QSSUSPY), QSSUSP, NORM2), - "TAU": Equation((US,), TAU, COMPUTE_TAU), - "DMAX": Equation((TAU,), DMAX, COMPUTE_DMAX), - "FROTP": Equation((TAU, MU), FROTP, TIMES), - # Deduce one vector component assuming that the it has same direction of (U, V) vector - "QSX": Equation((QS, U, V), QSX, COMPUTE_COMPONENT_X), - "QSY": Equation((QS, U, V), QSY, COMPUTE_COMPONENT_Y), - "QSBLX": Equation((QSBL, U, V), QSBLX, COMPUTE_COMPONENT_X), - "QSBLY": Equation((QSBL, U, V), QSBLY, COMPUTE_COMPONENT_Y), - "QSSUSPX": Equation((QSSUSP, U, V), QSSUSPX, COMPUTE_COMPONENT_X), - "QSSUSPY": Equation((QSSUSP, U, V), QSSUSPY, COMPUTE_COMPONENT_Y), -} - -# define special friction law identifiers -CHEZY_ID, STRICKLER_ID, MANNING_ID, NIKURADSE_ID = 0, 1, 2, 3 -FRICTION_LAWS = ["Chézy", "Strickler", "Manning", "Nikuradse"] - - -# a very special equation -class RouseEquation: - """! - needed a pickle-able top-level equation object when computing Rouse in multi-process - """ - - def __init__(self, ws, ws_id): - var = Variable(ws_id, None, None, None, -1) - self.input = (var, US) - self.output = ROUSE - self.ws = ws - self.operator = self.compute_rouse - - def compute_rouse(self, us): - with np.errstate(divide="ignore"): - return np.where(us != 0, self.ws / us / KARMAN, float("Inf")) - - -def is_basic_2d_variable(var_ID): - """! - @brief Determine if the input variable is a basic 2D variable - @param var_ID : the ID (short name) of the variable - @return : True if the variable is one of the basic variables - """ - return var_ID in basic_2D_vars_IDs - - -def get_available_2d_variables(input_var_IDs): - """! - @brief Determine the list of new 2D variables computable from the input variables by basic relations - @param input_var_IDs <[str]>: the list of 2D variable IDs contained in the input file - @return <[Variable]>: the list of variables computable from the input variables by basic relations - """ - computables = list( - map(VARIABLES_2D.get, filter(is_basic_2d_variable, input_var_IDs)) - ) - return get_available_variables(computables, BASIC_2D_EQUATIONS) - - -def get_necessary_2d_equations(known_var_IDs, needed_var_IDs, us_equation): - """! - @brief Determine the list of 2D equations needed to compute all user-selected variables, with precedence handling - @param known_var_IDs <[str]>: the list of variable IDs contained in the input file - @param needed_var_IDs <[str]>: the list of variable IDs selected by the user - @param us_equation : user-specified equation for friction velocity - @return <[Equation]>: the list of equations needed to compute all user-selected variables - """ - selected_unknown_var_IDs = list( - filter(lambda x: x not in known_var_IDs, needed_var_IDs) - ) - is_rouse = any(map(lambda x: x[:5] == "ROUSE", selected_unknown_var_IDs)) - necessary_equations = [] - - # add S - if "S" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["S"]) - - # add B - if "B" in selected_unknown_var_IDs: - if "S" in known_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["B"]) - else: - necessary_equations.append(BASIC_2D_EQUATIONS["Bbis"]) - - # add H - if "H" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["H"]) - elif "H" not in known_var_IDs: - if ( - "I" in selected_unknown_var_IDs - or "J" in selected_unknown_var_IDs - or "C" in selected_unknown_var_IDs - ): - necessary_equations.append(BASIC_2D_EQUATIONS["H"]) - elif "Q" in selected_unknown_var_IDs and ( - "I" not in known_var_IDs or "J" not in known_var_IDs - ): - necessary_equations.append(BASIC_2D_EQUATIONS["H"]) - elif "C" not in known_var_IDs and "F" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["H"]) - elif "US" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["H"]) - elif "US" not in known_var_IDs: - if "TAU" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["H"]) - elif "TAU" not in known_var_IDs: - if ( - "FROTP" in selected_unknown_var_IDs - or "DMAX" in selected_unknown_var_IDs - ): - necessary_equations.append(BASIC_2D_EQUATIONS["H"]) - elif is_rouse: - necessary_equations.append(BASIC_2D_EQUATIONS["H"]) - - # add M - if "M" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["M"]) - elif "M" not in known_var_IDs: - if "F" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["M"]) - elif "US" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["M"]) - elif "US" not in known_var_IDs: - if "TAU" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["M"]) - elif "TAU" not in known_var_IDs: - if ( - "FROTP" in selected_unknown_var_IDs - or "DMAX" in selected_unknown_var_IDs - ): - necessary_equations.append(BASIC_2D_EQUATIONS["M"]) - elif is_rouse: - necessary_equations.append(BASIC_2D_EQUATIONS["M"]) - - # add C - if "C" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["C"]) - elif "C" not in known_var_IDs and "F" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["C"]) - - # add F - if "F" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["F"]) - - # add I and J - if "I" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["I"]) - else: - if "Q" in selected_unknown_var_IDs and "I" not in known_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["I"]) - if "J" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["J"]) - else: - if "Q" in selected_unknown_var_IDs and "J" not in known_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["J"]) - - # add Q - if "Q" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["Q"]) - - # add US - if "US" in selected_unknown_var_IDs: - necessary_equations.append(us_equation) - elif "US" not in known_var_IDs: - if "TAU" in selected_unknown_var_IDs: - necessary_equations.append(us_equation) - elif "TAU" not in known_var_IDs: - if ( - "FROTP" in selected_unknown_var_IDs - or "DMAX" in selected_unknown_var_IDs - ): - necessary_equations.append(us_equation) - elif is_rouse: - necessary_equations.append(us_equation) - - # add TAU - if "TAU" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["TAU"]) - elif "TAU" not in known_var_IDs: - if "FROTP" in selected_unknown_var_IDs or "DMAX" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["TAU"]) - - # add DMAX - if "DMAX" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["DMAX"]) - - # add FROTP - if "FROTP" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["FROTP"]) - - # add ROUSE - for var_ID in selected_unknown_var_IDs: - if var_ID[:5] == "ROUSE": - rouse_value = float(var_ID[6:]) - necessary_equations.append(RouseEquation(rouse_value, var_ID)) - - # add QS - if "QS" in selected_unknown_var_IDs: - if "QSX" in known_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["QS"]) - else: - necessary_equations.append(BASIC_2D_EQUATIONS["QSbis"]) - - # add QSBL - if "QSBL" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["QSBL"]) - - # add QSSUSP - if "QSSUSP" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS["QSSUSP"]) - - # add vector component computations - for var_ID in ("QSX", "QSY", "QSBLX", "QSBLY", "QSSUSPX", "QSSUSPY"): - if var_ID in selected_unknown_var_IDs: - necessary_equations.append(BASIC_2D_EQUATIONS[var_ID]) - - return necessary_equations - - -def get_US_equation(friction_law): - """! - @brief Convert integer code to friction law equation - @param friction_law : an integer specifying the friction law to use - @return : the corresponding friction law equation - """ - if friction_law == CHEZY_ID: - return Equation((W, H, M), US, COMPUTE_CHEZY) - elif friction_law == STRICKLER_ID: - return Equation((W, H, M), US, COMPUTE_STRICKLER) - elif friction_law == MANNING_ID: - return Equation((W, H, M), US, COMPUTE_MANNING) - elif friction_law == NIKURADSE_ID: - return Equation((W, H, M), US, COMPUTE_NIKURADSE) - else: - return None - - -def new_variables_from_US(known_vars): - """! - @brief Add US, TAU and DMAX and eventually FROTP Variable objects to the list - @param available_vars <[Variable]>: the target list - @param known_vars <[str]>: known variables IDs - """ - new_vars = [US, TAU, DMAX] - if "MU" in known_vars: - new_vars.append(FROTP) - return new_vars diff --git a/xarray_selafin/variable/variables_3d.py b/xarray_selafin/variable/variables_3d.py deleted file mode 100755 index 48656c4..0000000 --- a/xarray_selafin/variable/variables_3d.py +++ /dev/null @@ -1,73 +0,0 @@ -"""! -Handle 3D variables and their relationships in Serafin files for additional variable computation -""" - -from .variables_utils import * - - -# define variables -spec = """Z,COTE Z,ELEVATION Z,M -U,VITESSE U,VELOCITY U,M/S -V,VITESSE V,VELOCITY V,M/S -W,VITESSE W,VELOCITY W,M/S -NUX,NUX POUR VITESSE,NUX FOR VELOCITY,M2/S -NUY,NUY POUR VITESSE,NUY FOR VELOCITY,M2/S -NUZ,NUZ POUR VITESSE,NUZ FOR VELOCITY,M2/S -M,VITESSE SCALAIRE,SCALAR VELOCITY,M/S -NU,NU POUR VITESSE,NU FOR VELOCITY,M2/S""" - -basic_3D_vars_IDs = ["Z", "U", "V", "W", "NUX", "NUY", "NUZ", "M", "NU"] -VARIABLES_3D = build_variables(spec) - -Z, U, V, W, NUX, NUY, NUZ, M, NU = [VARIABLES_3D[var] for var in basic_3D_vars_IDs] - - -# define equations -BASIC_3D_EQUATIONS = { - "M": Equation((U, V, W), M, NORM2_3D), - "NU": Equation((NUX, NUY, NUZ), NU, NORM2_3D), -} - - -def is_basic_3d_variable(var_ID): - """! - @brief Determine if the input variable is a basic 3D variable - @param var_ID : the ID (short name) of the variable - @return : True if the variable is one of the basic variables - """ - return var_ID in basic_3D_vars_IDs - - -def get_available_3d_variables(input_var_IDs): - """! - @brief Determine the list of new 3D variables computable from the input variables by basic relations - @param input_var_IDs <[str]>: the list of 3D variable IDs contained in the input file - @return <[Variable]>: the list of variables computable from the input variables by basic relations - """ - computables = list( - map(VARIABLES_3D.get, filter(is_basic_3d_variable, input_var_IDs)) - ) - return get_available_variables(computables, BASIC_3D_EQUATIONS) - - -def get_necessary_3d_equations(known_var_IDs, needed_var_IDs): - """! - @brief Determine the list of 3D equations needed to compute all user-selected variables, with precedence handling - @param known_var_IDs <[str]>: the list of variable IDs contained in the input file - @param needed_var_IDs <[str]>: the list of variable IDs selected by the user - @return <[Equation]>: the list of equations needed to compute all user-selected variables - """ - selected_unknown_var_IDs = list( - filter(lambda x: x not in known_var_IDs, needed_var_IDs) - ) - necessary_equations = [] - - # add M - if "M" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_3D_EQUATIONS["M"]) - - # add NU - if "NU" in selected_unknown_var_IDs: - necessary_equations.append(BASIC_3D_EQUATIONS["NU"]) - - return necessary_equations diff --git a/xarray_selafin/variable/variables_utils.py b/xarray_selafin/variable/variables_utils.py deleted file mode 100755 index aa1d7a1..0000000 --- a/xarray_selafin/variable/variables_utils.py +++ /dev/null @@ -1,172 +0,0 @@ -"""! -Handle 2D and 3D additional variables -""" - -import numpy as np - - -# define constants -KARMAN = 0.4 -RHO_WATER = 1000.0 -GRAVITY = 9.80665 - - -class Variable: - """! - @brief Data type for a single variable with ID (short name), Name (fr or en) and Unit - """ - - def __init__(self, ID, name_fr, name_en, unit, order): - self._ID = ID - self.name_fr = name_fr - self.name_en = name_en - self._unit = unit - self.order = order - - def __repr__(self): - return ", ".join([self.ID(), self.name_fr, self.name_en, self.unit()]) - - def name(self, language): - if language == "fr": - return self.name_fr - return self.name_en - - def ID(self): - return self._ID - - def unit(self): - return self._unit - - -class Equation: - """! - @brief Data type for an equation consisting of N input variables, 1 output variables and (N-1) operators - """ - - def __init__(self, input_variables, output_variable, operator): - self.input = input_variables - self.output = output_variable - self.operator = operator - - def __repr__(self): - return "%s -> %s (%s)" % (self.input, self.output, self.operator) - - -def build_variables(spec): - """! - @brief Initialize the BASIC_VARIABLES - """ - variables = {} - for i, row in enumerate(spec.split("\n")): - ID, name_fr, name_en, unit = row.split(",") - variables[ID] = Variable(ID, name_fr, name_en, unit, i) - return variables - - -def square_root(x): - with np.errstate(invalid="ignore"): - return np.sqrt(x) - - -def cubic_root(x): - with np.errstate(invalid="ignore"): - return np.where(x < 0, np.power(-x, 1 / 3.0), np.power(x, 1 / 3.0)) - - -def compute_NIKURADSE(w, h, m): - with np.errstate(divide="ignore", invalid="ignore"): - return np.sqrt( - np.power(m, 2) * KARMAN**2 / np.power(np.log(30 * h / np.exp(1) / w), 2) - ) - - -def compute_DMAX(tau): - return np.where( - tau > 0.34, - 1.4593 * np.power(tau, 0.979), - np.where( - tau > 0.1, - 1.2912 * np.power(tau, 2) + 1.3572 * tau - 0.1154, - 0.9055 * np.power(tau, 1.3178), - ), - ) - - -def compute_COMPONENT_X(scalar, x, y): - magnitude = np.sqrt(np.power(x, 2) + np.power(y, 2)) - return np.where(magnitude > 0, scalar * x / magnitude, 0) - - -def compute_COMPONENT_Y(scalar, x, y): - return compute_COMPONENT_X(scalar, y, x) - - -PLUS, MINUS, TIMES, NORM2, NORM2_3D = 1, 2, 3, 4, 104 -COMPUTE_TAU, COMPUTE_DMAX = 5, 6 -COMPUTE_CHEZY, COMPUTE_STRICKLER, COMPUTE_MANNING, COMPUTE_NIKURADSE = 7, 8, 9, 10 -COMPUTE_C, COMPUTE_F = 11, 12 -COMPUTE_COMPONENT_X, COMPUTE_COMPONENT_Y = 20, 21 - -OPERATIONS = { - PLUS: lambda a, b: a + b, - MINUS: lambda a, b: a - b, - TIMES: lambda a, b: a * b, - NORM2: lambda a, b: np.sqrt(np.square(a) + np.square(b)), - NORM2_3D: lambda a, b, c: np.sqrt(np.square(a) + np.square(b) + np.square(c)), - COMPUTE_TAU: lambda x: RHO_WATER * np.square(x), - COMPUTE_DMAX: compute_DMAX, - COMPUTE_CHEZY: lambda w, h, m: np.sqrt(np.power(m, 2) * GRAVITY / np.square(w)), - COMPUTE_STRICKLER: lambda w, h, m: np.sqrt( - np.power(m, 2) * GRAVITY / np.square(w) / cubic_root(h) - ), - COMPUTE_MANNING: lambda w, h, m: np.sqrt( - np.power(m, 2) * GRAVITY * np.power(w, 2) / cubic_root(h) - ), - COMPUTE_NIKURADSE: compute_NIKURADSE, - COMPUTE_COMPONENT_X: compute_COMPONENT_X, - COMPUTE_COMPONENT_Y: compute_COMPONENT_Y, - COMPUTE_C: lambda h: square_root(GRAVITY * h), - COMPUTE_F: lambda m, c: m / c, -} - - -def do_calculation(equation, input_values): - """! - @brief Apply an equation on input values - @param equation : an equation object - @param input_values <[numpy 1D-array]>: the values of the input variables - @return : the values of the output variable - """ - operation = OPERATIONS[equation.operator] - nb_operands = len(input_values) - if nb_operands == 1: - with np.errstate(divide="ignore", invalid="ignore"): - return operation(input_values[0]) - elif nb_operands == 2: - with np.errstate(divide="ignore", invalid="ignore"): - return operation(input_values[0], input_values[1]) - with np.errstate(divide="ignore", invalid="ignore"): - return operation(input_values[0], input_values[1], input_values[2]) - - -def get_available_variables(computables, basic_equations): - """! - @brief Determine the list of new variables (2D or 3D) computable from the input variables by basic relations - @return <[Variable]>: the list of variables computable from the input variables by basic relations - """ - available_vars = [] - while True: - found_new_computable = False - for equation in basic_equations.values(): - unknown = equation.output - needed_variables = equation.input - if unknown in computables: # not a new variable - continue - is_solvable = all(map(lambda x: x in computables, needed_variables)) - if is_solvable: - found_new_computable = True - computables.append(unknown) - available_vars.append(equation.output) - if not found_new_computable: - break - return available_vars diff --git a/xarray_selafin/xarray_backend.py b/xarray_selafin/xarray_backend.py index d669014..fdd8262 100644 --- a/xarray_selafin/xarray_backend.py +++ b/xarray_selafin/xarray_backend.py @@ -4,20 +4,26 @@ * https://tutorial.xarray.dev/advanced/backends/2.Backend_with_Lazy_Loading.html """ import os +import threading from datetime import datetime from datetime import timedelta -import numpy as np from operator import attrgetter -import threading + +import numpy as np import xarray as xr -from xarray.backends import BackendArray, BackendEntrypoint +from serafin import Read +from serafin import Serafin +from serafin import serafin +from serafin import SerafinHeader +from serafin import Write +from xarray.backends import BackendArray +from xarray.backends import BackendEntrypoint from xarray.core import indexing -from xarray_selafin import Serafin - try: import dask + DASK_AVAILABLE = True except ImportError: DASK_AVAILABLE = False @@ -40,7 +46,7 @@ def compute_duration_between_datetime(t0, time_serie): def read_serafin(filepath, lang): - resin = Serafin.Read(filepath, lang) + resin = Read(filepath, lang) resin.__enter__() resin.read_header() resin.get_time() @@ -48,7 +54,6 @@ def read_serafin(filepath, lang): class SelafinLazyArray(BackendArray): - def __init__(self, filename_or_obj, shape, dtype, lock, var): self.filename_or_obj = filename_or_obj self.shape = shape @@ -134,7 +139,6 @@ def _raw_indexing_method(self, key): class SelafinBackendEntrypoint(BackendEntrypoint): - def open_dataset( self, filename_or_obj, @@ -144,7 +148,7 @@ def open_dataset( # Below are custom arguments disable_lock=False, lazy_loading=True, - lang=Serafin.LANG, + lang=serafin.LANG, # `chunks` and `cache` DO NOT go here, they are handled by xarray ): # Initialize SELAFIN reader @@ -218,7 +222,7 @@ def close(): ds.set_close(close) - ds.attrs["title"] = slf.header.title.decode(Serafin.SLF_EIT).strip() + ds.attrs["title"] = slf.header.title.decode(serafin.SLF_EIT).strip() ds.attrs["language"] = slf.header.language ds.attrs["float_size"] = slf.header.float_size ds.attrs["endian"] = slf.header.endian @@ -228,7 +232,7 @@ def close(): if not is_2d: ds.attrs["ikle3"] = np.reshape(slf.header.ikle, (slf.header.nb_elements, ndp3)) ds.attrs["variables"] = { - var_ID: (name.decode(Serafin.SLF_EIT).rstrip(), unit.decode(Serafin.SLF_EIT).rstrip()) + var_ID: (name.decode(serafin.SLF_EIT).rstrip(), unit.decode(serafin.SLF_EIT).rstrip()) for var_ID, name, unit in slf.header.iter_on_all_variables() } ds.attrs["date_start"] = slf.header.date @@ -249,7 +253,6 @@ def guess_can_open(filename_or_obj): @xr.register_dataset_accessor("selafin") class SelafinAccessor: - def __init__(self, xarray_obj): self._ds = xarray_obj self._header = None @@ -279,7 +282,7 @@ def _build_header(self): # Title title = ds.attrs.get("title", "Converted with array-serafin") - header = Serafin.SerafinHeader(title) + header = SerafinHeader(title) # File precision float_size = ds.attrs.get("float_size", 4) # Default: single precision @@ -311,7 +314,7 @@ def _build_header(self): header.date = DEFAULT_DATE_START # Variables - header.language = ds.attrs.get("language", Serafin.LANG) + header.language = ds.attrs.get("language", serafin.LANG) for var in ds.data_vars: try: name, unit = ds.attrs["variables"][var] @@ -376,7 +379,7 @@ def _write_all(self, filepath): """Writes header and all data frames into output file""" header = self._header - with Serafin.Write(filepath, header.language, overwrite=True) as resout: + with Write(filepath, header.language, overwrite=True) as resout: resout.write_header(header) t0 = np.datetime64(datetime(*header.date)) From ea405e04d17a85b17c6c7148097789807983f236 Mon Sep 17 00:00:00 2001 From: tomsail Date: Mon, 1 Jun 2026 09:19:27 +0200 Subject: [PATCH 2/3] fix: address reviews --- poetry.lock | 2 +- pyproject.toml | 2 +- xarray_selafin/xarray_backend.py | 15 ++++++++------- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5472f62..aad1132 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2956,4 +2956,4 @@ type = ["pytest-mypy (>=1.0.1)"] [metadata] lock-version = "2.0" python-versions = ">=3.11" -content-hash = "d380c297207ec94a3b99a59a57a29e2b99fcc15b64ec3421a0b194a6881b2bef" +content-hash = "a441b28d6f466d194a3a308508ee0c0d08b6017b4d84ded076b43bf7f6b9bbfa" diff --git a/pyproject.toml b/pyproject.toml index 12c77c0..74d794e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ include = [ python = ">=3.11" numpy = "*" xarray = "*" -python-serafin = "*" +python-serafin = "0.1.0" [tool.poetry.plugins."xarray.backends"] selafin = "xarray_selafin.xarray_backend:SelafinBackendEntrypoint" diff --git a/xarray_selafin/xarray_backend.py b/xarray_selafin/xarray_backend.py index fdd8262..9d63681 100644 --- a/xarray_selafin/xarray_backend.py +++ b/xarray_selafin/xarray_backend.py @@ -12,10 +12,11 @@ import numpy as np import xarray as xr from serafin import Read -from serafin import Serafin -from serafin import serafin from serafin import SerafinHeader +from serafin import SerafinRequestError from serafin import Write +from serafin.serafin import LANG +from serafin.serafin import SLF_EIT from xarray.backends import BackendArray from xarray.backends import BackendEntrypoint from xarray.core import indexing @@ -148,7 +149,7 @@ def open_dataset( # Below are custom arguments disable_lock=False, lazy_loading=True, - lang=serafin.LANG, + lang=LANG, # `chunks` and `cache` DO NOT go here, they are handled by xarray ): # Initialize SELAFIN reader @@ -222,7 +223,7 @@ def close(): ds.set_close(close) - ds.attrs["title"] = slf.header.title.decode(serafin.SLF_EIT).strip() + ds.attrs["title"] = slf.header.title.decode(SLF_EIT).strip() ds.attrs["language"] = slf.header.language ds.attrs["float_size"] = slf.header.float_size ds.attrs["endian"] = slf.header.endian @@ -232,7 +233,7 @@ def close(): if not is_2d: ds.attrs["ikle3"] = np.reshape(slf.header.ikle, (slf.header.nb_elements, ndp3)) ds.attrs["variables"] = { - var_ID: (name.decode(serafin.SLF_EIT).rstrip(), unit.decode(serafin.SLF_EIT).rstrip()) + var_ID: (name.decode(SLF_EIT).rstrip(), unit.decode(SLF_EIT).rstrip()) for var_ID, name, unit in slf.header.iter_on_all_variables() } ds.attrs["date_start"] = slf.header.date @@ -314,7 +315,7 @@ def _build_header(self): header.date = DEFAULT_DATE_START # Variables - header.language = ds.attrs.get("language", serafin.LANG) + header.language = ds.attrs.get("language", LANG) for var in ds.data_vars: try: name, unit = ds.attrs["variables"][var] @@ -322,7 +323,7 @@ def _build_header(self): except KeyError: try: header.add_variable_from_ID(var) - except Serafin.SerafinRequestError: + except SerafinRequestError: header.add_variable_str(var, var, "?") header.nb_var = len(header.var_IDs) From 40b513eb82ed202f1dba69dad41efa1191c0bea0 Mon Sep 17 00:00:00 2001 From: tomsail Date: Mon, 1 Jun 2026 09:24:04 +0200 Subject: [PATCH 3/3] bump version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 74d794e..6c6439d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "xarray-selafin" -version = "0.2.1" +version = "0.2.2" description = "" authors = ["tomsail ", "lucduron "] readme = "README.md"