From 1c2a27755643c9034915e3eec5bc9b80552851fc Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Wed, 8 Jan 2025 07:53:00 +0100 Subject: [PATCH] Working on #43. Also updating project to support UV instead of poetry. --- .coveragerc | 13 + .editorconfig | 1 - .pre-commit-config.yaml | 20 + .sourcery.yaml | 29 +- AUTHORS.rst | 19 - HISTORY.rst => CHANGELOG.md | 50 +- CITATION.cff | 39 + CONTRIBUTING.rst | 137 - LICENSE | 2 +- README.md | 61 +- STYLEGUIDE.md | 423 +++ condaenv.yml | 5 - docs/api.rst | 7 - docs/authors.rst | 1 - docs/conf.py | 164 - docs/contributing.rst | 1 - docs/history.rst | 1 - docs/index.rst | 28 - docs/source/CHANGELOG.md | 2 + docs/source/LICENSE.md | 3 + docs/source/README.md | 2 + docs/source/STYLEGUIDE.md | 2 + docs/source/_static/DNV_logo_RGB.jpg | Bin 0 -> 202826 bytes docs/source/_static/my_package.svg | 1 + docs/source/_templates/custom-class.rst | 30 + docs/source/_templates/custom-module.rst | 67 + docs/source/cli.__main__.rst | 3 + docs/source/cli.rst | 7 + docs/source/conf.py | 85 + docs/source/index.rst | 26 + docs/source/my_package.rst | 25 + docs/trafficgen.check_land_crossing.rst | 7 - docs/trafficgen.cli.rst | 7 - docs/trafficgen.encounter.rst | 7 - docs/trafficgen.marine_system_simulator.rst | 7 - docs/trafficgen.plot_traffic_situation.rst | 7 - docs/trafficgen.read_files.rst | 7 - docs/trafficgen.rst | 24 - docs/trafficgen.ship_traffic_generator.rst | 7 - docs/trafficgen.types.rst | 7 - docs/trafficgen.utils.rst | 7 - ...ficgen.write_traffic_situation_to_file.rst | 7 - pyproject.toml | 241 +- pytest.ini | 5 + ruff.toml | 153 + src/trafficgen/check_land_crossing.py | 1 - src/trafficgen/cli.py | 15 +- src/trafficgen/encounter.py | 118 +- src/trafficgen/marine_system_simulator.py | 14 +- src/trafficgen/plot_traffic_situation.py | 58 +- src/trafficgen/read_files.py | 67 +- src/trafficgen/ship_traffic_generator.py | 23 +- src/trafficgen/types.py | 144 +- src/trafficgen/utils.py | 50 +- .../write_traffic_situation_to_file.py | 19 +- tests/conftest.py | 2 +- tests/test_read_files.py | 19 +- tests/test_trafficgen.py | 19 +- tests/test_write_files.py | 14 +- uv.lock | 2911 +++++++++++++++++ 60 files changed, 4245 insertions(+), 976 deletions(-) create mode 100644 .coveragerc create mode 100644 .pre-commit-config.yaml delete mode 100644 AUTHORS.rst rename HISTORY.rst => CHANGELOG.md (53%) create mode 100644 CITATION.cff delete mode 100644 CONTRIBUTING.rst create mode 100644 STYLEGUIDE.md delete mode 100644 condaenv.yml delete mode 100644 docs/api.rst delete mode 100644 docs/authors.rst delete mode 100644 docs/conf.py delete mode 100644 docs/contributing.rst delete mode 100644 docs/history.rst delete mode 100644 docs/index.rst create mode 100644 docs/source/CHANGELOG.md create mode 100644 docs/source/LICENSE.md create mode 100644 docs/source/README.md create mode 100644 docs/source/STYLEGUIDE.md create mode 100644 docs/source/_static/DNV_logo_RGB.jpg create mode 100644 docs/source/_static/my_package.svg create mode 100644 docs/source/_templates/custom-class.rst create mode 100644 docs/source/_templates/custom-module.rst create mode 100644 docs/source/cli.__main__.rst create mode 100644 docs/source/cli.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst create mode 100644 docs/source/my_package.rst delete mode 100644 docs/trafficgen.check_land_crossing.rst delete mode 100644 docs/trafficgen.cli.rst delete mode 100644 docs/trafficgen.encounter.rst delete mode 100644 docs/trafficgen.marine_system_simulator.rst delete mode 100644 docs/trafficgen.plot_traffic_situation.rst delete mode 100644 docs/trafficgen.read_files.rst delete mode 100644 docs/trafficgen.rst delete mode 100644 docs/trafficgen.ship_traffic_generator.rst delete mode 100644 docs/trafficgen.types.rst delete mode 100644 docs/trafficgen.utils.rst delete mode 100644 docs/trafficgen.write_traffic_situation_to_file.rst create mode 100644 pytest.ini create mode 100644 ruff.toml create mode 100644 uv.lock diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..85101ea --- /dev/null +++ b/.coveragerc @@ -0,0 +1,13 @@ +[paths] +source = + src/trafficgen + */site-packages/trafficgen + +[run] +source = trafficgen +branch = True + +[report] +fail_under = 10.0 +show_missing = True +skip_covered = True diff --git a/.editorconfig b/.editorconfig index b46c31e..6dda6af 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,7 +6,6 @@ root = true [*] indent_style = space indent_size = 4 -end_of_line = crlf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..5e8d030 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,20 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: mixed-line-ending + args: [--fix=auto] + - id: trailing-whitespace + - id: check-yaml + - id: check-toml + - id: check-merge-conflict + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.8.3 + hooks: + - id: ruff-format + - id: ruff + # - repo: https://github.com/pre-commit/mirrors-mypy + # rev: v1.13.0 + # hooks: + # - id: mypy +exclude: '(.venv|.*_cache)/.*' diff --git a/.sourcery.yaml b/.sourcery.yaml index d611d79..032322b 100644 --- a/.sourcery.yaml +++ b/.sourcery.yaml @@ -9,27 +9,26 @@ # This file was auto-generated by Sourcery on 2023-02-22 at 11:42. -version: '1' # The schema version of this config file +version: '1' # The schema version of this config file ignore: # A list of paths or files which Sourcery will ignore. -- .git -- .venv -- .tox -- build -- dist -- __pycache__ - + - .git + - .venv + - .tox + - dist + - __pycache__ + - docs/build rule_settings: enable: - - default - disable: # A list of rule IDs Sourcery will never suggest. - - inline-immediately-returned-variable + - default + disable: # A list of rule IDs Sourcery will never suggest. + - inline-immediately-returned-variable rule_types: - - refactoring - - suggestion - - comment - python_version: '3.9' # A string specifying the lowest Python version your project supports. Sourcery will not suggest refactorings requiring a higher Python version. + - refactoring + - suggestion + - comment + python_version: '3.10' # A string specifying the lowest Python version your project supports. Sourcery will not suggest refactorings requiring a higher Python version. # rules: # A list of custom rules Sourcery will include in its analysis. # - id: no-print-statements diff --git a/AUTHORS.rst b/AUTHORS.rst deleted file mode 100644 index e4eec4e..0000000 --- a/AUTHORS.rst +++ /dev/null @@ -1,19 +0,0 @@ -======= -Authors -======= - -Primary author ---------------- -Tom Arne Pedersen -Tom.Arne.Pedersen@dnv.com - -Claas Rostock -claas.rostock@dnv.com - -Minos Hemrich -Minos.Hemrich@dnv.com - -Testers ---------------- -* Grunde Løvoll -* Stephanie Kemna diff --git a/HISTORY.rst b/CHANGELOG.md similarity index 53% rename from HISTORY.rst rename to CHANGELOG.md index d9a9e19..9bcc011 100644 --- a/HISTORY.rst +++ b/CHANGELOG.md @@ -1,27 +1,31 @@ -======= -History -======= +# Changelog +All notable changes to the trafficgen project will be documented in this file.
+The changelog format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). -0.6.0 (2024-11-11) ------------------- +## [Unreleased] -Changed +-/- + + +## [0.6.0] - 2024-11-11 + +### Changed * Updated to download-artifact@v4 (from download-artifact@v3) -0.5.0 (2024-04-26) ------------------- -Changed +## [0.5.0] - 2024-04-26 + +### Changed * removed specific names for target ships. Files generated with target ship 1, 2 etc. * changed tests. Still need to figure out why some tests "fail" using CLI. -0.4.0 (2024-04-19) ------------------- -Changed +## [0.4.0] - 2024-04-19 + +### Changed * possible to have several aypoints for own ship * fixing pyright error @@ -30,20 +34,18 @@ Changed * situation length is used when checking if target ship is passing land -0.3.0 (2024-04-10) ------------------- +## [0.3.0] - 2024-04-10 -Changed +### Changed * using types from maritime schema * lat/lon used instead of north/east * the generated output files are using "maritime" units: knots and degrees -0.2.0 (2024-01-11) ------------------- +## [0.2.0] - 2024-01-11 -Changed +### Changed * add-basic-code-quality-settings-black-ruff-pyright, * first-small-round-of-code-improvement @@ -56,7 +58,15 @@ Changed * length of encounter may be specified by user -0.1.0 (2023-11-08) ------------------- +## [0.1.0] - 2023-11-08 * First release on PyPI. + + + +[0.6.0]: https://github.com/dnv-opensource/ship-traffic-generator/releases/tag/v0.6.0 +[0.5.0]: https://github.com/dnv-opensource/ship-traffic-generator/compare/v0.4.0...v0.5.0 +[0.4.0]: https://github.com/dnv-opensource/ship-traffic-generator/compare/v0.3.0...v0.4.0 +[0.3.0]: https://github.com/dnv-opensource/ship-traffic-generator/compare/v0.2.0...v0.3.0 +[0.2.0]: https://github.com/dnv-opensource/ship-traffic-generator/releases/tag/v0.2.0 +[trafficgen]: https://github.com/dnv-opensource/ship-traffic-generator diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..3d16201 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,39 @@ +cff-version: 1.2.0 +title: trafficgen +message: Ship Traffic Generator. +type: software +authors: + - name: DNV + address: 'Veritasveien 1, 1363 Høvik' + city: Oslo + website: 'https://www.dnv.com/' + - given-names: Tom Arne + family-names: Pedersen + email: Tom.Arne.Pedersen@dnv.com + affiliation: DNV + - given-names: Claas + family-names: Rostock + email: claas.rostock@dnv.com + affiliation: DNV + - given-names: Minos + family-names: Hemrich + email: Minos.Hemrich@dnv.com + affiliation: DNV +testers: + - given-names: Grunde + family-names: Løvoll + affiliation: DNV + - given-names: Stephanie + family-names: Kemna + affiliation: DNV +abstract: >- + The tool trafficgen generates unlimited set of encounters (based on input parameters) + to allow a systematic assessment of the vessel's ability to act according to COLREG + using simulation-based testing. +keywords: + - Traffic Generator + - Simulation-based testing + - Systematic assessment +license: MIT +url: 'https://github.com/dnv-opensource/ship-traffic-generator' +version: 0.6.0 diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst deleted file mode 100644 index fb60dd3..0000000 --- a/CONTRIBUTING.rst +++ /dev/null @@ -1,137 +0,0 @@ -.. highlight:: shell - -============ -Contributing -============ - -Contributions are welcome, and they are greatly appreciated! Every little bit -helps, and credit will always be given. - -You can contribute in many ways: - -Types of Contributions ----------------------- - -Report Bugs -~~~~~~~~~~~ - -Report bugs at https://github.com/dnv-opensource/ship-traffic-generator/issues. - -If you are reporting a bug, please include: - -* Your operating system name and version. -* The version of Python (and Conda) that you are using. -* Any additional details about your local setup that might be helpful in troubleshooting. -* Detailed steps to reproduce the bug. - -Fix Bugs -~~~~~~~~ - -Look through the GitHub issues for bugs. Anything tagged with "bug" and "help -wanted" is open to whoever wants to implement it. - -Implement Features -~~~~~~~~~~~~~~~~~~ - -Look through the GitHub issues for features. Anything tagged with "enhancement" -and "help wanted" is open to whoever wants to implement it. - -Write Documentation -~~~~~~~~~~~~~~~~~~~ - -Traffic Generator could always use more documentation, whether as part of the -official Traffic Generator docs, in docstrings, or even on the web in blog posts, -articles, and such. - -Submit Feedback -~~~~~~~~~~~~~~~ - -The best way to send feedback is to file an issue at https://github.com/dnv-opensource/ship-traffic-generator/issues. - -If you are proposing a feature: - -* Explain in detail how it would work. -* Keep the scope as narrow as possible, to make it easier to implement. -* Remember that this is a volunteer-driven project, and that contributions - are welcome :) - -Get Started! ------------- - -Ready to contribute? Here's how to set up `trafficgen` for local development. - -1. Clone the `trafficgen` repo on GitHub. -2. Install your local copy into a pyenv or conda environment. -3. Create a branch for local development:: - - $ git checkout -b name-of-your-bugfix-or-feature - - Now you can make your changes locally. - -4. When you're done making changes, check that your changes pass flake8 and the - tests, including testing other Python versions with tox:: - - $ flake8 --config tox.ini ./src/trafficgen ./tests - $ pytest ./tests - $ tox - - If you installed the package with `poetry` - - $ poetry install --with dev,docs - - flake8, pytest and tox should already be installed in your Python environment. - Note that the tox config assumes Python 3.10 and Python 3.11, you would have - to have them both available to tox for all tests to run. - If you only have one of these available tox will skip the non supported - environment (and in most cases that is OK). - If you are managing your Python enhancements with `pyenv` you will have to - install the necessary versions and then run `pyenv rehash` to make them - available to tox (or set multiple local envs with `pyenv local py310 py311`). - If you are using `conda` you will have to create a new environment with - the necessary Python version, install `virtualenv` in the environments - and then run `conda activate ` to make it available to tox (to run all - the environments in one go do `conda activate` inside activated environments). - - You can also run the python tests from VSCode via the "Testing" view, - "Configure Python Tests", with `pytest`` and select the folder `tests`. - -5. Commit your changes and push your branch to the source repo:: - - $ git add . - $ git commit -m "Your detailed description of your changes." - $ git push origin name-of-your-bugfix-or-feature - -6. Submit a pull request through https://github.com/dnv-opensource/ship-traffic-generator/pulls. - - -Pull Request Guidelines ------------------------ - -Before you submit a pull request, check that it meets these guidelines: - -1. The pull request should include tests. -2. If the pull request adds functionality, the docs should be updated. Put - your new functionality into a function with a docstring, and add the - feature to the list in README.md. -3. The pull request should work for Python 3.10. - - -Tips ----- - -To run a subset of tests:: - -$ pytest tests.test_trafficgen - - - -Deploying ---------- - -A reminder for the maintainers on how to deploy. -Make sure all your changes are committed (including an entry in HISTORY.rst). -Then run:: - -$ bump2version patch # possible: major / minor / patch -$ git push -$ git push --tags diff --git a/LICENSE b/LICENSE index 59ccfc7..90b0cc3 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 DNV open source +Copyright (c) 2024 [DNV](https://www.dnv.com) [open source](https://github.com/dnv-opensource) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index ae5094b..189b695 100644 --- a/README.md +++ b/README.md @@ -6,45 +6,72 @@ the tool will generate a set of traffic situations. The traffic situations may b A paper is written describing the background for the tool and how it works [paper] -## Quickstart -After you clone this repository, `trafficgen` can then be installed with the following steps: +## UV +This project uses `uv` as package manager. +If you haven't already, install [uv](https://docs.astral.sh/uv), preferably using it's ["Standalone installer"](https://docs.astral.sh/uv/getting-started/installation/#__tabbed_1_2) method:
+..on Windows: ```sh -$ cd ship_traffic_generator +powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" +``` +..on MacOS and Linux: +```sh +curl -LsSf https://astral.sh/uv/install.sh | sh ``` +(see [docs.astral.sh/uv](https://docs.astral.sh/uv/getting-started/installation/) for all / alternative installation methods.) + +Once installed, you can update `uv` to its latest version, anytime, by running: +```sh +uv self update +``` + +## Python +The traffic generator requires Python 3.10 or later.
-It is recommended to install the `trafficgen` package and it's dependencies in a separate -Python environment (Anaconda, pyenv, or virtualenv). `trafficgen` requires Python 3.10 or higher. +If you don't already have a compatible version installed on your machine, you way install Python through `uv`: +```sh +uv python install +``` +This will install the latest stable version of Python into the uv Python directory, i.e. as a uv-managed version of Python. -In Anaconda this can be done with: +Alternatively, and if you want a standalone version of Python on your machine, you can install Python either via `winget`: ```sh -$ conda create --name myenv python=3.10 -$ conda activate myenv +winget install --id Python.Python ``` +or you can download and install Python from the [python.org](https://www.python.org/downloads/) website. -In Powershell terminal with venv (also from VSCode), this can be done with: +## Clone the repository +Clone the traffig generator repository into your local development directory: +```sh +git clone https://github.com/dnv-opensource/ship-traffic-generator path/to/your/dir/ship-traffic-generator +``` +Change into the project directory after cloning: ```sh -$ python -m venv .venv -$ .venv\Scripts\Activate.ps1 +cd ship-traffic-generator ``` -Then update pip/setuptools, and install the dependencies for this repo: +## Install dependencies +Run `uv sync` to create a virtual environment and install all project dependencies into it: ```sh -$ python -m pip install --upgrade pip setuptools -$ pip install -e . +uv sync ``` +> **Note**: Using `--no-dev` will omit installing development dependencies. + +> **Note**: `uv` will create a new virtual environment called `.venv` in the project root directory when running +> `uv sync` the first time. Optionally, you can create your own virtual environment using e.g. `uv venv`, before running +> `uv sync`. -This will install the `trafficgen` Python package and command line tool (cli). You can check your installation by running: ```sh -$ trafficgen --help +uv run trafficgen --help ``` For more information on usage, run: ```sh -$ trafficgen gen-situation --help +trafficgen gen-situation --help ``` or build the documentation (see below). +TODO: FORTSETT HER, HVORDAN BYGGE DOKUMENTASJON ## Development & Documentation For development (dependency management, documentation and testing) it is recommended to use [Poetry](https://python-poetry.org/docs/). See Poetry's documentation for information of how to install and set up. diff --git a/STYLEGUIDE.md b/STYLEGUIDE.md new file mode 100644 index 0000000..d4ab3f8 --- /dev/null +++ b/STYLEGUIDE.md @@ -0,0 +1,423 @@ + +# Style Guide + +All code shall be [Ruff](https://docs.astral.sh/ruff) formatted. + +References, details as well as examples of bad/good styles and their respective reasoning can be found below. + +## References + +* [PEP-8](https://www.python.org/dev/peps/pep-0008/) (see also [pep8.org](https://pep8.org/)) +* [PEP-257](https://www.python.org/dev/peps/pep-0257/) +* Python style guide by [theluminousmen.com](https://luminousmen.com/post/the-ultimate-python-style-guidelines) +* [Documenting Python Code: A Complete Guide](https://realpython.com/documenting-python-code) +* [Jupyter](https://jupyter.readthedocs.io/en/latest/contributing/ipython-dev-guide/coding_style.html) style guide +* Python style guide on [learnpython.com](https://learnpython.com/blog/python-coding-best-practices-and-style-guidelines/) +* [Ruff](https://docs.astral.sh/ruff) + +## Code Layout + +* Use 4 spaces instead of tabs +* Maximum line length is 120 characters (not 79 as proposed in [PEP-8](https://www.python.org/dev/peps/pep-0008/)) +* 2 blank lines between classes and functions +* 1 blank line within class, between class methods +* Use blank lines for logic separation of functionality within functions/methods wherever it is justified +* No whitespace adjacent to parentheses, brackets, or braces + +```py + # Bad + spam( items[ 1 ], { key1 : arg1, key2 : arg2 }, ) + + # Good + spam(items[1], {key1: arg1, key2: arg2}, []) +``` + +* Surround operators with single whitespace on either side. + +```py + # Bad + x<1 + + # Good + x == 1 +``` + +* Never end your lines with a semicolon, and do not use a semicolon to put two statements on the same line +* When branching, always start a new block on a new line + +```py + # Bad + if flag: return None + + # Good + if flag: + return None +``` + +* Similarly to branching, do not write methods on one line in any case: + +```py + # Bad + def do_something(self): print("Something") + + # Good + def do_something(self): + print("Something") +``` + +* Place a class's `__init__` function (the constructor) always at the beginning of the class + +## Line Breaks + +* If function arguments do not fit into the specified line length, move them to a new line with indentation + +```py + # Bad + def long_function_name(var_one, var_two, var_three, + var_four): + print(var_one) + + # Bad + def long_function_name(var_one, var_two, var_three, + var_four): + print(var_one) + + # Better (but not preferred) + def long_function_name(var_one, + var_two, + var_three, + var_four): + print(var_one) + + # Good (and preferred) + def long_function_name( + var_one, + var_two, + var_three, + var_four, + ): + print(var_one) +``` + +* Move concatenated logical conditions to new lines if the line does not fit the maximum line size. This will help you understand the condition by looking from top to bottom. Poor formatting makes it difficult to read and understand complex predicates. + +```py + # Good + if ( + this_is_one_thing + and that_is_another_thing + or that_is_third_thing + or that_is_yet_another_thing + and one_more_thing + ): + do_something() +``` + +* Where binary operations stretch multiple lines, break lines before the binary operators, not thereafter + +```py + # Bad + GDP = ( + private_consumption + + gross_investment + + government_investment + + government_spending + + (exports - imports) + ) + + # Good + GDP = ( + private_consumption + + gross_investment + + government_investment + + government_spending + + (exports - imports) + ) +``` + +* Chaining methods should be broken up on multiple lines for better readability + +```py + ( + df.write.format("jdbc") + .option("url", "jdbc:postgresql:dbserver") + .option("dbtable", "schema.tablename") + .option("user", "username") + .option("password", "password") + .save() + ) +``` + +* Add a trailing comma to sequences of items when the closing container token ], ), or } does not appear on the same line as the final element + +```py + # Bad + y = [ + 0, + 1, + 4, + 6 + ] + z = { + 'a': 1, + 'b': 2 + } + + # Good + x = [1, 2, 3] + + # Good + y = [ + 0, + 1, + 4, + 6, <- note the trailing comma + ] + z = { + 'a': 1, + 'b': 2, <- note the trailing comma + } +``` + +## String Formatting + +* When quoting string literals, use double-quoted strings. When the string itself contains single or double quote characters, however, use the respective other one to avoid backslashes in the string. It improves readability. +* Use f-strings to format strings: + +```py + # Bad + print("Hello, %s. You are %s years old. You are a %s." % (name, age, profession)) + + # Good + print(f"Hello, {name}. You are {age} years old. You are a {profession}.") +``` + +* Use multiline strings, not \ , since it gets much more readable. + +```py + raise AttributeError( + "Here is a multiline error message with a very long first line " + "and a shorter second line." + ) +``` + +## Naming Conventions + +* For module names: `lowercase` . +Long module names can have words separated by underscores (`really_long_module_name.py`), but this is not required. Try to use the convention of nearby files. +* For class names: `CamelCase` +* For methods, functions, variables and attributes: `lowercase_with_underscores` +* For constants: `UPPERCASE` or `UPPERCASE_WITH_UNDERSCORES` +(Python does not differentiate between variables and constants. Using UPPERCASE for constants is just a convention, but helps a lot to quickly identify variables meant to serve as constants.) +* Implementation-specific private methods and variables will use `_single_underscore_prefix` +* Don't include the type of a variable in its name. + E.g. use `senders` instead of `sender_list` +* Names shall be clear about what a variable, class, or function contains or does. If you struggle to come up with a clear name, rethink your architecture: Often, the difficulty in finding a crisp name for something is a hint that separation of responsibilities can be improved. The solution then is less to agree on a name, but to start a round of refactoring: The name you're seeking often comes naturally then with refactoring to an improved architecture with clear responsibilities. +(see [SRP](https://en.wikipedia.org/wiki/Single-responsibility_principle), Single-Responsibilty Principle by Robert C. Martin) + +## Named Arguments + +* Use named arguments to improve readability and avoid mistakes introduced with future code maintenance + +```py + # Bad + urlget("[http://google.com](http://google.com/)", 20) + + # Good + urlget("[http://google.com](http://google.com/)", timeout=20) +``` + +* Never use mutable objects as default arguments in Python. If an attribute in a class or a named parameter in a function is of a mutable data type (e.g. a list or dict), never set its default value in the declaration of an object but always set it to None first, and then only later assign the default value in the class's constructor, or the functions body, respectively. Sounds complicated? If you prefer the shortcut, the examples below are your friend. +If you are interested in the long story including the why‘s, read these discussions on [Reddit](https://old.reddit.com/r/Python/comments/opb7hm/do_not_use_mutable_objects_as_default_arguments/) and [Twitter](https://twitter.com/willmcgugan/status/1419616480971399171). + +```py + # Bad + class Foo: + items = [] + + # Good + class Foo: + items = None + def __init__(self): + self.items = [] + + + # Bad + class Foo: + def __init__(self, items=[]): + self.items = items + + # Good + class Foo: + def __init__(self, items=None): + self.items = items or [] + + + # Bad + def some_function(x, y, items=[]): + ... + + # Good + def some_function(x, y, items=None): + items = items or [] + ... +``` + +## Commenting + +* First of all, if the code needs comments to clarify its work, you should think about refactoring it. The best comment to code is the code itself. +* Describe complex, possibly incomprehensible points and side effects in the comments +* Separate `#` and the comment with one whitespace + +```py + #bad comment + # good comment +``` + +* Use inline comments sparsely +* Where used, inline comments shall have 2 whitespaces before the `#` and one whitespace thereafter + +```py + x = y + z # inline comment + str1 = str2 + str3 # another inline comment +``` + +* If a piece of code is poorly understood, mark the piece with a `@TODO:` tag and your name to support future refactoring: + +```py + def get_ancestors_ids(self): + # @TODO: Do a cache reset while saving the category tree. CLAROS, YYYY-MM-DD + cache_name = f"{self._meta.model_name}_ancestors_{self.pk}" + cached_ids = cache.get(cache_name) + if cached_ids: + return cached_ids + + ids = [c.pk for c in self.get_ancestors(include_self=True)] + cache.set(cache_name, ids, timeout=3600) + + return ids +``` + +## Type hints + +* Use type hints in function signatures and module-scope variables. This is good documentation and can be used with linters for type checking and error checking. Use them whenever possible. +* Use pyi files to type annotate third-party or extension modules. + +## Docstrings + +* All Docstrings should be written in [Numpy](https://numpydoc.readthedocs.io/en/latest/format.html) format. For a good tutorial on Docstrings, see [Documenting Python Code: A Complete Guide](https://realpython.com/documenting-python-code) +* In a Docstring, summarize function/method behavior and document its arguments, return value(s), side effects, exceptions raised, and restrictions +* Wrap Docstrings with triple double quotes (""") +* The description of the arguments must be indented + +```py + def some_method(name, print=False): + """This function does something + + Parameters + ---------- + name : str + The name to use + print: bool, optional + A flag used to print the name to the console, by default False + + Raises + ------ + KeyError + If name is not found + + Returns + ------- + int + The return code + """ + ... + return 0 +``` + +## Exceptions + +* Raise specific exceptions and catch specific exceptions, such as KeyError, ValueError, etc. +* Do not raise or catch just Exception, except in rare cases where this is unavoidable, such as a try/except block on the top-level loop of some long-running process. For a good tutorial on why this matters, see [The Most Diabolical Python Antipattern](https://realpython.com/the-most-diabolical-python-antipattern/). +* Minimize the amount of code in a try/except block. The larger the body of the try, + the more likely that an exception will be raised by a line of code that you didn’t expect to raise an exception. + +## Imports + +* Avoid creating circular imports by importing modules more specialized than the one you are editing +* Relative imports are forbidden ([PEP-8](https://www.python.org/dev/peps/pep-0008/) only “highly discourages” them). Where absolutely needed, the `from future import absolute_import` syntax should be used (see [PEP-328](https://www.python.org/dev/peps/pep-0328/)) +* Never use wildcard imports (`from import *`). Always be explicit about what you're importing. Namespaces make code easier to read, so use them. +* Break long imports using parentheses and indent by 4 spaces. Include the trailing comma after the last import and place the closing bracket on a separate line + +```py + from my_pkg.utils import ( + some_utility_method_1, + some_utility_method_2, + some_utility_method_3, + some_utility_method_4, + some_utility_method_5, + ) +``` + +* Imports should be written in the following order, separated by a blank line: + 1. build-in modules + 2. third-party modules + 3. local application/library specific imports + +```py + import logging + import os + import typing as T + + import pandas as pd + import numpy as np + + import my_package + import my_package.my_module + from my_package.my_module import my_function, MyClass +``` + +* Even if a Python file is intended to be used as executable / script file only, it shall still be importable as a module, and its import should not have any side effects. Its main functionality shall hence be in a `main()` function, so that the code can be imported as a module for testing or being reused in the future: + +```py + def main(): + ... + + if __name__ == "__main__": + main() +``` + +## Unit-tests + +* Use pytest as the preferred testing framework. +* The name of a test shall clearly express what is being tested. +* Each test should preferably check only one specific aspect. + +```py + # Bad + def test_smth(): + result = f() + assert isinstance(result, list) + assert result[0] == 1 + assert result[1] == 2 + assert result[2] == 3 + assert result[3] == 4 + + # Good + def test_smth_type(): + result = f() + assert isinstance(result, list), "Result should be list" + + def test_smth_values(): + result = f() + assert set(result) == set(expected), f"Result should be {set(expected)}" +``` + +## And finally: It is a bad idea to use + +* global variables. +* iterators where they can be replaced by vectorized operations. +* lambda where it is not required. +* map and lambda where it can be replaced by a simple list comprehension. +* multiple nested maps and lambdas. +* nested functions. They are hard to test and debug. diff --git a/condaenv.yml b/condaenv.yml deleted file mode 100644 index 5cf20f8..0000000 --- a/condaenv.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: testenv -channels: -- defaults -dependencies: -- pip \ No newline at end of file diff --git a/docs/api.rst b/docs/api.rst deleted file mode 100644 index 3e977b3..0000000 --- a/docs/api.rst +++ /dev/null @@ -1,7 +0,0 @@ -API Documentation -================= - -.. toctree:: - :maxdepth: 4 - - trafficgen diff --git a/docs/authors.rst b/docs/authors.rst deleted file mode 100644 index e122f91..0000000 --- a/docs/authors.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../AUTHORS.rst diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index a671795..0000000 --- a/docs/conf.py +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env python -# -# trafficgen documentation build configuration file, created by -# sphinx-quickstart on Fri Jun 9 13:47:02 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another -# directory, add these directories to sys.path here. If the directory is -# relative to the documentation root, use os.path.abspath to make it -# absolute, like shown here. -# -import os -import sys - -try: - import tomli as tomli # pyright: ignore -except ImportError: - # for Python >= 3.11 - import tomllib as tomli # pyright: ignore - -with open("../pyproject.toml", "rb") as f: - toml = tomli.load(f) -pyproject = toml["tool"]["poetry"] - -sys.path.insert(0, os.path.abspath("..")) -sys.path.insert(0, os.path.abspath("../src")) - - -# -- General configuration --------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ["sphinx.ext.viewcode", "sphinx.ext.napoleon"] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "Traffic Generator" -copyright = "2024, DNV, Tom Arne Pedersen" -author = "Tom Arne Pedersen" - -# The version info for the project you're documenting, acts as replacement -# for |version| and |release|, also used in various other places throughout -# the built documents. -# -# The short X.Y version. -release = pyproject["version"] -version = release.split(".")[0] + "." + release.split(".")[2] - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = "en" - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -# html_theme = 'alabaster' -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a -# theme further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = [] - - -# -- Options for HTMLHelp output --------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "trafficgendoc" - - -# -- Options for LaTeX output ------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto, manual, or own class]). -latex_documents = [ - (master_doc, "trafficgen.tex", "Traffic Generator Documentation", "Tom Arne Pedersen", "manual"), -] - - -# -- Options for manual page output ------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "trafficgen", "Traffic Generator Documentation", [author], 1)] - - -# -- Options for Texinfo output ---------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "trafficgen", - "Traffic Generator Documentation", - author, - "trafficgen", - "One line description of project.", - "Miscellaneous", - ), -] diff --git a/docs/contributing.rst b/docs/contributing.rst deleted file mode 100644 index e582053..0000000 --- a/docs/contributing.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../CONTRIBUTING.rst diff --git a/docs/history.rst b/docs/history.rst deleted file mode 100644 index 2506499..0000000 --- a/docs/history.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../HISTORY.rst diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index c67c64e..0000000 --- a/docs/index.rst +++ /dev/null @@ -1,28 +0,0 @@ -Welcome to Traffic Generator's documentation! -============================================= - -The tool generates a structured set of encounters for verifying automatic collision and -grounding avoidance systems. Based on input parameters such as desired situation, relative speed, -relative bearing etc, the tool will generate a set of traffic situations. The traffic situations -may be written to files and/or inspected using plots. - -A :download:`paper<../docs/ICMASS23_verfying_caga_systems.pdf>` is written describing the background for -the tool and how it works. - -.. toctree:: - :maxdepth: 4 - :caption: Contents: - - installation - usage - input_files - contributing - authors - history - api - -Indices and tables -================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/source/CHANGELOG.md b/docs/source/CHANGELOG.md new file mode 100644 index 0000000..ff772da --- /dev/null +++ b/docs/source/CHANGELOG.md @@ -0,0 +1,2 @@ +```{include} ../../CHANGELOG.md +``` \ No newline at end of file diff --git a/docs/source/LICENSE.md b/docs/source/LICENSE.md new file mode 100644 index 0000000..947acdb --- /dev/null +++ b/docs/source/LICENSE.md @@ -0,0 +1,3 @@ +# LICENSE +```{include} ../../LICENSE +``` \ No newline at end of file diff --git a/docs/source/README.md b/docs/source/README.md new file mode 100644 index 0000000..060259b --- /dev/null +++ b/docs/source/README.md @@ -0,0 +1,2 @@ +```{include} ../../README.md +``` \ No newline at end of file diff --git a/docs/source/STYLEGUIDE.md b/docs/source/STYLEGUIDE.md new file mode 100644 index 0000000..8648352 --- /dev/null +++ b/docs/source/STYLEGUIDE.md @@ -0,0 +1,2 @@ +```{include} ../../STYLEGUIDE.md +``` \ No newline at end of file diff --git a/docs/source/_static/DNV_logo_RGB.jpg b/docs/source/_static/DNV_logo_RGB.jpg new file mode 100644 index 0000000000000000000000000000000000000000..136fe620f88821ed5b5455cc64326fae3a52a047 GIT binary patch literal 202826 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 aP!ymjKv96A07U_c0u%-Qw<)mS{eJ-a*w+F8 literal 0 HcmV?d00001 diff --git a/docs/source/_static/my_package.svg b/docs/source/_static/my_package.svg new file mode 100644 index 0000000..1e02cbe --- /dev/null +++ b/docs/source/_static/my_package.svg @@ -0,0 +1 @@ +mypackagelogo svg1224 x 1223 \ No newline at end of file diff --git a/docs/source/_templates/custom-class.rst b/docs/source/_templates/custom-class.rst new file mode 100644 index 0000000..a58baba --- /dev/null +++ b/docs/source/_templates/custom-class.rst @@ -0,0 +1,30 @@ +{{ name | escape | underline}} + +.. currentmodule:: {{ module }} + +.. autoclass:: {{ objname }} + :members: + :show-inheritance: + + + {% block methods %} + .. automethod:: __init__ + {% if methods %} + .. rubric:: {{ _('Methods') }} + .. autosummary:: + {% for item in methods %} + ~{{ name }}.{{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + + {% block attributes %} + {% if attributes %} + .. rubric:: {{ _('Attributes') }} + .. autosummary:: + {% for item in attributes %} + ~{{ name }}.{{ item }} + {%- endfor %} + {% endif %} + {% endblock %} diff --git a/docs/source/_templates/custom-module.rst b/docs/source/_templates/custom-module.rst new file mode 100644 index 0000000..1640853 --- /dev/null +++ b/docs/source/_templates/custom-module.rst @@ -0,0 +1,67 @@ +{{ fullname | escape | underline}} + +.. automodule:: {{ fullname }} + :members: + {%- if classes %} + :exclude-members: {% for item in classes %}{{ item }}{{','}}{%- endfor %} + {% endif %} + + + {% block attributes %} + {%- if attributes %} + .. rubric:: {{ _('Module Attributes') }} + .. autosummary:: + {% for item in attributes %} + {{ item }} + {%- endfor %} + {% endif %} + {%- endblock %} + + + {%- block functions %} + {%- if functions %} + .. rubric:: {{ _('Functions') }} + .. autosummary:: + {% for item in functions %} + {{ item }} + {%- endfor %} + {% endif %} + {%- endblock %} + + + {%- block classes %} + {%- if classes %} + .. rubric:: {{ _('Classes') }} + .. autosummary:: + :toctree: + :template: custom-class.rst + {% for item in classes %} + {{ item }} + {%- endfor %} + {% endif %} + {%- endblock %} + + + {%- block exceptions %} + {%- if exceptions %} + .. rubric:: {{ _('Exceptions') }} + .. autosummary:: + {% for item in exceptions %} + {{ item }} + {%- endfor %} + {% endif %} + {%- endblock %} + + +{%- block modules %} +{%- if modules %} +.. rubric:: Modules +.. autosummary:: + :toctree: + :template: custom-module.rst + :recursive: +{% for item in modules %} + {{ item }} +{%- endfor %} +{% endif %} +{%- endblock %} diff --git a/docs/source/cli.__main__.rst b/docs/source/cli.__main__.rst new file mode 100644 index 0000000..446b831 --- /dev/null +++ b/docs/source/cli.__main__.rst @@ -0,0 +1,3 @@ +.. sphinx_argparse_cli:: + :module: trafficgen.cli.__main__ + :func: _argparser diff --git a/docs/source/cli.rst b/docs/source/cli.rst new file mode 100644 index 0000000..77a0a33 --- /dev/null +++ b/docs/source/cli.rst @@ -0,0 +1,7 @@ +CLI Documentation +================= + +.. toctree:: + :maxdepth: 3 + + cli.__main__ diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..ce1d8ef --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,85 @@ +# ruff: noqa +# mypy: ignore-errors + +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import sys +from pathlib import Path + +sys.path.insert(0, str(Path("../../src").absolute())) + + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = "my-package" +copyright = "2024, DNV AS. All rights reserved." +author = "Author One, Author Two, Author Three" + +# The full version, including alpha/beta/rc tags +release = "0.1.0" + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + "myst_parser", + "sphinx.ext.autodoc", + "sphinx.ext.napoleon", + "sphinx_argparse_cli", + "sphinx.ext.mathjax", + "sphinx.ext.autosummary", + "sphinx.ext.todo", + "sphinxcontrib.mermaid", +] + +# Extenstion for myst_parser +myst_enable_extensions = [ + "dollarmath", + "attrs_inline", +] + +# The file extensions of source files. +source_suffix = { + ".rst": "restructuredtext", + ".md": "markdown", +} + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_title = f"my-package {release}" +html_theme = "furo" +html_static_path = ["_static"] +html_logo = "_static/my_package.svg" +autodoc_default_options = { + "member-order": "groupwise", + "undoc-members": True, + "exclude-members": "__weakref__", +} +autodoc_preserve_defaults = True + +myst_heading_anchors = 3 + +todo_include_todos = False + +# add markdown mermaid support +myst_fence_as_directive = ["mermaid"] diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..b70c128 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,26 @@ +.. my-package documentation master file, created by + sphinx-quickstart on Wed Jul 6 21:16:21 2022. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +my-package Documentation +======================== + +.. toctree:: + :maxdepth: 4 + :caption: Contents: + + README + api + cli + CHANGELOG + STYLEGUIDE + LICENSE + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/source/my_package.rst b/docs/source/my_package.rst new file mode 100644 index 0000000..e1e72de --- /dev/null +++ b/docs/source/my_package.rst @@ -0,0 +1,25 @@ +my-package package +================== + +Subpackages +----------- + +.. autosummary:: + :toctree: _autosummary + :template: custom-module.rst + :recursive: + + my_package.subpackage1 + my_package.subpackage2 + my_package.utils + + +Modules +------- + +.. autosummary:: + :toctree: _autosummary + :template: custom-module.rst + :recursive: + + my_package.api diff --git a/docs/trafficgen.check_land_crossing.rst b/docs/trafficgen.check_land_crossing.rst deleted file mode 100644 index 19ca198..0000000 --- a/docs/trafficgen.check_land_crossing.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.check\_land\_crossing module -======================================= - -.. automodule:: trafficgen.check_land_crossing - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.cli.rst b/docs/trafficgen.cli.rst deleted file mode 100644 index 27bb6be..0000000 --- a/docs/trafficgen.cli.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.cli module -===================== - -.. automodule:: trafficgen.cli - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.encounter.rst b/docs/trafficgen.encounter.rst deleted file mode 100644 index adfccef..0000000 --- a/docs/trafficgen.encounter.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.encounter module -=========================== - -.. automodule:: trafficgen.encounter - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.marine_system_simulator.rst b/docs/trafficgen.marine_system_simulator.rst deleted file mode 100644 index 3b9290d..0000000 --- a/docs/trafficgen.marine_system_simulator.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.marine\_system\_simulator module -=========================================== - -.. automodule:: trafficgen.marine_system_simulator - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.plot_traffic_situation.rst b/docs/trafficgen.plot_traffic_situation.rst deleted file mode 100644 index 39206b2..0000000 --- a/docs/trafficgen.plot_traffic_situation.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.plot\_traffic\_situation module -========================================== - -.. automodule:: trafficgen.plot_traffic_situation - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.read_files.rst b/docs/trafficgen.read_files.rst deleted file mode 100644 index 4409f70..0000000 --- a/docs/trafficgen.read_files.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.read\_files module -============================= - -.. automodule:: trafficgen.read_files - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.rst b/docs/trafficgen.rst deleted file mode 100644 index 1530ec7..0000000 --- a/docs/trafficgen.rst +++ /dev/null @@ -1,24 +0,0 @@ -trafficgen package -================== - -.. automodule:: trafficgen - :members: - :undoc-members: - :show-inheritance: - -Submodules ----------- - -.. toctree:: - :maxdepth: 4 - - trafficgen.check_land_crossing - trafficgen.cli - trafficgen.encounter - trafficgen.marine_system_simulator - trafficgen.plot_traffic_situation - trafficgen.read_files - trafficgen.ship_traffic_generator - trafficgen.types - trafficgen.utils - trafficgen.write_traffic_situation_to_file diff --git a/docs/trafficgen.ship_traffic_generator.rst b/docs/trafficgen.ship_traffic_generator.rst deleted file mode 100644 index acca72c..0000000 --- a/docs/trafficgen.ship_traffic_generator.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.ship\_traffic\_generator module -========================================== - -.. automodule:: trafficgen.ship_traffic_generator - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.types.rst b/docs/trafficgen.types.rst deleted file mode 100644 index e736371..0000000 --- a/docs/trafficgen.types.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.types module -======================= - -.. automodule:: trafficgen.types - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.utils.rst b/docs/trafficgen.utils.rst deleted file mode 100644 index 6335e60..0000000 --- a/docs/trafficgen.utils.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.utils module -======================= - -.. automodule:: trafficgen.utils - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.write_traffic_situation_to_file.rst b/docs/trafficgen.write_traffic_situation_to_file.rst deleted file mode 100644 index e70ec29..0000000 --- a/docs/trafficgen.write_traffic_situation_to_file.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.write\_traffic\_situation\_to\_file module -===================================================== - -.. automodule:: trafficgen.write_traffic_situation_to_file - :members: - :undoc-members: - :show-inheritance: diff --git a/pyproject.toml b/pyproject.toml index 68511c8..5afc45d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,135 +1,145 @@ -[tool.poetry] +[build-system] +requires = [ + "hatchling", +] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.sdist] +only-include = [ + "src/my_package", + "tests", + ".coveragerc", + ".editorconfig", + ".pre-commit-config.yaml", + "manage.py", + "pyproject.toml", + "pytest.ini", + "ruff.toml", + "uv.lock", +] + +[tool.hatch.build.targets.wheel] +packages = [ + "src/trafficgen", +] + +[project] name = "trafficgen" -version = "0.7.0" +version = "0.6.0" description = "Automatic generation of ship traffic situations from a set of predefined situations" -authors = ["Tom Arne Pedersen "] -license = "MIT License" readme = "README.md" +requires-python = ">= 3.10" +license = { file = "LICENSE" } +authors = [ + { name = "Tom Arne Pedersen", email = "Tom.Arne.Pedersen@dnv.com" }, + { name = "Claas Rostock", email = "Claas.Rostock@dnv.com" }, + { name = "Minos Hemrich", email = "Minos.Hemrich@dnv.com" }, +] +testers = [ + { name = "Grunde Løvoll", email = "Grunde.Lovoll@dnv.com" }, + { name = "Stephanie Kemna", email = "Stephanie.Kemna@dnv.com" }, +] +keywords = [ + "traffic generator", + "simulation", + "testing", +] +classifiers = [ + "Development Status :: 3 - Alpha", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Operating System :: Microsoft :: Windows", + "Operating System :: POSIX :: Linux", + # "Operating System :: MacOS", + "Environment :: Console", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "Topic :: Scientific/Engineering", + "Topic :: Software Development :: Libraries :: Python Modules", +] +dependencies = [ + "dictIO>=0.4.0", + "numpy>=1.25,<2.0", + "matplotlib>=3.7.2", + "basemap>=1.3.8", + "basemap-data-hires>=1.3.2", + "global-land-mask>=1.0.0", + "folium>=0.14.0", +] -[tool.poetry.dependencies] -python = ">=3.9, <3.13" -click = "^8.1" -click-log = "^0.4.0" -numpy = "^1.25.2" -matplotlib = "^3.7.2" -basemap = "^1.3.8" -basemap-data-hires = "^1.3.2" -global-land-mask = "^1.0.0" -folium = "^0.14.0" -pydantic = "^2.5" - - -[tool.poetry.group.dev] -optional = true - -[tool.poetry.group.dev.dependencies] -black = { version = "^23.12", extras = ["jupyter"] } -ruff = "^0.1.8" # linter -pyright = "^1.1.338" -tox = "^4.11.1" -pytest = "^7.4.1" -pytest-cov = "^4.1" -sourcery = "^1.14" - -[tool.poetry.group.docs] -optional = true - -[tool.poetry.group.docs.dependencies] -sphinx = "^7.2.5" -sphinx-rtd-theme = "^1.3.0" +[project.optional-dependencies] + + +[project.urls] +Homepage = "https://github.com/dnv-opensource/ship-traffic-generator" +# Documentation = "https://dnv-innersource.github.io/my-package/README.html" +Repository = "https://github.com/dnv-opensource/ship-traffic-generator.git" +Issues = "https://github.com/dnv-opensource/ship-traffic-generator/issues" +Changelog = "https://github.com/dnv-innersource/ship-traffic-generator/blob/main/CHANGELOG.md" + +[dependency-groups] +dev = [ + "pytest>=8.3", + "pytest-cov>=6.0", + "ruff>=0.8.3", + "pyright>=1.1.390", + "mypy>=1.13", + "sourcery>=1.27", + "pre-commit>=4.0", + "Sphinx>=8.1", + "sphinx-argparse-cli>=1.19", + "sphinx-autodoc-typehints>=2.5", + "sphinxcontrib-mermaid>=1.0.0", + "myst-parser>=4.0", + "furo>=2024.8", + "jupyter>=1.1", + "pandas-stubs>=2.2", + "pydantic>=2.5", + "click>=8.1", + "click-log>=0.4.0", +] -# Add command line interface here like: -[tool.poetry.scripts] +[project.scripts] trafficgen = "trafficgen.cli:main" -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" - -[tool.pytest.ini_options] -testpaths = "tests" -addopts = "--strict-markers" -xfail_strict = true - -[tool.black] -line-length = 105 -target-version = ["py39", "py310", "py311", "py312"] - -[tool.ruff] -exclude = [ - ".git", - ".venv", - ".tox", - "build", - "dist", - "__pycache__", - "./docs/conf.py", +[tool.mypy] +plugins = [ + "numpy.typing.mypy_plugin", ] -src = ["src"] -ignore = [ - "E501", # Line length too long - # "D100", # Missing docstring in public module - # "D101", # Missing docstring in public class - # "D102", # Missing docstring in public method - # "D103", # Missing docstring in public function - # "D104", # Missing docstring in public package - "D105", # Missing docstring in magic method - "D107", # Missing docstring in __init__ - "D202", # No blank lines allowed after function docstring - "D203", # 1 blank line required before class docstring - "D205", # 1 blank line required between summary line and description - "D212", # Multi-line docstring summary should start at the first line - "D213", # Multi-line docstring summary should start at the second line - # "N802", # Function name should be lowercase (uncomment if you want to allow Uppercase function names) - # "N803", # Argument name should be lowercase (uncomment if you want to allow Uppercase argument names) - "N806", # Variable in function should be lowercase (uncomment if you want to allow Uppercase variable names in functions) - # "N815", # Variable in class scope should not be mixedCase (uncomment if you want to allow mixedCase variable names in class scope) - # "N816", # Variable in global scope should not be mixedCase (uncomment if you want to allow mixedCase variable names in global scope) - ] -line-length = 105 -select = [ - "E", - "D", - "F", - "N", - "W", - "I", - "B", +mypy_path = "stubs" +files = [ + "src", + "tests", + "data", ] -target-version = "py39" - -[tool.ruff.pep8-naming] -ignore-names = [ - "test_*", - "setUp", - "tearDown", +exclude = [ + "^src/folder_to_be_excluded/", +] +check_untyped_defs = true +disable_error_code = [ + "misc", + "import-untyped", ] -[tool.ruff.pydocstyle] -convention = "numpy" - -[tool.ruff.per-file-ignores] -"__init__.py" = ["I001"] -"./tests/*" = ["D"] [tool.pyright] +stubPath = "stubs" +include = [ + "src", + "tests", + "demos", +] exclude = [ - ".git", - ".venv", - ".tox", - "build", - "dist", - "**/__pycache__", - "./docs/conf.py", - "./venv", + "src/folder_to_be_excluded", ] -extraPaths = ["./src"] + typeCheckingMode = "basic" useLibraryCodeForTypes = true -# Activate the following rules step by step to (step by step..) improve code quality reportMissingParameterType = "error" reportUnknownParameterType = "warning" -reportUnknownMemberType = "warning" +reportUnknownMemberType = "warning" # consider to set to `false` if you work a lot with matplotlib and pandas, which are both not properly typed and known to trigger this warning reportMissingTypeArgument = "error" reportPropertyTypeMismatch = "error" reportFunctionMemberAccess = "warning" @@ -150,12 +160,13 @@ reportUnusedExpression = "warning" reportMatchNotExhaustive = "warning" reportShadowedImports = "warning" reportUntypedFunctionDecorator = "warning" +reportUntypedClassDecorator = "warning" reportUntypedBaseClass = "error" reportUntypedNamedTuple = "warning" - +reportUnnecessaryTypeIgnoreComment = "information" # Activate the following rules only locally and temporary, i.e. for a QA session. # (For server side CI they are considered too strict.) +# reportMissingTypeStubs = true # reportConstantRedefinition = "warning" -# reportUnnecessaryTypeIgnoreComment = "information" # reportImportCycles = "warning" # reportImplicitStringConcatenation = "warning" diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..c382b54 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,5 @@ +[pytest] +testpaths = + tests +addopts = --strict-markers --verbose --durations=10 +xfail_strict = True diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 0000000..9e92dd8 --- /dev/null +++ b/ruff.toml @@ -0,0 +1,153 @@ +exclude = [ + ".git", + ".venv", + "dist", + "*cache", + "**/__pycache__", + "src/folder_to_be_excluded", +] +src = [ + "src", +] +line-length = 120 +target-version = "py310" + +[lint] +# Settings for Ruff linter (invoked with `uv run ruff check`). +# Start by including _all_ Ruff lint rules, then ignore selected rules as needed +# https://docs.astral.sh/ruff/rules/ +select = [ + "ALL", +] +ignore = [ + # Ruff lint rules temporarily ignored, but which should be reactivated and resolved in the future. + + # Ruff lint rules considered as too strict and hence ignored + "FIX002", # Line contains TODO, consider resolving the issue + "TD003", # Missing issue link on the line following a TODO + "S101", # Use of assert detected + "RET504", # Unnecessary assignment to `result` before `return` statement + "EM101", # Exception must not use a string literal, assign to variable first + "EM102", # Exception must not use an f-string literal, assign to variable first + "TRY003", # Avoid specifying long messages outside the exception class + "PLR1711", # Useless `return` statement at end of function + "G00", # Logging statement uses string formatting ('G00' covers all rules flagging string formatting in logging, e.g. G001, G002, etc.) + "S311", # Standard pseudo-random generators are not suitable for cryptographic purposes + "PLW0603", # Using the global statement to update {name} is discouraged + "PYI041", # Use `float` instead of `int | float` + + # Ruff lint rules recommended to keep enabled, + # but which are typical candidates you might have a need to ignore, + # especially in the beginning or when refactoring an existing codebase, + # to avoid too many Ruff errors at once. + # -> Listed here for easy access and reference. + # (uncomment to ignore) + # "N803", # Argument name should be lowercase (NOTE: ignore to allow capital arguments (e.g X) in scientific code) + # "N806", # Variable in function should be lowercase (NOTE: ignore to allow capital variables (e.g X) in scientific code) + # "TC002", # Move third-party import into a type-checking block + # "TC003", # Move standard library import into a type-checking block + + # Ruff lint rules known to be in conflict with Ruff formatter. + # https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules + "W191", # Tab-indentation (in conflict with Ruff formatter) + "E111", # Indentation with invalid multiple (in conflict with Ruff formatter) + "E114", # Indentation with invalid multiple comment (in conflict with Ruff formatter) + "E117", # Over-indented (in conflict with Ruff formatter) + "D206", # Indent with spaces (in conflict with Ruff formatter) + "D300", # Triple single quotes (in conflict with Ruff formatter) + "Q000", # Bad quotes in inline string (in conflict with Ruff formatter) + "Q001", # Bad quotes in multi-line string (in conflict with Ruff formatter) + "Q002", # Bad quotes in DocString (in conflict with Ruff formatter) + "Q003", # Avoidable escaped quote (in conflict with Ruff formatter) + "COM812", # Missing trailing comma (in conflict with Ruff formatter) + "COM819", # Prohibited trailing comma (in conflict with Ruff formatter) + "ISC001", # Single-line implicit string concatenation (in conflict with Ruff formatter) + "ISC002", # Multi-line implicit string concatenation (in conflict with Ruff formatter) +] +# File patterns to be excluded from Ruff lint +# (only needed for file patterns not already listed in the common `exclude` setting +# at top of this file, i.e. list here _additional_ excludes specific to Ruff lint.) +exclude = [ +] +allowed-confusables = [ + "×", # used as dim multiplication sign in comments, such as `19×16×15×16×8×6×3 = 10,506,240 possible combinations of parameters`. +] + +[lint.pep8-naming] +ignore-names = [ + "test_*", +] + +[lint.pylint] +max-args = 7 + +[lint.flake8-pytest-style] +raises-require-match-for = [ + "BaseException", + "Exception", + "OSError", + "IOError", + "EnvironmentError", + "socket.error", +] + +[lint.per-file-ignores] +# `__init__.py` specific ignores +"__init__.py" = [ + "F401", # {name} imported but unused (NOTE: ignored as imports in `__init__.py` files are almost never used inside the module, but are intended for namespaces) + "I001", # Import block is un-sorted or un-formatted + "PLC0414", # Import alias does not rename original package +] +# `tests` specific ignores +"tests/**/*" = [ + "D", # Missing docstrings + "ERA001", # Found commented-out code + "PT006", # Wrong type passed to first argument of `@pytest.mark.parametrize` (NOTE: ignored to allow parameters args as "args_1,arg_2,arg_3,..." + "S101", # Use of assert detected + "PLR2004", # Magic value used in comparison + "ANN201", # Missing return type annotation for public function + "ANN202", # Missing return type annotation for private function + "ARG001", # Unused function argument: {name} + "ARG002", # Unused method argument: {name} + "INP001", # File is part of an implicit namespace package. Add an `__init__.py`. (NOTE: tests are not intended to be a module, __init__.py hence not required.) + "SLF001", # Private member accessed + "TRY004", # Prefer `TypeError` exception for invalid type +] +# `stubs` specific ignores +"stubs/**/*" = [ + "D", # Missing docstrings + "ERA001", # Found commented-out code + "SLF001", # Private member accessed + "F405", # {name} may be undefined, or defined from star imports: {module} + "F403", # from {name} import * used; unable to detect undefined names + "ANN", # Missing type annotation + "N", # Naming violations + "A001", # Variable {name} is shadowing a Python builtin + "A002", # Argument {name} is shadowing a Python builtin + "FBT001", # Boolean-typed positional argument in function definition + "PYI042", # Type alias {name} should be CamelCase + "PYI002", # complex if statement in stub + "PLR0913", # Too many arguments in function definition +] +# Jupyter notebook specific ignores +"**/*.ipynb" = [ + "D103", # Missing docstring in public function + "T201", # `print` found + "PGH003", # Use specific rule codes when ignoring type issues + "TCH002", # Move third-party import into a type-checking block +] +# `demos` specific ignores +"demos/**/*" = [ + "D", # Missing docstrings + "S101", # Use of assert detected + "PLR2004", # Magic value used in comparison + "INP001", # File is part of an implicit namespace package. Add an `__init__.py`. (NOTE: tutorials are not intended to be a module, __init__.py hence not required.) + "T201", # `print` found + "E402", # Module level import not at top of cell +] + +[lint.pydocstyle] +convention = "numpy" + +[format] +docstring-code-format = true diff --git a/src/trafficgen/check_land_crossing.py b/src/trafficgen/check_land_crossing.py index d0912fa..e9f84c0 100644 --- a/src/trafficgen/check_land_crossing.py +++ b/src/trafficgen/check_land_crossing.py @@ -27,7 +27,6 @@ def path_crosses_land( ------- is_on_land: True if parts of the path crosses land. """ - num_checks = 10 for i in range(int(time_interval / num_checks)): position_2 = calculate_position_at_certain_time( diff --git a/src/trafficgen/cli.py b/src/trafficgen/cli.py index ab53dec..f87250b 100644 --- a/src/trafficgen/cli.py +++ b/src/trafficgen/cli.py @@ -8,6 +8,7 @@ import logging import sys from pathlib import Path +from typing import TYPE_CHECKING import click import click_log @@ -15,9 +16,11 @@ from trafficgen.plot_traffic_situation import plot_specific_traffic_situation, plot_traffic_situations from trafficgen.read_files import read_encounter_settings_file from trafficgen.ship_traffic_generator import generate_traffic_situations -from trafficgen.types import EncounterSettings from trafficgen.write_traffic_situation_to_file import write_traffic_situations_to_json_file +if TYPE_CHECKING: + from trafficgen.types import EncounterSettings + logger = logging.getLogger(__name__) _ = click_log.basic_config(logger) @@ -124,7 +127,7 @@ def gen_situation( Example: \n trafficgen gen-situation -s ./data/example_situations_input -o ./data/test_output_1. - """ + """ # noqa: D205 click.echo("Generating traffic situations") generated_traffic_situations = generate_traffic_situations( situation_folder=Path(situations), @@ -149,13 +152,9 @@ def gen_situation( with contextlib.suppress(TypeError): if visualize_situation > 0: click.echo("Plotting a specific traffic situation") - plot_specific_traffic_situation( - generated_traffic_situations, visualize_situation, encounter_settings - ) + plot_specific_traffic_situation(generated_traffic_situations, visualize_situation, encounter_settings) else: - click.echo( - "Invalid traffic situation number specified, not creating map plot. See --help for more info." - ) + click.echo("Invalid traffic situation number specified, not creating map plot. See --help for more info.") if output is not None: click.echo("Writing traffic situations to files") write_traffic_situations_to_json_file(generated_traffic_situations, write_folder=Path(output)) diff --git a/src/trafficgen/encounter.py b/src/trafficgen/encounter.py index c4b85fd..53f9422 100644 --- a/src/trafficgen/encounter.py +++ b/src/trafficgen/encounter.py @@ -1,11 +1,12 @@ """ -Functions to generate encounters consisting of one own ship and one to many target ships. +Functions to generate encounters. + +The encounters consist of one own ship and one to many target ships. The generated encounters may be of type head-on, overtaking give-way and stand-on and crossing give-way and stand-on. """ import random -from typing import List, Optional, Tuple, Union import numpy as np @@ -36,13 +37,13 @@ def generate_encounter( desired_encounter_type: EncounterType, own_ship: OwnShip, - target_ships_static: List[ShipStatic], + target_ships_static: list[ShipStatic], encounter_number: int, - beta_default: Optional[Union[List[float], float]], - relative_sog_default: Optional[float], - vector_time_default: Optional[float], + beta_default: list[float] | float | None, + relative_sog_default: float | None, + vector_time_default: float | None, settings: EncounterSettings, -) -> Tuple[TargetShip, bool]: +) -> tuple[TargetShip, bool]: """ Generate an encounter. @@ -90,13 +91,13 @@ def generate_encounter( # resetting vector_time, beta and relative_sog to default values before # new search for situation is done - vector_time: Union[float, None] = vector_time_default + vector_time: float | None = vector_time_default if vector_time is None: vector_time = random.uniform(settings.vector_range[0], settings.vector_range[1]) if beta_default is None: beta: float = assign_beta(desired_encounter_type, settings) - elif isinstance(beta_default, List): + elif isinstance(beta_default, list): beta: float = assign_beta_from_list(beta_default) else: beta: float = beta_default @@ -211,14 +212,10 @@ def generate_encounter( settings.situation_length, ) - target_ship_waypoint1 = Waypoint( - position=future_position_target_ship, turn_radius=None, leg=None - ) + target_ship_waypoint1 = Waypoint(position=future_position_target_ship, turn_radius=None, leg=None) waypoints = [target_ship_waypoint0, target_ship_waypoint1] - target_ship = TargetShip( - static=target_ship_static, initial=target_ship_initial, waypoints=waypoints - ) + target_ship = TargetShip(static=target_ship_static, initial=target_ship_initial, waypoints=waypoints) else: # Since encounter is not found, using initial values from own ship. Will not be taken into use. target_ship = TargetShip(static=target_ship_static, initial=own_ship.initial, waypoints=None) @@ -237,7 +234,9 @@ def check_encounter_evolvement( settings: EncounterSettings, ) -> bool: """ - Check encounter evolvement. The generated encounter should be the same type of + Check encounter evolvement. + + The generated encounter should be the same type of encounter (head-on, crossing, give-way) also some time before the encounter is started. Params: @@ -253,7 +252,7 @@ def check_encounter_evolvement( theta13_criteria: float = settings.classification.theta13_criteria theta14_criteria: float = settings.classification.theta14_criteria theta15_criteria: float = settings.classification.theta15_criteria - theta15: List[float] = settings.classification.theta15 + theta15: list[float] = settings.classification.theta15 assert own_ship.initial is not None @@ -327,16 +326,16 @@ def define_own_ship( encounter_settings.situation_length, ) own_ship_waypoint1 = Waypoint(position=ship_position_future, turn_radius=None, leg=None) - own_ship_waypoints: List[Waypoint] = [own_ship_waypoint0, own_ship_waypoint1] + own_ship_waypoints: list[Waypoint] = [own_ship_waypoint0, own_ship_waypoint1] elif len(desired_traffic_situation.own_ship.waypoints) == 1: # If one waypoint is given, use initial position as first waypoint own_ship_waypoint0 = Waypoint( position=own_ship_initial.position.model_copy(deep=True), turn_radius=None, leg=None ) own_ship_waypoint1 = desired_traffic_situation.own_ship.waypoints[0] - own_ship_waypoints: List[Waypoint] = [own_ship_waypoint0, own_ship_waypoint1] + own_ship_waypoints: list[Waypoint] = [own_ship_waypoint0, own_ship_waypoint1] else: - own_ship_waypoints: List[Waypoint] = desired_traffic_situation.own_ship.waypoints + own_ship_waypoints: list[Waypoint] = desired_traffic_situation.own_ship.waypoints own_ship = OwnShip( static=own_ship_static, @@ -355,8 +354,9 @@ def calculate_min_vector_length_target_ship( lat_lon0: GeoPosition, ) -> float: """ - Calculate minimum vector length (target ship sog x vector). This will - ensure that ship sog is high enough to find proper situation. + Calculate minimum vector length (target ship sog x vector). + + This is done to ensure that ship sog is high enough to find proper situation. Params: * own_ship_position: Own ship initial position, latitudinal [rad] and longitudinal [rad] @@ -399,7 +399,7 @@ def find_start_position_target_ship( desired_beta: float, desired_encounter_type: EncounterType, settings: EncounterSettings, -) -> Tuple[GeoPosition, bool]: +) -> tuple[GeoPosition, bool]: """ Find start position of target ship using desired beta and vector length. @@ -420,7 +420,7 @@ def find_start_position_target_ship( theta13_criteria: float = settings.classification.theta13_criteria theta14_criteria: float = settings.classification.theta14_criteria theta15_criteria: float = settings.classification.theta15_criteria - theta15: List[float] = settings.classification.theta15 + theta15: list[float] = settings.classification.theta15 n_1, e_1, _ = llh2flat(own_ship_position.lat, own_ship_position.lon, lat_lon0.lat, lat_lon0.lon) n_2, e_2, _ = llh2flat( @@ -436,12 +436,7 @@ def find_start_position_target_ship( e_4: float = e_1 + np.sin(psi) b: float = ( - -2 * e_2 * e_4 - - 2 * n_2 * n_4 - + 2 * e_1 * e_2 - + 2 * n_1 * n_2 - + 2 * e_1 * (e_4 - e_1) - + 2 * n_1 * (n_4 - n_1) + -2 * e_2 * e_4 - 2 * n_2 * n_4 + 2 * e_1 * e_2 + 2 * n_1 * n_2 + 2 * e_1 * (e_4 - e_1) + 2 * n_1 * (n_4 - n_1) ) a: float = (e_4 - e_1) ** 2 + (n_4 - n_1) ** 2 c: float = e_2**2 + n_2**2 - 2 * e_1 * e_2 - 2 * n_1 * n_2 - v_r**2 + e_1**2 + n_1**2 @@ -519,9 +514,10 @@ def assign_future_position_to_target_ship( max_meeting_distance: float, ) -> GeoPosition: """ - Randomly assign future position of target ship. If drawing a circle with radius - max_meeting_distance around future position of own ship, future position of - target ship shall be somewhere inside this circle. + Randomly assign future position of target ship. + + If drawing a circle with radius max_meeting_distance around future position of own ship, + future position of target ship shall be somewhere inside this circle. Params: * own_ship_position_future: Dict, own ship position at a given time in the @@ -555,10 +551,12 @@ def determine_colreg( theta13_criteria: float, theta14_criteria: float, theta15_criteria: float, - theta15: List[float], + theta15: list[float], ) -> EncounterType: """ - Determine the colreg type based on alpha, relative bearing between target ship and own + Determine the colreg type. + + Colreg type is based on alpha, relative bearing between target ship and own ship seen from target ship, and beta, relative bearing between own ship and target ship seen from own ship. @@ -583,22 +581,13 @@ def determine_colreg( # Find appropriate rule set if (beta > theta15[0]) & (beta < theta15[1]) & (abs(alpha) - theta13_criteria <= 0.001): return EncounterType.OVERTAKING_STAND_ON - if ( - (alpha_2_pi > theta15[0]) - & (alpha_2_pi < theta15[1]) - & (abs(beta_pi) - theta13_criteria <= 0.001) - ): + if (alpha_2_pi > theta15[0]) & (alpha_2_pi < theta15[1]) & (abs(beta_pi) - theta13_criteria <= 0.001): return EncounterType.OVERTAKING_GIVE_WAY if (abs(beta_pi) - theta14_criteria <= 0.001) & (abs(alpha) - theta14_criteria <= 0.001): return EncounterType.HEAD_ON if (beta > 0) & (beta < theta15[0]) & (alpha > -theta15[0]) & (alpha - theta15_criteria <= 0.001): return EncounterType.CROSSING_GIVE_WAY - if ( - (alpha_2_pi > 0) - & (alpha_2_pi < theta15[0]) - & (beta_pi > -theta15[0]) - & (beta_pi - theta15_criteria <= 0.001) - ): + if (alpha_2_pi > 0) & (alpha_2_pi < theta15[0]) & (beta_pi > -theta15[0]) & (beta_pi - theta15_criteria <= 0.001): return EncounterType.CROSSING_STAND_ON return EncounterType.NO_RISK_COLLISION @@ -609,10 +598,9 @@ def calculate_relative_bearing( position_target_ship: GeoPosition, heading_target_ship: float, lat_lon0: GeoPosition, -) -> Tuple[float, float]: +) -> tuple[float, float]: """ - Calculate relative bearing between own ship and target ship, both seen from - own ship and seen from target ship. + Calculate relative bearing between own ship and target ship. Params: * position_own_ship: Own ship position {lat, lon} [rad] @@ -627,9 +615,7 @@ def calculate_relative_bearing( * alpha: relative bearing between target ship and own ship seen from target ship [rad] """ # POSE combination of relative bearing and contact angle - n_own_ship, e_own_ship, _ = llh2flat( - position_own_ship.lat, position_own_ship.lon, lat_lon0.lat, lat_lon0.lon - ) + n_own_ship, e_own_ship, _ = llh2flat(position_own_ship.lat, position_own_ship.lon, lat_lon0.lat, lat_lon0.lon) n_target_ship, e_target_ship, _ = llh2flat( position_target_ship.lat, position_target_ship.lon, @@ -705,7 +691,7 @@ def calculate_ship_cog(pos_0: GeoPosition, pos_1: GeoPosition, lat_lon0: GeoPosi return round(cog, 3) -def assign_vector_time(vector_time_range: List[float]): +def assign_vector_time(vector_time_range: list[float]) -> float: """ Assign random (uniform) vector time. @@ -716,9 +702,7 @@ def assign_vector_time(vector_time_range: List[float]): ------- * vector_time: Vector time [min] """ - vector_time: float = vector_time_range[0] + random.uniform(0, 1) * ( - vector_time_range[1] - vector_time_range[0] - ) + vector_time: float = vector_time_range[0] + random.uniform(0, 1) * (vector_time_range[1] - vector_time_range[0]) return vector_time @@ -727,7 +711,7 @@ def assign_sog_to_target_ship( own_ship_sog: float, min_target_ship_sog: float, relative_sog_setting: EncounterRelativeSpeed, -): +) -> float: """ Assign random (uniform) sog to target ship depending on type of encounter. @@ -755,10 +739,7 @@ def assign_sog_to_target_ship( relative_sog = [0.0, 0.0] # Check that minimum target ship sog is in the relative sog range - if ( - min_target_ship_sog / own_ship_sog > relative_sog[0] - and min_target_ship_sog / own_ship_sog < relative_sog[1] - ): + if min_target_ship_sog / own_ship_sog > relative_sog[0] and min_target_ship_sog / own_ship_sog < relative_sog[1]: relative_sog[0] = min_target_ship_sog / own_ship_sog target_ship_sog: float = ( @@ -768,10 +749,12 @@ def assign_sog_to_target_ship( return target_ship_sog -def assign_beta_from_list(beta_limit: List[float]) -> float: +def assign_beta_from_list(beta_limit: list[float]) -> float: """ - Assign random (uniform) relative bearing beta between own ship - and target ship depending between the limits given by beta_limit. + Assign random (uniform) relative bearing. + + The beta between own ship + and target ship depending is somewhere between the limits given by beta_limit. Params: * beta_limit: Limits for beta @@ -787,8 +770,7 @@ def assign_beta_from_list(beta_limit: List[float]) -> float: def assign_beta(encounter_type: EncounterType, settings: EncounterSettings) -> float: """ - Assign random (uniform) relative bearing beta between own ship - and target ship depending on type of encounter. + Assign random (uniform) relative bearing. Params: * encounter_type: Type of encounter @@ -801,7 +783,7 @@ def assign_beta(encounter_type: EncounterType, settings: EncounterSettings) -> f theta13_crit: float = settings.classification.theta13_criteria theta14_crit: float = settings.classification.theta14_criteria theta15_crit: float = settings.classification.theta15_criteria - theta15: List[float] = settings.classification.theta15 + theta15: list[float] = settings.classification.theta15 if encounter_type is EncounterType.OVERTAKING_STAND_ON: return theta15[0] + random.uniform(0, 1) * (theta15[1] - theta15[0]) @@ -818,7 +800,7 @@ def assign_beta(encounter_type: EncounterType, settings: EncounterSettings) -> f return 0.0 -def decide_target_ship(target_ships_static: List[ShipStatic]) -> ShipStatic: +def decide_target_ship(target_ships_static: list[ShipStatic]) -> ShipStatic: """ Randomly pick a target ship from a list of target ships. diff --git a/src/trafficgen/marine_system_simulator.py b/src/trafficgen/marine_system_simulator.py index 136ef56..70b9fbf 100644 --- a/src/trafficgen/marine_system_simulator.py +++ b/src/trafficgen/marine_system_simulator.py @@ -11,8 +11,6 @@ Parts of the library have been re-implemented in Python and are found below. """ -from typing import Tuple - import numpy as np @@ -23,10 +21,9 @@ def flat2llh( lon_0: float, z_n: float = 0.0, height_ref: float = 0.0, -) -> Tuple[float, float, float]: +) -> tuple[float, float, float]: """ - Compute lon lon (rad), lat lat (rad) and height h (m) for the - NED coordinates (xn,yn,zn). + Compute lon lon (rad), lat lat (rad) and height h (m) for the NED coordinates (xn,yn,zn). Method taken from the MSS (Marine System Simulator) toolbox which is a Matlab/Simulink library for marine systems. @@ -80,10 +77,9 @@ def llh2flat( lon_0: float, height: float = 0.0, height_ref: float = 0.0, -) -> Tuple[float, float, float]: +) -> tuple[float, float, float]: """ - Compute (north, east) for a flat Earth coordinate system from lon - lon (rad) and lat lat (rad). + Compute (north, east) for a flat Earth coordinate system from lon lon (rad) and lat lat (rad). Method taken from the MSS (Marine System Simulator) toolbox which is a Matlab/Simulink library for marine systems. @@ -109,7 +105,6 @@ def llh2flat( * y_n: Ship position, east [m] * z_n: Ship position, down [m] """ - # WGS-84 parameters a_radius = 6378137 # Semi-major axis (equitorial radius) f_factor = 1 / 298.257223563 # Flattening @@ -149,5 +144,4 @@ def ssa(angle: float) -> float: ------- * smallest_angle: "smallest signed angle" or the smallest difference between two angles """ - return np.mod(angle + np.pi, 2 * np.pi) - np.pi diff --git a/src/trafficgen/plot_traffic_situation.py b/src/trafficgen/plot_traffic_situation.py index e8fc2c3..dccb3ec 100644 --- a/src/trafficgen/plot_traffic_situation.py +++ b/src/trafficgen/plot_traffic_situation.py @@ -3,12 +3,11 @@ """Functions to prepare and plot traffic situations.""" import math -from typing import List, Optional, Tuple, Union import matplotlib.pyplot as plt import numpy as np from folium import Map, Polygon -from matplotlib.axes import Axes as Axes +from matplotlib.axes import Axes from matplotlib.patches import Circle from trafficgen.marine_system_simulator import flat2llh, llh2flat @@ -21,7 +20,7 @@ def calculate_vector_arrow( direction: float, vector_length: float, lat_lon0: GeoPosition, -) -> List[Tuple[float, float]]: +) -> list[tuple[float, float]]: """ Calculate the arrow with length vector pointing in the direction of ship course. @@ -50,12 +49,8 @@ def calculate_vector_arrow( lat_start, lon_start, _ = flat2llh(north_start, east_start, lat_lon0.lat, lat_lon0.lon) lat_end, lon_end, _ = flat2llh(north_end, east_end, lat_lon0.lat, lat_lon0.lon) - lat_arrow_side_1, lon_arrow_side_1, _ = flat2llh( - north_arrow_side_1, east_arrow_side_1, lat_lon0.lat, lat_lon0.lon - ) - lat_arrow_side_2, lon_arrow_side_2, _ = flat2llh( - north_arrow_side_2, east_arrow_side_2, lat_lon0.lat, lat_lon0.lon - ) + lat_arrow_side_1, lon_arrow_side_1, _ = flat2llh(north_arrow_side_1, east_arrow_side_1, lat_lon0.lat, lat_lon0.lon) + lat_arrow_side_2, lon_arrow_side_2, _ = flat2llh(north_arrow_side_2, east_arrow_side_2, lat_lon0.lat, lat_lon0.lon) point_1 = (rad_2_deg(lat_start), rad_2_deg(lon_start)) point_2 = (rad_2_deg(lat_end), rad_2_deg(lon_end)) @@ -71,7 +66,7 @@ def calculate_ship_outline( lat_lon0: GeoPosition, ship_length: float = 100.0, ship_width: float = 15.0, -) -> List[Tuple[float, float]]: +) -> list[tuple[float, float]]: """ Calculate the outline of the ship pointing in the direction of ship course. @@ -96,16 +91,8 @@ def calculate_ship_outline( east_pos1 = east_start + np.sin(course) * (-ship_length / 2) + np.cos(course) * ship_width / 2 lat_pos1, lon_pos1, _ = flat2llh(north_pos1, east_pos1, lat_lon0.lat, lat_lon0.lon) - north_pos2 = ( - north_start - + np.cos(course) * (ship_length / 2 - ship_length * 0.1) - - np.sin(course) * ship_width / 2 - ) - east_pos2 = ( - east_start - + np.sin(course) * (ship_length / 2 - ship_length * 0.1) - + np.cos(course) * ship_width / 2 - ) + north_pos2 = north_start + np.cos(course) * (ship_length / 2 - ship_length * 0.1) - np.sin(course) * ship_width / 2 + east_pos2 = east_start + np.sin(course) * (ship_length / 2 - ship_length * 0.1) + np.cos(course) * ship_width / 2 lat_pos2, lon_pos2, _ = flat2llh(north_pos2, east_pos2, lat_lon0.lat, lat_lon0.lon) north_pos3 = north_start + np.cos(course) * (ship_length / 2) @@ -113,15 +100,9 @@ def calculate_ship_outline( lat_pos3, lon_pos3, _ = flat2llh(north_pos3, east_pos3, lat_lon0.lat, lat_lon0.lon) north_pos4 = ( - north_start - + np.cos(course) * (ship_length / 2 - ship_length * 0.1) - - np.sin(course) * (-ship_width / 2) - ) - east_pos4 = ( - east_start - + np.sin(course) * (ship_length / 2 - ship_length * 0.1) - + np.cos(course) * (-ship_width / 2) + north_start + np.cos(course) * (ship_length / 2 - ship_length * 0.1) - np.sin(course) * (-ship_width / 2) ) + east_pos4 = east_start + np.sin(course) * (ship_length / 2 - ship_length * 0.1) + np.cos(course) * (-ship_width / 2) lat_pos4, lon_pos4, _ = flat2llh(north_pos4, east_pos4, lat_lon0.lat, lat_lon0.lon) north_pos5 = north_start + np.cos(course) * (-ship_length / 2) - np.sin(course) * (-ship_width / 2) @@ -138,10 +119,10 @@ def calculate_ship_outline( def plot_specific_traffic_situation( - traffic_situations: List[TrafficSituation], + traffic_situations: list[TrafficSituation], situation_number: int, encounter_settings: EncounterSettings, -): +) -> None: """ Plot a specific situation in map. @@ -149,11 +130,10 @@ def plot_specific_traffic_situation( * traffic_situations: Generated traffic situations * situation_number: The specific situation to be plotted """ - num_situations = len(traffic_situations) if situation_number > num_situations: print( - f"Situation_number specified higher than number of situations available, plotting last situation: {num_situations}" + f"Situation_number specified higher than number of situations available, plotting last situation: {num_situations}" # noqa: E501 ) situation_number = num_situations @@ -173,7 +153,7 @@ def plot_specific_traffic_situation( "black", ) - target_ships: Union[List[TargetShip], None] = situation.target_ships + target_ships: list[TargetShip] | None = situation.target_ships assert target_ships is not None for target_ship in target_ships: map_plot = add_ship_to_map( @@ -190,7 +170,7 @@ def add_ship_to_map( ship: Ship, vector_time: float, lat_lon0: GeoPosition, - map_plot: Optional[Map], + map_plot: Map | None, color: str = "black", ) -> Map: """ @@ -232,11 +212,11 @@ def add_ship_to_map( def plot_traffic_situations( - traffic_situations: List[TrafficSituation], + traffic_situations: list[TrafficSituation], col: int, row: int, encounter_settings: EncounterSettings, -): +) -> None: """ Plot the traffic situations in one more figures. @@ -352,9 +332,9 @@ def add_ship_to_plot( ship: Ship, vector_time: float, lat_lon0: GeoPosition, - axes: Optional[Axes], + axes: Axes | None, color: str = "black", -): +) -> Axes: """ Add the ship to the plot. @@ -396,7 +376,7 @@ def add_ship_to_plot( ) circle = Circle( xy=(pos_0_east, pos_0_north), - radius=vector_time / 3000.0, # type: ignore + radius=vector_time / 3000.0, color=color, ) _ = axes.add_patch(circle) diff --git a/src/trafficgen/read_files.py b/src/trafficgen/read_files.py index 387efcc..977df4a 100644 --- a/src/trafficgen/read_files.py +++ b/src/trafficgen/read_files.py @@ -3,21 +3,18 @@ import json import os from pathlib import Path -from typing import Any, Dict, List, Union, cast -from uuid import UUID, uuid4 +from typing import Any, cast from trafficgen.types import ( EncounterSettings, - OwnShip, ShipStatic, SituationInput, - TargetShip, TrafficSituation, ) from trafficgen.utils import deg_2_rad, knot_2_m_pr_s, min_2_s, nm_2_m -def read_situation_files(situation_folder: Path) -> List[SituationInput]: +def read_situation_files(situation_folder: Path) -> list[SituationInput]: """ Read traffic situation files. @@ -29,10 +26,10 @@ def read_situation_files(situation_folder: Path) -> List[SituationInput]: ------- * situations: List of desired traffic situations """ - situations: List[SituationInput] = [] + situations: list[SituationInput] = [] for file_name in sorted([file for file in os.listdir(situation_folder) if file.endswith(".json")]): - file_path = os.path.join(situation_folder, file_name) - with open(file_path, encoding="utf-8") as f: + file_path = situation_folder / file_name + with Path.open(file_path, encoding="utf-8") as f: data = json.load(f) data = convert_keys_to_snake_case(data) @@ -47,7 +44,7 @@ def read_situation_files(situation_folder: Path) -> List[SituationInput]: return situations -def read_generated_situation_files(situation_folder: Path) -> List[TrafficSituation]: +def read_generated_situation_files(situation_folder: Path) -> list[TrafficSituation]: """ Read the generated traffic situation files. Used for testing the trafficgen algorithm. @@ -58,10 +55,10 @@ def read_generated_situation_files(situation_folder: Path) -> List[TrafficSituat ------- * situations: List of desired traffic situations """ - situations: List[TrafficSituation] = [] + situations: list[TrafficSituation] = [] for file_name in sorted([file for file in os.listdir(situation_folder) if file.endswith(".json")]): - file_path = os.path.join(situation_folder, file_name) - with open(file_path, encoding="utf-8") as f: + file_path = situation_folder / file_name + with Path.open(file_path, encoding="utf-8") as f: data = json.load(f) data = convert_keys_to_snake_case(data) @@ -112,10 +109,10 @@ def convert_situation_data_from_maritime_to_si_units(situation: SituationInput) assert situation.encounters is not None for encounter in situation.encounters: - beta: Union[List[float], float, None] = encounter.beta - vector_time: Union[float, None] = encounter.vector_time + beta: list[float] | float | None = encounter.beta + vector_time: float | None = encounter.vector_time if beta is not None: - if isinstance(beta, List): + if isinstance(beta, list): assert len(beta) == 2 for i in range(len(beta)): beta[i] = deg_2_rad(beta[i]) @@ -138,7 +135,7 @@ def read_own_ship_static_file(own_ship_static_file: Path) -> ShipStatic: ------- * own_ship static information """ - with open(own_ship_static_file, encoding="utf-8") as f: + with Path.open(own_ship_static_file, encoding="utf-8") as f: data = json.load(f) data = convert_keys_to_snake_case(data) @@ -152,7 +149,7 @@ def read_own_ship_static_file(own_ship_static_file: Path) -> ShipStatic: return ship_static -def read_target_ship_static_files(target_ship_folder: Path) -> List[ShipStatic]: +def read_target_ship_static_files(target_ship_folder: Path) -> list[ShipStatic]: """ Read target ship static data files. @@ -163,12 +160,12 @@ def read_target_ship_static_files(target_ship_folder: Path) -> List[ShipStatic]: ------- * target_ships_static: List of different target ships with static information """ - target_ships_static: List[ShipStatic] = [] + target_ships_static: list[ShipStatic] = [] i = 0 for file_name in sorted([file for file in os.listdir(target_ship_folder) if file.endswith(".json")]): i = i + 1 - file_path = os.path.join(target_ship_folder, file_name) - with open(file_path, encoding="utf-8") as f: + file_path = target_ship_folder / file_name + with Path.open(file_path, encoding="utf-8") as f: data = json.load(f) data = convert_keys_to_snake_case(data) @@ -209,7 +206,7 @@ def read_encounter_settings_file(settings_file: Path) -> EncounterSettings: ------- * encounter_settings: Settings for the encounter """ - with open(settings_file, encoding="utf-8") as f: + with Path.open(settings_file, encoding="utf-8") as f: data = json.load(f) data = check_input_units(data) encounter_settings: EncounterSettings = EncounterSettings(**data) @@ -249,9 +246,8 @@ def convert_settings_data_from_maritime_to_si_units(settings: EncounterSettings) return settings -def check_input_units(data: Dict[str, Any]) -> Dict[str, Any]: +def check_input_units(data: dict[str, Any]) -> dict[str, Any]: """Check if input unit is specified, if not specified it is set to SI.""" - if "input_units" not in data: data["input_units"] = "si" @@ -263,33 +259,26 @@ def camel_to_snake(string: str) -> str: return "".join([f"_{c.lower()}" if c.isupper() else c for c in string]).lstrip("_") -def convert_keys_to_snake_case(data: Dict[str, Any]) -> Dict[str, Any]: +def convert_keys_to_snake_case(data: dict[str, Any]) -> dict[str, Any]: """Convert keys in a nested dictionary from camel case to snake case.""" - return cast(Dict[str, Any], _convert_keys_to_snake_case(data)) + return cast(dict[str, Any], _convert_keys_to_snake_case(data)) def _convert_keys_to_snake_case( - data: Union[Dict[str, Any], List[Any]], -) -> Union[Dict[str, Any], List[Any]]: + data: dict[str, Any] | list[Any], +) -> dict[str, Any] | list[Any]: """Convert keys in a nested dictionary from camel case to snake case.""" - - if isinstance(data, Dict): # Dict - converted_dict: Dict[str, Any] = {} + if isinstance(data, dict): # Dict + converted_dict: dict[str, Any] = {} for key, value in data.items(): converted_key = camel_to_snake(key) - if isinstance(value, (Dict, List)): - converted_value = _convert_keys_to_snake_case(value) - else: - converted_value = value + converted_value = _convert_keys_to_snake_case(value) if isinstance(value, dict | list) else value converted_dict[converted_key] = converted_value return converted_dict # List - converted_list: List[Any] = [] + converted_list: list[Any] = [] for value in data: - if isinstance(value, (Dict, List)): - converted_value = _convert_keys_to_snake_case(value) - else: - converted_value = value + converted_value = _convert_keys_to_snake_case(value) if isinstance(value, dict | list) else value converted_list.append(value) return converted_list diff --git a/src/trafficgen/ship_traffic_generator.py b/src/trafficgen/ship_traffic_generator.py index 1032559..3504139 100644 --- a/src/trafficgen/ship_traffic_generator.py +++ b/src/trafficgen/ship_traffic_generator.py @@ -2,7 +2,6 @@ from importlib.metadata import PackageNotFoundError, version from pathlib import Path -from typing import List, Union from trafficgen.encounter import ( define_own_ship, @@ -36,9 +35,10 @@ def generate_traffic_situations( own_ship_file: Path, target_ship_folder: Path, settings_file: Path, -) -> List[TrafficSituation]: +) -> list[TrafficSituation]: """ Generate a set of traffic situations using input files. + This is the main function for generating a set of traffic situations using input files specifying number and type of encounter, type of target ships etc. @@ -53,12 +53,11 @@ def generate_traffic_situations( * traffic_situations: List of generated traffic situations. * One situation may consist of one or more encounters. """ - own_ship_static: ShipStatic = read_own_ship_static_file(own_ship_file) - target_ships_static: List[ShipStatic] = read_target_ship_static_files(target_ship_folder) + target_ships_static: list[ShipStatic] = read_target_ship_static_files(target_ship_folder) encounter_settings: EncounterSettings = read_encounter_settings_file(settings_file) - desired_traffic_situations: List[SituationInput] = read_situation_files(situation_folder) - traffic_situations: List[TrafficSituation] = [] + desired_traffic_situations: list[SituationInput] = read_situation_files(situation_folder) + traffic_situations: list[TrafficSituation] = [] for desired_traffic_situation in desired_traffic_situations: num_situations: int = desired_traffic_situation.num_situations @@ -68,16 +67,14 @@ def generate_traffic_situations( lat_lon0: GeoPosition = desired_traffic_situation.own_ship.initial.position - own_ship: OwnShip = define_own_ship( - desired_traffic_situation, own_ship_static, encounter_settings, lat_lon0 - ) + own_ship: OwnShip = define_own_ship(desired_traffic_situation, own_ship_static, encounter_settings, lat_lon0) for _ in range(num_situations): - target_ships: List[TargetShip] = [] + target_ships: list[TargetShip] = [] for i, encounter in enumerate(desired_traffic_situation.encounters): desired_encounter_type = EncounterType(encounter.desired_encounter_type) - beta: Union[List[float], float, None] = encounter.beta - relative_speed: Union[float, None] = encounter.relative_speed - vector_time: Union[float, None] = encounter.vector_time + beta: list[float] | float | None = encounter.beta + relative_speed: float | None = encounter.relative_speed + vector_time: float | None = encounter.vector_time target_ship, encounter_found = generate_encounter( desired_encounter_type, diff --git a/src/trafficgen/types.py b/src/trafficgen/types.py index 4706810..08d2ca4 100644 --- a/src/trafficgen/types.py +++ b/src/trafficgen/types.py @@ -3,7 +3,7 @@ from datetime import datetime from enum import Enum from importlib.metadata import PackageNotFoundError, version -from typing import Annotated, Any, List, Optional, Type, Union +from typing import Annotated, Any, Optional, Type from pydantic import BaseModel, ConfigDict from pydantic.fields import Field @@ -175,32 +175,20 @@ class Dimensions(BaseModelConfig): """ - length: Optional[ - Annotated[float, Field(gt=0, description="Width of the ship in meters", examples=[130.0])] - ] = None - width: Optional[ - Annotated[float, Field(gt=0, description="Width of the ship in meters", examples=[30.0])] - ] = None - height: Optional[ - Annotated[float, Field(gt=0, description="Height of the ship in meters", examples=[15.0])] - ] = None - draught: Optional[ - Annotated[float, Field(gt=0, description="Draught of the ship in meters", examples=[15.0])] - ] = None + length: Optional[Annotated[float, Field(gt=0, description="Width of the ship in meters", examples=[130.0])]] = None + width: Optional[Annotated[float, Field(gt=0, description="Width of the ship in meters", examples=[30.0])]] = None + height: Optional[Annotated[float, Field(gt=0, description="Height of the ship in meters", examples=[15.0])]] = None + draught: Optional[Annotated[float, Field(gt=0, description="Draught of the ship in meters", examples=[15.0])]] = ( + None + ) - a: Optional[ - Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Bow", examples=[80])] - ] = None - b: Optional[ - Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Stern", examples=[20])] - ] = None - c: Optional[ - Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Port", examples=[20])] - ] = None + a: Optional[Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Bow", examples=[80])]] = None + b: Optional[Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Stern", examples=[20])]] = ( + None + ) + c: Optional[Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Port", examples=[20])]] = None d: Optional[ - Annotated[ - float, Field(gt=0, description="Distance in meters from CCRP to Starboard", examples=[20]) - ] + Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Starboard", examples=[20])] ] = None def __init__(self, **data: Any): @@ -232,16 +220,12 @@ class ShipStatic(BaseModelConfig): ), ] ] = None - imo: Optional[ - Annotated[int, Field(ge=1000000, le=9999999, description="IMO Number", examples=[1234567])] - ] = None + imo: Optional[Annotated[int, Field(ge=1000000, le=9999999, description="IMO Number", examples=[1234567])]] = None name: Optional[Annotated[str, Field(description="Ship name", examples=["RMS Titanic"])]] = None dimensions: Optional[Annotated[Dimensions, Field(description="Key ship dimensions")]] = None - ship_type: Optional[Annotated[AisShipType, Field(description="General ship type, based on AIS")]] = ( - None - ) + ship_type: Optional[Annotated[AisShipType, Field(description="General ship type, based on AIS")]] = None path_type: Optional[ Annotated[ @@ -254,14 +238,10 @@ class ShipStatic(BaseModelConfig): ] = None sog_min: Optional[ - Annotated[ - float, Field(ge=0, description="Minimum ship speed over ground in knots", examples=[5.0]) - ] + Annotated[float, Field(ge=0, description="Minimum ship speed over ground in knots", examples=[5.0])] ] = None sog_max: Optional[ - Annotated[ - float, Field(ge=0, description="Maximum ship speed over ground in knots", examples=[15.0]) - ] + Annotated[float, Field(ge=0, description="Maximum ship speed over ground in knots", examples=[15.0])] ] = None model_config = ConfigDict(extra="allow") @@ -297,19 +277,13 @@ class Initial(BaseModelConfig): examples=[create_position_example()], ), ] - sog: Annotated[ - float, Field(ge=0, description="Initial ship (SOG) ground in knots", examples=[10.0]) - ] + sog: Annotated[float, Field(ge=0, description="Initial ship (SOG) ground in knots", examples=[10.0])] cog: Annotated[ float, - Field( - ge=0, le=360, description="Initial ship course over ground (COG) in degrees", examples=[45.0] - ), + Field(ge=0, le=360, description="Initial ship course over ground (COG) in degrees", examples=[45.0]), ] heading: Optional[ - Annotated[ - float, Field(ge=0, le=360, description="Initial ship heading in degrees", examples=[45.2]) - ] + Annotated[float, Field(ge=0, le=360, description="Initial ship heading in degrees", examples=[45.2])] ] = None nav_status: Optional[Annotated[AisNavStatus, Field(description="AIS Navigational Status")]] = None @@ -318,9 +292,7 @@ class DataPoint(BaseModelConfig): """Data type for storing data which is numerical and continuos.""" value: Optional[ - Annotated[ - float, Field(description="the value of the data at the current waypoint", examples=[12.3]) - ] + Annotated[float, Field(description="the value of the data at the current waypoint", examples=[12.3])] ] = None interp_start: Optional[ Annotated[ @@ -361,12 +333,8 @@ class RouteData(BaseModelConfig): class Leg(BaseModelConfig): """Data type for a leg.""" - starboard_xtd: Optional[ - Annotated[float, Field(description="Starboard XTD in NM as defined in RTZ.")] - ] = None - portside_xtd: Optional[ - Annotated[float, Field(description="Starboard XTD in NM as defined in RTZ.")] - ] = None + starboard_xtd: Optional[Annotated[float, Field(description="Starboard XTD in NM as defined in RTZ.")]] = None + portside_xtd: Optional[Annotated[float, Field(description="Starboard XTD in NM as defined in RTZ.")]] = None data: Optional[Annotated[RouteData, Field(description=data_description)]] = None @@ -375,16 +343,12 @@ class Waypoint(BaseModelConfig): position: Annotated[ GeoPosition, - Field( - description="A geographical coordinate.", examples=[GeoPosition(lon=11.2313, lat=51.2123)] - ), + Field(description="A geographical coordinate.", examples=[GeoPosition(lon=11.2313, lat=51.2123)]), ] turn_radius: Optional[ Annotated[ float, - Field( - description="Orthodrome turn radius in nautical miles as defined in RTZ.", examples=[200] - ), + Field(description="Orthodrome turn radius in nautical miles as defined in RTZ.", examples=[200]), ] ] = None leg: Optional[Annotated[Leg, Field(description="Current Leg information.")]] = None @@ -416,9 +380,7 @@ def create_initial_example(): def create_data_point_example(): """Create a DataPoint class.""" - return DataPoint( - value=12.3, interp_start=100, interp_end=100, interp_method=InterpolationMethod.LINEAR - ) + return DataPoint(value=12.3, interp_start=100, interp_end=100, interp_method=InterpolationMethod.LINEAR) def create_waypoint_example(): @@ -443,7 +405,7 @@ class Ship(BaseModelConfig): ] = None waypoints: Optional[ Annotated[ - List[Waypoint], + list[Waypoint], Field(description=waypoints_description, examples=[create_waypoint_example()]), ] ] = None @@ -453,7 +415,7 @@ def __init__(self, **data: Any): if not self.waypoints: self.waypoints = self._generate_waypoints() - def _generate_waypoints(self) -> Union[List[Waypoint], None]: + def _generate_waypoints(self) -> list[Waypoint] | None: """Generate waypoints if they don't exist.""" waypoints = [] @@ -485,9 +447,7 @@ def _generate_waypoints(self) -> Union[List[Waypoint], None]: class OwnShip(Ship): """Data type for the own ship.""" - static: Annotated[ - ShipStatic, Field(description=static_description, examples=[create_ship_static_example()]) - ] + static: Annotated[ShipStatic, Field(description=static_description, examples=[create_ship_static_example()])] def __init__(self, **data: Any): super().__init__(**data) @@ -498,9 +458,7 @@ def __init__(self, **data: Any): class TargetShip(Ship): """Data type for the target ship.""" - static: Annotated[ - ShipStatic, Field(description=static_description, examples=[create_ship_static_example()]) - ] + static: Annotated[ShipStatic, Field(description=static_description, examples=[create_ship_static_example()])] def __init__(self, **data: Any): super().__init__(**data) @@ -524,21 +482,15 @@ def create_own_ship_example(): def create_target_example(): """Create a TargetShip class.""" - return TargetShip( - static=create_ship_static_example(), initial=create_initial_example(), waypoints=None - ) + return TargetShip(static=create_ship_static_example(), initial=create_initial_example(), waypoints=None) class TrafficSituation(BaseModelConfig): """Data type for a traffic situation.""" - version: Annotated[ - str, Field(description="Ship traffic generator version number", examples=[project_version]) - ] + version: Annotated[str, Field(description="Ship traffic generator version number", examples=[project_version])] title: Optional[ - Annotated[ - str, Field(description="The title of the traffic situation", examples=["overtaking_18"]) - ] + Annotated[str, Field(description="The title of the traffic situation", examples=["overtaking_18"])] ] = None description: Optional[ Annotated[ @@ -558,12 +510,10 @@ class TrafficSituation(BaseModelConfig): ), ] ] = None - own_ship: Annotated[ - OwnShip, Field(description="Own Ship (OS) data", examples=[create_ship_example()]) - ] + own_ship: Annotated[OwnShip, Field(description="Own Ship (OS) data", examples=[create_ship_example()])] target_ships: Optional[ Annotated[ - List[TargetShip], + list[TargetShip], Field(description="Target Ship (TGT) data", examples=[[create_ship_example()]]), ] ] = None @@ -584,9 +534,9 @@ class Encounter(BaseModelConfig): """Data type for an encounter.""" desired_encounter_type: EncounterType - beta: Union[List[float], float, None] = None - relative_speed: Union[float, None] = None - vector_time: Union[float, None] = None + beta: list[float] | float | None = None + relative_speed: float | None = None + vector_time: float | None = None model_config = ConfigDict(extra="allow") @@ -597,7 +547,7 @@ class EncounterClassification(BaseModelConfig): theta13_criteria: float theta14_criteria: float theta15_criteria: float - theta15: List[float] + theta15: list[float] model_config = ConfigDict(extra="allow") @@ -605,11 +555,11 @@ class EncounterClassification(BaseModelConfig): class EncounterRelativeSpeed(BaseModelConfig): """Data type for relative speed between two ships in an encounter.""" - overtaking_stand_on: List[float] - overtaking_give_way: List[float] - head_on: List[float] - crossing_give_way: List[float] - crossing_stand_on: List[float] + overtaking_stand_on: list[float] + overtaking_give_way: list[float] + head_on: list[float] + crossing_give_way: list[float] + crossing_stand_on: list[float] model_config = ConfigDict(extra="allow") @@ -619,7 +569,7 @@ class EncounterSettings(BaseModelConfig): classification: EncounterClassification relative_speed: EncounterRelativeSpeed - vector_range: List[float] + vector_range: list[float] common_vector: float situation_length: float max_meeting_distance: float @@ -633,7 +583,7 @@ class OwnShipInitial(BaseModelConfig): """Data type for initial data for the own ship used for generating a situation.""" initial: Initial - waypoints: Optional[List[Waypoint]] = Field(None, description="An array of `Waypoint` objects.") + waypoints: Optional[list[Waypoint]] = Field(None, description="An array of `Waypoint` objects.") class SituationInput(BaseModelConfig): @@ -643,6 +593,6 @@ class SituationInput(BaseModelConfig): description: str num_situations: int own_ship: OwnShipInitial - encounters: List[Encounter] + encounters: list[Encounter] model_config = ConfigDict(extra="allow") diff --git a/src/trafficgen/utils.py b/src/trafficgen/utils.py index aa2a9bb..69c8360 100644 --- a/src/trafficgen/utils.py +++ b/src/trafficgen/utils.py @@ -1,7 +1,5 @@ """Utility functions that are used by several other functions.""" -from typing import List - import numpy as np from trafficgen.marine_system_simulator import flat2llh, llh2flat @@ -19,7 +17,6 @@ def knot_2_m_pr_s(speed_in_knot: float) -> float: ------- * speed_in_m_pr_s: Ship speed in meters pr second """ - knot_2_m_pr_sec: float = 0.5144 return speed_in_knot * knot_2_m_pr_sec @@ -35,7 +32,6 @@ def m_pr_s_2_knot(speed_in_m_pr_s: float) -> float: ------- * speed_in_knot: Ship speed in knots """ - knot_2_m_pr_sec: float = 0.5144 return speed_in_m_pr_s / knot_2_m_pr_sec @@ -51,7 +47,6 @@ def min_2_s(time_in_min: float) -> float: ------- * time_in_s: Time in seconds """ - min_2_s_coeff: float = 60.0 return time_in_min * min_2_s_coeff @@ -67,7 +62,6 @@ def m_2_nm(length_in_m: float) -> float: ------- * length_in_nm: Length given in nautical miles """ - m_2_nm_coeff: float = 1.0 / 1852.0 return m_2_nm_coeff * length_in_m @@ -83,7 +77,6 @@ def nm_2_m(length_in_nm: float) -> float: ------- * length_in_m: Length given in meters """ - nm_2_m_factor: float = 1852.0 return length_in_nm * nm_2_m_factor @@ -99,7 +92,6 @@ def deg_2_rad(angle_in_degrees: float) -> float: ------- * angle given in radians: Angle given in radians """ - return angle_in_degrees * np.pi / 180.0 @@ -115,7 +107,6 @@ def rad_2_deg(angle_in_radians: float) -> float: * angle given in radians: Angle given in radians """ - return angle_in_radians * 180.0 / np.pi @@ -132,7 +123,6 @@ def convert_angle_minus_pi_to_pi_to_0_to_2_pi(angle_pi: float) -> float: * angle_2_pi: Angle given in the region 0 to 2pi radians """ - return angle_pi if angle_pi >= 0.0 else angle_pi + 2 * np.pi @@ -149,7 +139,6 @@ def convert_angle_0_to_2_pi_to_minus_pi_to_pi(angle_2_pi: float) -> float: * angle_pi: Angle given in the region -pi to pi radians """ - return angle_2_pi if (angle_2_pi >= 0.0) & (angle_2_pi <= np.pi) else angle_2_pi - 2 * np.pi @@ -161,8 +150,9 @@ def calculate_position_at_certain_time( delta_time: float, ) -> GeoPosition: """ - Calculate the position of the ship at a given time based on initial position - and delta time, and constant speed and course. + Calculate the position of the ship at a given time. + + The calculated position is based on initial position and delta time, in addition to constant speed and course. Params: * position{lat, lon}: Initial ship position [rad] @@ -174,7 +164,6 @@ def calculate_position_at_certain_time( ------- * position{lat, lon}: Estimated ship position in delta time minutes [rad] """ - north, east, _ = llh2flat(position.lat, position.lon, lat_lon0.lat, lat_lon0.lon) north = north + speed * delta_time * np.cos(course) @@ -202,9 +191,7 @@ def calculate_distance(position_prev: GeoPosition, position_next: GeoPosition) - * distance: Distance between waypoints [m] """ # Using position of previous waypoint as reference point - north_next, east_next, _ = llh2flat( - position_next.lat, position_next.lon, position_prev.lat, position_prev.lon - ) + north_next, east_next, _ = llh2flat(position_next.lat, position_next.lon, position_prev.lat, position_prev.lon) distance: float = np.sqrt(north_next**2 + east_next**2) @@ -212,12 +199,14 @@ def calculate_distance(position_prev: GeoPosition, position_next: GeoPosition) - def calculate_position_along_track_using_waypoints( - waypoints: List[Waypoint], + waypoints: list[Waypoint], inital_speed: float, vector_time: float, ) -> GeoPosition: """ - Calculate the position of the ship at a given time based on initial position + Calculate the position along the track using waypoints. + + The position along the track is calculated based on initial position and delta time, and constant speed and course. Params: @@ -234,8 +223,8 @@ def calculate_position_along_track_using_waypoints( for i in range(1, len(waypoints)): ship_speed: float = inital_speed - if waypoints[i].leg is not None and waypoints[i].leg.data.sog is not None: # type: ignore - ship_speed = waypoints[i].leg.data.sog # type: ignore + if waypoints[i].leg is not None and waypoints[i].leg.data.sog is not None: # type: ignore[attr-defined] + ship_speed = waypoints[i].leg.data.sog # type: ignore[attr-defined] dist_between_waypoints = calculate_distance(waypoints[i - 1].position, waypoints[i].position) @@ -245,12 +234,8 @@ def calculate_position_along_track_using_waypoints( if dist_travel > dist_between_waypoints: time_in_transit = time_in_transit + dist_between_waypoints / ship_speed else: - bearing = calculate_bearing_between_waypoints( - waypoints[i - 1].position, waypoints[i].position - ) - position_along_track = calculate_destination_along_track( - waypoints[i - 1].position, dist_travel, bearing - ) + bearing = calculate_bearing_between_waypoints(waypoints[i - 1].position, waypoints[i].position) + position_along_track = calculate_destination_along_track(waypoints[i - 1].position, dist_travel, bearing) return position_along_track # if ship reach last waypoint in less time than vector_time, last waypoint is used @@ -258,8 +243,7 @@ def calculate_position_along_track_using_waypoints( def calculate_bearing_between_waypoints(position_prev: GeoPosition, position_next: GeoPosition) -> float: - """ - Calculate the bearing in rad between two waypoints. + """Calculate the bearing in rad between two waypoints. Params: * position_prev{lat, lon}: Previous waypoint [rad] @@ -270,18 +254,14 @@ def calculate_bearing_between_waypoints(position_prev: GeoPosition, position_nex * bearing: Bearing between waypoints [m] """ # Using position of previous waypoint as reference point - north_next, east_next, _ = llh2flat( - position_next.lat, position_next.lon, position_prev.lat, position_prev.lon - ) + north_next, east_next, _ = llh2flat(position_next.lat, position_next.lon, position_prev.lat, position_prev.lon) bearing: float = convert_angle_minus_pi_to_pi_to_0_to_2_pi(np.arctan2(east_next, north_next)) return bearing -def calculate_destination_along_track( - position_prev: GeoPosition, distance: float, bearing: float -) -> GeoPosition: +def calculate_destination_along_track(position_prev: GeoPosition, distance: float, bearing: float) -> GeoPosition: """ Calculate the destination along the track between two waypoints when distance along the track is given. diff --git a/src/trafficgen/write_traffic_situation_to_file.py b/src/trafficgen/write_traffic_situation_to_file.py index 66fedd0..ea16570 100644 --- a/src/trafficgen/write_traffic_situation_to_file.py +++ b/src/trafficgen/write_traffic_situation_to_file.py @@ -1,7 +1,7 @@ """Functions to clean traffic situations data before writing it to a json file.""" from pathlib import Path -from typing import List, TypeVar +from typing import TypeVar from trafficgen.types import OwnShip, Ship, TargetShip, TrafficSituation from trafficgen.utils import m_2_nm, m_pr_s_2_knot, rad_2_deg @@ -9,7 +9,7 @@ T_ship = TypeVar("T_ship", Ship, OwnShip, TargetShip) -def write_traffic_situations_to_json_file(situations: List[TrafficSituation], write_folder: Path): +def write_traffic_situations_to_json_file(situations: list[TrafficSituation], write_folder: Path) -> None: """ Write traffic situations to json file. @@ -17,7 +17,6 @@ def write_traffic_situations_to_json_file(situations: List[TrafficSituation], wr * traffic_situations: Traffic situations to be written to file * write_folder: Folder where the json files is to be written """ - Path(write_folder).mkdir(parents=True, exist_ok=True) for i, situation in enumerate(situations): file_number: int = i + 1 @@ -26,7 +25,7 @@ def write_traffic_situations_to_json_file(situations: List[TrafficSituation], wr data: str = situation.model_dump_json( by_alias=True, indent=4, exclude_unset=True, exclude_defaults=False, exclude_none=True ) - with open(output_file_path, "w", encoding="utf-8") as outfile: + with Path.open(output_file_path, "w", encoding="utf-8") as outfile: _ = outfile.write(data) @@ -86,14 +85,8 @@ def convert_ship_data_from_si_units_to_maritime(ship: T_ship) -> T_ship: assert waypoint.leg.data.sog.value is not None assert waypoint.leg.data.sog.interp_start is not None assert waypoint.leg.data.sog.interp_end is not None - waypoint.leg.data.sog.value = round( - m_pr_s_2_knot(waypoint.leg.data.sog.value), 2 - ) - waypoint.leg.data.sog.interp_start = round( - m_2_nm(waypoint.leg.data.sog.interp_start), 2 - ) - waypoint.leg.data.sog.interp_end = round( - m_2_nm(waypoint.leg.data.sog.interp_end), 2 - ) + waypoint.leg.data.sog.value = round(m_pr_s_2_knot(waypoint.leg.data.sog.value), 2) + waypoint.leg.data.sog.interp_start = round(m_2_nm(waypoint.leg.data.sog.interp_start), 2) + waypoint.leg.data.sog.interp_end = round(m_2_nm(waypoint.leg.data.sog.interp_end), 2) return ship diff --git a/tests/conftest.py b/tests/conftest.py index 88031e3..8e3a02e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,5 @@ -# -*- coding: utf-8 -*- """Root level fixtures for `trafficgen`""" + from pathlib import Path import pytest diff --git a/tests/test_read_files.py b/tests/test_read_files.py index 330a22b..33afa39 100644 --- a/tests/test_read_files.py +++ b/tests/test_read_files.py @@ -1,7 +1,6 @@ """Tests reading files.""" from pathlib import Path -from typing import List, Set from trafficgen.read_files import ( read_encounter_settings_file, @@ -23,7 +22,7 @@ def test_read_situations_1_ts_full_spec(situations_folder_test_01: Path): Test reading traffic situations with full specification, meaning all parameters are specified. """ - desired_traffic_situations: List[SituationInput] = read_situation_files(situations_folder_test_01) + desired_traffic_situations: list[SituationInput] = read_situation_files(situations_folder_test_01) assert len(desired_traffic_situations) == 5 # sourcery skip: no-loop-in-tests @@ -45,7 +44,7 @@ def test_read_situations_1_ts_partly_spec(situations_folder_test_02: Path): Test reading traffic situations using partly specification, meaning some of the parameters are specified. """ - desired_traffic_situations: List[SituationInput] = read_situation_files(situations_folder_test_02) + desired_traffic_situations: list[SituationInput] = read_situation_files(situations_folder_test_02) assert len(desired_traffic_situations) == 2 # sourcery skip: no-loop-in-tests @@ -62,7 +61,7 @@ def test_read_situations_1_ts_minimum_spec(situations_folder_test_03: Path): Test reading traffic situations using using minimum specification, meaning only type of situation is specified. """ - desired_traffic_situations: List[SituationInput] = read_situation_files(situations_folder_test_03) + desired_traffic_situations: list[SituationInput] = read_situation_files(situations_folder_test_03) assert len(desired_traffic_situations) == 2 # sourcery skip: no-loop-in-tests @@ -80,7 +79,7 @@ def test_read_situations_2_ts_one_to_many_situations(situations_folder_test_04: """ Test reading a traffic situation file num_situations=5 and 2 encounter specifications. """ - desired_traffic_situations: List[SituationInput] = read_situation_files(situations_folder_test_04) + desired_traffic_situations: list[SituationInput] = read_situation_files(situations_folder_test_04) assert len(desired_traffic_situations) == 1 # sourcery skip: no-loop-in-tests @@ -100,11 +99,11 @@ def test_read_situations_one_to_many_situations(situations_folder_test_05: Path) """ Test reading three traffic situation files 1, 2 and 3 encounter specifications. """ - desired_traffic_situations: List[SituationInput] = read_situation_files(situations_folder_test_05) + desired_traffic_situations: list[SituationInput] = read_situation_files(situations_folder_test_05) assert len(desired_traffic_situations) == 3 # sourcery skip: no-loop-in-tests - num_situations_values_found: Set[int] = set() + num_situations_values_found: set[int] = set() for situation in desired_traffic_situations: assert situation.own_ship is not None assert situation.encounters is not None @@ -123,11 +122,11 @@ def test_read_situations_with_different_encounter_types(situations_folder_test_0 """ Test reading 5 traffic situation files with different encounter types. """ - desired_traffic_situations: List[SituationInput] = read_situation_files(situations_folder_test_07) + desired_traffic_situations: list[SituationInput] = read_situation_files(situations_folder_test_07) assert len(desired_traffic_situations) == 5 # sourcery skip: no-loop-in-tests - desired_encounter_types_found: Set[EncounterType] = set() + desired_encounter_types_found: set[EncounterType] = set() for situation in desired_traffic_situations: assert situation.own_ship is not None assert situation.encounters is not None @@ -165,7 +164,7 @@ def test_read_target_ships(target_ships_folder: Path): """ Test reading target ship files. """ - target_ships_static: List[ShipStatic] = read_target_ship_static_files(target_ships_folder) + target_ships_static: list[ShipStatic] = read_target_ship_static_files(target_ships_folder) # sourcery skip: no-loop-in-tests for target_ship_static in target_ships_static: diff --git a/tests/test_trafficgen.py b/tests/test_trafficgen.py index d887476..7571d16 100644 --- a/tests/test_trafficgen.py +++ b/tests/test_trafficgen.py @@ -1,7 +1,6 @@ """Tests for `trafficgen` package.""" from pathlib import Path -from typing import List import pytest from click.testing import CliRunner @@ -79,7 +78,7 @@ def test_gen_situations( settings_file: Path, ): """Test generating traffic situations.""" - situations: List[TrafficSituation] = generate_traffic_situations( + situations: list[TrafficSituation] = generate_traffic_situations( situation_folder=situations_folder, own_ship_file=own_ship_file, target_ship_folder=target_ships_folder, @@ -121,7 +120,7 @@ def test_gen_situations_1_ts_full_spec_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == 5 # sourcery skip: no-loop-in-tests @@ -163,7 +162,7 @@ def test_gen_situations_1_ts_partly_spec_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == 2 # sourcery skip: no-loop-in-tests @@ -216,7 +215,7 @@ def test_gen_situations_1_ts_minimum_spec_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == 2 # sourcery skip: no-loop-in-tests @@ -257,7 +256,7 @@ def test_gen_situations_2_ts_one_to_many_situations_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == 5 # sourcery skip: no-loop-in-tests @@ -298,7 +297,7 @@ def test_gen_situations_one_to_many_situations_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == 10 # sourcery skip: no-loop-in-tests @@ -340,7 +339,7 @@ def test_gen_situations_ot_gw_target_ship_speed_too_high_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == 3 # sourcery skip: no-loop-in-tests @@ -382,7 +381,7 @@ def test_gen_situations_illegal_beta_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) # sourcery skip: no-loop-in-tests for situation in situations: @@ -421,7 +420,7 @@ def test_gen_situation_beta_limited_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == 1 # sourcery skip: no-loop-in-tests diff --git a/tests/test_write_files.py b/tests/test_write_files.py index a5d5195..b68fcca 100644 --- a/tests/test_write_files.py +++ b/tests/test_write_files.py @@ -1,17 +1,19 @@ """Tests writing files.""" from pathlib import Path -from typing import List +from typing import TYPE_CHECKING from trafficgen.read_files import ( read_generated_situation_files, ) from trafficgen.ship_traffic_generator import generate_traffic_situations -from trafficgen.types import ( - TrafficSituation, -) from trafficgen.write_traffic_situation_to_file import write_traffic_situations_to_json_file +if TYPE_CHECKING: + from trafficgen.types import ( + TrafficSituation, + ) + def test_write_situations_multiple( situations_folder: Path, @@ -22,14 +24,14 @@ def test_write_situations_multiple( ): """Test writing multiple traffic situations in one call.""" - situations: List[TrafficSituation] = generate_traffic_situations( + situations: list[TrafficSituation] = generate_traffic_situations( situation_folder=situations_folder, own_ship_file=own_ship_file, target_ship_folder=target_ships_folder, settings_file=settings_file, ) write_traffic_situations_to_json_file(situations, output_folder) - reread_situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + reread_situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == len(reread_situations) diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..f743b53 --- /dev/null +++ b/uv.lock @@ -0,0 +1,2911 @@ +version = 1 +requires-python = ">=3.10" + +[[package]] +name = "alabaster" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929 }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "anyio" +version = "4.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, +] + +[[package]] +name = "argon2-cffi" +version = "23.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argon2-cffi-bindings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/fa/57ec2c6d16ecd2ba0cf15f3c7d1c3c2e7b5fcb83555ff56d7ab10888ec8f/argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08", size = 42798 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea", size = 15124 }, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/e9/184b8ccce6683b0aa2fbb7ba5683ea4b9c5763f1356347f1312c32e3c66e/argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", size = 1779911 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/13/838ce2620025e9666aa8f686431f67a29052241692a3dd1ae9d3692a89d3/argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", size = 29658 }, + { url = "https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", size = 80583 }, + { url = "https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", size = 86168 }, + { url = "https://files.pythonhosted.org/packages/74/f6/4a34a37a98311ed73bb80efe422fed95f2ac25a4cacc5ae1d7ae6a144505/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", size = 82709 }, + { url = "https://files.pythonhosted.org/packages/74/2b/73d767bfdaab25484f7e7901379d5f8793cccbb86c6e0cbc4c1b96f63896/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", size = 83613 }, + { url = "https://files.pythonhosted.org/packages/4f/fd/37f86deef67ff57c76f137a67181949c2d408077e2e3dd70c6c42912c9bf/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", size = 84583 }, + { url = "https://files.pythonhosted.org/packages/6f/52/5a60085a3dae8fded8327a4f564223029f5f54b0cb0455a31131b5363a01/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", size = 88475 }, + { url = "https://files.pythonhosted.org/packages/8b/95/143cd64feb24a15fa4b189a3e1e7efbaeeb00f39a51e99b26fc62fbacabd/argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", size = 27698 }, + { url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", size = 30817 }, + { url = "https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", size = 53104 }, +] + +[[package]] +name = "arrow" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "types-python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/00/0f6e8fcdb23ea632c866620cc872729ff43ed91d284c866b515c6342b173/arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85", size = 131960 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", size = 66419 }, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, +] + +[[package]] +name = "async-lru" +version = "2.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/e2/2b4651eff771f6fd900d233e175ddc5e2be502c7eb62c0c42f975c6d36cd/async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627", size = 10019 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/9f/3c3503693386c4b0f245eaf5ca6198e3b28879ca0a40bde6b0e319793453/async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224", size = 6111 }, +] + +[[package]] +name = "attrs" +version = "24.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/48/c8/6260f8ccc11f0917360fc0da435c5c9c7504e3db174d5a12a1494887b045/attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff", size = 805984 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/aa/ab0f7891a01eeb2d2e338ae8fecbe57fcebea1a24dbb64d45801bfab481d/attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308", size = 63397 }, +] + +[[package]] +name = "babel" +version = "2.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/74/f1bc80f23eeba13393b7222b11d95ca3af2c1e28edca18af487137eefed9/babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316", size = 9348104 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", size = 9587599 }, +] + +[[package]] +name = "basemap" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "basemap-data" }, + { name = "matplotlib" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pyproj" }, + { name = "pyshp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/63/f3a5e74a8a31c20ea785ebd0fc1a9e680a9f1c5ac9ab4888f349ef9a3165/basemap-1.4.1.zip", hash = "sha256:6822d3d08c11cdc443e3ed01d61d512e7cf62d4b40bbc1d235f0a898f2c54a7a", size = 167398 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/dd/11376f7c1437b91612f389a4fa33cab636e02d16a256dd6ecb74ac5261b2/basemap-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8786f23e3f456ab402b8160efb7b8b1c3780d6b84154dfcfdcd3f0401ef3285", size = 623524 }, + { url = "https://files.pythonhosted.org/packages/db/46/ea479f53a880f99d8758f6e4e72ce0c020f00211a70ff16dc5bfe77494dc/basemap-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:22793cf731d6cc06e11cf2760fd2875cd18b2980ce1c5ba15f6ebd9e224b1a1d", size = 569011 }, + { url = "https://files.pythonhosted.org/packages/48/dc/75a162c27053e7470474be827c02d5ea8c25b9f9ca2e1b823b4480d5ce84/basemap-1.4.1-cp310-cp310-manylinux1_i686.whl", hash = "sha256:8818fbb5e1133f0955a62ea159a3792124fc06f9b37ea4427612f6def923b711", size = 922385 }, + { url = "https://files.pythonhosted.org/packages/31/c0/640b7a056671d51453b4685cf4c10f2bbe7326c3c9d301a2358b8889887b/basemap-1.4.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:650e9b2170579193cb89bea2c328740fc13c0327b8ea55173490f760d0f04f8c", size = 935998 }, + { url = "https://files.pythonhosted.org/packages/b3/73/38a2be36571f61d9bb3e9a25c4be119c1a314bc06be31f2492aed0de9dc5/basemap-1.4.1-cp310-cp310-win32.whl", hash = "sha256:2e198e442bae7ad0d25f529788fcb5802192d844d856fa966f6018a46648a375", size = 402690 }, + { url = "https://files.pythonhosted.org/packages/c9/a8/ed7ca0f4ef0aa4872b2b705c25c25f13fe9e70a41aea773ac34888cf8c62/basemap-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:91d03458343d73f6a5e4d42e79df59cf57eba699094b71ce7c57ec40c8de9f59", size = 507061 }, + { url = "https://files.pythonhosted.org/packages/58/ab/a93ccacdde434d00d2f9e08c8ecf62df0c50cf0ce3c1b819f3ca3fea6c2f/basemap-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:509bb451ce26f1f7651cc19d27ef049935304c7795a141cfbe05582802554226", size = 623678 }, + { url = "https://files.pythonhosted.org/packages/73/92/f0bf706ef07c503d20a7cc0863b66e5db418680fdaca94dc2cac537423cd/basemap-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a6860ab68a461cd36b6eda5d3973bfa1e3a4fdeaf608e8dd4b324b08e8561eed", size = 569118 }, + { url = "https://files.pythonhosted.org/packages/e6/e2/0932c15c6bae2100a262506830358a1dfb3c2c82671e4094cc8f2b6d5104/basemap-1.4.1-cp311-cp311-manylinux1_i686.whl", hash = "sha256:500a3d314166057d0b3c065e63147042c996ead1af5d59e319f813b83d4ea220", size = 936489 }, + { url = "https://files.pythonhosted.org/packages/0c/d3/72c1ed71fb5fd283f96696efb5d8d100f1a3c434e0d5e53c5d9b3ed9793e/basemap-1.4.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:6e0a13ba17ca011c55db44fab9210363154bc67482776d3b149a3ef1b4b01bad", size = 942421 }, + { url = "https://files.pythonhosted.org/packages/c0/dd/90a5817723353b45d7a82cce5d9ba15f5024afb4c437c59133230f5bebd5/basemap-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e6b8430a4f73485fcdb766cd2acb9e766cdacc67adca7757e7a2915b685d8461", size = 402504 }, + { url = "https://files.pythonhosted.org/packages/36/91/c3bf3ef6eacdb7cae204f3b440b7810ecbb30a4067457310d2544c6a5b14/basemap-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:c4d80330f00728acfd88be78e0485fd688984db873853f9c75647ec78e653203", size = 507324 }, + { url = "https://files.pythonhosted.org/packages/90/05/a58c9ee0e6335671417843c2421a0f8940a2a1456157b1cd91ebd7e8da79/basemap-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:51a5e8f2183e7505f4dfbb965048348c2f1e501283b13ad9950409c3da9655f6", size = 624979 }, + { url = "https://files.pythonhosted.org/packages/a8/26/04d6fe6208ad022745347d7b66a26a6671e9a054ce558465c6b96fe60feb/basemap-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f99f3da41fc3e6bfb726f0fbd3302939a3b03e353ccd2be5ebd7bc09b84c386", size = 569896 }, + { url = "https://files.pythonhosted.org/packages/1c/ff/cbd7431d4a97b48445808f5ffd21f80f69e01edfb701affab4d7f72a4214/basemap-1.4.1-cp312-cp312-manylinux1_i686.whl", hash = "sha256:20644986a63d57c9d94afb8aba180d5362c1bd08d61d4537aa6221a70e3df762", size = 943278 }, + { url = "https://files.pythonhosted.org/packages/d7/ee/5908870dab84ea5c3f3f29b665a6042d8a461cfd315c701c02d10d607ef0/basemap-1.4.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:b64f000374a41bf19ac8f8b39cbd2a3b244c79673cd686c9eb507c19daef9e78", size = 950333 }, + { url = "https://files.pythonhosted.org/packages/31/46/c083b25568bcb119080602a4422f5f3eec663dbd8dd627f0c5be3d0e3fa8/basemap-1.4.1-cp312-cp312-win32.whl", hash = "sha256:84918a6e030adc9aedee92fe622adde8b54cc81051a6ce6723c04987081d92f4", size = 403000 }, + { url = "https://files.pythonhosted.org/packages/7f/ab/caf597d36e4ab9e5b3302d9fdeea4d652b002e314c617cb3a36bcf070f97/basemap-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff588f63f35d0b58607c9642cc2cf68967b464ee7aa27a6d87db2ec8edc910e2", size = 507602 }, +] + +[[package]] +name = "basemap-data" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/45/f6/efc358bb1ed930cb06a45934ac128c6869cdcb9c1c57679d1d9ac9f99241/basemap_data-1.3.2.zip", hash = "sha256:0072efd6f12c76e9f35e8fd718360d634b849ba988e74acccaf1ec536275f70b", size = 30540081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/c3/63fdb885308c999206c7a497d79a50891581626da7dc491d432d2732bb46/basemap_data-1.3.2-py2.py3-none-any.whl", hash = "sha256:26e794556c496b26f7714658cdbea5c68cb47d6a8a9fb0e674844fa89c56fc59", size = 30535486 }, +] + +[[package]] +name = "basemap-data-hires" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/78/aa/092b3efff3f425c33edb64dbb604bb0958fff8724d634e551b402ace6cce/basemap_data_hires-1.3.2.zip", hash = "sha256:0982eb95b2066ccbe10b6580bcd9c597e3a4e25016bf25afb65e1a96f6e3e97d", size = 91064505 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/3a/4a975fc74b63e2d494e236ba70fe765151bf0adad758ad40e4cf4ecf2310/basemap_data_hires-1.3.2-py2.py3-none-any.whl", hash = "sha256:39c14c865f8b89c4254d68165a36f1d34dece9366b6cd344692ec02001df956e", size = 91059959 }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/ca/824b1195773ce6166d388573fc106ce56d4a805bd7427b624e063596ec58/beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", size = 581181 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed", size = 147925 }, +] + +[[package]] +name = "bleach" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406 }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2" }, +] + +[[package]] +name = "branca" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e8/1d/bec5cb6669b7bf98b632b20bbbb25200bdc44298e7a39d588b0028a78300/branca-0.8.1.tar.gz", hash = "sha256:ac397c2d79bd13af0d04193b26d5ed17031d27609a7f1fab50c438b8ae712390", size = 27743 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/9d/91cddd38bd00170aad1a4b198c47b4ed716be45c234e09b835af41f4e717/branca-0.8.1-py3-none-any.whl", hash = "sha256:d29c5fab31f7c21a92e34bf3f854234e29fecdcf5d2df306b616f20d816be425", size = 26071 }, +] + +[[package]] +name = "certifi" +version = "2024.12.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, + { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, + { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, + { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, + { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, + { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, + { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, + { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, + { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, + { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, + { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, + { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/58/5580c1716040bc89206c77d8f74418caf82ce519aae06450393ca73475d1/charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", size = 198013 }, + { url = "https://files.pythonhosted.org/packages/d0/11/00341177ae71c6f5159a08168bcb98c6e6d196d372c94511f9f6c9afe0c6/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", size = 141285 }, + { url = "https://files.pythonhosted.org/packages/01/09/11d684ea5819e5a8f5100fb0b38cf8d02b514746607934134d31233e02c8/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", size = 151449 }, + { url = "https://files.pythonhosted.org/packages/08/06/9f5a12939db324d905dc1f70591ae7d7898d030d7662f0d426e2286f68c9/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", size = 143892 }, + { url = "https://files.pythonhosted.org/packages/93/62/5e89cdfe04584cb7f4d36003ffa2936681b03ecc0754f8e969c2becb7e24/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", size = 146123 }, + { url = "https://files.pythonhosted.org/packages/a9/ac/ab729a15c516da2ab70a05f8722ecfccc3f04ed7a18e45c75bbbaa347d61/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", size = 147943 }, + { url = "https://files.pythonhosted.org/packages/03/d2/3f392f23f042615689456e9a274640c1d2e5dd1d52de36ab8f7955f8f050/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", size = 142063 }, + { url = "https://files.pythonhosted.org/packages/f2/e3/e20aae5e1039a2cd9b08d9205f52142329f887f8cf70da3650326670bddf/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", size = 150578 }, + { url = "https://files.pythonhosted.org/packages/8d/af/779ad72a4da0aed925e1139d458adc486e61076d7ecdcc09e610ea8678db/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", size = 153629 }, + { url = "https://files.pythonhosted.org/packages/c2/b6/7aa450b278e7aa92cf7732140bfd8be21f5f29d5bf334ae987c945276639/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", size = 150778 }, + { url = "https://files.pythonhosted.org/packages/39/f4/d9f4f712d0951dcbfd42920d3db81b00dd23b6ab520419626f4023334056/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", size = 146453 }, + { url = "https://files.pythonhosted.org/packages/49/2b/999d0314e4ee0cff3cb83e6bc9aeddd397eeed693edb4facb901eb8fbb69/charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", size = 95479 }, + { url = "https://files.pythonhosted.org/packages/2d/ce/3cbed41cff67e455a386fb5e5dd8906cdda2ed92fbc6297921f2e4419309/charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", size = 102790 }, + { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, + { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, + { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, + { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, + { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, + { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, + { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, + { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, + { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, + { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, + { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, + { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, + { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, +] + +[[package]] +name = "click-log" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/32/228be4f971e4bd556c33d52a22682bfe318ffe57a1ddb7a546f347a90260/click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975", size = 9985 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756", size = 4273 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "comm" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 }, +] + +[[package]] +name = "contourpy" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/c2/fc7193cc5383637ff390a712e88e4ded0452c9fbcf84abe3de5ea3df1866/contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699", size = 13465753 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/a3/80937fe3efe0edacf67c9a20b955139a1a622730042c1ea991956f2704ad/contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab", size = 268466 }, + { url = "https://files.pythonhosted.org/packages/82/1d/e3eaebb4aa2d7311528c048350ca8e99cdacfafd99da87bc0a5f8d81f2c2/contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124", size = 253314 }, + { url = "https://files.pythonhosted.org/packages/de/f3/d796b22d1a2b587acc8100ba8c07fb7b5e17fde265a7bb05ab967f4c935a/contourpy-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1", size = 312003 }, + { url = "https://files.pythonhosted.org/packages/bf/f5/0e67902bc4394daee8daa39c81d4f00b50e063ee1a46cb3938cc65585d36/contourpy-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b", size = 351896 }, + { url = "https://files.pythonhosted.org/packages/1f/d6/e766395723f6256d45d6e67c13bb638dd1fa9dc10ef912dc7dd3dcfc19de/contourpy-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453", size = 320814 }, + { url = "https://files.pythonhosted.org/packages/a9/57/86c500d63b3e26e5b73a28b8291a67c5608d4aa87ebd17bd15bb33c178bc/contourpy-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3", size = 324969 }, + { url = "https://files.pythonhosted.org/packages/b8/62/bb146d1289d6b3450bccc4642e7f4413b92ebffd9bf2e91b0404323704a7/contourpy-1.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277", size = 1265162 }, + { url = "https://files.pythonhosted.org/packages/18/04/9f7d132ce49a212c8e767042cc80ae390f728060d2eea47058f55b9eff1c/contourpy-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595", size = 1324328 }, + { url = "https://files.pythonhosted.org/packages/46/23/196813901be3f97c83ababdab1382e13e0edc0bb4e7b49a7bff15fcf754e/contourpy-1.3.1-cp310-cp310-win32.whl", hash = "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697", size = 173861 }, + { url = "https://files.pythonhosted.org/packages/e0/82/c372be3fc000a3b2005061ca623a0d1ecd2eaafb10d9e883a2fc8566e951/contourpy-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e", size = 218566 }, + { url = "https://files.pythonhosted.org/packages/12/bb/11250d2906ee2e8b466b5f93e6b19d525f3e0254ac8b445b56e618527718/contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b", size = 269555 }, + { url = "https://files.pythonhosted.org/packages/67/71/1e6e95aee21a500415f5d2dbf037bf4567529b6a4e986594d7026ec5ae90/contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc", size = 254549 }, + { url = "https://files.pythonhosted.org/packages/31/2c/b88986e8d79ac45efe9d8801ae341525f38e087449b6c2f2e6050468a42c/contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86", size = 313000 }, + { url = "https://files.pythonhosted.org/packages/c4/18/65280989b151fcf33a8352f992eff71e61b968bef7432fbfde3a364f0730/contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6", size = 352925 }, + { url = "https://files.pythonhosted.org/packages/f5/c7/5fd0146c93220dbfe1a2e0f98969293b86ca9bc041d6c90c0e065f4619ad/contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85", size = 323693 }, + { url = "https://files.pythonhosted.org/packages/85/fc/7fa5d17daf77306840a4e84668a48ddff09e6bc09ba4e37e85ffc8e4faa3/contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c", size = 326184 }, + { url = "https://files.pythonhosted.org/packages/ef/e7/104065c8270c7397c9571620d3ab880558957216f2b5ebb7e040f85eeb22/contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291", size = 1268031 }, + { url = "https://files.pythonhosted.org/packages/e2/4a/c788d0bdbf32c8113c2354493ed291f924d4793c4a2e85b69e737a21a658/contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f", size = 1325995 }, + { url = "https://files.pythonhosted.org/packages/a6/e6/a2f351a90d955f8b0564caf1ebe4b1451a3f01f83e5e3a414055a5b8bccb/contourpy-1.3.1-cp311-cp311-win32.whl", hash = "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375", size = 174396 }, + { url = "https://files.pythonhosted.org/packages/a8/7e/cd93cab453720a5d6cb75588cc17dcdc08fc3484b9de98b885924ff61900/contourpy-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9", size = 219787 }, + { url = "https://files.pythonhosted.org/packages/37/6b/175f60227d3e7f5f1549fcb374592be311293132207e451c3d7c654c25fb/contourpy-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509", size = 271494 }, + { url = "https://files.pythonhosted.org/packages/6b/6a/7833cfae2c1e63d1d8875a50fd23371394f540ce809d7383550681a1fa64/contourpy-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc", size = 255444 }, + { url = "https://files.pythonhosted.org/packages/7f/b3/7859efce66eaca5c14ba7619791b084ed02d868d76b928ff56890d2d059d/contourpy-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454", size = 307628 }, + { url = "https://files.pythonhosted.org/packages/48/b2/011415f5e3f0a50b1e285a0bf78eb5d92a4df000553570f0851b6e309076/contourpy-1.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80", size = 347271 }, + { url = "https://files.pythonhosted.org/packages/84/7d/ef19b1db0f45b151ac78c65127235239a8cf21a59d1ce8507ce03e89a30b/contourpy-1.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec", size = 318906 }, + { url = "https://files.pythonhosted.org/packages/ba/99/6794142b90b853a9155316c8f470d2e4821fe6f086b03e372aca848227dd/contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9", size = 323622 }, + { url = "https://files.pythonhosted.org/packages/3c/0f/37d2c84a900cd8eb54e105f4fa9aebd275e14e266736778bb5dccbf3bbbb/contourpy-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b", size = 1266699 }, + { url = "https://files.pythonhosted.org/packages/3a/8a/deb5e11dc7d9cc8f0f9c8b29d4f062203f3af230ba83c30a6b161a6effc9/contourpy-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d", size = 1326395 }, + { url = "https://files.pythonhosted.org/packages/1a/35/7e267ae7c13aaf12322ccc493531f1e7f2eb8fba2927b9d7a05ff615df7a/contourpy-1.3.1-cp312-cp312-win32.whl", hash = "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e", size = 175354 }, + { url = "https://files.pythonhosted.org/packages/a1/35/c2de8823211d07e8a79ab018ef03960716c5dff6f4d5bff5af87fd682992/contourpy-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d", size = 220971 }, + { url = "https://files.pythonhosted.org/packages/9a/e7/de62050dce687c5e96f946a93546910bc67e483fe05324439e329ff36105/contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2", size = 271548 }, + { url = "https://files.pythonhosted.org/packages/78/4d/c2a09ae014ae984c6bdd29c11e74d3121b25eaa117eca0bb76340efd7e1c/contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5", size = 255576 }, + { url = "https://files.pythonhosted.org/packages/ab/8a/915380ee96a5638bda80cd061ccb8e666bfdccea38d5741cb69e6dbd61fc/contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81", size = 306635 }, + { url = "https://files.pythonhosted.org/packages/29/5c/c83ce09375428298acd4e6582aeb68b1e0d1447f877fa993d9bf6cd3b0a0/contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2", size = 345925 }, + { url = "https://files.pythonhosted.org/packages/29/63/5b52f4a15e80c66c8078a641a3bfacd6e07106835682454647aca1afc852/contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7", size = 318000 }, + { url = "https://files.pythonhosted.org/packages/9a/e2/30ca086c692691129849198659bf0556d72a757fe2769eb9620a27169296/contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c", size = 322689 }, + { url = "https://files.pythonhosted.org/packages/6b/77/f37812ef700f1f185d348394debf33f22d531e714cf6a35d13d68a7003c7/contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3", size = 1268413 }, + { url = "https://files.pythonhosted.org/packages/3f/6d/ce84e79cdd128542ebeb268f84abb4b093af78e7f8ec504676673d2675bc/contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1", size = 1326530 }, + { url = "https://files.pythonhosted.org/packages/72/22/8282f4eae20c73c89bee7a82a19c4e27af9b57bb602ecaa00713d5bdb54d/contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82", size = 175315 }, + { url = "https://files.pythonhosted.org/packages/e3/d5/28bca491f65312b438fbf076589dcde7f6f966b196d900777f5811b9c4e2/contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd", size = 220987 }, + { url = "https://files.pythonhosted.org/packages/2f/24/a4b285d6adaaf9746e4700932f579f1a7b6f9681109f694cfa233ae75c4e/contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30", size = 285001 }, + { url = "https://files.pythonhosted.org/packages/48/1d/fb49a401b5ca4f06ccf467cd6c4f1fd65767e63c21322b29b04ec40b40b9/contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751", size = 268553 }, + { url = "https://files.pythonhosted.org/packages/79/1e/4aef9470d13fd029087388fae750dccb49a50c012a6c8d1d634295caa644/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342", size = 310386 }, + { url = "https://files.pythonhosted.org/packages/b0/34/910dc706ed70153b60392b5305c708c9810d425bde12499c9184a1100888/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c", size = 349806 }, + { url = "https://files.pythonhosted.org/packages/31/3c/faee6a40d66d7f2a87f7102236bf4780c57990dd7f98e5ff29881b1b1344/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f", size = 321108 }, + { url = "https://files.pythonhosted.org/packages/17/69/390dc9b20dd4bb20585651d7316cc3054b7d4a7b4f8b710b2b698e08968d/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda", size = 327291 }, + { url = "https://files.pythonhosted.org/packages/ef/74/7030b67c4e941fe1e5424a3d988080e83568030ce0355f7c9fc556455b01/contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242", size = 1263752 }, + { url = "https://files.pythonhosted.org/packages/f0/ed/92d86f183a8615f13f6b9cbfc5d4298a509d6ce433432e21da838b4b63f4/contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1", size = 1318403 }, + { url = "https://files.pythonhosted.org/packages/b3/0e/c8e4950c77dcfc897c71d61e56690a0a9df39543d2164040301b5df8e67b/contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1", size = 185117 }, + { url = "https://files.pythonhosted.org/packages/c1/31/1ae946f11dfbd229222e6d6ad8e7bd1891d3d48bde5fbf7a0beb9491f8e3/contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546", size = 236668 }, + { url = "https://files.pythonhosted.org/packages/3e/4f/e56862e64b52b55b5ddcff4090085521fc228ceb09a88390a2b103dccd1b/contourpy-1.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6", size = 265605 }, + { url = "https://files.pythonhosted.org/packages/b0/2e/52bfeeaa4541889f23d8eadc6386b442ee2470bd3cff9baa67deb2dd5c57/contourpy-1.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750", size = 315040 }, + { url = "https://files.pythonhosted.org/packages/52/94/86bfae441707205634d80392e873295652fc313dfd93c233c52c4dc07874/contourpy-1.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53", size = 218221 }, +] + +[[package]] +name = "coverage" +version = "7.6.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/ba/ac14d281f80aab516275012e8875991bb06203957aa1e19950139238d658/coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", size = 803868 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/12/2a2a923edf4ddabdffed7ad6da50d96a5c126dae7b80a33df7310e329a1e/coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78", size = 207982 }, + { url = "https://files.pythonhosted.org/packages/ca/49/6985dbca9c7be3f3cb62a2e6e492a0c88b65bf40579e16c71ae9c33c6b23/coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c", size = 208414 }, + { url = "https://files.pythonhosted.org/packages/35/93/287e8f1d1ed2646f4e0b2605d14616c9a8a2697d0d1b453815eb5c6cebdb/coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a", size = 236860 }, + { url = "https://files.pythonhosted.org/packages/de/e1/cfdb5627a03567a10031acc629b75d45a4ca1616e54f7133ca1fa366050a/coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165", size = 234758 }, + { url = "https://files.pythonhosted.org/packages/6d/85/fc0de2bcda3f97c2ee9fe8568f7d48f7279e91068958e5b2cc19e0e5f600/coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988", size = 235920 }, + { url = "https://files.pythonhosted.org/packages/79/73/ef4ea0105531506a6f4cf4ba571a214b14a884630b567ed65b3d9c1975e1/coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5", size = 234986 }, + { url = "https://files.pythonhosted.org/packages/c6/4d/75afcfe4432e2ad0405c6f27adeb109ff8976c5e636af8604f94f29fa3fc/coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3", size = 233446 }, + { url = "https://files.pythonhosted.org/packages/86/5b/efee56a89c16171288cafff022e8af44f8f94075c2d8da563c3935212871/coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5", size = 234566 }, + { url = "https://files.pythonhosted.org/packages/f2/db/67770cceb4a64d3198bf2aa49946f411b85ec6b0a9b489e61c8467a4253b/coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244", size = 210675 }, + { url = "https://files.pythonhosted.org/packages/8d/27/e8bfc43f5345ec2c27bc8a1fa77cdc5ce9dcf954445e11f14bb70b889d14/coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e", size = 211518 }, + { url = "https://files.pythonhosted.org/packages/85/d2/5e175fcf6766cf7501a8541d81778fd2f52f4870100e791f5327fd23270b/coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3", size = 208088 }, + { url = "https://files.pythonhosted.org/packages/4b/6f/06db4dc8fca33c13b673986e20e466fd936235a6ec1f0045c3853ac1b593/coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43", size = 208536 }, + { url = "https://files.pythonhosted.org/packages/0d/62/c6a0cf80318c1c1af376d52df444da3608eafc913b82c84a4600d8349472/coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132", size = 240474 }, + { url = "https://files.pythonhosted.org/packages/a3/59/750adafc2e57786d2e8739a46b680d4fb0fbc2d57fbcb161290a9f1ecf23/coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f", size = 237880 }, + { url = "https://files.pythonhosted.org/packages/2c/f8/ef009b3b98e9f7033c19deb40d629354aab1d8b2d7f9cfec284dbedf5096/coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994", size = 239750 }, + { url = "https://files.pythonhosted.org/packages/a6/e2/6622f3b70f5f5b59f705e680dae6db64421af05a5d1e389afd24dae62e5b/coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99", size = 238642 }, + { url = "https://files.pythonhosted.org/packages/2d/10/57ac3f191a3c95c67844099514ff44e6e19b2915cd1c22269fb27f9b17b6/coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd", size = 237266 }, + { url = "https://files.pythonhosted.org/packages/ee/2d/7016f4ad9d553cabcb7333ed78ff9d27248ec4eba8dd21fa488254dff894/coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377", size = 238045 }, + { url = "https://files.pythonhosted.org/packages/a7/fe/45af5c82389a71e0cae4546413266d2195c3744849669b0bab4b5f2c75da/coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8", size = 210647 }, + { url = "https://files.pythonhosted.org/packages/db/11/3f8e803a43b79bc534c6a506674da9d614e990e37118b4506faf70d46ed6/coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609", size = 211508 }, + { url = "https://files.pythonhosted.org/packages/86/77/19d09ea06f92fdf0487499283b1b7af06bc422ea94534c8fe3a4cd023641/coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", size = 208281 }, + { url = "https://files.pythonhosted.org/packages/b6/67/5479b9f2f99fcfb49c0d5cf61912a5255ef80b6e80a3cddba39c38146cf4/coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", size = 208514 }, + { url = "https://files.pythonhosted.org/packages/15/d1/febf59030ce1c83b7331c3546d7317e5120c5966471727aa7ac157729c4b/coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", size = 241537 }, + { url = "https://files.pythonhosted.org/packages/4b/7e/5ac4c90192130e7cf8b63153fe620c8bfd9068f89a6d9b5f26f1550f7a26/coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", size = 238572 }, + { url = "https://files.pythonhosted.org/packages/dc/03/0334a79b26ecf59958f2fe9dd1f5ab3e2f88db876f5071933de39af09647/coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", size = 240639 }, + { url = "https://files.pythonhosted.org/packages/d7/45/8a707f23c202208d7b286d78ad6233f50dcf929319b664b6cc18a03c1aae/coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", size = 240072 }, + { url = "https://files.pythonhosted.org/packages/66/02/603ce0ac2d02bc7b393279ef618940b4a0535b0868ee791140bda9ecfa40/coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", size = 238386 }, + { url = "https://files.pythonhosted.org/packages/04/62/4e6887e9be060f5d18f1dd58c2838b2d9646faf353232dec4e2d4b1c8644/coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", size = 240054 }, + { url = "https://files.pythonhosted.org/packages/5c/74/83ae4151c170d8bd071924f212add22a0e62a7fe2b149edf016aeecad17c/coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", size = 210904 }, + { url = "https://files.pythonhosted.org/packages/c3/54/de0893186a221478f5880283119fc40483bc460b27c4c71d1b8bba3474b9/coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", size = 211692 }, + { url = "https://files.pythonhosted.org/packages/25/6d/31883d78865529257bf847df5789e2ae80e99de8a460c3453dbfbe0db069/coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", size = 208308 }, + { url = "https://files.pythonhosted.org/packages/70/22/3f2b129cc08de00c83b0ad6252e034320946abfc3e4235c009e57cfeee05/coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", size = 208565 }, + { url = "https://files.pythonhosted.org/packages/97/0a/d89bc2d1cc61d3a8dfe9e9d75217b2be85f6c73ebf1b9e3c2f4e797f4531/coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", size = 241083 }, + { url = "https://files.pythonhosted.org/packages/4c/81/6d64b88a00c7a7aaed3a657b8eaa0931f37a6395fcef61e53ff742b49c97/coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", size = 238235 }, + { url = "https://files.pythonhosted.org/packages/9a/0b/7797d4193f5adb4b837207ed87fecf5fc38f7cc612b369a8e8e12d9fa114/coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", size = 240220 }, + { url = "https://files.pythonhosted.org/packages/65/4d/6f83ca1bddcf8e51bf8ff71572f39a1c73c34cf50e752a952c34f24d0a60/coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", size = 239847 }, + { url = "https://files.pythonhosted.org/packages/30/9d/2470df6aa146aff4c65fee0f87f58d2164a67533c771c9cc12ffcdb865d5/coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", size = 237922 }, + { url = "https://files.pythonhosted.org/packages/08/dd/723fef5d901e6a89f2507094db66c091449c8ba03272861eaefa773ad95c/coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", size = 239783 }, + { url = "https://files.pythonhosted.org/packages/3d/f7/64d3298b2baf261cb35466000628706ce20a82d42faf9b771af447cd2b76/coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", size = 210965 }, + { url = "https://files.pythonhosted.org/packages/d5/58/ec43499a7fc681212fe7742fe90b2bc361cdb72e3181ace1604247a5b24d/coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", size = 211719 }, + { url = "https://files.pythonhosted.org/packages/ab/c9/f2857a135bcff4330c1e90e7d03446b036b2363d4ad37eb5e3a47bbac8a6/coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", size = 209050 }, + { url = "https://files.pythonhosted.org/packages/aa/b3/f840e5bd777d8433caa9e4a1eb20503495709f697341ac1a8ee6a3c906ad/coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", size = 209321 }, + { url = "https://files.pythonhosted.org/packages/85/7d/125a5362180fcc1c03d91850fc020f3831d5cda09319522bcfa6b2b70be7/coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", size = 252039 }, + { url = "https://files.pythonhosted.org/packages/a9/9c/4358bf3c74baf1f9bddd2baf3756b54c07f2cfd2535f0a47f1e7757e54b3/coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", size = 247758 }, + { url = "https://files.pythonhosted.org/packages/cf/c7/de3eb6fc5263b26fab5cda3de7a0f80e317597a4bad4781859f72885f300/coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", size = 250119 }, + { url = "https://files.pythonhosted.org/packages/3e/e6/43de91f8ba2ec9140c6a4af1102141712949903dc732cf739167cfa7a3bc/coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", size = 249597 }, + { url = "https://files.pythonhosted.org/packages/08/40/61158b5499aa2adf9e37bc6d0117e8f6788625b283d51e7e0c53cf340530/coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", size = 247473 }, + { url = "https://files.pythonhosted.org/packages/50/69/b3f2416725621e9f112e74e8470793d5b5995f146f596f133678a633b77e/coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", size = 248737 }, + { url = "https://files.pythonhosted.org/packages/3c/6e/fe899fb937657db6df31cc3e61c6968cb56d36d7326361847440a430152e/coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", size = 211611 }, + { url = "https://files.pythonhosted.org/packages/1c/55/52f5e66142a9d7bc93a15192eba7a78513d2abf6b3558d77b4ca32f5f424/coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", size = 212781 }, + { url = "https://files.pythonhosted.org/packages/a1/70/de81bfec9ed38a64fc44a77c7665e20ca507fc3265597c28b0d989e4082e/coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f", size = 200223 }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version <= '3.11'" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 }, +] + +[[package]] +name = "debugpy" +version = "1.8.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/e7/666f4c9b0e24796af50aadc28d36d21c2e01e831a934535f956e09b3650c/debugpy-1.8.11.tar.gz", hash = "sha256:6ad2688b69235c43b020e04fecccdf6a96c8943ca9c2fb340b8adc103c655e57", size = 1640124 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/e6/4cf7422eaa591b4c7d6a9fde224095dac25283fdd99d90164f28714242b0/debugpy-1.8.11-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:2b26fefc4e31ff85593d68b9022e35e8925714a10ab4858fb1b577a8a48cb8cd", size = 2075100 }, + { url = "https://files.pythonhosted.org/packages/83/3a/e163de1df5995d95760a4d748b02fbefb1c1bf19e915b664017c40435dbf/debugpy-1.8.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61bc8b3b265e6949855300e84dc93d02d7a3a637f2aec6d382afd4ceb9120c9f", size = 3559724 }, + { url = "https://files.pythonhosted.org/packages/27/6c/327e19fd1bf428a1efe1a6f97b306689c54c2cebcf871b66674ead718756/debugpy-1.8.11-cp310-cp310-win32.whl", hash = "sha256:c928bbf47f65288574b78518449edaa46c82572d340e2750889bbf8cd92f3737", size = 5178068 }, + { url = "https://files.pythonhosted.org/packages/49/80/359ff8aa388f0bd4a48f0fa9ce3606396d576657ac149c6fba3cc7de8adb/debugpy-1.8.11-cp310-cp310-win_amd64.whl", hash = "sha256:8da1db4ca4f22583e834dcabdc7832e56fe16275253ee53ba66627b86e304da1", size = 5210109 }, + { url = "https://files.pythonhosted.org/packages/7c/58/8e3f7ec86c1b7985a232667b5df8f3b1b1c8401028d8f4d75e025c9556cd/debugpy-1.8.11-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:85de8474ad53ad546ff1c7c7c89230db215b9b8a02754d41cb5a76f70d0be296", size = 2173656 }, + { url = "https://files.pythonhosted.org/packages/d2/03/95738a68ade2358e5a4d63a2fd8e7ed9ad911001cfabbbb33a7f81343945/debugpy-1.8.11-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ffc382e4afa4aee367bf413f55ed17bd91b191dcaf979890af239dda435f2a1", size = 3132464 }, + { url = "https://files.pythonhosted.org/packages/ca/f4/18204891ab67300950615a6ad09b9de236203a9138f52b3b596fa17628ca/debugpy-1.8.11-cp311-cp311-win32.whl", hash = "sha256:40499a9979c55f72f4eb2fc38695419546b62594f8af194b879d2a18439c97a9", size = 5103637 }, + { url = "https://files.pythonhosted.org/packages/3b/90/3775e301cfa573b51eb8a108285681f43f5441dc4c3916feed9f386ef861/debugpy-1.8.11-cp311-cp311-win_amd64.whl", hash = "sha256:987bce16e86efa86f747d5151c54e91b3c1e36acc03ce1ddb50f9d09d16ded0e", size = 5127862 }, + { url = "https://files.pythonhosted.org/packages/c6/ae/2cf26f3111e9d94384d9c01e9d6170188b0aeda15b60a4ac6457f7c8a26f/debugpy-1.8.11-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:84e511a7545d11683d32cdb8f809ef63fc17ea2a00455cc62d0a4dbb4ed1c308", size = 2498756 }, + { url = "https://files.pythonhosted.org/packages/b0/16/ec551789d547541a46831a19aa15c147741133da188e7e6acf77510545a7/debugpy-1.8.11-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce291a5aca4985d82875d6779f61375e959208cdf09fcec40001e65fb0a54768", size = 4219136 }, + { url = "https://files.pythonhosted.org/packages/72/6f/b2b3ce673c55f882d27a6eb04a5f0c68bcad6b742ac08a86d8392ae58030/debugpy-1.8.11-cp312-cp312-win32.whl", hash = "sha256:28e45b3f827d3bf2592f3cf7ae63282e859f3259db44ed2b129093ca0ac7940b", size = 5224440 }, + { url = "https://files.pythonhosted.org/packages/77/09/b1f05be802c1caef5b3efc042fc6a7cadd13d8118b072afd04a9b9e91e06/debugpy-1.8.11-cp312-cp312-win_amd64.whl", hash = "sha256:44b1b8e6253bceada11f714acf4309ffb98bfa9ac55e4fce14f9e5d4484287a1", size = 5264578 }, + { url = "https://files.pythonhosted.org/packages/2e/66/931dc2479aa8fbf362dc6dcee707d895a84b0b2d7b64020135f20b8db1ed/debugpy-1.8.11-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:8988f7163e4381b0da7696f37eec7aca19deb02e500245df68a7159739bbd0d3", size = 2483651 }, + { url = "https://files.pythonhosted.org/packages/10/07/6c171d0fe6b8d237e35598b742f20ba062511b3a4631938cc78eefbbf847/debugpy-1.8.11-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c1f6a173d1140e557347419767d2b14ac1c9cd847e0b4c5444c7f3144697e4e", size = 4213770 }, + { url = "https://files.pythonhosted.org/packages/89/f1/0711da6ac250d4fe3bf7b3e9b14b4a86e82a98b7825075c07e19bab8da3d/debugpy-1.8.11-cp313-cp313-win32.whl", hash = "sha256:bb3b15e25891f38da3ca0740271e63ab9db61f41d4d8541745cfc1824252cb28", size = 5223911 }, + { url = "https://files.pythonhosted.org/packages/56/98/5e27fa39050749ed460025bcd0034a0a5e78a580a14079b164cc3abdeb98/debugpy-1.8.11-cp313-cp313-win_amd64.whl", hash = "sha256:d8768edcbeb34da9e11bcb8b5c2e0958d25218df7a6e56adf415ef262cd7b6d1", size = 5264166 }, + { url = "https://files.pythonhosted.org/packages/77/0a/d29a5aacf47b4383ed569b8478c02d59ee3a01ad91224d2cff8562410e43/debugpy-1.8.11-py2.py3-none-any.whl", hash = "sha256:0e22f846f4211383e6a416d04b4c13ed174d24cc5d43f5fd52e7821d0ebc8920", size = 5226874 }, +] + +[[package]] +name = "decorator" +version = "5.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", size = 35016 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, +] + +[[package]] +name = "dictio" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema" }, + { name = "lxml" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/d6/afa4be318fdd3ea287dd4300145d505646732ea712717ed3a342d3af06cf/dictio-0.4.0.tar.gz", hash = "sha256:c637ed257923c8f3991b8fccb7c103d9240512ccb60322b5f43a76203f450487", size = 95732 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/59/9921cc5fd537572bbd88ac6ab2a0b6bac0ea8f3fd200934f7a310dcecf0c/dictio-0.4.0-py3-none-any.whl", hash = "sha256:460a0b03f19a0eb68d4455407e416c457a5068f1b06f8c522c44a4fe7a207145", size = 59421 }, +] + +[[package]] +name = "distlib" +version = "0.3.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, +] + +[[package]] +name = "docutils" +version = "0.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408 }, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, +] + +[[package]] +name = "executing" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/e3/7d45f492c2c4a0e8e0fad57d081a7c8a0286cdd86372b070cca1ec0caa1e/executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab", size = 977485 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf", size = 25805 }, +] + +[[package]] +name = "fastjsonschema" +version = "2.21.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924 }, +] + +[[package]] +name = "filelock" +version = "3.16.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/db/3ef5bb276dae18d6ec2124224403d1d67bccdbefc17af4cc8f553e341ab1/filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435", size = 18037 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, +] + +[[package]] +name = "folium" +version = "0.19.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "branca" }, + { name = "jinja2" }, + { name = "numpy" }, + { name = "requests" }, + { name = "xyzservices" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/09/469cbe217cddc0cb11542fa38f50014e548b2dda010f67185b0579885cd6/folium-0.19.4.tar.gz", hash = "sha256:431a655b52a9bf3efda336f2be022103f0106504a0599e7c349efbfd30bafda6", size = 105936 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/ab/d1f47c48a14e17cd487c8b467b573291fae75477b067241407e7889a3692/folium-0.19.4-py2.py3-none-any.whl", hash = "sha256:bea5246b6a6aa61b96d1c51399dd63254bacbd6ba8a826eeb491f45242032dfd", size = 110511 }, +] + +[[package]] +name = "fonttools" +version = "4.55.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/61/a300d1574dc381393424047c0396a0e213db212e28361123af9830d71a8d/fonttools-4.55.3.tar.gz", hash = "sha256:3983313c2a04d6cc1fe9251f8fc647754cf49a61dac6cb1e7249ae67afaafc45", size = 3498155 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/f3/9ac8c6705e4a0ff3c29e524df1caeee6f2987b02fb630129f21cc99a8212/fonttools-4.55.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1dcc07934a2165ccdc3a5a608db56fb3c24b609658a5b340aee4ecf3ba679dc0", size = 2769857 }, + { url = "https://files.pythonhosted.org/packages/d8/24/e8b8edd280bdb7d0ecc88a5d952b1dec2ee2335be71cc5a33c64871cdfe8/fonttools-4.55.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f7d66c15ba875432a2d2fb419523f5d3d347f91f48f57b8b08a2dfc3c39b8a3f", size = 2299705 }, + { url = "https://files.pythonhosted.org/packages/f8/9e/e1ba20bd3b71870207fd45ca3b90208a7edd8ae3b001081dc31c45adb017/fonttools-4.55.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e4ae3592e62eba83cd2c4ccd9462dcfa603ff78e09110680a5444c6925d841", size = 4576104 }, + { url = "https://files.pythonhosted.org/packages/34/db/d423bc646e6703fe3e6aea0edd22a2df47b9d188c5f7f1b49070be4d2205/fonttools-4.55.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d65a3022c35e404d19ca14f291c89cc5890032ff04f6c17af0bd1927299674", size = 4618282 }, + { url = "https://files.pythonhosted.org/packages/75/a0/e5062ac960a385b984ba74e7b55132e7f2c65e449e8330ab0f595407a3de/fonttools-4.55.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d342e88764fb201286d185093781bf6628bbe380a913c24adf772d901baa8276", size = 4570539 }, + { url = "https://files.pythonhosted.org/packages/1f/33/0d744ff518ebe50020b63e5018b8b278efd6a930c1d2eedda7defc42153b/fonttools-4.55.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dd68c87a2bfe37c5b33bcda0fba39b65a353876d3b9006fde3adae31f97b3ef5", size = 4742411 }, + { url = "https://files.pythonhosted.org/packages/7e/6c/2f768652dba6b801f1567fc5d1829cda369bcd6e95e315a91e628f91c702/fonttools-4.55.3-cp310-cp310-win32.whl", hash = "sha256:1bc7ad24ff98846282eef1cbeac05d013c2154f977a79886bb943015d2b1b261", size = 2175132 }, + { url = "https://files.pythonhosted.org/packages/19/d1/4dcd865360fb2c499749a913fe80e41c26e8ae18629d87dfffa3de27e831/fonttools-4.55.3-cp310-cp310-win_amd64.whl", hash = "sha256:b54baf65c52952db65df39fcd4820668d0ef4766c0ccdf32879b77f7c804d5c5", size = 2219430 }, + { url = "https://files.pythonhosted.org/packages/4b/18/14be25545600bd100e5b74a3ac39089b7c1cb403dc513b7ca348be3381bf/fonttools-4.55.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c4491699bad88efe95772543cd49870cf756b019ad56294f6498982408ab03e", size = 2771005 }, + { url = "https://files.pythonhosted.org/packages/b2/51/2e1a5d3871cd7c2ae2054b54e92604e7d6abc3fd3656e9583c399648fe1c/fonttools-4.55.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5323a22eabddf4b24f66d26894f1229261021dacd9d29e89f7872dd8c63f0b8b", size = 2300654 }, + { url = "https://files.pythonhosted.org/packages/73/1a/50109bb2703bc6f774b52ea081db21edf2a9fa4b6d7485faadf9d1b997e9/fonttools-4.55.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5480673f599ad410695ca2ddef2dfefe9df779a9a5cda89503881e503c9c7d90", size = 4877541 }, + { url = "https://files.pythonhosted.org/packages/5d/52/c0b9857fa075da1b8806c5dc2d8342918a8cc2065fd14fbddb3303282693/fonttools-4.55.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da9da6d65cd7aa6b0f806556f4985bcbf603bf0c5c590e61b43aa3e5a0f822d0", size = 4906304 }, + { url = "https://files.pythonhosted.org/packages/0b/1b/55f85c7e962d295e456d5209581c919620ee3e877b95cd86245187a5050f/fonttools-4.55.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e894b5bd60d9f473bed7a8f506515549cc194de08064d829464088d23097331b", size = 4888087 }, + { url = "https://files.pythonhosted.org/packages/83/13/6f2809c612ea2ac51391f92468ff861c63473601530fca96458b453212bf/fonttools-4.55.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aee3b57643827e237ff6ec6d28d9ff9766bd8b21e08cd13bff479e13d4b14765", size = 5056958 }, + { url = "https://files.pythonhosted.org/packages/c1/28/d0ea9e872fa4208b9dfca686e1dd9ca22f6c9ef33ecff2f0ebc2dbe7c29b/fonttools-4.55.3-cp311-cp311-win32.whl", hash = "sha256:eb6ca911c4c17eb51853143624d8dc87cdcdf12a711fc38bf5bd21521e79715f", size = 2173939 }, + { url = "https://files.pythonhosted.org/packages/be/36/d74ae1020bc41a1dff3e6f5a99f646563beecb97e386d27abdac3ba07650/fonttools-4.55.3-cp311-cp311-win_amd64.whl", hash = "sha256:6314bf82c54c53c71805318fcf6786d986461622dd926d92a465199ff54b1b72", size = 2220363 }, + { url = "https://files.pythonhosted.org/packages/89/58/fbcf5dff7e3ea844bb00c4d806ca1e339e1f2dce5529633bf4842c0c9a1f/fonttools-4.55.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f9e736f60f4911061235603a6119e72053073a12c6d7904011df2d8fad2c0e35", size = 2765380 }, + { url = "https://files.pythonhosted.org/packages/81/dd/da6e329e51919b4f421c8738f3497e2ab08c168e76aaef7b6d5351862bdf/fonttools-4.55.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a8aa2c5e5b8b3bcb2e4538d929f6589a5c6bdb84fd16e2ed92649fb5454f11c", size = 2297940 }, + { url = "https://files.pythonhosted.org/packages/00/44/f5ee560858425c99ef07e04919e736db09d6416408e5a8d3bbfb4a6623fd/fonttools-4.55.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07f8288aacf0a38d174445fc78377a97fb0b83cfe352a90c9d9c1400571963c7", size = 4793327 }, + { url = "https://files.pythonhosted.org/packages/24/da/0a001926d791c55e29ac3c52964957a20dbc1963615446b568b7432891c3/fonttools-4.55.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8d5e8916c0970fbc0f6f1bece0063363bb5857a7f170121a4493e31c3db3314", size = 4865624 }, + { url = "https://files.pythonhosted.org/packages/3d/d8/1edd8b13a427a9fb6418373437caa586c0caa57f260af8e0548f4d11e340/fonttools-4.55.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ae3b6600565b2d80b7c05acb8e24d2b26ac407b27a3f2e078229721ba5698427", size = 4774166 }, + { url = "https://files.pythonhosted.org/packages/9c/ec/ade054097976c3d6debc9032e09a351505a0196aa5493edf021be376f75e/fonttools-4.55.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:54153c49913f45065c8d9e6d0c101396725c5621c8aee744719300f79771d75a", size = 5001832 }, + { url = "https://files.pythonhosted.org/packages/e2/cd/233f0e31ad799bb91fc78099c8b4e5ec43b85a131688519640d6bae46f6a/fonttools-4.55.3-cp312-cp312-win32.whl", hash = "sha256:827e95fdbbd3e51f8b459af5ea10ecb4e30af50221ca103bea68218e9615de07", size = 2162228 }, + { url = "https://files.pythonhosted.org/packages/46/45/a498b5291f6c0d91b2394b1ed7447442a57d1c9b9cf8f439aee3c316a56e/fonttools-4.55.3-cp312-cp312-win_amd64.whl", hash = "sha256:e6e8766eeeb2de759e862004aa11a9ea3d6f6d5ec710551a88b476192b64fd54", size = 2209118 }, + { url = "https://files.pythonhosted.org/packages/9c/9f/00142a19bad96eeeb1aed93f567adc19b7f2c1af6f5bc0a1c3de90b4b1ac/fonttools-4.55.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a430178ad3e650e695167cb53242dae3477b35c95bef6525b074d87493c4bf29", size = 2752812 }, + { url = "https://files.pythonhosted.org/packages/b0/20/14b8250d63ba65e162091fb0dda07730f90c303bbf5257e9ddacec7230d9/fonttools-4.55.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:529cef2ce91dc44f8e407cc567fae6e49a1786f2fefefa73a294704c415322a4", size = 2291521 }, + { url = "https://files.pythonhosted.org/packages/34/47/a681cfd10245eb74f65e491a934053ec75c4af639655446558f29818e45e/fonttools-4.55.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e75f12c82127486fac2d8bfbf5bf058202f54bf4f158d367e41647b972342ca", size = 4770980 }, + { url = "https://files.pythonhosted.org/packages/d2/6c/a7066afc19db0705a12efd812e19c32cde2b9514eb714659522f2ebd60b6/fonttools-4.55.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:859c358ebf41db18fb72342d3080bce67c02b39e86b9fbcf1610cca14984841b", size = 4845534 }, + { url = "https://files.pythonhosted.org/packages/0c/a2/3c204fbabbfd845d9bdcab9ae35279d41e9a4bf5c80a0a2708f9c5a195d6/fonttools-4.55.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:546565028e244a701f73df6d8dd6be489d01617863ec0c6a42fa25bf45d43048", size = 4753910 }, + { url = "https://files.pythonhosted.org/packages/6e/8c/b4cb3592880340b89e4ef6601b531780bba73862332a6451d78fe135d6cb/fonttools-4.55.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:aca318b77f23523309eec4475d1fbbb00a6b133eb766a8bdc401faba91261abe", size = 4976411 }, + { url = "https://files.pythonhosted.org/packages/fc/a8/4bf98840ff89fcc188470b59daec57322178bf36d2f4f756cd19a42a826b/fonttools-4.55.3-cp313-cp313-win32.whl", hash = "sha256:8c5ec45428edaa7022f1c949a632a6f298edc7b481312fc7dc258921e9399628", size = 2160178 }, + { url = "https://files.pythonhosted.org/packages/e6/57/4cc35004605416df3225ff362f3455cf09765db00df578ae9e46d0fefd23/fonttools-4.55.3-cp313-cp313-win_amd64.whl", hash = "sha256:11e5de1ee0d95af4ae23c1a138b184b7f06e0b6abacabf1d0db41c90b03d834b", size = 2206102 }, + { url = "https://files.pythonhosted.org/packages/99/3b/406d17b1f63e04a82aa621936e6e1c53a8c05458abd66300ac85ea7f9ae9/fonttools-4.55.3-py3-none-any.whl", hash = "sha256:f412604ccbeee81b091b420272841e5ec5ef68967a9790e80bffd0e30b8e2977", size = 1111638 }, +] + +[[package]] +name = "fqdn" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121 }, +] + +[[package]] +name = "furo" +version = "2024.8.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "pygments" }, + { name = "sphinx" }, + { name = "sphinx-basic-ng" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a0/e2/d351d69a9a9e4badb4a5be062c2d0e87bd9e6c23b5e57337fef14bef34c8/furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01", size = 1661506 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/48/e791a7ed487dbb9729ef32bb5d1af16693d8925f4366befef54119b2e576/furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c", size = 341333 }, +] + +[[package]] +name = "global-land-mask" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/cd/d06fe252cbe41b85c7a1a54e4d4214c79b770eb5d6c6fa3b03e56371a6da/global-land-mask-1.0.0.tar.gz", hash = "sha256:956bf02e8b05bfc9f3a29cbc6e97d5ba4151c0732504acc73c2db9ea325ecff3", size = 1825546 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/e9/eaac67e39b68f64828a164f8dbfcf13baccd7382704ea120152af475f520/global_land_mask-1.0.0-py3-none-any.whl", hash = "sha256:07751fbb4e3834ee508a84ea64d9bd5340fbd0a8c951e24b43c323fcc670bb62", size = 1836944 }, +] + +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, +] + +[[package]] +name = "identify" +version = "2.6.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/92/69934b9ef3c31ca2470980423fda3d00f0460ddefdf30a67adf7f17e2e00/identify-2.6.5.tar.gz", hash = "sha256:c10b33f250e5bba374fae86fb57f3adcebf1161bce7cdf92031915fd480c13bc", size = 99213 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/fa/dce098f4cdf7621aa8f7b4f919ce545891f489482f0bfa5102f3eca8608b/identify-2.6.5-py2.py3-none-any.whl", hash = "sha256:14181a47091eb75b337af4c23078c9d09225cd4c48929f521f3bf16b09d02566", size = 99078 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769 }, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, +] + +[[package]] +name = "ipykernel" +version = "6.29.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 }, +] + +[[package]] +name = "ipython" +version = "8.31.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/35/6f90fdddff7a08b7b715fccbd2427b5212c9525cd043d26fdc45bee0708d/ipython-8.31.0.tar.gz", hash = "sha256:b6a2274606bec6166405ff05e54932ed6e5cfecaca1fc05f2cacde7bb074d70b", size = 5501011 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/60/d0feb6b6d9fe4ab89fe8fe5b47cbf6cd936bfd9f1e7ffa9d0015425aeed6/ipython-8.31.0-py3-none-any.whl", hash = "sha256:46ec58f8d3d076a61d128fe517a51eb730e3aaf0c184ea8c17d16e366660c6a6", size = 821583 }, +] + +[[package]] +name = "ipywidgets" +version = "8.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm" }, + { name = "ipython" }, + { name = "jupyterlab-widgets" }, + { name = "traitlets" }, + { name = "widgetsnbextension" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/4c/dab2a281b07596a5fc220d49827fe6c794c66f1493d7a74f1df0640f2cc5/ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17", size = 116723 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245", size = 139767 }, +] + +[[package]] +name = "isoduration" +version = "20.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321 }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, +] + +[[package]] +name = "jinja2" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 }, +] + +[[package]] +name = "json5" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/3d/bbe62f3d0c05a689c711cff57b2e3ac3d3e526380adb7c781989f075115c/json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559", size = 48202 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/42/797895b952b682c3dafe23b1834507ee7f02f4d6299b65aaa61425763278/json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa", size = 34049 }, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 }, +] + +[package.optional-dependencies] +format-nongpl = [ + { name = "fqdn" }, + { name = "idna" }, + { name = "isoduration" }, + { name = "jsonpointer" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "uri-template" }, + { name = "webcolors" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2024.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/10/db/58f950c996c793472e336ff3655b13fbcf1e3b359dcf52dcf3ed3b52c352/jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", size = 15561 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 }, +] + +[[package]] +name = "jupyter" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipywidgets" }, + { name = "jupyter-console" }, + { name = "jupyterlab" }, + { name = "nbconvert" }, + { name = "notebook" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657 }, +] + +[[package]] +name = "jupyter-client" +version = "8.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, +] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "pyzmq" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510 }, +] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 }, +] + +[[package]] +name = "jupyter-events" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema", extra = ["format-nongpl"] }, + { name = "python-json-logger" }, + { name = "pyyaml" }, + { name = "referencing" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/65/5791c8a979b5646ca29ea50e42b6708908b789f7ff389d1a03c1b93a1c54/jupyter_events-0.11.0.tar.gz", hash = "sha256:c0bc56a37aac29c1fbc3bcfbddb8c8c49533f9cf11f1c4e6adadba936574ab90", size = 62039 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/8c/9b65cb2cd4ea32d885993d5542244641590530836802a2e8c7449a4c61c9/jupyter_events-0.11.0-py3-none-any.whl", hash = "sha256:36399b41ce1ca45fe8b8271067d6a140ffa54cec4028e95491c93b78a855cacf", size = 19423 }, +] + +[[package]] +name = "jupyter-lsp" +version = "2.2.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/b4/3200b0b09c12bc3b72d943d923323c398eff382d1dcc7c0dbc8b74630e40/jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001", size = 48741 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/e0/7bd7cff65594fd9936e2f9385701e44574fc7d721331ff676ce440b14100/jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da", size = 69146 }, +] + +[[package]] +name = "jupyter-server" +version = "2.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "argon2-cffi" }, + { name = "jinja2" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "jupyter-events" }, + { name = "jupyter-server-terminals" }, + { name = "nbconvert" }, + { name = "nbformat" }, + { name = "overrides" }, + { name = "packaging" }, + { name = "prometheus-client" }, + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "pyzmq" }, + { name = "send2trash" }, + { name = "terminado" }, + { name = "tornado" }, + { name = "traitlets" }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/8c/df09d4ab646141f130f9977b32b206ba8615d1969b2eba6a2e84b7f89137/jupyter_server-2.15.0.tar.gz", hash = "sha256:9d446b8697b4f7337a1b7cdcac40778babdd93ba614b6d68ab1c0c918f1c4084", size = 725227 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl", hash = "sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3", size = 385826 }, +] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "terminado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269", size = 31430 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa", size = 13656 }, +] + +[[package]] +name = "jupyterlab" +version = "4.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "async-lru" }, + { name = "httpx" }, + { name = "ipykernel" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyter-lsp" }, + { name = "jupyter-server" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "packaging" }, + { name = "setuptools" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/45/1052f842e066902b1d78126df7e2269b1b9408991e1344e167b2e429f9e1/jupyterlab-4.3.4.tar.gz", hash = "sha256:f0bb9b09a04766e3423cccc2fc23169aa2ffedcdf8713e9e0fb33cac0b6859d0", size = 21797583 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/48/af57263e53cfc220e522de047aa0993f53bab734fe812af1e03e33ac6d7c/jupyterlab-4.3.4-py3-none-any.whl", hash = "sha256:b754c2601c5be6adf87cb5a1d8495d653ffb945f021939f77776acaa94dae952", size = 11665373 }, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884 }, +] + +[[package]] +name = "jupyterlab-server" +version = "2.27.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "jinja2" }, + { name = "json5" }, + { name = "jsonschema" }, + { name = "jupyter-server" }, + { name = "packaging" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/c9/a883ce65eb27905ce77ace410d83587c82ea64dc85a48d1f7ed52bcfa68d/jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4", size = 76173 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4", size = 59700 }, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/73/fa26bbb747a9ea4fca6b01453aa22990d52ab62dd61384f1ac0dc9d4e7ba/jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed", size = 203556 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/93/858e87edc634d628e5d752ba944c2833133a28fa87bb093e6832ced36a3e/jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54", size = 214392 }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/5f/4d8e9e852d98ecd26cdf8eaf7ed8bc33174033bba5e07001b289f07308fd/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db", size = 124623 }, + { url = "https://files.pythonhosted.org/packages/1d/70/7f5af2a18a76fe92ea14675f8bd88ce53ee79e37900fa5f1a1d8e0b42998/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b", size = 66720 }, + { url = "https://files.pythonhosted.org/packages/c6/13/e15f804a142353aefd089fadc8f1d985561a15358c97aca27b0979cb0785/kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d", size = 65413 }, + { url = "https://files.pythonhosted.org/packages/ce/6d/67d36c4d2054e83fb875c6b59d0809d5c530de8148846b1370475eeeece9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d", size = 1650826 }, + { url = "https://files.pythonhosted.org/packages/de/c6/7b9bb8044e150d4d1558423a1568e4f227193662a02231064e3824f37e0a/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c", size = 1628231 }, + { url = "https://files.pythonhosted.org/packages/b6/38/ad10d437563063eaaedbe2c3540a71101fc7fb07a7e71f855e93ea4de605/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3", size = 1408938 }, + { url = "https://files.pythonhosted.org/packages/52/ce/c0106b3bd7f9e665c5f5bc1e07cc95b5dabd4e08e3dad42dbe2faad467e7/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed", size = 1422799 }, + { url = "https://files.pythonhosted.org/packages/d0/87/efb704b1d75dc9758087ba374c0f23d3254505edaedd09cf9d247f7878b9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f", size = 1354362 }, + { url = "https://files.pythonhosted.org/packages/eb/b3/fd760dc214ec9a8f208b99e42e8f0130ff4b384eca8b29dd0efc62052176/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff", size = 2222695 }, + { url = "https://files.pythonhosted.org/packages/a2/09/a27fb36cca3fc01700687cc45dae7a6a5f8eeb5f657b9f710f788748e10d/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d", size = 2370802 }, + { url = "https://files.pythonhosted.org/packages/3d/c3/ba0a0346db35fe4dc1f2f2cf8b99362fbb922d7562e5f911f7ce7a7b60fa/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c", size = 2334646 }, + { url = "https://files.pythonhosted.org/packages/41/52/942cf69e562f5ed253ac67d5c92a693745f0bed3c81f49fc0cbebe4d6b00/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605", size = 2467260 }, + { url = "https://files.pythonhosted.org/packages/32/26/2d9668f30d8a494b0411d4d7d4ea1345ba12deb6a75274d58dd6ea01e951/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e", size = 2288633 }, + { url = "https://files.pythonhosted.org/packages/98/99/0dd05071654aa44fe5d5e350729961e7bb535372935a45ac89a8924316e6/kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751", size = 71885 }, + { url = "https://files.pythonhosted.org/packages/6c/fc/822e532262a97442989335394d441cd1d0448c2e46d26d3e04efca84df22/kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271", size = 65175 }, + { url = "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", size = 124635 }, + { url = "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", size = 66717 }, + { url = "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", size = 65413 }, + { url = "https://files.pythonhosted.org/packages/a9/98/1df4089b1ed23d83d410adfdc5947245c753bddfbe06541c4aae330e9e70/kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", size = 1343994 }, + { url = "https://files.pythonhosted.org/packages/8d/bf/b4b169b050c8421a7c53ea1ea74e4ef9c335ee9013216c558a047f162d20/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", size = 1434804 }, + { url = "https://files.pythonhosted.org/packages/66/5a/e13bd341fbcf73325ea60fdc8af752addf75c5079867af2e04cc41f34434/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", size = 1450690 }, + { url = "https://files.pythonhosted.org/packages/9b/4f/5955dcb376ba4a830384cc6fab7d7547bd6759fe75a09564910e9e3bb8ea/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", size = 1376839 }, + { url = "https://files.pythonhosted.org/packages/3a/97/5edbed69a9d0caa2e4aa616ae7df8127e10f6586940aa683a496c2c280b9/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", size = 1435109 }, + { url = "https://files.pythonhosted.org/packages/13/fc/e756382cb64e556af6c1809a1bbb22c141bbc2445049f2da06b420fe52bf/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", size = 2245269 }, + { url = "https://files.pythonhosted.org/packages/76/15/e59e45829d7f41c776d138245cabae6515cb4eb44b418f6d4109c478b481/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", size = 2393468 }, + { url = "https://files.pythonhosted.org/packages/e9/39/483558c2a913ab8384d6e4b66a932406f87c95a6080112433da5ed668559/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", size = 2355394 }, + { url = "https://files.pythonhosted.org/packages/01/aa/efad1fbca6570a161d29224f14b082960c7e08268a133fe5dc0f6906820e/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", size = 2490901 }, + { url = "https://files.pythonhosted.org/packages/c9/4f/15988966ba46bcd5ab9d0c8296914436720dd67fca689ae1a75b4ec1c72f/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", size = 2312306 }, + { url = "https://files.pythonhosted.org/packages/2d/27/bdf1c769c83f74d98cbc34483a972f221440703054894a37d174fba8aa68/kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", size = 71966 }, + { url = "https://files.pythonhosted.org/packages/4a/c9/9642ea855604aeb2968a8e145fc662edf61db7632ad2e4fb92424be6b6c0/kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", size = 65311 }, + { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152 }, + { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067 }, + { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443 }, + { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728 }, + { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388 }, + { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849 }, + { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533 }, + { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898 }, + { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605 }, + { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801 }, + { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077 }, + { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410 }, + { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853 }, + { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424 }, + { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156 }, + { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071 }, + { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053 }, + { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278 }, + { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139 }, + { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517 }, + { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952 }, + { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132 }, + { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997 }, + { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060 }, + { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471 }, + { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793 }, + { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855 }, + { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430 }, + { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294 }, + { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736 }, + { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194 }, + { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942 }, + { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341 }, + { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455 }, + { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138 }, + { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857 }, + { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129 }, + { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538 }, + { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661 }, + { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710 }, + { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213 }, + { url = "https://files.pythonhosted.org/packages/1f/f9/ae81c47a43e33b93b0a9819cac6723257f5da2a5a60daf46aa5c7226ea85/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a", size = 60403 }, + { url = "https://files.pythonhosted.org/packages/58/ca/f92b5cb6f4ce0c1ebfcfe3e2e42b96917e16f7090e45b21102941924f18f/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8", size = 58657 }, + { url = "https://files.pythonhosted.org/packages/80/28/ae0240f732f0484d3a4dc885d055653c47144bdf59b670aae0ec3c65a7c8/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0", size = 84948 }, + { url = "https://files.pythonhosted.org/packages/5d/eb/78d50346c51db22c7203c1611f9b513075f35c4e0e4877c5dde378d66043/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c", size = 81186 }, + { url = "https://files.pythonhosted.org/packages/43/f8/7259f18c77adca88d5f64f9a522792e178b2691f3748817a8750c2d216ef/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b", size = 80279 }, + { url = "https://files.pythonhosted.org/packages/3a/1d/50ad811d1c5dae091e4cf046beba925bcae0a610e79ae4c538f996f63ed5/kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b", size = 71762 }, +] + +[[package]] +name = "lxml" +version = "5.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/6b/20c3a4b24751377aaa6307eb230b66701024012c29dd374999cc92983269/lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f", size = 3679318 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/ce/2789e39eddf2b13fac29878bfa465f0910eb6b0096e29090e5176bc8cf43/lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656", size = 8124570 }, + { url = "https://files.pythonhosted.org/packages/24/a8/f4010166a25d41715527129af2675981a50d3bbf7df09c5d9ab8ca24fbf9/lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d", size = 4413042 }, + { url = "https://files.pythonhosted.org/packages/41/a4/7e45756cecdd7577ddf67a68b69c1db0f5ddbf0c9f65021ee769165ffc5a/lxml-5.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a", size = 5139213 }, + { url = "https://files.pythonhosted.org/packages/02/e2/ecf845b12323c92748077e1818b64e8b4dba509a4cb12920b3762ebe7552/lxml-5.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8", size = 4838814 }, + { url = "https://files.pythonhosted.org/packages/12/91/619f9fb72cf75e9ceb8700706f7276f23995f6ad757e6d400fbe35ca4990/lxml-5.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330", size = 5425084 }, + { url = "https://files.pythonhosted.org/packages/25/3b/162a85a8f0fd2a3032ec3f936636911c6e9523a8e263fffcfd581ce98b54/lxml-5.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965", size = 4875993 }, + { url = "https://files.pythonhosted.org/packages/43/af/dd3f58cc7d946da6ae42909629a2b1d5dd2d1b583334d4af9396697d6863/lxml-5.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22", size = 5012462 }, + { url = "https://files.pythonhosted.org/packages/69/c1/5ea46b2d4c98f5bf5c83fffab8a0ad293c9bc74df9ecfbafef10f77f7201/lxml-5.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b", size = 4815288 }, + { url = "https://files.pythonhosted.org/packages/1d/51/a0acca077ad35da458f4d3f729ef98effd2b90f003440d35fc36323f8ae6/lxml-5.3.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7", size = 5472435 }, + { url = "https://files.pythonhosted.org/packages/4d/6b/0989c9368986961a6b0f55b46c80404c4b758417acdb6d87bfc3bd5f4967/lxml-5.3.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8", size = 4976354 }, + { url = "https://files.pythonhosted.org/packages/05/9e/87492d03ff604fbf656ed2bf3e2e8d28f5d58ea1f00ff27ac27b06509079/lxml-5.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32", size = 5029973 }, + { url = "https://files.pythonhosted.org/packages/f9/cc/9ae1baf5472af88e19e2c454b3710c1be9ecafb20eb474eeabcd88a055d2/lxml-5.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86", size = 4888837 }, + { url = "https://files.pythonhosted.org/packages/d2/10/5594ffaec8c120d75b17e3ad23439b740a51549a9b5fd7484b2179adfe8f/lxml-5.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5", size = 5530555 }, + { url = "https://files.pythonhosted.org/packages/ea/9b/de17f05377c8833343b629905571fb06cff2028f15a6f58ae2267662e341/lxml-5.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03", size = 5405314 }, + { url = "https://files.pythonhosted.org/packages/8a/b4/227be0f1f3cca8255925985164c3838b8b36e441ff0cc10c1d3c6bdba031/lxml-5.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7", size = 5079303 }, + { url = "https://files.pythonhosted.org/packages/5c/ee/19abcebb7fc40319bb71cd6adefa1ad94d09b5660228715854d6cc420713/lxml-5.3.0-cp310-cp310-win32.whl", hash = "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80", size = 3475126 }, + { url = "https://files.pythonhosted.org/packages/a1/35/183d32551447e280032b2331738cd850da435a42f850b71ebeaab42c1313/lxml-5.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3", size = 3805065 }, + { url = "https://files.pythonhosted.org/packages/5c/a8/449faa2a3cbe6a99f8d38dcd51a3ee8844c17862841a6f769ea7c2a9cd0f/lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b", size = 8141056 }, + { url = "https://files.pythonhosted.org/packages/ac/8a/ae6325e994e2052de92f894363b038351c50ee38749d30cc6b6d96aaf90f/lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18", size = 4425238 }, + { url = "https://files.pythonhosted.org/packages/f8/fb/128dddb7f9086236bce0eeae2bfb316d138b49b159f50bc681d56c1bdd19/lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442", size = 5095197 }, + { url = "https://files.pythonhosted.org/packages/b4/f9/a181a8ef106e41e3086629c8bdb2d21a942f14c84a0e77452c22d6b22091/lxml-5.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4", size = 4809809 }, + { url = "https://files.pythonhosted.org/packages/25/2f/b20565e808f7f6868aacea48ddcdd7e9e9fb4c799287f21f1a6c7c2e8b71/lxml-5.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f", size = 5407593 }, + { url = "https://files.pythonhosted.org/packages/23/0e/caac672ec246d3189a16c4d364ed4f7d6bf856c080215382c06764058c08/lxml-5.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e", size = 4866657 }, + { url = "https://files.pythonhosted.org/packages/67/a4/1f5fbd3f58d4069000522196b0b776a014f3feec1796da03e495cf23532d/lxml-5.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c", size = 4967017 }, + { url = "https://files.pythonhosted.org/packages/ee/73/623ecea6ca3c530dd0a4ed0d00d9702e0e85cd5624e2d5b93b005fe00abd/lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16", size = 4810730 }, + { url = "https://files.pythonhosted.org/packages/1d/ce/fb84fb8e3c298f3a245ae3ea6221c2426f1bbaa82d10a88787412a498145/lxml-5.3.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79", size = 5455154 }, + { url = "https://files.pythonhosted.org/packages/b1/72/4d1ad363748a72c7c0411c28be2b0dc7150d91e823eadad3b91a4514cbea/lxml-5.3.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080", size = 4969416 }, + { url = "https://files.pythonhosted.org/packages/42/07/b29571a58a3a80681722ea8ed0ba569211d9bb8531ad49b5cacf6d409185/lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654", size = 5013672 }, + { url = "https://files.pythonhosted.org/packages/b9/93/bde740d5a58cf04cbd38e3dd93ad1e36c2f95553bbf7d57807bc6815d926/lxml-5.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d", size = 4878644 }, + { url = "https://files.pythonhosted.org/packages/56/b5/645c8c02721d49927c93181de4017164ec0e141413577687c3df8ff0800f/lxml-5.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763", size = 5511531 }, + { url = "https://files.pythonhosted.org/packages/85/3f/6a99a12d9438316f4fc86ef88c5d4c8fb674247b17f3173ecadd8346b671/lxml-5.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec", size = 5402065 }, + { url = "https://files.pythonhosted.org/packages/80/8a/df47bff6ad5ac57335bf552babfb2408f9eb680c074ec1ba412a1a6af2c5/lxml-5.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be", size = 5069775 }, + { url = "https://files.pythonhosted.org/packages/08/ae/e7ad0f0fbe4b6368c5ee1e3ef0c3365098d806d42379c46c1ba2802a52f7/lxml-5.3.0-cp311-cp311-win32.whl", hash = "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9", size = 3474226 }, + { url = "https://files.pythonhosted.org/packages/c3/b5/91c2249bfac02ee514ab135e9304b89d55967be7e53e94a879b74eec7a5c/lxml-5.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1", size = 3814971 }, + { url = "https://files.pythonhosted.org/packages/eb/6d/d1f1c5e40c64bf62afd7a3f9b34ce18a586a1cccbf71e783cd0a6d8e8971/lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859", size = 8171753 }, + { url = "https://files.pythonhosted.org/packages/bd/83/26b1864921869784355459f374896dcf8b44d4af3b15d7697e9156cb2de9/lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e", size = 4441955 }, + { url = "https://files.pythonhosted.org/packages/e0/d2/e9bff9fb359226c25cda3538f664f54f2804f4b37b0d7c944639e1a51f69/lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f", size = 5050778 }, + { url = "https://files.pythonhosted.org/packages/88/69/6972bfafa8cd3ddc8562b126dd607011e218e17be313a8b1b9cc5a0ee876/lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e", size = 4748628 }, + { url = "https://files.pythonhosted.org/packages/5d/ea/a6523c7c7f6dc755a6eed3d2f6d6646617cad4d3d6d8ce4ed71bfd2362c8/lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179", size = 5322215 }, + { url = "https://files.pythonhosted.org/packages/99/37/396fbd24a70f62b31d988e4500f2068c7f3fd399d2fd45257d13eab51a6f/lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a", size = 4813963 }, + { url = "https://files.pythonhosted.org/packages/09/91/e6136f17459a11ce1757df864b213efbeab7adcb2efa63efb1b846ab6723/lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3", size = 4923353 }, + { url = "https://files.pythonhosted.org/packages/1d/7c/2eeecf87c9a1fca4f84f991067c693e67340f2b7127fc3eca8fa29d75ee3/lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1", size = 4740541 }, + { url = "https://files.pythonhosted.org/packages/3b/ed/4c38ba58defca84f5f0d0ac2480fdcd99fc7ae4b28fc417c93640a6949ae/lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d", size = 5346504 }, + { url = "https://files.pythonhosted.org/packages/a5/22/bbd3995437e5745cb4c2b5d89088d70ab19d4feabf8a27a24cecb9745464/lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c", size = 4898077 }, + { url = "https://files.pythonhosted.org/packages/0a/6e/94537acfb5b8f18235d13186d247bca478fea5e87d224644e0fe907df976/lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99", size = 4946543 }, + { url = "https://files.pythonhosted.org/packages/8d/e8/4b15df533fe8e8d53363b23a41df9be907330e1fa28c7ca36893fad338ee/lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff", size = 4816841 }, + { url = "https://files.pythonhosted.org/packages/1a/e7/03f390ea37d1acda50bc538feb5b2bda6745b25731e4e76ab48fae7106bf/lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a", size = 5417341 }, + { url = "https://files.pythonhosted.org/packages/ea/99/d1133ab4c250da85a883c3b60249d3d3e7c64f24faff494cf0fd23f91e80/lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8", size = 5327539 }, + { url = "https://files.pythonhosted.org/packages/7d/ed/e6276c8d9668028213df01f598f385b05b55a4e1b4662ee12ef05dab35aa/lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d", size = 5012542 }, + { url = "https://files.pythonhosted.org/packages/36/88/684d4e800f5aa28df2a991a6a622783fb73cf0e46235cfa690f9776f032e/lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30", size = 3486454 }, + { url = "https://files.pythonhosted.org/packages/fc/82/ace5a5676051e60355bd8fb945df7b1ba4f4fb8447f2010fb816bfd57724/lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f", size = 3816857 }, + { url = "https://files.pythonhosted.org/packages/94/6a/42141e4d373903bfea6f8e94b2f554d05506dfda522ada5343c651410dc8/lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a", size = 8156284 }, + { url = "https://files.pythonhosted.org/packages/91/5e/fa097f0f7d8b3d113fb7312c6308af702f2667f22644441715be961f2c7e/lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd", size = 4432407 }, + { url = "https://files.pythonhosted.org/packages/2d/a1/b901988aa6d4ff937f2e5cfc114e4ec561901ff00660c3e56713642728da/lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51", size = 5048331 }, + { url = "https://files.pythonhosted.org/packages/30/0f/b2a54f48e52de578b71bbe2a2f8160672a8a5e103df3a78da53907e8c7ed/lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b", size = 4744835 }, + { url = "https://files.pythonhosted.org/packages/82/9d/b000c15538b60934589e83826ecbc437a1586488d7c13f8ee5ff1f79a9b8/lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002", size = 5316649 }, + { url = "https://files.pythonhosted.org/packages/e3/ee/ffbb9eaff5e541922611d2c56b175c45893d1c0b8b11e5a497708a6a3b3b/lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4", size = 4812046 }, + { url = "https://files.pythonhosted.org/packages/15/ff/7ff89d567485c7b943cdac316087f16b2399a8b997007ed352a1248397e5/lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492", size = 4918597 }, + { url = "https://files.pythonhosted.org/packages/c6/a3/535b6ed8c048412ff51268bdf4bf1cf052a37aa7e31d2e6518038a883b29/lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3", size = 4738071 }, + { url = "https://files.pythonhosted.org/packages/7a/8f/cbbfa59cb4d4fd677fe183725a76d8c956495d7a3c7f111ab8f5e13d2e83/lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4", size = 5342213 }, + { url = "https://files.pythonhosted.org/packages/5c/fb/db4c10dd9958d4b52e34d1d1f7c1f434422aeaf6ae2bbaaff2264351d944/lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367", size = 4893749 }, + { url = "https://files.pythonhosted.org/packages/f2/38/bb4581c143957c47740de18a3281a0cab7722390a77cc6e610e8ebf2d736/lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832", size = 4945901 }, + { url = "https://files.pythonhosted.org/packages/fc/d5/18b7de4960c731e98037bd48fa9f8e6e8f2558e6fbca4303d9b14d21ef3b/lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff", size = 4815447 }, + { url = "https://files.pythonhosted.org/packages/97/a8/cd51ceaad6eb849246559a8ef60ae55065a3df550fc5fcd27014361c1bab/lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd", size = 5411186 }, + { url = "https://files.pythonhosted.org/packages/89/c3/1e3dabab519481ed7b1fdcba21dcfb8832f57000733ef0e71cf6d09a5e03/lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb", size = 5324481 }, + { url = "https://files.pythonhosted.org/packages/b6/17/71e9984cf0570cd202ac0a1c9ed5c1b8889b0fc8dc736f5ef0ffb181c284/lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b", size = 5011053 }, + { url = "https://files.pythonhosted.org/packages/69/68/9f7e6d3312a91e30829368c2b3217e750adef12a6f8eb10498249f4e8d72/lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957", size = 3485634 }, + { url = "https://files.pythonhosted.org/packages/7d/db/214290d58ad68c587bd5d6af3d34e56830438733d0d0856c0275fde43652/lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d", size = 3814417 }, + { url = "https://files.pythonhosted.org/packages/99/f7/b73a431c8500565aa500e99e60b448d305eaf7c0b4c893c7c5a8a69cc595/lxml-5.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c", size = 3925431 }, + { url = "https://files.pythonhosted.org/packages/db/48/4a206623c0d093d0e3b15f415ffb4345b0bdf661a3d0b15a112948c033c7/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a", size = 4216683 }, + { url = "https://files.pythonhosted.org/packages/54/47/577820c45dd954523ae8453b632d91e76da94ca6d9ee40d8c98dd86f916b/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005", size = 4326732 }, + { url = "https://files.pythonhosted.org/packages/68/de/96cb6d3269bc994b4f5ede8ca7bf0840f5de0a278bc6e50cb317ff71cafa/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce", size = 4218377 }, + { url = "https://files.pythonhosted.org/packages/a5/43/19b1ef6cbffa4244a217f95cc5f41a6cb4720fed33510a49670b03c5f1a0/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83", size = 4351237 }, + { url = "https://files.pythonhosted.org/packages/ba/b2/6a22fb5c0885da3b00e116aee81f0b829ec9ac8f736cd414b4a09413fc7d/lxml-5.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba", size = 3487557 }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 }, + { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 }, + { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 }, + { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 }, + { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 }, + { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 }, + { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 }, + { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 }, + { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 }, + { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 }, + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, +] + +[[package]] +name = "matplotlib" +version = "3.8.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/4f/8487737a74d8be4ab5fbe6019b0fae305c1604cf7209500969b879b5f462/matplotlib-3.8.4.tar.gz", hash = "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea", size = 35934425 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/c0/1f88491656d21a2fecd90fbfae999b2f87bc44d439ef301ec8e0e4a937a0/matplotlib-3.8.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014", size = 7603557 }, + { url = "https://files.pythonhosted.org/packages/86/9c/aa059a4fb8154d5875a5ddd33f8d0a42d77c0225fe4325e9b9358f39b0bf/matplotlib-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106", size = 7497421 }, + { url = "https://files.pythonhosted.org/packages/0b/67/ded5217d42de1532193cd87db925c67997d23c68b20c3eaa9e4c6a0adb67/matplotlib-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10", size = 11377985 }, + { url = "https://files.pythonhosted.org/packages/d6/07/061f97211f942101070a46fecd813a6b1bd83590ed7b07c473cabd707fe7/matplotlib-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0", size = 11608003 }, + { url = "https://files.pythonhosted.org/packages/9a/d3/5d0bb1d905e219543fdfd7ab04e9d641a766367c83a5ffbcea60d2b2cf2d/matplotlib-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef", size = 9535368 }, + { url = "https://files.pythonhosted.org/packages/62/5a/a5108ae3db37f35f8a2be8a57d62da327af239214c9661464ce09ee32d7d/matplotlib-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338", size = 7656037 }, + { url = "https://files.pythonhosted.org/packages/36/11/62250ea25780d4b59c2c6044ec161235c47cc05a18d0ec0a05657de75b7d/matplotlib-3.8.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661", size = 7606117 }, + { url = "https://files.pythonhosted.org/packages/14/60/12d4f27b859a74359306662da69c2d08826a2b05cfe7f96e66b490f41573/matplotlib-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c", size = 7500108 }, + { url = "https://files.pythonhosted.org/packages/4e/ba/9e4f7f34dccf2d2768504410410db8d551c940457a2bec658dc4fa3b5aa2/matplotlib-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa", size = 11382998 }, + { url = "https://files.pythonhosted.org/packages/80/3b/e363612ac1a514abfb5505aa209dd5b724b3232a6de98710d7759559706a/matplotlib-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71", size = 11613309 }, + { url = "https://files.pythonhosted.org/packages/32/4c/63164901acadb3ada55c5e0fd6b7f29c9033d7e131302884cd735611b77a/matplotlib-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b", size = 9546019 }, + { url = "https://files.pythonhosted.org/packages/2d/d5/6227732ecab9165586966ccb54301e3164f61b470c954c4cf6940654fbe1/matplotlib-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae", size = 7658174 }, + { url = "https://files.pythonhosted.org/packages/91/eb/65f3bd78ce757dadd455c220273349428384b162485cd8aa380b61a867ed/matplotlib-3.8.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616", size = 7604083 }, + { url = "https://files.pythonhosted.org/packages/da/2b/2bb6073ca8d336da07ace7d98bf7bb9da8233f55876bb3db6a5ee924f3e9/matplotlib-3.8.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732", size = 7496013 }, + { url = "https://files.pythonhosted.org/packages/61/cd/976d3a9c10328da1d2fe183f7c92c45f1e125536226a6eb3a820c4753cd1/matplotlib-3.8.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb", size = 11376749 }, + { url = "https://files.pythonhosted.org/packages/cd/ba/412149958e951876096198609b958b90a8a2c9bc07a96eeeaa9e2c480f30/matplotlib-3.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30", size = 11600837 }, + { url = "https://files.pythonhosted.org/packages/dc/4f/e5b56ca109d8ab6bae37f519f15b891fc18809ddb8bc1aa26e0bfca83e25/matplotlib-3.8.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25", size = 9538883 }, + { url = "https://files.pythonhosted.org/packages/7d/ca/e7bd1876a341ed8c456095962a582696cac1691cb6e55bd5ead15a755c5d/matplotlib-3.8.4-cp312-cp312-win_amd64.whl", hash = "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a", size = 7659712 }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316 }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + +[[package]] +name = "mistune" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/6e/96fc7cb3288666c5de2c396eb0e338dc95f7a8e4920e43e38783a22d0084/mistune-3.1.0.tar.gz", hash = "sha256:dbcac2f78292b9dc066cd03b7a3a26b62d85f8159f2ea5fd28e55df79908d667", size = 94401 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/b3/743ffc3f59da380da504d84ccd1faf9a857a1445991ff19bf2ec754163c2/mistune-3.1.0-py3-none-any.whl", hash = "sha256:b05198cf6d671b3deba6c87ec6cf0d4eb7b72c524636eddb6dbf13823b52cee1", size = 53694 }, +] + +[[package]] +name = "mypy" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/eb/2c92d8ea1e684440f54fa49ac5d9a5f19967b7b472a281f419e69a8d228e/mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6", size = 3216051 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/7a/87ae2adb31d68402da6da1e5f30c07ea6063e9f09b5e7cfc9dfa44075e74/mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb", size = 11211002 }, + { url = "https://files.pythonhosted.org/packages/e1/23/eada4c38608b444618a132be0d199b280049ded278b24cbb9d3fc59658e4/mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0", size = 10358400 }, + { url = "https://files.pythonhosted.org/packages/43/c9/d6785c6f66241c62fd2992b05057f404237deaad1566545e9f144ced07f5/mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d", size = 12095172 }, + { url = "https://files.pythonhosted.org/packages/c3/62/daa7e787770c83c52ce2aaf1a111eae5893de9e004743f51bfcad9e487ec/mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b", size = 12828732 }, + { url = "https://files.pythonhosted.org/packages/1b/a2/5fb18318a3637f29f16f4e41340b795da14f4751ef4f51c99ff39ab62e52/mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427", size = 13012197 }, + { url = "https://files.pythonhosted.org/packages/28/99/e153ce39105d164b5f02c06c35c7ba958aaff50a2babba7d080988b03fe7/mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f", size = 9780836 }, + { url = "https://files.pythonhosted.org/packages/da/11/a9422850fd506edbcdc7f6090682ecceaf1f87b9dd847f9df79942da8506/mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c", size = 11120432 }, + { url = "https://files.pythonhosted.org/packages/b6/9e/47e450fd39078d9c02d620545b2cb37993a8a8bdf7db3652ace2f80521ca/mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1", size = 10279515 }, + { url = "https://files.pythonhosted.org/packages/01/b5/6c8d33bd0f851a7692a8bfe4ee75eb82b6983a3cf39e5e32a5d2a723f0c1/mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8", size = 12025791 }, + { url = "https://files.pythonhosted.org/packages/f0/4c/e10e2c46ea37cab5c471d0ddaaa9a434dc1d28650078ac1b56c2d7b9b2e4/mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f", size = 12749203 }, + { url = "https://files.pythonhosted.org/packages/88/55/beacb0c69beab2153a0f57671ec07861d27d735a0faff135a494cd4f5020/mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1", size = 12885900 }, + { url = "https://files.pythonhosted.org/packages/a2/75/8c93ff7f315c4d086a2dfcde02f713004357d70a163eddb6c56a6a5eff40/mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae", size = 9777869 }, + { url = "https://files.pythonhosted.org/packages/43/1b/b38c079609bb4627905b74fc6a49849835acf68547ac33d8ceb707de5f52/mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14", size = 11266668 }, + { url = "https://files.pythonhosted.org/packages/6b/75/2ed0d2964c1ffc9971c729f7a544e9cd34b2cdabbe2d11afd148d7838aa2/mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9", size = 10254060 }, + { url = "https://files.pythonhosted.org/packages/a1/5f/7b8051552d4da3c51bbe8fcafffd76a6823779101a2b198d80886cd8f08e/mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11", size = 11933167 }, + { url = "https://files.pythonhosted.org/packages/04/90/f53971d3ac39d8b68bbaab9a4c6c58c8caa4d5fd3d587d16f5927eeeabe1/mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e", size = 12864341 }, + { url = "https://files.pythonhosted.org/packages/03/d2/8bc0aeaaf2e88c977db41583559319f1821c069e943ada2701e86d0430b7/mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89", size = 12972991 }, + { url = "https://files.pythonhosted.org/packages/6f/17/07815114b903b49b0f2cf7499f1c130e5aa459411596668267535fe9243c/mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b", size = 9879016 }, + { url = "https://files.pythonhosted.org/packages/9e/15/bb6a686901f59222275ab228453de741185f9d54fecbaacec041679496c6/mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255", size = 11252097 }, + { url = "https://files.pythonhosted.org/packages/f8/b3/8b0f74dfd072c802b7fa368829defdf3ee1566ba74c32a2cb2403f68024c/mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34", size = 10239728 }, + { url = "https://files.pythonhosted.org/packages/c5/9b/4fd95ab20c52bb5b8c03cc49169be5905d931de17edfe4d9d2986800b52e/mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a", size = 11924965 }, + { url = "https://files.pythonhosted.org/packages/56/9d/4a236b9c57f5d8f08ed346914b3f091a62dd7e19336b2b2a0d85485f82ff/mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9", size = 12867660 }, + { url = "https://files.pythonhosted.org/packages/40/88/a61a5497e2f68d9027de2bb139c7bb9abaeb1be1584649fa9d807f80a338/mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd", size = 12969198 }, + { url = "https://files.pythonhosted.org/packages/54/da/3d6fc5d92d324701b0c23fb413c853892bfe0e1dbe06c9138037d459756b/mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107", size = 9885276 }, + { url = "https://files.pythonhosted.org/packages/a0/b5/32dd67b69a16d088e533962e5044e51004176a9952419de0370cdaead0f8/mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1", size = 2752905 }, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, +] + +[[package]] +name = "myst-parser" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "jinja2" }, + { name = "markdown-it-py" }, + { name = "mdit-py-plugins" }, + { name = "pyyaml" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/55/6d1741a1780e5e65038b74bce6689da15f620261c490c3511eb4c12bac4b/myst_parser-4.0.0.tar.gz", hash = "sha256:851c9dfb44e36e56d15d05e72f02b80da21a9e0d07cba96baf5e2d476bb91531", size = 93858 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/b4/b036f8fdb667587bb37df29dc6644681dd78b7a2a6321a34684b79412b28/myst_parser-4.0.0-py3-none-any.whl", hash = "sha256:b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d", size = 84563 }, +] + +[[package]] +name = "nbclient" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "nbformat" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434 }, +] + +[[package]] +name = "nbconvert" +version = "7.16.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach", extra = ["css"] }, + { name = "defusedxml" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/2c/d026c0367f2be2463d4c2f5b538e28add2bc67bc13730abb7f364ae4eb8b/nbconvert-7.16.5.tar.gz", hash = "sha256:c83467bb5777fdfaac5ebbb8e864f300b277f68692ecc04d6dab72f2d8442344", size = 856367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/9e/2dcc9fe00cf55d95a8deae69384e9cea61816126e345754f6c75494d32ec/nbconvert-7.16.5-py3-none-any.whl", hash = "sha256:e12eac052d6fd03040af4166c563d76e7aeead2e9aadf5356db552a1784bd547", size = 258061 }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454 }, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, +] + +[[package]] +name = "notebook" +version = "7.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, + { name = "jupyterlab" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/04/ac488379d5afef43402b3fb4be2857db1a09804fecf98b9b714c741b225b/notebook-7.3.2.tar.gz", hash = "sha256:705e83a1785f45b383bf3ee13cb76680b92d24f56fb0c7d2136fe1d850cd3ca8", size = 12781804 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/9b/76e50ee18f183ea5fe1784a9eeaa50f2c71802e4740d6e959592b0993298/notebook-7.3.2-py3-none-any.whl", hash = "sha256:e5f85fc59b69d3618d73cf27544418193ff8e8058d5bf61d315ce4f473556288", size = 13163630 }, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307 }, +] + +[[package]] +name = "numpy" +version = "1.26.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/94/ace0fdea5241a27d13543ee117cbc65868e82213fb31a8eb7fe9ff23f313/numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", size = 20631468 }, + { url = "https://files.pythonhosted.org/packages/20/f7/b24208eba89f9d1b58c1668bc6c8c4fd472b20c45573cb767f59d49fb0f6/numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", size = 13966411 }, + { url = "https://files.pythonhosted.org/packages/fc/a5/4beee6488160798683eed5bdb7eead455892c3b4e1f78d79d8d3f3b084ac/numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", size = 14219016 }, + { url = "https://files.pythonhosted.org/packages/4b/d7/ecf66c1cd12dc28b4040b15ab4d17b773b87fa9d29ca16125de01adb36cd/numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f", size = 18240889 }, + { url = "https://files.pythonhosted.org/packages/24/03/6f229fe3187546435c4f6f89f6d26c129d4f5bed40552899fcf1f0bf9e50/numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", size = 13876746 }, + { url = "https://files.pythonhosted.org/packages/39/fe/39ada9b094f01f5a35486577c848fe274e374bbf8d8f472e1423a0bbd26d/numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", size = 18078620 }, + { url = "https://files.pythonhosted.org/packages/d5/ef/6ad11d51197aad206a9ad2286dc1aac6a378059e06e8cf22cd08ed4f20dc/numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", size = 5972659 }, + { url = "https://files.pythonhosted.org/packages/19/77/538f202862b9183f54108557bfda67e17603fc560c384559e769321c9d92/numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", size = 15808905 }, + { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554 }, + { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127 }, + { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994 }, + { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005 }, + { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297 }, + { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567 }, + { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812 }, + { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913 }, + { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901 }, + { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868 }, + { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109 }, + { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613 }, + { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172 }, + { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643 }, + { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803 }, + { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754 }, +] + +[[package]] +name = "overrides" +version = "7.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832 }, +] + +[[package]] +name = "packaging" +version = "23.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", size = 146714 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7", size = 53011 }, +] + +[[package]] +name = "pandas-stubs" +version = "2.2.3.241126" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "types-pytz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/86/93c545d149c3e1fe1c4c55478cc3a69859d0ea3467e1d9892e9eb28cb1e7/pandas_stubs-2.2.3.241126.tar.gz", hash = "sha256:cf819383c6d9ae7d4dabf34cd47e1e45525bb2f312e6ad2939c2c204cb708acd", size = 104204 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/ab/ed42acf15bab2e86e5c49fad4aa038315233c4c2d22f41b49faa4d837516/pandas_stubs-2.2.3.241126-py3-none-any.whl", hash = "sha256:74aa79c167af374fe97068acc90776c0ebec5266a6e5c69fe11e9c2cf51f2267", size = 158280 }, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663 }, +] + +[[package]] +name = "parso" +version = "0.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, +] + +[[package]] +name = "pillow" +version = "11.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/af/c097e544e7bd278333db77933e535098c259609c4eb3b85381109602fb5b/pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20", size = 46742715 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/1c/2dcea34ac3d7bc96a1fd1bd0a6e06a57c67167fec2cff8d95d88229a8817/pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8", size = 3229983 }, + { url = "https://files.pythonhosted.org/packages/14/ca/6bec3df25e4c88432681de94a3531cc738bd85dea6c7aa6ab6f81ad8bd11/pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192", size = 3101831 }, + { url = "https://files.pythonhosted.org/packages/d4/2c/668e18e5521e46eb9667b09e501d8e07049eb5bfe39d56be0724a43117e6/pillow-11.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2", size = 4314074 }, + { url = "https://files.pythonhosted.org/packages/02/80/79f99b714f0fc25f6a8499ecfd1f810df12aec170ea1e32a4f75746051ce/pillow-11.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26", size = 4394933 }, + { url = "https://files.pythonhosted.org/packages/81/aa/8d4ad25dc11fd10a2001d5b8a80fdc0e564ac33b293bdfe04ed387e0fd95/pillow-11.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07", size = 4353349 }, + { url = "https://files.pythonhosted.org/packages/84/7a/cd0c3eaf4a28cb2a74bdd19129f7726277a7f30c4f8424cd27a62987d864/pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482", size = 4476532 }, + { url = "https://files.pythonhosted.org/packages/8f/8b/a907fdd3ae8f01c7670dfb1499c53c28e217c338b47a813af8d815e7ce97/pillow-11.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e", size = 4279789 }, + { url = "https://files.pythonhosted.org/packages/6f/9a/9f139d9e8cccd661c3efbf6898967a9a337eb2e9be2b454ba0a09533100d/pillow-11.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269", size = 4413131 }, + { url = "https://files.pythonhosted.org/packages/a8/68/0d8d461f42a3f37432203c8e6df94da10ac8081b6d35af1c203bf3111088/pillow-11.1.0-cp310-cp310-win32.whl", hash = "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49", size = 2291213 }, + { url = "https://files.pythonhosted.org/packages/14/81/d0dff759a74ba87715509af9f6cb21fa21d93b02b3316ed43bda83664db9/pillow-11.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a", size = 2625725 }, + { url = "https://files.pythonhosted.org/packages/ce/1f/8d50c096a1d58ef0584ddc37e6f602828515219e9d2428e14ce50f5ecad1/pillow-11.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65", size = 2375213 }, + { url = "https://files.pythonhosted.org/packages/dd/d6/2000bfd8d5414fb70cbbe52c8332f2283ff30ed66a9cde42716c8ecbe22c/pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457", size = 3229968 }, + { url = "https://files.pythonhosted.org/packages/d9/45/3fe487010dd9ce0a06adf9b8ff4f273cc0a44536e234b0fad3532a42c15b/pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35", size = 3101806 }, + { url = "https://files.pythonhosted.org/packages/e3/72/776b3629c47d9d5f1c160113158a7a7ad177688d3a1159cd3b62ded5a33a/pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2", size = 4322283 }, + { url = "https://files.pythonhosted.org/packages/e4/c2/e25199e7e4e71d64eeb869f5b72c7ddec70e0a87926398785ab944d92375/pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070", size = 4402945 }, + { url = "https://files.pythonhosted.org/packages/c1/ed/51d6136c9d5911f78632b1b86c45241c712c5a80ed7fa7f9120a5dff1eba/pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6", size = 4361228 }, + { url = "https://files.pythonhosted.org/packages/48/a4/fbfe9d5581d7b111b28f1d8c2762dee92e9821bb209af9fa83c940e507a0/pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1", size = 4484021 }, + { url = "https://files.pythonhosted.org/packages/39/db/0b3c1a5018117f3c1d4df671fb8e47d08937f27519e8614bbe86153b65a5/pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2", size = 4287449 }, + { url = "https://files.pythonhosted.org/packages/d9/58/bc128da7fea8c89fc85e09f773c4901e95b5936000e6f303222490c052f3/pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96", size = 4419972 }, + { url = "https://files.pythonhosted.org/packages/5f/bb/58f34379bde9fe197f51841c5bbe8830c28bbb6d3801f16a83b8f2ad37df/pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f", size = 2291201 }, + { url = "https://files.pythonhosted.org/packages/3a/c6/fce9255272bcf0c39e15abd2f8fd8429a954cf344469eaceb9d0d1366913/pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761", size = 2625686 }, + { url = "https://files.pythonhosted.org/packages/c8/52/8ba066d569d932365509054859f74f2a9abee273edcef5cd75e4bc3e831e/pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71", size = 2375194 }, + { url = "https://files.pythonhosted.org/packages/95/20/9ce6ed62c91c073fcaa23d216e68289e19d95fb8188b9fb7a63d36771db8/pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a", size = 3226818 }, + { url = "https://files.pythonhosted.org/packages/b9/d8/f6004d98579a2596c098d1e30d10b248798cceff82d2b77aa914875bfea1/pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b", size = 3101662 }, + { url = "https://files.pythonhosted.org/packages/08/d9/892e705f90051c7a2574d9f24579c9e100c828700d78a63239676f960b74/pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3", size = 4329317 }, + { url = "https://files.pythonhosted.org/packages/8c/aa/7f29711f26680eab0bcd3ecdd6d23ed6bce180d82e3f6380fb7ae35fcf3b/pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a", size = 4412999 }, + { url = "https://files.pythonhosted.org/packages/c8/c4/8f0fe3b9e0f7196f6d0bbb151f9fba323d72a41da068610c4c960b16632a/pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1", size = 4368819 }, + { url = "https://files.pythonhosted.org/packages/38/0d/84200ed6a871ce386ddc82904bfadc0c6b28b0c0ec78176871a4679e40b3/pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f", size = 4496081 }, + { url = "https://files.pythonhosted.org/packages/84/9c/9bcd66f714d7e25b64118e3952d52841a4babc6d97b6d28e2261c52045d4/pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91", size = 4296513 }, + { url = "https://files.pythonhosted.org/packages/db/61/ada2a226e22da011b45f7104c95ebda1b63dcbb0c378ad0f7c2a710f8fd2/pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c", size = 4431298 }, + { url = "https://files.pythonhosted.org/packages/e7/c4/fc6e86750523f367923522014b821c11ebc5ad402e659d8c9d09b3c9d70c/pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6", size = 2291630 }, + { url = "https://files.pythonhosted.org/packages/08/5c/2104299949b9d504baf3f4d35f73dbd14ef31bbd1ddc2c1b66a5b7dfda44/pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf", size = 2626369 }, + { url = "https://files.pythonhosted.org/packages/37/f3/9b18362206b244167c958984b57c7f70a0289bfb59a530dd8af5f699b910/pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5", size = 2375240 }, + { url = "https://files.pythonhosted.org/packages/b3/31/9ca79cafdce364fd5c980cd3416c20ce1bebd235b470d262f9d24d810184/pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc", size = 3226640 }, + { url = "https://files.pythonhosted.org/packages/ac/0f/ff07ad45a1f172a497aa393b13a9d81a32e1477ef0e869d030e3c1532521/pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0", size = 3101437 }, + { url = "https://files.pythonhosted.org/packages/08/2f/9906fca87a68d29ec4530be1f893149e0cb64a86d1f9f70a7cfcdfe8ae44/pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1", size = 4326605 }, + { url = "https://files.pythonhosted.org/packages/b0/0f/f3547ee15b145bc5c8b336401b2d4c9d9da67da9dcb572d7c0d4103d2c69/pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec", size = 4411173 }, + { url = "https://files.pythonhosted.org/packages/b1/df/bf8176aa5db515c5de584c5e00df9bab0713548fd780c82a86cba2c2fedb/pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5", size = 4369145 }, + { url = "https://files.pythonhosted.org/packages/de/7c/7433122d1cfadc740f577cb55526fdc39129a648ac65ce64db2eb7209277/pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114", size = 4496340 }, + { url = "https://files.pythonhosted.org/packages/25/46/dd94b93ca6bd555588835f2504bd90c00d5438fe131cf01cfa0c5131a19d/pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352", size = 4296906 }, + { url = "https://files.pythonhosted.org/packages/a8/28/2f9d32014dfc7753e586db9add35b8a41b7a3b46540e965cb6d6bc607bd2/pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3", size = 4431759 }, + { url = "https://files.pythonhosted.org/packages/33/48/19c2cbe7403870fbe8b7737d19eb013f46299cdfe4501573367f6396c775/pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9", size = 2291657 }, + { url = "https://files.pythonhosted.org/packages/3b/ad/285c556747d34c399f332ba7c1a595ba245796ef3e22eae190f5364bb62b/pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c", size = 2626304 }, + { url = "https://files.pythonhosted.org/packages/e5/7b/ef35a71163bf36db06e9c8729608f78dedf032fc8313d19bd4be5c2588f3/pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65", size = 2375117 }, + { url = "https://files.pythonhosted.org/packages/79/30/77f54228401e84d6791354888549b45824ab0ffde659bafa67956303a09f/pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861", size = 3230060 }, + { url = "https://files.pythonhosted.org/packages/ce/b1/56723b74b07dd64c1010fee011951ea9c35a43d8020acd03111f14298225/pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081", size = 3106192 }, + { url = "https://files.pythonhosted.org/packages/e1/cd/7bf7180e08f80a4dcc6b4c3a0aa9e0b0ae57168562726a05dc8aa8fa66b0/pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c", size = 4446805 }, + { url = "https://files.pythonhosted.org/packages/97/42/87c856ea30c8ed97e8efbe672b58c8304dee0573f8c7cab62ae9e31db6ae/pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547", size = 4530623 }, + { url = "https://files.pythonhosted.org/packages/ff/41/026879e90c84a88e33fb00cc6bd915ac2743c67e87a18f80270dfe3c2041/pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab", size = 4465191 }, + { url = "https://files.pythonhosted.org/packages/e5/fb/a7960e838bc5df57a2ce23183bfd2290d97c33028b96bde332a9057834d3/pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9", size = 2295494 }, + { url = "https://files.pythonhosted.org/packages/d7/6c/6ec83ee2f6f0fda8d4cf89045c6be4b0373ebfc363ba8538f8c999f63fcd/pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe", size = 2631595 }, + { url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 }, + { url = "https://files.pythonhosted.org/packages/fa/c5/389961578fb677b8b3244fcd934f720ed25a148b9a5cc81c91bdf59d8588/pillow-11.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90", size = 3198345 }, + { url = "https://files.pythonhosted.org/packages/c4/fa/803c0e50ffee74d4b965229e816af55276eac1d5806712de86f9371858fd/pillow-11.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb", size = 3072938 }, + { url = "https://files.pythonhosted.org/packages/dc/67/2a3a5f8012b5d8c63fe53958ba906c1b1d0482ebed5618057ef4d22f8076/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442", size = 3400049 }, + { url = "https://files.pythonhosted.org/packages/e5/a0/514f0d317446c98c478d1872497eb92e7cde67003fed74f696441e647446/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83", size = 3422431 }, + { url = "https://files.pythonhosted.org/packages/cd/00/20f40a935514037b7d3f87adfc87d2c538430ea625b63b3af8c3f5578e72/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f", size = 3446208 }, + { url = "https://files.pythonhosted.org/packages/28/3c/7de681727963043e093c72e6c3348411b0185eab3263100d4490234ba2f6/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73", size = 3509746 }, + { url = "https://files.pythonhosted.org/packages/41/67/936f9814bdd74b2dfd4822f1f7725ab5d8ff4103919a1664eb4874c58b2f/pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0", size = 2626353 }, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, +] + +[[package]] +name = "pre-commit" +version = "4.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/c8/e22c292035f1bac8b9f5237a2622305bc0304e776080b246f3df57c4ff9f/pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2", size = 191678 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/8f/496e10d51edd6671ebe0432e33ff800aa86775d2d147ce7d43389324a525/pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878", size = 218713 }, +] + +[[package]] +name = "prometheus-client" +version = "0.21.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/62/14/7d0f567991f3a9af8d1cd4f619040c93b68f09a02b6d0b6ab1b2d1ded5fe/prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", size = 78551 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301", size = 54682 }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.48" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/4f/feb5e137aff82f7c7f3248267b97451da3644f6cdc218edfe549fb354127/prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90", size = 424684 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e", size = 386595 }, +] + +[[package]] +name = "psutil" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511 }, + { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985 }, + { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488 }, + { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477 }, + { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017 }, + { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602 }, + { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444 }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + +[[package]] +name = "pydantic" +version = "2.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/7e/fb60e6fee04d0ef8f15e4e01ff187a196fa976eb0f0ab524af4599e5754c/pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06", size = 762094 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/26/3e1bbe954fde7ee22a6e7d31582c642aad9e84ffe4b5fb61e63b87cd326f/pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d", size = 431765 }, +] + +[[package]] +name = "pydantic-core" +version = "2.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/bc/fed5f74b5d802cf9a03e83f60f18864e90e3aed7223adaca5ffb7a8d8d64/pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", size = 1895938 }, + { url = "https://files.pythonhosted.org/packages/71/2a/185aff24ce844e39abb8dd680f4e959f0006944f4a8a0ea372d9f9ae2e53/pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", size = 1815684 }, + { url = "https://files.pythonhosted.org/packages/c3/43/fafabd3d94d159d4f1ed62e383e264f146a17dd4d48453319fd782e7979e/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", size = 1829169 }, + { url = "https://files.pythonhosted.org/packages/a2/d1/f2dfe1a2a637ce6800b799aa086d079998959f6f1215eb4497966efd2274/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", size = 1867227 }, + { url = "https://files.pythonhosted.org/packages/7d/39/e06fcbcc1c785daa3160ccf6c1c38fea31f5754b756e34b65f74e99780b5/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", size = 2037695 }, + { url = "https://files.pythonhosted.org/packages/7a/67/61291ee98e07f0650eb756d44998214231f50751ba7e13f4f325d95249ab/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", size = 2741662 }, + { url = "https://files.pythonhosted.org/packages/32/90/3b15e31b88ca39e9e626630b4c4a1f5a0dfd09076366f4219429e6786076/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", size = 1993370 }, + { url = "https://files.pythonhosted.org/packages/ff/83/c06d333ee3a67e2e13e07794995c1535565132940715931c1c43bfc85b11/pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", size = 1996813 }, + { url = "https://files.pythonhosted.org/packages/7c/f7/89be1c8deb6e22618a74f0ca0d933fdcb8baa254753b26b25ad3acff8f74/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", size = 2005287 }, + { url = "https://files.pythonhosted.org/packages/b7/7d/8eb3e23206c00ef7feee17b83a4ffa0a623eb1a9d382e56e4aa46fd15ff2/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", size = 2128414 }, + { url = "https://files.pythonhosted.org/packages/4e/99/fe80f3ff8dd71a3ea15763878d464476e6cb0a2db95ff1c5c554133b6b83/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", size = 2155301 }, + { url = "https://files.pythonhosted.org/packages/2b/a3/e50460b9a5789ca1451b70d4f52546fa9e2b420ba3bfa6100105c0559238/pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", size = 1816685 }, + { url = "https://files.pythonhosted.org/packages/57/4c/a8838731cb0f2c2a39d3535376466de6049034d7b239c0202a64aaa05533/pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", size = 1982876 }, + { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 }, + { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 }, + { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 }, + { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 }, + { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 }, + { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 }, + { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 }, + { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 }, + { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 }, + { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 }, + { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 }, + { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 }, + { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 }, + { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 }, + { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, + { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, + { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, + { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, + { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, + { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, + { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, + { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, + { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, + { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, + { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, + { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, + { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, + { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, + { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, + { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, + { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, + { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, + { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, + { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, + { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, + { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, + { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, + { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, + { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, + { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, + { url = "https://files.pythonhosted.org/packages/46/72/af70981a341500419e67d5cb45abe552a7c74b66326ac8877588488da1ac/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", size = 1891159 }, + { url = "https://files.pythonhosted.org/packages/ad/3d/c5913cccdef93e0a6a95c2d057d2c2cba347815c845cda79ddd3c0f5e17d/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", size = 1768331 }, + { url = "https://files.pythonhosted.org/packages/f6/f0/a3ae8fbee269e4934f14e2e0e00928f9346c5943174f2811193113e58252/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", size = 1822467 }, + { url = "https://files.pythonhosted.org/packages/d7/7a/7bbf241a04e9f9ea24cd5874354a83526d639b02674648af3f350554276c/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", size = 1979797 }, + { url = "https://files.pythonhosted.org/packages/4f/5f/4784c6107731f89e0005a92ecb8a2efeafdb55eb992b8e9d0a2be5199335/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", size = 1987839 }, + { url = "https://files.pythonhosted.org/packages/6d/a7/61246562b651dff00de86a5f01b6e4befb518df314c54dec187a78d81c84/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", size = 1998861 }, + { url = "https://files.pythonhosted.org/packages/86/aa/837821ecf0c022bbb74ca132e117c358321e72e7f9702d1b6a03758545e2/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", size = 2116582 }, + { url = "https://files.pythonhosted.org/packages/81/b0/5e74656e95623cbaa0a6278d16cf15e10a51f6002e3ec126541e95c29ea3/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", size = 2151985 }, + { url = "https://files.pythonhosted.org/packages/63/37/3e32eeb2a451fddaa3898e2163746b0cffbbdbb4740d38372db0490d67f3/pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", size = 2004715 }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, +] + +[[package]] +name = "pyparsing" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/1a/3544f4f299a47911c2ab3710f534e52fea62a633c96806995da5d25be4b2/pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a", size = 1067694 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/a7/c8a2d361bf89c0d9577c934ebb7421b25dc84bf3a8e3ac0a40aed9acc547/pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1", size = 107716 }, +] + +[[package]] +name = "pyproj" +version = "3.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/84/2b39bbf888c753ea48b40d47511548c77aa03445465c35cc4c4e9649b643/pyproj-3.6.1.tar.gz", hash = "sha256:44aa7c704c2b7d8fb3d483bbf75af6cb2350d30a63b144279a09b75fead501bf", size = 225131 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/32/63cf474f4a8d4804b3bdf7c16b8589f38142e8e2f8319dcea27e0bc21a87/pyproj-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab7aa4d9ff3c3acf60d4b285ccec134167a948df02347585fdd934ebad8811b4", size = 6142763 }, + { url = "https://files.pythonhosted.org/packages/18/86/2e7cb9de40492f1bafbf11f4c9072edc394509a40b5e4c52f8139546f039/pyproj-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4bc0472302919e59114aa140fd7213c2370d848a7249d09704f10f5b062031fe", size = 4877123 }, + { url = "https://files.pythonhosted.org/packages/5e/c5/928d5a26995dbefbebd7507d982141cd9153bc7e4392b334fff722c4af12/pyproj-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5279586013b8d6582e22b6f9e30c49796966770389a9d5b85e25a4223286cd3f", size = 6190576 }, + { url = "https://files.pythonhosted.org/packages/f6/2b/b60cf73b0720abca313bfffef34e34f7f7dae23852b2853cf0368d49426b/pyproj-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fafd1f3eb421694857f254a9bdbacd1eb22fc6c24ca74b136679f376f97d35", size = 8328075 }, + { url = "https://files.pythonhosted.org/packages/d9/a8/7193f46032636be917bc775506ae987aad72c931b1f691b775ca812a2917/pyproj-3.6.1-cp310-cp310-win32.whl", hash = "sha256:c41e80ddee130450dcb8829af7118f1ab69eaf8169c4bf0ee8d52b72f098dc2f", size = 5635713 }, + { url = "https://files.pythonhosted.org/packages/89/8f/27350c8fba71a37cd0d316f100fbd96bf139cc2b5ff1ab0dcbc7ac64010a/pyproj-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:db3aedd458e7f7f21d8176f0a1d924f1ae06d725228302b872885a1c34f3119e", size = 6087932 }, + { url = "https://files.pythonhosted.org/packages/84/a6/a300c1b14b2112e966e9f90b18f9c13b586bdcf417207cee913ae9005da3/pyproj-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ebfbdbd0936e178091309f6cd4fcb4decd9eab12aa513cdd9add89efa3ec2882", size = 6147442 }, + { url = "https://files.pythonhosted.org/packages/30/bd/b9bd3761f08754e8dbb34c5a647db2099b348ab5da338e90980caf280e37/pyproj-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:447db19c7efad70ff161e5e46a54ab9cc2399acebb656b6ccf63e4bc4a04b97a", size = 4880331 }, + { url = "https://files.pythonhosted.org/packages/f4/0a/d82aeeb605b5d6870bc72307c3b5e044e632eb7720df8885e144f51a8eac/pyproj-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7e13c40183884ec7f94eb8e0f622f08f1d5716150b8d7a134de48c6110fee85", size = 6192425 }, + { url = "https://files.pythonhosted.org/packages/64/90/dfe5c00de1ca4dbb82606e79790659d4ed7f0ed8d372bccb3baca2a5abe0/pyproj-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65ad699e0c830e2b8565afe42bd58cc972b47d829b2e0e48ad9638386d994915", size = 8571478 }, + { url = "https://files.pythonhosted.org/packages/14/6d/ae373629a1723f0db80d7b8c93598b00d9ecb930ed9ebf4f35826a33e97c/pyproj-3.6.1-cp311-cp311-win32.whl", hash = "sha256:8b8acc31fb8702c54625f4d5a2a6543557bec3c28a0ef638778b7ab1d1772132", size = 5634575 }, + { url = "https://files.pythonhosted.org/packages/79/95/eb68113c5b5737c342bde1bab92705dabe69c16299c5a122616e50f1fbd6/pyproj-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:38a3361941eb72b82bd9a18f60c78b0df8408416f9340521df442cebfc4306e2", size = 6088494 }, + { url = "https://files.pythonhosted.org/packages/0b/64/93232511a7906a492b1b7dfdfc17f4e95982d76a24ef4f86d18cfe7ae2c9/pyproj-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1e9fbaf920f0f9b4ee62aab832be3ae3968f33f24e2e3f7fbb8c6728ef1d9746", size = 6135280 }, + { url = "https://files.pythonhosted.org/packages/10/f2/b550b1f65cc7e51c9116b220b50aade60c439103432a3fd5b12efbc77e15/pyproj-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d227a865356f225591b6732430b1d1781e946893789a609bb34f59d09b8b0f8", size = 4880030 }, + { url = "https://files.pythonhosted.org/packages/fe/4b/2f8f6f94643b9fe2083338eff294feda84d916409b5840b7a402d2be93f8/pyproj-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83039e5ae04e5afc974f7d25ee0870a80a6bd6b7957c3aca5613ccbe0d3e72bf", size = 6184439 }, + { url = "https://files.pythonhosted.org/packages/19/9b/c57569132174786aa3f72275ac306956859a639dad0ce8d95c8411ce8209/pyproj-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb059ba3bced6f6725961ba758649261d85ed6ce670d3e3b0a26e81cf1aa8d", size = 8660747 }, + { url = "https://files.pythonhosted.org/packages/0e/ab/1c2159ec757677c5a6b8803f6be45c2b550dc42c84ec4a228dc219849bbb/pyproj-3.6.1-cp312-cp312-win32.whl", hash = "sha256:2d6ff73cc6dbbce3766b6c0bce70ce070193105d8de17aa2470009463682a8eb", size = 5626805 }, + { url = "https://files.pythonhosted.org/packages/c7/f3/2f32fe143cd7ba1d4d68f1b6dce9ca402d909cbd5a5830e3a8fa3d1acbbf/pyproj-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:7a27151ddad8e1439ba70c9b4b2b617b290c39395fa9ddb7411ebb0eb86d6fb0", size = 6079779 }, +] + +[[package]] +name = "pyright" +version = "1.1.391" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nodeenv" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/05/4ea52a8a45cc28897edb485b4102d37cbfd5fce8445d679cdeb62bfad221/pyright-1.1.391.tar.gz", hash = "sha256:66b2d42cdf5c3cbab05f2f4b76e8bec8aa78e679bfa0b6ad7b923d9e027cadb2", size = 21965 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/89/66f49552fbeb21944c8077d11834b2201514a56fd1b7747ffff9630f1bd9/pyright-1.1.391-py3-none-any.whl", hash = "sha256:54fa186f8b3e8a55a44ebfa842636635688670c6896dcf6cf4a7fc75062f4d15", size = 18579 }, +] + +[[package]] +name = "pyshp" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/63/9f/0dd21250c60375a532c35e89fad8d5e8a3f1a2e3f7c389ccc5a60b05263e/pyshp-2.3.1.tar.gz", hash = "sha256:4caec82fd8dd096feba8217858068bacb2a3b5950f43c048c6dc32a3489d5af1", size = 1731544 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/2f/68116db5b36b895c0450e3072b8cb6c2fac0359279b182ea97014d3c8ac0/pyshp-2.3.1-py2.py3-none-any.whl", hash = "sha256:67024c0ccdc352ba5db777c4e968483782dfa78f8e200672a90d2d30fd8b7b49", size = 46537 }, +] + +[[package]] +name = "pytest" +version = "8.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 }, +] + +[[package]] +name = "pytest-cov" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", extra = ["toml"] }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/45/9b538de8cef30e17c7b45ef42f538a94889ed6a16f2387a6c89e73220651/pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0", size = 66945 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", size = 22949 }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "python-json-logger" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/c4/358cd13daa1d912ef795010897a483ab2f0b41c9ea1b35235a8b2f7d15a7/python_json_logger-3.2.1.tar.gz", hash = "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008", size = 16287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/72/2f30cf26664fcfa0bd8ec5ee62ec90c03bd485e4a294d92aabc76c5203a5/python_json_logger-3.2.1-py3-none-any.whl", hash = "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090", size = 14924 }, +] + +[[package]] +name = "pywin32" +version = "308" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/a6/3e9f2c474895c1bb61b11fa9640be00067b5c5b363c501ee9c3fa53aec01/pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e", size = 5927028 }, + { url = "https://files.pythonhosted.org/packages/d9/b4/84e2463422f869b4b718f79eb7530a4c1693e96b8a4e5e968de38be4d2ba/pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e", size = 6558484 }, + { url = "https://files.pythonhosted.org/packages/9f/8f/fb84ab789713f7c6feacaa08dad3ec8105b88ade8d1c4f0f0dfcaaa017d6/pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c", size = 7971454 }, + { url = "https://files.pythonhosted.org/packages/eb/e2/02652007469263fe1466e98439831d65d4ca80ea1a2df29abecedf7e47b7/pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a", size = 5928156 }, + { url = "https://files.pythonhosted.org/packages/48/ef/f4fb45e2196bc7ffe09cad0542d9aff66b0e33f6c0954b43e49c33cad7bd/pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b", size = 6559559 }, + { url = "https://files.pythonhosted.org/packages/79/ef/68bb6aa865c5c9b11a35771329e95917b5559845bd75b65549407f9fc6b4/pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6", size = 7972495 }, + { url = "https://files.pythonhosted.org/packages/00/7c/d00d6bdd96de4344e06c4afbf218bc86b54436a94c01c71a8701f613aa56/pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", size = 5939729 }, + { url = "https://files.pythonhosted.org/packages/21/27/0c8811fbc3ca188f93b5354e7c286eb91f80a53afa4e11007ef661afa746/pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", size = 6543015 }, + { url = "https://files.pythonhosted.org/packages/9d/0f/d40f8373608caed2255781a3ad9a51d03a594a1248cd632d6a298daca693/pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", size = 7976033 }, + { url = "https://files.pythonhosted.org/packages/a9/a4/aa562d8935e3df5e49c161b427a3a2efad2ed4e9cf81c3de636f1fdddfd0/pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", size = 5938579 }, + { url = "https://files.pythonhosted.org/packages/c7/50/b0efb8bb66210da67a53ab95fd7a98826a97ee21f1d22949863e6d588b22/pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4", size = 6542056 }, + { url = "https://files.pythonhosted.org/packages/26/df/2b63e3e4f2df0224f8aaf6d131f54fe4e8c96400eb9df563e2aae2e1a1f9/pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", size = 7974986 }, +] + +[[package]] +name = "pywinpty" +version = "2.0.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/82/90f8750423cba4b9b6c842df227609fb60704482d7abf6dd47e2babc055a/pywinpty-2.0.14.tar.gz", hash = "sha256:18bd9529e4a5daf2d9719aa17788ba6013e594ae94c5a0c27e83df3278b0660e", size = 27769 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/09/56376af256eab8cc5f8982a3b138d387136eca27fa1a8a68660e8ed59e4b/pywinpty-2.0.14-cp310-none-win_amd64.whl", hash = "sha256:0b149c2918c7974f575ba79f5a4aad58bd859a52fa9eb1296cc22aa412aa411f", size = 1397115 }, + { url = "https://files.pythonhosted.org/packages/be/e2/af1a99c0432e4e58c9ac8e334ee191790ec9793d33559189b9d2069bdc1d/pywinpty-2.0.14-cp311-none-win_amd64.whl", hash = "sha256:cf2a43ac7065b3e0dc8510f8c1f13a75fb8fde805efa3b8cff7599a1ef497bc7", size = 1397223 }, + { url = "https://files.pythonhosted.org/packages/ad/79/759ae767a3b78d340446efd54dd1fe4f7dafa4fc7be96ed757e44bcdba54/pywinpty-2.0.14-cp312-none-win_amd64.whl", hash = "sha256:55dad362ef3e9408ade68fd173e4f9032b3ce08f68cfe7eacb2c263ea1179737", size = 1397207 }, + { url = "https://files.pythonhosted.org/packages/7d/34/b77b3c209bf2eaa6455390c8d5449241637f5957f41636a2204065d52bfa/pywinpty-2.0.14-cp313-none-win_amd64.whl", hash = "sha256:074fb988a56ec79ca90ed03a896d40707131897cefb8f76f926e3834227f2819", size = 1396698 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199 }, + { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758 }, + { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463 }, + { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280 }, + { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239 }, + { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802 }, + { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527 }, + { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052 }, + { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774 }, + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "pyzmq" +version = "26.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/05/bed626b9f7bb2322cdbbf7b4bd8f54b1b617b0d2ab2d3547d6e39428a48e/pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f", size = 271975 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/a8/9837c39aba390eb7d01924ace49d761c8dbe7bc2d6082346d00c8332e431/pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629", size = 1340058 }, + { url = "https://files.pythonhosted.org/packages/a2/1f/a006f2e8e4f7d41d464272012695da17fb95f33b54342612a6890da96ff6/pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b", size = 1008818 }, + { url = "https://files.pythonhosted.org/packages/b6/09/b51b6683fde5ca04593a57bbe81788b6b43114d8f8ee4e80afc991e14760/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764", size = 673199 }, + { url = "https://files.pythonhosted.org/packages/c9/78/486f3e2e824f3a645238332bf5a4c4b4477c3063033a27c1e4052358dee2/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c", size = 911762 }, + { url = "https://files.pythonhosted.org/packages/5e/3b/2eb1667c9b866f53e76ee8b0c301b0469745a23bd5a87b7ee3d5dd9eb6e5/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a", size = 868773 }, + { url = "https://files.pythonhosted.org/packages/16/29/ca99b4598a9dc7e468b5417eda91f372b595be1e3eec9b7cbe8e5d3584e8/pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88", size = 868834 }, + { url = "https://files.pythonhosted.org/packages/ad/e5/9efaeb1d2f4f8c50da04144f639b042bc52869d3a206d6bf672ab3522163/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f", size = 1202861 }, + { url = "https://files.pythonhosted.org/packages/c3/62/c721b5608a8ac0a69bb83cbb7d07a56f3ff00b3991a138e44198a16f94c7/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282", size = 1515304 }, + { url = "https://files.pythonhosted.org/packages/87/84/e8bd321aa99b72f48d4606fc5a0a920154125bd0a4608c67eab742dab087/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea", size = 1414712 }, + { url = "https://files.pythonhosted.org/packages/cd/cd/420e3fd1ac6977b008b72e7ad2dae6350cc84d4c5027fc390b024e61738f/pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2", size = 578113 }, + { url = "https://files.pythonhosted.org/packages/5c/57/73930d56ed45ae0cb4946f383f985c855c9b3d4063f26416998f07523c0e/pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971", size = 641631 }, + { url = "https://files.pythonhosted.org/packages/61/d2/ae6ac5c397f1ccad59031c64beaafce7a0d6182e0452cc48f1c9c87d2dd0/pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa", size = 543528 }, + { url = "https://files.pythonhosted.org/packages/12/20/de7442172f77f7c96299a0ac70e7d4fb78cd51eca67aa2cf552b66c14196/pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218", size = 1340639 }, + { url = "https://files.pythonhosted.org/packages/98/4d/5000468bd64c7910190ed0a6c76a1ca59a68189ec1f007c451dc181a22f4/pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4", size = 1008710 }, + { url = "https://files.pythonhosted.org/packages/e1/bf/c67fd638c2f9fbbab8090a3ee779370b97c82b84cc12d0c498b285d7b2c0/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef", size = 673129 }, + { url = "https://files.pythonhosted.org/packages/86/94/99085a3f492aa538161cbf27246e8886ff850e113e0c294a5b8245f13b52/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317", size = 910107 }, + { url = "https://files.pythonhosted.org/packages/31/1d/346809e8a9b999646d03f21096428453465b1bca5cd5c64ecd048d9ecb01/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf", size = 867960 }, + { url = "https://files.pythonhosted.org/packages/ab/68/6fb6ae5551846ad5beca295b7bca32bf0a7ce19f135cb30e55fa2314e6b6/pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e", size = 869204 }, + { url = "https://files.pythonhosted.org/packages/0f/f9/18417771dee223ccf0f48e29adf8b4e25ba6d0e8285e33bcbce078070bc3/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37", size = 1203351 }, + { url = "https://files.pythonhosted.org/packages/e0/46/f13e67fe0d4f8a2315782cbad50493de6203ea0d744610faf4d5f5b16e90/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3", size = 1514204 }, + { url = "https://files.pythonhosted.org/packages/50/11/ddcf7343b7b7a226e0fc7b68cbf5a5bb56291fac07f5c3023bb4c319ebb4/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6", size = 1414339 }, + { url = "https://files.pythonhosted.org/packages/01/14/1c18d7d5b7be2708f513f37c61bfadfa62161c10624f8733f1c8451b3509/pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4", size = 576928 }, + { url = "https://files.pythonhosted.org/packages/3b/1b/0a540edd75a41df14ec416a9a500b9fec66e554aac920d4c58fbd5756776/pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5", size = 642317 }, + { url = "https://files.pythonhosted.org/packages/98/77/1cbfec0358078a4c5add529d8a70892db1be900980cdb5dd0898b3d6ab9d/pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003", size = 543834 }, + { url = "https://files.pythonhosted.org/packages/28/2f/78a766c8913ad62b28581777ac4ede50c6d9f249d39c2963e279524a1bbe/pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9", size = 1343105 }, + { url = "https://files.pythonhosted.org/packages/b7/9c/4b1e2d3d4065be715e007fe063ec7885978fad285f87eae1436e6c3201f4/pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52", size = 1008365 }, + { url = "https://files.pythonhosted.org/packages/4f/ef/5a23ec689ff36d7625b38d121ef15abfc3631a9aecb417baf7a4245e4124/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08", size = 665923 }, + { url = "https://files.pythonhosted.org/packages/ae/61/d436461a47437d63c6302c90724cf0981883ec57ceb6073873f32172d676/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5", size = 903400 }, + { url = "https://files.pythonhosted.org/packages/47/42/fc6d35ecefe1739a819afaf6f8e686f7f02a4dd241c78972d316f403474c/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae", size = 860034 }, + { url = "https://files.pythonhosted.org/packages/07/3b/44ea6266a6761e9eefaa37d98fabefa112328808ac41aa87b4bbb668af30/pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711", size = 860579 }, + { url = "https://files.pythonhosted.org/packages/38/6f/4df2014ab553a6052b0e551b37da55166991510f9e1002c89cab7ce3b3f2/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6", size = 1196246 }, + { url = "https://files.pythonhosted.org/packages/38/9d/ee240fc0c9fe9817f0c9127a43238a3e28048795483c403cc10720ddef22/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3", size = 1507441 }, + { url = "https://files.pythonhosted.org/packages/85/4f/01711edaa58d535eac4a26c294c617c9a01f09857c0ce191fd574d06f359/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b", size = 1406498 }, + { url = "https://files.pythonhosted.org/packages/07/18/907134c85c7152f679ed744e73e645b365f3ad571f38bdb62e36f347699a/pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7", size = 575533 }, + { url = "https://files.pythonhosted.org/packages/ce/2c/a6f4a20202a4d3c582ad93f95ee78d79bbdc26803495aec2912b17dbbb6c/pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a", size = 637768 }, + { url = "https://files.pythonhosted.org/packages/5f/0e/eb16ff731632d30554bf5af4dbba3ffcd04518219d82028aea4ae1b02ca5/pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b", size = 540675 }, + { url = "https://files.pythonhosted.org/packages/04/a7/0f7e2f6c126fe6e62dbae0bc93b1bd3f1099cf7fea47a5468defebe3f39d/pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726", size = 1006564 }, + { url = "https://files.pythonhosted.org/packages/31/b6/a187165c852c5d49f826a690857684333a6a4a065af0a6015572d2284f6a/pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3", size = 1340447 }, + { url = "https://files.pythonhosted.org/packages/68/ba/f4280c58ff71f321602a6e24fd19879b7e79793fb8ab14027027c0fb58ef/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50", size = 665485 }, + { url = "https://files.pythonhosted.org/packages/77/b5/c987a5c53c7d8704216f29fc3d810b32f156bcea488a940e330e1bcbb88d/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb", size = 903484 }, + { url = "https://files.pythonhosted.org/packages/29/c9/07da157d2db18c72a7eccef8e684cefc155b712a88e3d479d930aa9eceba/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187", size = 859981 }, + { url = "https://files.pythonhosted.org/packages/43/09/e12501bd0b8394b7d02c41efd35c537a1988da67fc9c745cae9c6c776d31/pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b", size = 860334 }, + { url = "https://files.pythonhosted.org/packages/eb/ff/f5ec1d455f8f7385cc0a8b2acd8c807d7fade875c14c44b85c1bddabae21/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18", size = 1196179 }, + { url = "https://files.pythonhosted.org/packages/ec/8a/bb2ac43295b1950fe436a81fc5b298be0b96ac76fb029b514d3ed58f7b27/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115", size = 1507668 }, + { url = "https://files.pythonhosted.org/packages/a9/49/dbc284ebcfd2dca23f6349227ff1616a7ee2c4a35fe0a5d6c3deff2b4fed/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e", size = 1406539 }, + { url = "https://files.pythonhosted.org/packages/00/68/093cdce3fe31e30a341d8e52a1ad86392e13c57970d722c1f62a1d1a54b6/pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5", size = 575567 }, + { url = "https://files.pythonhosted.org/packages/92/ae/6cc4657148143412b5819b05e362ae7dd09fb9fe76e2a539dcff3d0386bc/pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad", size = 637551 }, + { url = "https://files.pythonhosted.org/packages/6c/67/fbff102e201688f97c8092e4c3445d1c1068c2f27bbd45a578df97ed5f94/pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797", size = 540378 }, + { url = "https://files.pythonhosted.org/packages/3f/fe/2d998380b6e0122c6c4bdf9b6caf490831e5f5e2d08a203b5adff060c226/pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a", size = 1007378 }, + { url = "https://files.pythonhosted.org/packages/4a/f4/30d6e7157f12b3a0390bde94d6a8567cdb88846ed068a6e17238a4ccf600/pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc", size = 1329532 }, + { url = "https://files.pythonhosted.org/packages/82/86/3fe917870e15ee1c3ad48229a2a64458e36036e64b4afa9659045d82bfa8/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5", size = 653242 }, + { url = "https://files.pythonhosted.org/packages/50/2d/242e7e6ef6c8c19e6cb52d095834508cd581ffb925699fd3c640cdc758f1/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672", size = 888404 }, + { url = "https://files.pythonhosted.org/packages/ac/11/7270566e1f31e4ea73c81ec821a4b1688fd551009a3d2bab11ec66cb1e8f/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797", size = 845858 }, + { url = "https://files.pythonhosted.org/packages/91/d5/72b38fbc69867795c8711bdd735312f9fef1e3d9204e2f63ab57085434b9/pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386", size = 847375 }, + { url = "https://files.pythonhosted.org/packages/dd/9a/10ed3c7f72b4c24e719c59359fbadd1a27556a28b36cdf1cd9e4fb7845d5/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306", size = 1183489 }, + { url = "https://files.pythonhosted.org/packages/72/2d/8660892543fabf1fe41861efa222455811adac9f3c0818d6c3170a1153e3/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6", size = 1492932 }, + { url = "https://files.pythonhosted.org/packages/7b/d6/32fd69744afb53995619bc5effa2a405ae0d343cd3e747d0fbc43fe894ee/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0", size = 1392485 }, + { url = "https://files.pythonhosted.org/packages/53/fb/36b2b2548286e9444e52fcd198760af99fd89102b5be50f0660fcfe902df/pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072", size = 906955 }, + { url = "https://files.pythonhosted.org/packages/77/8f/6ce54f8979a01656e894946db6299e2273fcee21c8e5fa57c6295ef11f57/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1", size = 565701 }, + { url = "https://files.pythonhosted.org/packages/ee/1c/bf8cd66730a866b16db8483286078892b7f6536f8c389fb46e4beba0a970/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d", size = 794312 }, + { url = "https://files.pythonhosted.org/packages/71/43/91fa4ff25bbfdc914ab6bafa0f03241d69370ef31a761d16bb859f346582/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca", size = 752775 }, + { url = "https://files.pythonhosted.org/packages/ec/d2/3b2ab40f455a256cb6672186bea95cd97b459ce4594050132d71e76f0d6f/pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c", size = 550762 }, +] + +[[package]] +name = "referencing" +version = "0.35.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/73ca1f8e72fff6fa52119dbd185f73a907b1989428917b24cff660129b6d/referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c", size = 62991 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de", size = 26684 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490 }, +] + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242 }, +] + +[[package]] +name = "rpds-py" +version = "0.22.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/80/cce854d0921ff2f0a9fa831ba3ad3c65cee3a46711addf39a2af52df2cfd/rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d", size = 26771 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/2a/ead1d09e57449b99dcc190d8d2323e3a167421d8f8fdf0f217c6f6befe47/rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967", size = 359514 }, + { url = "https://files.pythonhosted.org/packages/8f/7e/1254f406b7793b586c68e217a6a24ec79040f85e030fff7e9049069284f4/rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37", size = 349031 }, + { url = "https://files.pythonhosted.org/packages/aa/da/17c6a2c73730d426df53675ff9cc6653ac7a60b6438d03c18e1c822a576a/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24", size = 381485 }, + { url = "https://files.pythonhosted.org/packages/aa/13/2dbacd820466aa2a3c4b747afb18d71209523d353cf865bf8f4796c969ea/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff", size = 386794 }, + { url = "https://files.pythonhosted.org/packages/6d/62/96905d0a35ad4e4bc3c098b2f34b2e7266e211d08635baa690643d2227be/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c", size = 423523 }, + { url = "https://files.pythonhosted.org/packages/eb/1b/d12770f2b6a9fc2c3ec0d810d7d440f6d465ccd8b7f16ae5385952c28b89/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e", size = 446695 }, + { url = "https://files.pythonhosted.org/packages/4d/cf/96f1fd75512a017f8e07408b6d5dbeb492d9ed46bfe0555544294f3681b3/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec", size = 381959 }, + { url = "https://files.pythonhosted.org/packages/ab/f0/d1c5b501c8aea85aeb938b555bfdf7612110a2f8cdc21ae0482c93dd0c24/rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c", size = 410420 }, + { url = "https://files.pythonhosted.org/packages/33/3b/45b6c58fb6aad5a569ae40fb890fc494c6b02203505a5008ee6dc68e65f7/rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09", size = 557620 }, + { url = "https://files.pythonhosted.org/packages/83/62/3fdd2d3d47bf0bb9b931c4c73036b4ab3ec77b25e016ae26fab0f02be2af/rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00", size = 584202 }, + { url = "https://files.pythonhosted.org/packages/04/f2/5dced98b64874b84ca824292f9cee2e3f30f3bcf231d15a903126684f74d/rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf", size = 552787 }, + { url = "https://files.pythonhosted.org/packages/67/13/2273dea1204eda0aea0ef55145da96a9aa28b3f88bb5c70e994f69eda7c3/rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652", size = 220088 }, + { url = "https://files.pythonhosted.org/packages/4e/80/8c8176b67ad7f4a894967a7a4014ba039626d96f1d4874d53e409b58d69f/rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8", size = 231737 }, + { url = "https://files.pythonhosted.org/packages/15/ad/8d1ddf78f2805a71253fcd388017e7b4a0615c22c762b6d35301fef20106/rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f", size = 359773 }, + { url = "https://files.pythonhosted.org/packages/c8/75/68c15732293a8485d79fe4ebe9045525502a067865fa4278f178851b2d87/rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a", size = 349214 }, + { url = "https://files.pythonhosted.org/packages/3c/4c/7ce50f3070083c2e1b2bbd0fb7046f3da55f510d19e283222f8f33d7d5f4/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5", size = 380477 }, + { url = "https://files.pythonhosted.org/packages/9a/e9/835196a69cb229d5c31c13b8ae603bd2da9a6695f35fe4270d398e1db44c/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb", size = 386171 }, + { url = "https://files.pythonhosted.org/packages/f9/8e/33fc4eba6683db71e91e6d594a2cf3a8fbceb5316629f0477f7ece5e3f75/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2", size = 422676 }, + { url = "https://files.pythonhosted.org/packages/37/47/2e82d58f8046a98bb9497a8319604c92b827b94d558df30877c4b3c6ccb3/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0", size = 446152 }, + { url = "https://files.pythonhosted.org/packages/e1/78/79c128c3e71abbc8e9739ac27af11dc0f91840a86fce67ff83c65d1ba195/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1", size = 381300 }, + { url = "https://files.pythonhosted.org/packages/c9/5b/2e193be0e8b228c1207f31fa3ea79de64dadb4f6a4833111af8145a6bc33/rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d", size = 409636 }, + { url = "https://files.pythonhosted.org/packages/c2/3f/687c7100b762d62186a1c1100ffdf99825f6fa5ea94556844bbbd2d0f3a9/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648", size = 556708 }, + { url = "https://files.pythonhosted.org/packages/8c/a2/c00cbc4b857e8b3d5e7f7fc4c81e23afd8c138b930f4f3ccf9a41a23e9e4/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74", size = 583554 }, + { url = "https://files.pythonhosted.org/packages/d0/08/696c9872cf56effdad9ed617ac072f6774a898d46b8b8964eab39ec562d2/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a", size = 552105 }, + { url = "https://files.pythonhosted.org/packages/18/1f/4df560be1e994f5adf56cabd6c117e02de7c88ee238bb4ce03ed50da9d56/rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64", size = 220199 }, + { url = "https://files.pythonhosted.org/packages/b8/1b/c29b570bc5db8237553002788dc734d6bd71443a2ceac2a58202ec06ef12/rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c", size = 231775 }, + { url = "https://files.pythonhosted.org/packages/75/47/3383ee3bd787a2a5e65a9b9edc37ccf8505c0a00170e3a5e6ea5fbcd97f7/rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e", size = 352334 }, + { url = "https://files.pythonhosted.org/packages/40/14/aa6400fa8158b90a5a250a77f2077c0d0cd8a76fce31d9f2b289f04c6dec/rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56", size = 342111 }, + { url = "https://files.pythonhosted.org/packages/7d/06/395a13bfaa8a28b302fb433fb285a67ce0ea2004959a027aea8f9c52bad4/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45", size = 384286 }, + { url = "https://files.pythonhosted.org/packages/43/52/d8eeaffab047e6b7b7ef7f00d5ead074a07973968ffa2d5820fa131d7852/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e", size = 391739 }, + { url = "https://files.pythonhosted.org/packages/83/31/52dc4bde85c60b63719610ed6f6d61877effdb5113a72007679b786377b8/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d", size = 427306 }, + { url = "https://files.pythonhosted.org/packages/70/d5/1bab8e389c2261dba1764e9e793ed6830a63f830fdbec581a242c7c46bda/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38", size = 442717 }, + { url = "https://files.pythonhosted.org/packages/82/a1/a45f3e30835b553379b3a56ea6c4eb622cf11e72008229af840e4596a8ea/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15", size = 385721 }, + { url = "https://files.pythonhosted.org/packages/a6/27/780c942de3120bdd4d0e69583f9c96e179dfff082f6ecbb46b8d6488841f/rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059", size = 415824 }, + { url = "https://files.pythonhosted.org/packages/94/0b/aa0542ca88ad20ea719b06520f925bae348ea5c1fdf201b7e7202d20871d/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e", size = 561227 }, + { url = "https://files.pythonhosted.org/packages/0d/92/3ed77d215f82c8f844d7f98929d56cc321bb0bcfaf8f166559b8ec56e5f1/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61", size = 587424 }, + { url = "https://files.pythonhosted.org/packages/09/42/cacaeb047a22cab6241f107644f230e2935d4efecf6488859a7dd82fc47d/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7", size = 555953 }, + { url = "https://files.pythonhosted.org/packages/e6/52/c921dc6d5f5d45b212a456c1f5b17df1a471127e8037eb0972379e39dff4/rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627", size = 221339 }, + { url = "https://files.pythonhosted.org/packages/f2/c7/f82b5be1e8456600395366f86104d1bd8d0faed3802ad511ef6d60c30d98/rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4", size = 235786 }, + { url = "https://files.pythonhosted.org/packages/d0/bf/36d5cc1f2c609ae6e8bf0fc35949355ca9d8790eceb66e6385680c951e60/rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84", size = 351657 }, + { url = "https://files.pythonhosted.org/packages/24/2a/f1e0fa124e300c26ea9382e59b2d582cba71cedd340f32d1447f4f29fa4e/rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25", size = 341829 }, + { url = "https://files.pythonhosted.org/packages/cf/c2/0da1231dd16953845bed60d1a586fcd6b15ceaeb965f4d35cdc71f70f606/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4", size = 384220 }, + { url = "https://files.pythonhosted.org/packages/c7/73/a4407f4e3a00a9d4b68c532bf2d873d6b562854a8eaff8faa6133b3588ec/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5", size = 391009 }, + { url = "https://files.pythonhosted.org/packages/a9/c3/04b7353477ab360fe2563f5f0b176d2105982f97cd9ae80a9c5a18f1ae0f/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc", size = 426989 }, + { url = "https://files.pythonhosted.org/packages/8d/e6/e4b85b722bcf11398e17d59c0f6049d19cd606d35363221951e6d625fcb0/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b", size = 441544 }, + { url = "https://files.pythonhosted.org/packages/27/fc/403e65e56f65fff25f2973216974976d3f0a5c3f30e53758589b6dc9b79b/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518", size = 385179 }, + { url = "https://files.pythonhosted.org/packages/57/9b/2be9ff9700d664d51fd96b33d6595791c496d2778cb0b2a634f048437a55/rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd", size = 415103 }, + { url = "https://files.pythonhosted.org/packages/bb/a5/03c2ad8ca10994fcf22dd2150dd1d653bc974fa82d9a590494c84c10c641/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2", size = 560916 }, + { url = "https://files.pythonhosted.org/packages/ba/2e/be4fdfc8b5b576e588782b56978c5b702c5a2307024120d8aeec1ab818f0/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16", size = 587062 }, + { url = "https://files.pythonhosted.org/packages/67/e0/2034c221937709bf9c542603d25ad43a68b4b0a9a0c0b06a742f2756eb66/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f", size = 555734 }, + { url = "https://files.pythonhosted.org/packages/ea/ce/240bae07b5401a22482b58e18cfbabaa392409b2797da60223cca10d7367/rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de", size = 220663 }, + { url = "https://files.pythonhosted.org/packages/cb/f0/d330d08f51126330467edae2fa4efa5cec8923c87551a79299380fdea30d/rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9", size = 235503 }, + { url = "https://files.pythonhosted.org/packages/f7/c4/dbe1cc03df013bf2feb5ad00615038050e7859f381e96fb5b7b4572cd814/rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b", size = 347698 }, + { url = "https://files.pythonhosted.org/packages/a4/3a/684f66dd6b0f37499cad24cd1c0e523541fd768576fa5ce2d0a8799c3cba/rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b", size = 337330 }, + { url = "https://files.pythonhosted.org/packages/82/eb/e022c08c2ce2e8f7683baa313476492c0e2c1ca97227fe8a75d9f0181e95/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1", size = 380022 }, + { url = "https://files.pythonhosted.org/packages/e4/21/5a80e653e4c86aeb28eb4fea4add1f72e1787a3299687a9187105c3ee966/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83", size = 390754 }, + { url = "https://files.pythonhosted.org/packages/37/a4/d320a04ae90f72d080b3d74597074e62be0a8ecad7d7321312dfe2dc5a6a/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd", size = 423840 }, + { url = "https://files.pythonhosted.org/packages/87/70/674dc47d93db30a6624279284e5631be4c3a12a0340e8e4f349153546728/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1", size = 438970 }, + { url = "https://files.pythonhosted.org/packages/3f/64/9500f4d66601d55cadd21e90784cfd5d5f4560e129d72e4339823129171c/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3", size = 383146 }, + { url = "https://files.pythonhosted.org/packages/4d/45/630327addb1d17173adcf4af01336fd0ee030c04798027dfcb50106001e0/rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130", size = 408294 }, + { url = "https://files.pythonhosted.org/packages/5f/ef/8efb3373cee54ea9d9980b772e5690a0c9e9214045a4e7fa35046e399fee/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c", size = 556345 }, + { url = "https://files.pythonhosted.org/packages/54/01/151d3b9ef4925fc8f15bfb131086c12ec3c3d6dd4a4f7589c335bf8e85ba/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b", size = 582292 }, + { url = "https://files.pythonhosted.org/packages/30/89/35fc7a6cdf3477d441c7aca5e9bbf5a14e0f25152aed7f63f4e0b141045d/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333", size = 553855 }, + { url = "https://files.pythonhosted.org/packages/8f/e0/830c02b2457c4bd20a8c5bb394d31d81f57fbefce2dbdd2e31feff4f7003/rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730", size = 219100 }, + { url = "https://files.pythonhosted.org/packages/f8/30/7ac943f69855c2db77407ae363484b915d861702dbba1aa82d68d57f42be/rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf", size = 233794 }, + { url = "https://files.pythonhosted.org/packages/8b/63/e29f8ee14fcf383574f73b6bbdcbec0fbc2e5fc36b4de44d1ac389b1de62/rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d", size = 360786 }, + { url = "https://files.pythonhosted.org/packages/d3/e0/771ee28b02a24e81c8c0e645796a371350a2bb6672753144f36ae2d2afc9/rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd", size = 350589 }, + { url = "https://files.pythonhosted.org/packages/cf/49/abad4c4a1e6f3adf04785a99c247bfabe55ed868133e2d1881200aa5d381/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493", size = 381848 }, + { url = "https://files.pythonhosted.org/packages/3a/7d/f4bc6d6fbe6af7a0d2b5f2ee77079efef7c8528712745659ec0026888998/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96", size = 387879 }, + { url = "https://files.pythonhosted.org/packages/13/b0/575c797377fdcd26cedbb00a3324232e4cb2c5d121f6e4b0dbf8468b12ef/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123", size = 423916 }, + { url = "https://files.pythonhosted.org/packages/54/78/87157fa39d58f32a68d3326f8a81ad8fb99f49fe2aa7ad9a1b7d544f9478/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad", size = 448410 }, + { url = "https://files.pythonhosted.org/packages/59/69/860f89996065a88be1b6ff2d60e96a02b920a262d8aadab99e7903986597/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9", size = 382841 }, + { url = "https://files.pythonhosted.org/packages/bd/d7/bc144e10d27e3cb350f98df2492a319edd3caaf52ddfe1293f37a9afbfd7/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e", size = 409662 }, + { url = "https://files.pythonhosted.org/packages/14/2a/6bed0b05233c291a94c7e89bc76ffa1c619d4e1979fbfe5d96024020c1fb/rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338", size = 558221 }, + { url = "https://files.pythonhosted.org/packages/11/23/cd8f566de444a137bc1ee5795e47069a947e60810ba4152886fe5308e1b7/rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566", size = 583780 }, + { url = "https://files.pythonhosted.org/packages/8d/63/79c3602afd14d501f751e615a74a59040328da5ef29ed5754ae80d236b84/rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe", size = 553619 }, + { url = "https://files.pythonhosted.org/packages/9f/2e/c5c1689e80298d4e94c75b70faada4c25445739d91b94c211244a3ed7ed1/rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d", size = 233338 }, +] + +[[package]] +name = "ruff" +version = "0.8.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/00/089db7890ea3be5709e3ece6e46408d6f1e876026ec3fd081ee585fef209/ruff-0.8.6.tar.gz", hash = "sha256:dcad24b81b62650b0eb8814f576fc65cfee8674772a6e24c9b747911801eeaa5", size = 3473116 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/28/aa07903694637c2fa394a9f4fe93cf861ad8b09f1282fa650ef07ff9fe97/ruff-0.8.6-py3-none-linux_armv6l.whl", hash = "sha256:defed167955d42c68b407e8f2e6f56ba52520e790aba4ca707a9c88619e580e3", size = 10628735 }, + { url = "https://files.pythonhosted.org/packages/2b/43/827bb1448f1fcb0fb42e9c6edf8fb067ca8244923bf0ddf12b7bf949065c/ruff-0.8.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:54799ca3d67ae5e0b7a7ac234baa657a9c1784b48ec954a094da7c206e0365b1", size = 10386758 }, + { url = "https://files.pythonhosted.org/packages/df/93/fc852a81c3cd315b14676db3b8327d2bb2d7508649ad60bfdb966d60738d/ruff-0.8.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e88b8f6d901477c41559ba540beeb5a671e14cd29ebd5683903572f4b40a9807", size = 10007808 }, + { url = "https://files.pythonhosted.org/packages/94/e9/e0ed4af1794335fb280c4fac180f2bf40f6a3b859cae93a5a3ada27325ae/ruff-0.8.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0509e8da430228236a18a677fcdb0c1f102dd26d5520f71f79b094963322ed25", size = 10861031 }, + { url = "https://files.pythonhosted.org/packages/82/68/da0db02f5ecb2ce912c2bef2aa9fcb8915c31e9bc363969cfaaddbc4c1c2/ruff-0.8.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a7ddb221779871cf226100e677b5ea38c2d54e9e2c8ed847450ebbdf99b32d", size = 10388246 }, + { url = "https://files.pythonhosted.org/packages/ac/1d/b85383db181639019b50eb277c2ee48f9f5168f4f7c287376f2b6e2a6dc2/ruff-0.8.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:248b1fb3f739d01d528cc50b35ee9c4812aa58cc5935998e776bf8ed5b251e75", size = 11424693 }, + { url = "https://files.pythonhosted.org/packages/ac/b7/30bc78a37648d31bfc7ba7105b108cb9091cd925f249aa533038ebc5a96f/ruff-0.8.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bc3c083c50390cf69e7e1b5a5a7303898966be973664ec0c4a4acea82c1d4315", size = 12141921 }, + { url = "https://files.pythonhosted.org/packages/60/b3/ee0a14cf6a1fbd6965b601c88d5625d250b97caf0534181e151504498f86/ruff-0.8.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52d587092ab8df308635762386f45f4638badb0866355b2b86760f6d3c076188", size = 11692419 }, + { url = "https://files.pythonhosted.org/packages/ef/d6/c597062b2931ba3e3861e80bd2b147ca12b3370afc3889af46f29209037f/ruff-0.8.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61323159cf21bc3897674e5adb27cd9e7700bab6b84de40d7be28c3d46dc67cf", size = 12981648 }, + { url = "https://files.pythonhosted.org/packages/68/84/21f578c2a4144917985f1f4011171aeff94ab18dfa5303ac632da2f9af36/ruff-0.8.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ae4478b1471fc0c44ed52a6fb787e641a2ac58b1c1f91763bafbc2faddc5117", size = 11251801 }, + { url = "https://files.pythonhosted.org/packages/6c/aa/1ac02537c8edeb13e0955b5db86b5c050a1dcba54f6d49ab567decaa59c1/ruff-0.8.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0c000a471d519b3e6cfc9c6680025d923b4ca140ce3e4612d1a2ef58e11f11fe", size = 10849857 }, + { url = "https://files.pythonhosted.org/packages/eb/00/020cb222252d833956cb3b07e0e40c9d4b984fbb2dc3923075c8f944497d/ruff-0.8.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9257aa841e9e8d9b727423086f0fa9a86b6b420fbf4bf9e1465d1250ce8e4d8d", size = 10470852 }, + { url = "https://files.pythonhosted.org/packages/00/56/e6d6578202a0141cd52299fe5acb38b2d873565f4670c7a5373b637cf58d/ruff-0.8.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45a56f61b24682f6f6709636949ae8cc82ae229d8d773b4c76c09ec83964a95a", size = 10972997 }, + { url = "https://files.pythonhosted.org/packages/be/31/dd0db1f4796bda30dea7592f106f3a67a8f00bcd3a50df889fbac58e2786/ruff-0.8.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:496dd38a53aa173481a7d8866bcd6451bd934d06976a2505028a50583e001b76", size = 11317760 }, + { url = "https://files.pythonhosted.org/packages/d4/70/cfcb693dc294e034c6fed837fa2ec98b27cc97a26db5d049345364f504bf/ruff-0.8.6-py3-none-win32.whl", hash = "sha256:e169ea1b9eae61c99b257dc83b9ee6c76f89042752cb2d83486a7d6e48e8f764", size = 8799729 }, + { url = "https://files.pythonhosted.org/packages/60/22/ae6bcaa0edc83af42751bd193138bfb7598b2990939d3e40494d6c00698c/ruff-0.8.6-py3-none-win_amd64.whl", hash = "sha256:f1d70bef3d16fdc897ee290d7d20da3cbe4e26349f62e8a0274e7a3f4ce7a905", size = 9673857 }, + { url = "https://files.pythonhosted.org/packages/91/f8/3765e053acd07baa055c96b2065c7fab91f911b3c076dfea71006666f5b0/ruff-0.8.6-py3-none-win_arm64.whl", hash = "sha256:7d7fc2377a04b6e04ffe588caad613d0c460eb2ecba4c0ccbbfe2bc973cbc162", size = 9149556 }, +] + +[[package]] +name = "send2trash" +version = "1.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/3a/aec9b02217bb79b87bbc1a21bc6abc51e3d5dcf65c30487ac96c0908c722/Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf", size = 17394 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", size = 18072 }, +] + +[[package]] +name = "setuptools" +version = "75.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/57/e6f0bde5a2c333a32fbcce201f906c1fd0b3a7144138712a5e9d9598c5ec/setuptools-75.7.0.tar.gz", hash = "sha256:886ff7b16cd342f1d1defc16fc98c9ce3fde69e087a4e1983d7ab634e5f41f4f", size = 1338616 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/6e/abdfaaf5c294c553e7a81cf5d801fbb4f53f5c5b6646de651f92a2667547/setuptools-75.7.0-py3-none-any.whl", hash = "sha256:84fb203f278ebcf5cd08f97d3fb96d3fbed4b629d500b29ad60d11e00769b183", size = 1224467 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", size = 86699 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", size = 93002 }, +] + +[[package]] +name = "soupsieve" +version = "2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, +] + +[[package]] +name = "sourcery" +version = "1.28.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/ec/ca54e440acabd4737a5b0b5ea51bbebb2f226801e43c79ad2ebb305a22e4/sourcery-1.28.0-py2.py3-none-macosx_10_9_universal2.whl", hash = "sha256:ede0daff5ef75fc0a584f5c044c9bfa591905fa4ea6b7ec86210cdea149c6821", size = 90850628 }, + { url = "https://files.pythonhosted.org/packages/ff/3e/2156d7b3a9b82fec1f6b30a850a5c70f4448c7edd1b037f8d21a4d57f9b7/sourcery-1.28.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:b4a3c8d60ce1b912565082c33a1427a04b347d32bfeac0d706319cfff30706dd", size = 116086476 }, + { url = "https://files.pythonhosted.org/packages/21/b7/90afde2a62768e56cd46d3a884a5beecb1edc9a3b7da1117cb7ee2932b06/sourcery-1.28.0-py2.py3-none-win_amd64.whl", hash = "sha256:a1f22a15d1731f14c283ec24f66d1efb143fe26ecc78e22a98d4ce76c463a969", size = 89178129 }, +] + +[[package]] +name = "sphinx" +version = "8.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125 }, +] + +[[package]] +name = "sphinx-argparse-cli" +version = "1.19.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/5f/ae6043738a48408ce1371303958fa02943d29619dd5d202e147b1dc8552d/sphinx_argparse_cli-1.19.0.tar.gz", hash = "sha256:0374b23560fd4246234c0ef2d8bb97703088c8ae721bf63a84b9fd0d32f87a78", size = 12667 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/1f/7d40169591a70fb1a8ba57345e22c3f6dca5b06ee6efddafe5ccee91336c/sphinx_argparse_cli-1.19.0-py3-none-any.whl", hash = "sha256:c0e069deed1db44d289f90469c04320f1c2249b3dcbd3c3e093bf9a66e4bd8e4", size = 9941 }, +] + +[[package]] +name = "sphinx-autodoc-typehints" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/37/725d06f80cbe85b8538021df4515b7408af231cbe8b201a3bb2cf773a83d/sphinx_autodoc_typehints-3.0.0.tar.gz", hash = "sha256:d5cdab471efb10fcff4ffe81a2ef713398bc891af9d942a4b763f5ed1d9bf550", size = 35943 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/36/110d38a8b481b915d77461ca68764ebacf7aeba84be7cbe2dc965a65ae80/sphinx_autodoc_typehints-3.0.0-py3-none-any.whl", hash = "sha256:b82bf83e23ae3d5dc25881004a6d6614be6291ff8ff165b2d1e18799f0f6bd74", size = 20041 }, +] + +[[package]] +name = "sphinx-basic-ng" +version = "1.0.0b2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496 }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300 }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530 }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705 }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071 }, +] + +[[package]] +name = "sphinxcontrib-mermaid" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/97/69/bf039237ad260073e8c02f820b3e00dc34f3a2de20aff7861e6b19d2f8c5/sphinxcontrib_mermaid-1.0.0.tar.gz", hash = "sha256:2e8ab67d3e1e2816663f9347d026a8dee4a858acdd4ad32dd1c808893db88146", size = 15153 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/c8/784b9ac6ea08aa594c1a4becbd0dbe77186785362e31fd633b8c6ae0197a/sphinxcontrib_mermaid-1.0.0-py3-none-any.whl", hash = "sha256:60b72710ea02087f212028feb09711225fbc2e343a10d34822fe787510e1caa3", size = 9597 }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743 }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, +] + +[[package]] +name = "terminado" +version = "0.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "os_name != 'nt'" }, + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154 }, +] + +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610 }, +] + +[[package]] +name = "tomli" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 }, + { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 }, + { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 }, + { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 }, + { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 }, + { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 }, + { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 }, + { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 }, + { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 }, + { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 }, + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, +] + +[[package]] +name = "tornado" +version = "6.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 }, + { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 }, + { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 }, + { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 }, + { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173 }, + { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 }, + { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 }, + { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 }, + { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 }, + { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, +] + +[[package]] +name = "trafficgen" +version = "0.6.0" +source = { editable = "." } +dependencies = [ + { name = "basemap" }, + { name = "basemap-data-hires" }, + { name = "dictio" }, + { name = "folium" }, + { name = "global-land-mask" }, + { name = "matplotlib" }, + { name = "numpy" }, +] + +[package.dev-dependencies] +dev = [ + { name = "click" }, + { name = "click-log" }, + { name = "furo" }, + { name = "jupyter" }, + { name = "mypy" }, + { name = "myst-parser" }, + { name = "pandas-stubs" }, + { name = "pre-commit" }, + { name = "pydantic" }, + { name = "pyright" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "ruff" }, + { name = "sourcery" }, + { name = "sphinx" }, + { name = "sphinx-argparse-cli" }, + { name = "sphinx-autodoc-typehints" }, + { name = "sphinxcontrib-mermaid" }, +] + +[package.metadata] +requires-dist = [ + { name = "basemap", specifier = ">=1.3.8" }, + { name = "basemap-data-hires", specifier = ">=1.3.2" }, + { name = "dictio", specifier = ">=0.4.0" }, + { name = "folium", specifier = ">=0.14.0" }, + { name = "global-land-mask", specifier = ">=1.0.0" }, + { name = "matplotlib", specifier = ">=3.7.2" }, + { name = "numpy", specifier = ">=1.25,<2.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "click", specifier = ">=8.1" }, + { name = "click-log", specifier = ">=0.4.0" }, + { name = "furo", specifier = ">=2024.8" }, + { name = "jupyter", specifier = ">=1.1" }, + { name = "mypy", specifier = ">=1.13" }, + { name = "myst-parser", specifier = ">=4.0" }, + { name = "pandas-stubs", specifier = ">=2.2" }, + { name = "pre-commit", specifier = ">=4.0" }, + { name = "pydantic", specifier = ">=2.5" }, + { name = "pyright", specifier = ">=1.1.390" }, + { name = "pytest", specifier = ">=8.3" }, + { name = "pytest-cov", specifier = ">=6.0" }, + { name = "ruff", specifier = ">=0.8.3" }, + { name = "sourcery", specifier = ">=1.27" }, + { name = "sphinx", specifier = ">=8.1" }, + { name = "sphinx-argparse-cli", specifier = ">=1.19" }, + { name = "sphinx-autodoc-typehints", specifier = ">=2.5" }, + { name = "sphinxcontrib-mermaid", specifier = ">=1.0.0" }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, +] + +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20241206" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/60/47d92293d9bc521cd2301e423a358abfac0ad409b3a1606d8fbae1321961/types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb", size = 13802 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/b3/ca41df24db5eb99b00d97f89d7674a90cb6b3134c52fb8121b6d8d30f15c/types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53", size = 14384 }, +] + +[[package]] +name = "types-pytz" +version = "2024.2.0.20241221" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/26/516311b02b5a215e721155fb65db8a965d061372e388d6125ebce8d674b0/types_pytz-2024.2.0.20241221.tar.gz", hash = "sha256:06d7cde9613e9f7504766a0554a270c369434b50e00975b3a4a0f6eed0f2c1a9", size = 10213 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/db/c92ca6920cccd9c2998b013601542e2ac5e59bc805bcff94c94ad254b7df/types_pytz-2024.2.0.20241221-py3-none-any.whl", hash = "sha256:8fc03195329c43637ed4f593663df721fef919b60a969066e22606edf0b53ad5", size = 10008 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140 }, +] + +[[package]] +name = "urllib3" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, +] + +[[package]] +name = "virtualenv" +version = "20.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/39/689abee4adc85aad2af8174bb195a819d0be064bf55fcc73b49d2b28ae77/virtualenv-20.28.1.tar.gz", hash = "sha256:5d34ab240fdb5d21549b76f9e8ff3af28252f5499fb6d6f031adac4e5a8c5329", size = 7650532 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/8f/dfb257ca6b4e27cb990f1631142361e4712badab8e3ca8dc134d96111515/virtualenv-20.28.1-py3-none-any.whl", hash = "sha256:412773c85d4dab0409b83ec36f7a6499e72eaf08c80e81e9576bca61831c71cb", size = 4276719 }, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, +] + +[[package]] +name = "webcolors" +version = "24.11.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/29/061ec845fb58521848f3739e466efd8250b4b7b98c1b6c5bf4d40b419b7e/webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6", size = 45064 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9", size = 14934 }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 }, +] + +[[package]] +name = "websocket-client" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/30/fba0d96b4b5fbf5948ed3f4681f7da2f9f64512e1d303f94b4cc174c24a5/websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da", size = 54648 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826 }, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/56/fc/238c424fd7f4ebb25f8b1da9a934a3ad7c848286732ae04263661eb0fc03/widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6", size = 1164730 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71", size = 2335872 }, +] + +[[package]] +name = "xyzservices" +version = "2024.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a0/16/ae87cbd2d6bfc40a419077521c35aadf5121725b7bee3d7c51b56f50958b/xyzservices-2024.9.0.tar.gz", hash = "sha256:68fb8353c9dbba4f1ff6c0f2e5e4e596bb9e1db7f94f4f7dfbcb26e25aa66fde", size = 1131900 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/d3/e07ce413d16ef64e885bea37551eac4c5ca3ddd440933f9c94594273d0d9/xyzservices-2024.9.0-py3-none-any.whl", hash = "sha256:776ae82b78d6e5ca63dd6a94abb054df8130887a4a308473b54a6bd364de8644", size = 85130 }, +]